diff --git a/.buildkite/ftr_platform_stateful_configs.yml b/.buildkite/ftr_platform_stateful_configs.yml index af04aef1e0911..d02d3d198a2ef 100644 --- a/.buildkite/ftr_platform_stateful_configs.yml +++ b/.buildkite/ftr_platform_stateful_configs.yml @@ -264,7 +264,6 @@ enabled: - x-pack/test/functional/apps/security/config.ts - x-pack/test/functional/apps/snapshot_restore/config.ts - x-pack/test/functional/apps/spaces/config.ts - - x-pack/test/functional/apps/spaces/solution_view_flag_enabled/config.ts - x-pack/test/functional/apps/status_page/config.ts - x-pack/test/functional/apps/transform/creation/index_pattern/config.ts - x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/config.ts diff --git a/.buildkite/ftr_security_stateful_configs.yml b/.buildkite/ftr_security_stateful_configs.yml index bd8bc9e922f0d..84a9c815bf565 100644 --- a/.buildkite/ftr_security_stateful_configs.yml +++ b/.buildkite/ftr_security_stateful_configs.yml @@ -101,4 +101,5 @@ enabled: - x-pack/test/cloud_security_posture_functional/config.ts - x-pack/test/cloud_security_posture_functional/config.agentless.ts - x-pack/test/cloud_security_posture_functional/data_views/config.ts - - x-pack/test/automatic_import_api_integration/security/config_basic.ts + - x-pack/test/automatic_import_api_integration/apis/config_basic.ts + - x-pack/test/automatic_import_api_integration/apis/config_graphs.ts diff --git a/.buildkite/pipelines/pull_request/scout_ui_tests.yml b/.buildkite/pipelines/pull_request/scout_ui_tests.yml new file mode 100644 index 0000000000000..37ea1567c4f42 --- /dev/null +++ b/.buildkite/pipelines/pull_request/scout_ui_tests.yml @@ -0,0 +1,18 @@ +steps: + - command: .buildkite/scripts/steps/functional/scout_ui_tests.sh + label: 'Scout UI Tests' + agents: + machineType: n2-standard-4 + preemptible: true + depends_on: + - build + - quick_checks + - checks + - linting + - linting_with_types + - check_types + timeout_in_minutes: 30 + retry: + automatic: + - exit_status: '-1' + limit: 2 diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 3c404083174b1..ded7bd99643eb 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -378,6 +378,16 @@ const getPipeline = (filename: string, removeSteps = true) => { ); } + if ( + (await doAnyChangesMatch([ + /^x-pack\/plugins\/discover_enhanced\/ui_tests/, + /^packages\/kbn-scout/, + ])) || + GITHUB_PR_LABELS.includes('ci:scout-ui-tests') + ) { + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/scout_ui_tests.yml')); + } + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/post_build.yml')); // remove duplicated steps diff --git a/.buildkite/scripts/steps/functional/scout_ui_tests.sh b/.buildkite/scripts/steps/functional/scout_ui_tests.sh new file mode 100755 index 0000000000000..bee4ec4020882 --- /dev/null +++ b/.buildkite/scripts/steps/functional/scout_ui_tests.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source .buildkite/scripts/steps/functional/common.sh + +export JOB=kibana-scout-ui-tests + +TEST_CONFIG="x-pack/plugins/discover_enhanced/ui_tests/playwright.config.ts" +KIBANA_DIR="$KIBANA_BUILD_LOCATION" + +declare -A TESTS=( + ["Stateful"]="--stateful" + ["Serverless Elasticsearch"]="--serverless=es" + ["Serverless Observability"]="--serverless=oblt" + ["Serverless Security"]="--serverless=security" +) + +ORDER=("Stateful" "Serverless Elasticsearch" "Serverless Observability" "Serverless Security") + +EXIT_CODE=0 + +for TEST_NAME in "${ORDER[@]}"; do + RUN_MODE="${TESTS[$TEST_NAME]}" + echo "--- $TEST_NAME: 'discover_enhanced' plugin UI Tests" + if ! node scripts/scout run-tests "$RUN_MODE" --config "$TEST_CONFIG" --kibana-install-dir "$KIBANA_DIR"; then + echo "$TEST_NAME: failed" + EXIT_CODE=1 + else + echo "$TEST_NAME: passed" + fi +done + +exit $EXIT_CODE diff --git a/.eslintrc.js b/.eslintrc.js index 0fe79513a9948..afbc2a1353b52 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -919,6 +919,7 @@ module.exports = { 'x-pack/plugins/observability_solution/exploratory_view/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/observability_solution/ux/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/observability_solution/slo/**/*.{js,mjs,ts,tsx}', + 'x-pack/packages/observability/**/*.{js,mjs,ts,tsx}', ], rules: { 'no-console': ['warn', { allow: ['error'] }], @@ -938,6 +939,7 @@ module.exports = { 'x-pack/plugins/observability_solution/observability/**/*.stories.*', 'x-pack/plugins/observability_solution/exploratory_view/**/*.stories.*', 'x-pack/plugins/observability_solution/slo/**/*.stories.*', + 'x-pack/packages/observability/**/*.{js,mjs,ts,tsx}', ], rules: { 'react/function-component-definition': [ @@ -1100,7 +1102,7 @@ module.exports = { 'x-pack/plugins/elastic_assistant/common/**/*.{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/security-solution/**/*.{js,mjs,ts,tsx}', + 'x-pack/solutions/security/packages/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution/public/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_ess/public/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_serverless/public/**/*.{js,mjs,ts,tsx}', @@ -1138,7 +1140,7 @@ module.exports = { '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/solutions/security/packages/**/*.{ts,tsx}', 'x-pack/plugins/security_solution/**/*.{ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{ts,tsx}', 'x-pack/plugins/security_solution_serverless/**/*.{ts,tsx}', @@ -1153,7 +1155,7 @@ module.exports = { '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/solutions/security/packages/**/*.{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}', 'x-pack/plugins/security_solution_serverless/**/*.{test,mock,test_helper}.{ts,tsx}', @@ -1174,7 +1176,7 @@ module.exports = { '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/solutions/security/packages/**/*.{ts,tsx}', 'x-pack/plugins/security_solution/**/*.{ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{ts,tsx}', 'x-pack/plugins/security_solution_serverless/**/*.{ts,tsx}', @@ -1208,7 +1210,7 @@ module.exports = { '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/solutions/security/packages/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_serverless/**/*.{js,mjs,ts,tsx}', @@ -1307,8 +1309,8 @@ module.exports = { overrides: [ { files: [ - 'x-pack/packages/security-solution/features/**/*.{js,mjs,ts,tsx}', - 'x-pack/packages/security-solution/navigation/**/*.{js,mjs,ts,tsx}', + 'x-pack/solutions/security/packages/features/**/*.{js,mjs,ts,tsx}', + 'x-pack/solutions/security/packages/navigation/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_serverless/**/*.{js,mjs,ts,tsx}', diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 901fbc18cbbc0..4d0a628baab7d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -421,6 +421,7 @@ packages/kbn-openapi-common @elastic/security-detection-rule-management packages/kbn-openapi-generator @elastic/security-detection-rule-management packages/kbn-optimizer @elastic/kibana-operations packages/kbn-optimizer-webpack-helpers @elastic/kibana-operations +packages/kbn-palettes @elastic/kibana-visualizations packages/kbn-panel-loader @elastic/kibana-presentation packages/kbn-peggy @elastic/kibana-operations packages/kbn-peggy-loader @elastic/kibana-operations @@ -434,6 +435,7 @@ packages/kbn-react-field @elastic/kibana-data-discovery packages/kbn-react-hooks @elastic/obs-ux-logs-team packages/kbn-react-mute-legacy-root-warning @elastic/appex-sharedux packages/kbn-recently-accessed @elastic/appex-sharedux +packages/kbn-relocate @elastic/kibana-core packages/kbn-repo-file-maps @elastic/kibana-operations packages/kbn-repo-info @elastic/kibana-operations packages/kbn-repo-linter @elastic/kibana-operations @@ -626,10 +628,10 @@ src/platform/packages/shared/kbn-esql-ast @elastic/kibana-esql src/platform/packages/shared/kbn-esql-utils @elastic/kibana-esql src/platform/packages/shared/kbn-esql-validation-autocomplete @elastic/kibana-esql src/platform/packages/shared/kbn-osquery-io-ts-types @elastic/security-asset-management +src/platform/plugins/shared/ai_assistant_management/selection @elastic/obs-ai-assistant src/platform/plugins/shared/esql @elastic/kibana-esql src/platform/plugins/shared/esql_datagrid @elastic/kibana-esql src/plugins/advanced_settings @elastic/appex-sharedux @elastic/kibana-management -src/plugins/ai_assistant_management/selection @elastic/obs-ai-assistant src/plugins/bfetch @elastic/appex-sharedux src/plugins/chart_expressions/common @elastic/kibana-visualizations src/plugins/chart_expressions/expression_gauge @elastic/kibana-visualizations @@ -806,14 +808,6 @@ x-pack/packages/observability/observability_utils/observability_utils_server @el x-pack/packages/observability/synthetics_test_data @elastic/obs-ux-management-team x-pack/packages/rollup @elastic/kibana-management x-pack/packages/search/shared_ui @elastic/search-kibana -x-pack/packages/security-solution/data_table @elastic/security-threat-hunting-investigations -x-pack/packages/security-solution/distribution_bar @elastic/kibana-cloud-security-posture -x-pack/packages/security-solution/ecs_data_quality_dashboard @elastic/security-threat-hunting-explore -x-pack/packages/security-solution/features @elastic/security-threat-hunting-explore -x-pack/packages/security-solution/navigation @elastic/security-threat-hunting-explore -x-pack/packages/security-solution/side_nav @elastic/security-threat-hunting-explore -x-pack/packages/security-solution/storybook/config @elastic/security-threat-hunting-explore -x-pack/packages/security-solution/upselling @elastic/security-threat-hunting-explore x-pack/packages/security/api_key_management @elastic/kibana-security x-pack/packages/security/authorization_core @elastic/kibana-security x-pack/packages/security/authorization_core_common @elastic/kibana-security @@ -867,6 +861,7 @@ x-pack/platform/packages/shared/ml/random_sampler_utils @elastic/ml-ui x-pack/platform/packages/shared/ml/response_stream @elastic/ml-ui x-pack/platform/packages/shared/ml/runtime_field_utils @elastic/ml-ui x-pack/platform/packages/shared/ml/trained_models_utils @elastic/ml-ui +x-pack/platform/plugins/private/data_usage @elastic/obs-ai-assistant @elastic/security-solution x-pack/platform/plugins/private/data_visualizer @elastic/ml-ui x-pack/platform/plugins/private/transform @elastic/ml-ui x-pack/platform/plugins/private/translations @elastic/kibana-localization @@ -876,6 +871,7 @@ x-pack/platform/plugins/shared/aiops @elastic/ml-ui x-pack/platform/plugins/shared/entity_manager @elastic/obs-entities x-pack/platform/plugins/shared/inference @elastic/appex-ai-infra x-pack/platform/plugins/shared/ml @elastic/ml-ui +x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant @elastic/obs-ai-assistant x-pack/plugins/actions @elastic/response-ops x-pack/plugins/alerting @elastic/response-ops x-pack/plugins/asset_inventory @elastic/kibana-cloud-security-posture @@ -894,7 +890,6 @@ x-pack/plugins/cross_cluster_replication @elastic/kibana-management x-pack/plugins/custom_branding @elastic/appex-sharedux x-pack/plugins/dashboard_enhanced @elastic/kibana-presentation x-pack/plugins/data_quality @elastic/obs-ux-logs-team -x-pack/plugins/data_usage @elastic/obs-ai-assistant @elastic/security-solution x-pack/plugins/discover_enhanced @elastic/kibana-data-discovery x-pack/plugins/drilldowns/url_drilldown @elastic/appex-sharedux x-pack/plugins/ecs_data_quality_dashboard @elastic/security-threat-hunting-explore @@ -942,12 +937,9 @@ x-pack/plugins/observability_solution/logs_explorer @elastic/obs-ux-logs-team x-pack/plugins/observability_solution/logs_shared @elastic/obs-ux-logs-team x-pack/plugins/observability_solution/metrics_data_access @elastic/obs-ux-infra_services-team x-pack/plugins/observability_solution/observability @elastic/obs-ux-management-team -x-pack/plugins/observability_solution/observability_ai_assistant @elastic/obs-ai-assistant -x-pack/plugins/observability_solution/observability_ai_assistant_app @elastic/obs-ai-assistant -x-pack/plugins/observability_solution/observability_ai_assistant_management @elastic/obs-ai-assistant x-pack/plugins/observability_solution/observability_logs_explorer @elastic/obs-ux-logs-team -x-pack/plugins/observability_solution/observability_onboarding @elastic/obs-ux-logs-team @elastic/obs-ux-onboarding-team -x-pack/plugins/observability_solution/observability_onboarding/e2e @elastic/obs-ux-logs-team @elastic/obs-ux-onboarding-team +x-pack/plugins/observability_solution/observability_onboarding @elastic/obs-ux-logs-team +x-pack/plugins/observability_solution/observability_onboarding/e2e @elastic/obs-ux-logs-team x-pack/plugins/observability_solution/observability_shared @elastic/observability-ui x-pack/plugins/observability_solution/profiling @elastic/obs-ux-infra_services-team x-pack/plugins/observability_solution/profiling_data_access @elastic/obs-ux-infra_services-team @@ -955,7 +947,7 @@ x-pack/plugins/observability_solution/slo @elastic/obs-ux-management-team x-pack/plugins/observability_solution/synthetics @elastic/obs-ux-management-team x-pack/plugins/observability_solution/synthetics/e2e @elastic/obs-ux-management-team x-pack/plugins/observability_solution/uptime @elastic/obs-ux-management-team -x-pack/plugins/observability_solution/ux @elastic/obs-ux-infra_services-team +x-pack/plugins/observability_solution/ux @elastic/obs-ux-management-team x-pack/plugins/osquery @elastic/security-defend-workflows x-pack/plugins/painless_lab @elastic/kibana-management x-pack/plugins/remote_clusters @elastic/kibana-management @@ -993,10 +985,22 @@ x-pack/plugins/timelines @elastic/security-threat-hunting-investigations x-pack/plugins/triggers_actions_ui @elastic/response-ops x-pack/plugins/upgrade_assistant @elastic/kibana-management x-pack/plugins/watcher @elastic/kibana-management +x-pack/solutions/observability/packages/observability_ai/observability_ai_common @elastic/obs-ai-assistant +x-pack/solutions/observability/packages/observability_ai/observability_ai_server @elastic/obs-ai-assistant +x-pack/solutions/observability/plugins/observability_ai_assistant_app @elastic/obs-ai-assistant +x-pack/solutions/observability/plugins/observability_ai_assistant_management @elastic/obs-ai-assistant x-pack/solutions/observability/plugins/observability_solution/entities_data_access @elastic/obs-entities x-pack/solutions/observability/plugins/observability_solution/entity_manager_app @elastic/obs-entities x-pack/solutions/observability/plugins/streams @elastic/streams-program-team x-pack/solutions/observability/plugins/streams_app @elastic/streams-program-team +x-pack/solutions/security/packages/data_table @elastic/security-threat-hunting-investigations +x-pack/solutions/security/packages/distribution_bar @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/ecs_data_quality_dashboard @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/features @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/navigation @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/side_nav @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/storybook/config @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/upselling @elastic/security-threat-hunting-explore x-pack/test x-pack/test_serverless x-pack/test/alerting_api_integration/common/plugins/aad @elastic/response-ops @@ -1142,6 +1146,8 @@ x-pack/test_serverless/api_integration/test_suites/common/platform_security @ela /x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples @elastic/kibana-data-discovery /x-pack/test_serverless/functional/test_suites/common/management/data_views @elastic/kibana-data-discovery src/plugins/discover/public/context_awareness/profile_providers/security @elastic/kibana-data-discovery @elastic/security-threat-hunting-investigations +# TODO: this deprecation_logs folder should be owned by kibana management team after 9.0 +src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs @elastic/kibana-data-discovery @elastic/kibana-core src/plugins/discover/public/context_awareness/profile_providers/observability @elastic/kibana-data-discovery @elastic/obs-ux-logs-team # Platform Docs @@ -2122,6 +2128,7 @@ x-pack/test_serverless/functional/test_suites/security/index.mki_only.ts @elasti /x-pack/test/functional/es_archives/auditbeat/default @elastic/security-solution /x-pack/test/functional/es_archives/auditbeat/hosts @elastic/security-solution /x-pack/test_serverless/functional/page_objects/svl_management_page.ts @elastic/security-solution +/x-pack/test_serverless/functional/page_objects/svl_data_usage.ts @elastic/security-solution @elastic/obs-ai-assistant /x-pack/test_serverless/api_integration/test_suites/security @elastic/security-solution /x-pack/test_serverless/functional/test_suites/security/index.feature_flags.ts @elastic/security-solution @@ -2484,7 +2491,7 @@ x-pack/test/automatic_import_api_integration @elastic/security-scalability ## Packages x-pack/packages/kbn-cloud-security-posture @elastic/kibana-cloud-security-posture -x-pack/packages/security-solution/distribution_bar @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/distribution_bar @elastic/kibana-cloud-security-posture ## Plugins x-pack/plugins/cloud_defend @elastic/kibana-cloud-security-posture x-pack/plugins/cloud_security_posture @elastic/kibana-cloud-security-posture @@ -2647,6 +2654,736 @@ x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics /.github/workflows/oblt-github-commands @elastic/observablt-robots @elastic/kibana-operations /.github/workflows/undeploy-my-kibana.yml @elastic/observablt-robots @elastic/kibana-operations +# Sustainable kibana - Temporary placeholder for new folders +# To be removed as folders are moved into their new home. +# see https://github.com/elastic/kibana/pull/203682 + +src/core/packages/analytics/browser @elastic/kibana-core +src/core/packages/analytics/browser-internal @elastic/kibana-core +src/core/packages/analytics/server @elastic/kibana-core +src/core/packages/analytics/server-internal @elastic/kibana-core +src/core/packages/application/browser @elastic/kibana-core +src/core/packages/application/browser-internal @elastic/kibana-core +src/core/packages/application/common @elastic/kibana-core +src/core/packages/apps/browser-internal @elastic/kibana-core +src/core/packages/apps/server-internal @elastic/kibana-core +src/core/packages/base/browser-internal @elastic/kibana-core +src/core/packages/base/common @elastic/kibana-core +src/core/packages/base/common-internal @elastic/kibana-core +src/core/packages/base/server-internal @elastic/kibana-core +src/core/packages/capabilities/browser-internal @elastic/kibana-core +src/core/packages/capabilities/common @elastic/kibana-core +src/core/packages/capabilities/server @elastic/kibana-core +src/core/packages/capabilities/server-internal @elastic/kibana-core +src/core/packages/chrome/browser @elastic/appex-sharedux +src/core/packages/chrome/browser-internal @elastic/appex-sharedux +src/core/packages/config/server-internal @elastic/kibana-core +src/core/packages/custom-branding/browser @elastic/appex-sharedux +src/core/packages/custom-branding/browser-internal @elastic/appex-sharedux +src/core/packages/custom-branding/browser-mocks @elastic/appex-sharedux +src/core/packages/custom-branding/common @elastic/appex-sharedux +src/core/packages/custom-branding/server @elastic/appex-sharedux +src/core/packages/custom-branding/server-internal @elastic/appex-sharedux +src/core/packages/custom-branding/server-mocks @elastic/appex-sharedux +src/core/packages/deprecations/browser @elastic/kibana-core +src/core/packages/deprecations/browser-internal @elastic/kibana-core +src/core/packages/deprecations/common @elastic/kibana-core +src/core/packages/deprecations/server @elastic/kibana-core +src/core/packages/deprecations/server-internal @elastic/kibana-core +src/core/packages/doc-links/browser @elastic/kibana-core +src/core/packages/doc-links/browser-internal @elastic/kibana-core +src/core/packages/doc-links/server @elastic/kibana-core +src/core/packages/doc-links/server-internal @elastic/kibana-core +src/core/packages/elasticsearch/client-server-internal @elastic/kibana-core +src/core/packages/elasticsearch/server @elastic/kibana-core +src/core/packages/elasticsearch/server-internal @elastic/kibana-core +src/core/packages/environment/server-internal @elastic/kibana-core +src/core/packages/execution-context/browser @elastic/kibana-core +src/core/packages/execution-context/browser-internal @elastic/kibana-core +src/core/packages/execution-context/common @elastic/kibana-core +src/core/packages/execution-context/server @elastic/kibana-core +src/core/packages/execution-context/server-internal @elastic/kibana-core +src/core/packages/fatal-errors/browser @elastic/kibana-core +src/core/packages/fatal-errors/browser-internal @elastic/kibana-core +src/core/packages/feature-flags/browser @elastic/kibana-core +src/core/packages/feature-flags/browser-internal @elastic/kibana-core +src/core/packages/feature-flags/browser-mocks @elastic/kibana-core +src/core/packages/feature-flags/server @elastic/kibana-core +src/core/packages/feature-flags/server-internal @elastic/kibana-core +src/core/packages/feature-flags/server-mocks @elastic/kibana-core +src/core/packages/http/browser @elastic/kibana-core +src/core/packages/http/browser-internal @elastic/kibana-core +src/core/packages/http/common @elastic/kibana-core +src/core/packages/http/context-server-internal @elastic/kibana-core +src/core/packages/http/request-handler-context-server @elastic/kibana-core +src/core/packages/http/request-handler-context-server-internal @elastic/kibana-core +src/core/packages/http/resources-server @elastic/kibana-core +src/core/packages/http/resources-server-internal @elastic/kibana-core +src/core/packages/http/router-server-internal @elastic/kibana-core +src/core/packages/http/server @elastic/kibana-core +src/core/packages/http/server-internal @elastic/kibana-core +src/core/packages/http/server-utils @elastic/kibana-core +src/core/packages/i18n/browser @elastic/kibana-core +src/core/packages/i18n/browser-internal @elastic/kibana-core +src/core/packages/i18n/server @elastic/kibana-core +src/core/packages/i18n/server-internal @elastic/kibana-core +src/core/packages/injected-metadata/browser-internal @elastic/kibana-core +src/core/packages/injected-metadata/common-internal @elastic/kibana-core +src/core/packages/integrations/browser-internal @elastic/kibana-core +src/core/packages/lifecycle/browser @elastic/kibana-core +src/core/packages/lifecycle/browser-internal @elastic/kibana-core +src/core/packages/lifecycle/server @elastic/kibana-core +src/core/packages/lifecycle/server-internal @elastic/kibana-core +src/core/packages/logging/browser-internal @elastic/kibana-core +src/core/packages/logging/common-internal @elastic/kibana-core +src/core/packages/logging/server @elastic/kibana-core +src/core/packages/logging/server-internal @elastic/kibana-core +src/core/packages/metrics/collectors-server-internal @elastic/kibana-core +src/core/packages/metrics/server @elastic/kibana-core +src/core/packages/metrics/server-internal @elastic/kibana-core +src/core/packages/mount-utils/browser @elastic/kibana-core +src/core/packages/mount-utils/browser-internal @elastic/kibana-core +src/core/packages/node/server @elastic/kibana-core +src/core/packages/node/server-internal @elastic/kibana-core +src/core/packages/notifications/browser @elastic/kibana-core +src/core/packages/notifications/browser-internal @elastic/kibana-core +src/core/packages/overlays/browser @elastic/kibana-core +src/core/packages/overlays/browser-internal @elastic/kibana-core +src/core/packages/plugins/base-server-internal @elastic/kibana-core +src/core/packages/plugins/browser @elastic/kibana-core +src/core/packages/plugins/browser-internal @elastic/kibana-core +src/core/packages/plugins/contracts-browser @elastic/kibana-core +src/core/packages/plugins/contracts-server @elastic/kibana-core +src/core/packages/plugins/server @elastic/kibana-core +src/core/packages/plugins/server-internal @elastic/kibana-core +src/core/packages/preboot/server @elastic/kibana-core +src/core/packages/preboot/server-internal @elastic/kibana-core +src/core/packages/rendering/browser @elastic/kibana-core +src/core/packages/rendering/browser-internal @elastic/kibana-core +src/core/packages/rendering/server-internal @elastic/kibana-core +src/core/packages/root/browser-internal @elastic/kibana-core +src/core/packages/root/server-internal @elastic/kibana-core +src/core/packages/saved-objects/api-browser @elastic/kibana-core +src/core/packages/saved-objects/api-server @elastic/kibana-core +src/core/packages/saved-objects/api-server-internal @elastic/kibana-core +src/core/packages/saved-objects/base-server-internal @elastic/kibana-core +src/core/packages/saved-objects/browser @elastic/kibana-core +src/core/packages/saved-objects/browser-internal @elastic/kibana-core +src/core/packages/saved-objects/common @elastic/kibana-core +src/core/packages/saved-objects/import-export-server-internal @elastic/kibana-core +src/core/packages/saved-objects/migration-server-internal @elastic/kibana-core +src/core/packages/saved-objects/server @elastic/kibana-core +src/core/packages/saved-objects/server-internal @elastic/kibana-core +src/core/packages/saved-objects/utils-server @elastic/kibana-core +src/core/packages/security/browser @elastic/kibana-core +src/core/packages/security/browser-internal @elastic/kibana-core +src/core/packages/security/browser-mocks @elastic/kibana-core +src/core/packages/security/common @elastic/kibana-core @elastic/kibana-security +src/core/packages/security/server @elastic/kibana-core +src/core/packages/security/server-internal @elastic/kibana-core +src/core/packages/security/server-mocks @elastic/kibana-core +src/core/packages/status/common @elastic/kibana-core +src/core/packages/status/server @elastic/kibana-core +src/core/packages/status/server-internal @elastic/kibana-core +src/core/packages/test-helpers/deprecations-getters @elastic/kibana-core +src/core/packages/test-helpers/http-setup-browser @elastic/kibana-core +src/core/packages/test-helpers/so-type-serializer @elastic/kibana-core +src/core/packages/test-helpers/test-utils @elastic/kibana-core +src/core/packages/theme/browser @elastic/kibana-core +src/core/packages/theme/browser-internal @elastic/kibana-core +src/core/packages/ui-settings/browser @elastic/appex-sharedux +src/core/packages/ui-settings/browser-internal @elastic/appex-sharedux +src/core/packages/ui-settings/common @elastic/appex-sharedux +src/core/packages/ui-settings/server @elastic/appex-sharedux +src/core/packages/ui-settings/server-internal @elastic/appex-sharedux +src/core/packages/usage-data/base-server-internal @elastic/kibana-core +src/core/packages/usage-data/server @elastic/kibana-core +src/core/packages/usage-data/server-internal @elastic/kibana-core +src/core/packages/user-profile/browser @elastic/kibana-core +src/core/packages/user-profile/browser-internal @elastic/kibana-core +src/core/packages/user-profile/browser-mocks @elastic/kibana-core +src/core/packages/user-profile/common @elastic/kibana-core +src/core/packages/user-profile/server @elastic/kibana-core +src/core/packages/user-profile/server-internal @elastic/kibana-core +src/core/packages/user-profile/server-mocks @elastic/kibana-core +src/core/packages/user-settings/server @elastic/kibana-security +src/core/packages/user-settings/server-internal @elastic/kibana-security +src/core/packages/user-settings/server-mocks @elastic/kibana-security +src/platform/packages/private/analytics/utils/analytics_collection_utils @elastic/kibana-core +src/platform/packages/private/content-management/favorites/favorites_common @elastic/appex-sharedux +src/platform/packages/private/content-management/tabbed_table_list_view @elastic/appex-sharedux +src/platform/packages/private/default-nav/analytics @elastic/kibana-data-discovery @elastic/kibana-presentation @elastic/kibana-visualizations +src/platform/packages/private/default-nav/devtools @elastic/kibana-management +src/platform/packages/private/default-nav/management @elastic/kibana-management +src/platform/packages/private/default-nav/ml @elastic/ml-ui +src/platform/packages/private/kbn-apm-config-loader @elastic/kibana-core @vigneshshanmugam +src/platform/packages/private/kbn-config-mocks @elastic/kibana-core +src/platform/packages/private/kbn-esql-editor @elastic/kibana-esql +src/platform/packages/private/kbn-generate-csv @elastic/appex-sharedux +src/platform/packages/private/kbn-handlebars @elastic/kibana-security +src/platform/packages/private/kbn-hapi-mocks @elastic/kibana-core +src/platform/packages/private/kbn-health-gateway-server @elastic/kibana-core +src/platform/packages/private/kbn-item-buffer @elastic/appex-sharedux +src/platform/packages/private/kbn-language-documentation @elastic/kibana-esql +src/platform/packages/private/kbn-lens-formula-docs @elastic/kibana-visualizations +src/platform/packages/private/kbn-managed-content-badge @elastic/kibana-visualizations +src/platform/packages/private/kbn-management/settings/application @elastic/kibana-management +src/platform/packages/private/kbn-management/settings/components/field_category @elastic/kibana-management +src/platform/packages/private/kbn-management/settings/components/form @elastic/kibana-management +src/platform/packages/private/kbn-mapbox-gl @elastic/kibana-presentation +src/platform/packages/private/kbn-panel-loader @elastic/kibana-presentation +src/platform/packages/private/kbn-repo-packages @elastic/kibana-operations +src/platform/packages/private/kbn-reporting/common @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/export_types/csv @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/export_types/csv_common @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/export_types/pdf @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/export_types/pdf_common @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/export_types/png @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/export_types/png_common @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/get_csv_panel_actions @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/mocks_server @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/public @elastic/appex-sharedux +src/platform/packages/private/kbn-reporting/server @elastic/appex-sharedux +src/platform/packages/private/kbn-saved-objects-settings @elastic/appex-sharedux +src/platform/packages/private/kbn-screenshotting-server @elastic/appex-sharedux +src/platform/packages/private/kbn-sse-utils-server @elastic/obs-knowledge-team +src/platform/packages/private/kbn-timelion-grammar @elastic/kibana-visualizations +src/platform/packages/private/kbn-tinymath @elastic/kibana-visualizations +src/platform/packages/private/kbn-transpose-utils @elastic/kibana-visualizations +src/platform/packages/private/kbn-ui-shared-deps-npm @elastic/kibana-operations +src/platform/packages/private/kbn-ui-shared-deps-src @elastic/kibana-operations +src/platform/packages/private/kbn-unsaved-changes-badge @elastic/kibana-data-discovery +src/platform/packages/private/react/kibana_context/root @elastic/appex-sharedux +src/platform/packages/private/response-ops/rule_params @elastic/response-ops +src/platform/packages/private/serverless/project_switcher @elastic/appex-sharedux +src/platform/packages/private/serverless/settings/common @elastic/appex-sharedux @elastic/kibana-management +src/platform/packages/private/serverless/types @elastic/appex-sharedux +src/platform/packages/private/shared-ux/button/exit_full_screen @elastic/appex-sharedux +src/platform/packages/private/shared-ux/modal/tabbed @elastic/appex-sharedux +src/platform/packages/private/shared-ux/page/analytics_no_data/impl @elastic/appex-sharedux +src/platform/packages/private/shared-ux/page/analytics_no_data/mocks @elastic/appex-sharedux +src/platform/packages/private/shared-ux/page/analytics_no_data/types @elastic/appex-sharedux +src/platform/packages/private/shared-ux/page/kibana_no_data/impl @elastic/appex-sharedux +src/platform/packages/private/shared-ux/page/kibana_no_data/mocks @elastic/appex-sharedux +src/platform/packages/private/shared-ux/page/kibana_no_data/types @elastic/appex-sharedux +src/platform/packages/private/shared-ux/prompt/no_data_views/impl @elastic/appex-sharedux +src/platform/packages/private/shared-ux/prompt/no_data_views/mocks @elastic/appex-sharedux +src/platform/packages/private/shared-ux/table_persist @elastic/appex-sharedux +src/platform/packages/shared/cloud @elastic/kibana-core +src/platform/packages/shared/content-management/content_editor @elastic/appex-sharedux +src/platform/packages/shared/content-management/content_insights/content_insights_public @elastic/appex-sharedux +src/platform/packages/shared/content-management/content_insights/content_insights_server @elastic/appex-sharedux +src/platform/packages/shared/content-management/favorites/favorites_public @elastic/appex-sharedux +src/platform/packages/shared/content-management/favorites/favorites_server @elastic/appex-sharedux +src/platform/packages/shared/content-management/table_list_view @elastic/appex-sharedux +src/platform/packages/shared/content-management/table_list_view_common @elastic/appex-sharedux +src/platform/packages/shared/content-management/table_list_view_table @elastic/appex-sharedux +src/platform/packages/shared/content-management/user_profiles @elastic/appex-sharedux +src/platform/packages/shared/deeplinks/analytics @elastic/kibana-data-discovery @elastic/kibana-presentation @elastic/kibana-visualizations +src/platform/packages/shared/deeplinks/devtools @elastic/kibana-management +src/platform/packages/shared/deeplinks/fleet @elastic/fleet +src/platform/packages/shared/deeplinks/management @elastic/kibana-management +src/platform/packages/shared/deeplinks/ml @elastic/ml-ui +src/platform/packages/shared/deeplinks/observability @elastic/obs-ux-management-team +src/platform/packages/shared/deeplinks/search @elastic/search-kibana +src/platform/packages/shared/deeplinks/security @elastic/security-solution +src/platform/packages/shared/deeplinks/shared @elastic/appex-sharedux +src/platform/packages/shared/home/sample_data_card @elastic/appex-sharedux +src/platform/packages/shared/home/sample_data_tab @elastic/appex-sharedux +src/platform/packages/shared/home/sample_data_types @elastic/appex-sharedux +src/platform/packages/shared/kbn-actions-types @elastic/response-ops +src/platform/packages/shared/kbn-alerting-types @elastic/response-ops +src/platform/packages/shared/kbn-alerts-as-data-utils @elastic/response-ops +src/platform/packages/shared/kbn-alerts-ui-shared @elastic/response-ops +src/platform/packages/shared/kbn-analytics @elastic/kibana-core +src/platform/packages/shared/kbn-apm-data-view @elastic/obs-ux-infra_services-team +src/platform/packages/shared/kbn-apm-utils @elastic/obs-ux-infra_services-team +src/platform/packages/shared/kbn-avc-banner @elastic/security-defend-workflows +src/platform/packages/shared/kbn-bfetch-error @elastic/appex-sharedux +src/platform/packages/shared/kbn-calculate-width-from-char-count @elastic/kibana-visualizations +src/platform/packages/shared/kbn-cases-components @elastic/response-ops +src/platform/packages/shared/kbn-cbor @elastic/kibana-operations +src/platform/packages/shared/kbn-cell-actions @elastic/security-threat-hunting-explore +src/platform/packages/shared/kbn-chart-icons @elastic/kibana-visualizations +src/platform/packages/shared/kbn-coloring @elastic/kibana-visualizations +src/platform/packages/shared/kbn-config @elastic/kibana-core +src/platform/packages/shared/kbn-config-schema @elastic/kibana-core +src/platform/packages/shared/kbn-content-management-utils @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-crypto @elastic/kibana-security +src/platform/packages/shared/kbn-crypto-browser @elastic/kibana-core +src/platform/packages/shared/kbn-custom-icons @elastic/obs-ux-logs-team +src/platform/packages/shared/kbn-data-service @elastic/kibana-visualizations @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-data-view-utils @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-datemath @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-discover-contextual-components @elastic/obs-ux-logs-team @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-discover-utils @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-doc-links @elastic/docs +src/platform/packages/shared/kbn-dom-drag-drop @elastic/kibana-visualizations @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-ebt-tools @elastic/kibana-core +src/platform/packages/shared/kbn-elastic-agent-utils @elastic/obs-ux-logs-team +src/platform/packages/shared/kbn-es-errors @elastic/kibana-core +src/platform/packages/shared/kbn-es-query @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-es-types @elastic/kibana-core @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-esql-ast @elastic/kibana-esql +src/platform/packages/shared/kbn-esql-utils @elastic/kibana-esql +src/platform/packages/shared/kbn-esql-validation-autocomplete @elastic/kibana-esql +src/platform/packages/shared/kbn-event-annotation-common @elastic/kibana-visualizations +src/platform/packages/shared/kbn-event-annotation-components @elastic/kibana-visualizations +src/platform/packages/shared/kbn-field-types @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-field-utils @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-flot-charts @elastic/kibana-presentation @elastic/stack-monitoring +src/platform/packages/shared/kbn-grouping @elastic/response-ops +src/platform/packages/shared/kbn-guided-onboarding @elastic/appex-sharedux +src/platform/packages/shared/kbn-i18n @elastic/kibana-core +src/platform/packages/shared/kbn-i18n-react @elastic/kibana-core +src/platform/packages/shared/kbn-interpreter @elastic/kibana-visualizations +src/platform/packages/shared/kbn-io-ts-utils @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-lens-embeddable-utils @elastic/obs-ux-infra_services-team @elastic/kibana-visualizations +src/platform/packages/shared/kbn-logging @elastic/kibana-core +src/platform/packages/shared/kbn-logging-mocks @elastic/kibana-core +src/platform/packages/shared/kbn-management/cards_navigation @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/components/field_input @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/components/field_row @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/field_definition @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/section_registry @elastic/appex-sharedux @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/setting_ids @elastic/appex-sharedux @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/types @elastic/kibana-management +src/platform/packages/shared/kbn-management/settings/utilities @elastic/kibana-management +src/platform/packages/shared/kbn-monaco @elastic/appex-sharedux +src/platform/packages/shared/kbn-object-versioning @elastic/appex-sharedux +src/platform/packages/shared/kbn-object-versioning-utils @elastic/appex-sharedux +src/platform/packages/shared/kbn-openapi-common @elastic/security-detection-rule-management +src/platform/packages/shared/kbn-osquery-io-ts-types @elastic/security-asset-management +src/platform/packages/shared/kbn-profiling-utils @elastic/obs-ux-infra_services-team +src/platform/packages/shared/kbn-react-field @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-react-hooks @elastic/obs-ux-logs-team +src/platform/packages/shared/kbn-recently-accessed @elastic/appex-sharedux +src/platform/packages/shared/kbn-repo-info @elastic/kibana-operations +src/platform/packages/shared/kbn-resizable-layout @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-rison @elastic/kibana-operations +src/platform/packages/shared/kbn-router-to-openapispec @elastic/kibana-core +src/platform/packages/shared/kbn-router-utils @elastic/obs-ux-logs-team +src/platform/packages/shared/kbn-rrule @elastic/response-ops +src/platform/packages/shared/kbn-rule-data-utils @elastic/security-detections-response @elastic/response-ops @elastic/obs-ux-management-team +src/platform/packages/shared/kbn-safer-lodash-set @elastic/kibana-security +src/platform/packages/shared/kbn-search-api-panels @elastic/search-kibana +src/platform/packages/shared/kbn-search-connectors @elastic/search-kibana +src/platform/packages/shared/kbn-search-errors @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-search-response-warnings @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-search-types @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-security-hardening @elastic/kibana-security +src/platform/packages/shared/kbn-securitysolution-ecs @elastic/security-threat-hunting-explore +src/platform/packages/shared/kbn-securitysolution-es-utils @elastic/security-detection-engine +src/platform/packages/shared/kbn-securitysolution-io-ts-types @elastic/security-detection-engine +src/platform/packages/shared/kbn-securitysolution-io-ts-utils @elastic/security-detection-engine +src/platform/packages/shared/kbn-securitysolution-rules @elastic/security-detection-engine +src/platform/packages/shared/kbn-server-http-tools @elastic/kibana-core +src/platform/packages/shared/kbn-server-route-repository @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-server-route-repository-client @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-server-route-repository-utils @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-shared-svg @elastic/obs-ux-infra_services-team +src/platform/packages/shared/kbn-shared-ux-utility @elastic/appex-sharedux +src/platform/packages/shared/kbn-sort-predicates @elastic/kibana-visualizations +src/platform/packages/shared/kbn-sse-utils @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-sse-utils-client @elastic/obs-knowledge-team +src/platform/packages/shared/kbn-std @elastic/kibana-core +src/platform/packages/shared/kbn-triggers-actions-ui-types @elastic/response-ops +src/platform/packages/shared/kbn-try-in-console @elastic/search-kibana +src/platform/packages/shared/kbn-typed-react-router-config @elastic/obs-knowledge-team @elastic/obs-ux-infra_services-team +src/platform/packages/shared/kbn-ui-actions-browser @elastic/appex-sharedux +src/platform/packages/shared/kbn-ui-theme @elastic/kibana-operations +src/platform/packages/shared/kbn-unified-data-table @elastic/kibana-data-discovery @elastic/security-threat-hunting-investigations +src/platform/packages/shared/kbn-unified-doc-viewer @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-unified-field-list @elastic/kibana-data-discovery +src/platform/packages/shared/kbn-unsaved-changes-prompt @elastic/kibana-management +src/platform/packages/shared/kbn-user-profile-components @elastic/kibana-security +src/platform/packages/shared/kbn-utility-types @elastic/kibana-core +src/platform/packages/shared/kbn-utility-types-jest @elastic/kibana-operations +src/platform/packages/shared/kbn-utils @elastic/kibana-operations +src/platform/packages/shared/kbn-visualization-ui-components @elastic/kibana-visualizations +src/platform/packages/shared/kbn-visualization-utils @elastic/kibana-visualizations +src/platform/packages/shared/kbn-zod @elastic/kibana-core +src/platform/packages/shared/kbn-zod-helpers @elastic/security-detection-rule-management +src/platform/packages/shared/presentation/presentation_containers @elastic/kibana-presentation +src/platform/packages/shared/presentation/presentation_publishing @elastic/kibana-presentation +src/platform/packages/shared/react/kibana_context/common @elastic/appex-sharedux +src/platform/packages/shared/react/kibana_context/render @elastic/appex-sharedux +src/platform/packages/shared/react/kibana_context/styled @elastic/appex-sharedux +src/platform/packages/shared/react/kibana_context/theme @elastic/appex-sharedux +src/platform/packages/shared/react/kibana_mount @elastic/appex-sharedux +src/platform/packages/shared/serverless/settings/observability_project @elastic/appex-sharedux @elastic/kibana-management @elastic/obs-ux-management-team +src/platform/packages/shared/serverless/settings/search_project @elastic/search-kibana @elastic/kibana-management +src/platform/packages/shared/serverless/settings/security_project @elastic/security-solution @elastic/kibana-management +src/platform/packages/shared/shared-ux/avatar/solution @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/button_toolbar @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/card/no_data/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/card/no_data/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/card/no_data/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/chrome/navigation @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/code_editor/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/code_editor/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/error_boundary @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/context @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/file_picker/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/file_upload/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/image/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/image/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/file/util @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/link/redirect_app/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/link/redirect_app/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/link/redirect_app/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/markdown/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/markdown/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/markdown/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/kibana_template/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/kibana_template/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/kibana_template/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/no_data_config/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/no_data_config/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/no_data_config/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/no_data/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/no_data/mocks @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/no_data/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/page/solution_nav @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/prompt/no_data_views/types @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/prompt/not_found @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/router/impl @elastic/appex-sharedux +src/platform/packages/shared/shared-ux/storybook/mock @elastic/appex-sharedux +src/platform/packages/shared/Users/gsoldevila/Work/kibana-secondary/Users/gsoldevila/Work/kibana-secondary/src/core @elastic/kibana-core +src/platform/packages/shared/Users/gsoldevila/Work/kibana-secondary/Users/gsoldevila/Work/kibana-secondary/src/plugins/chart_expressions/common @elastic/kibana-visualizations +src/platform/plugins/private/advanced_settings @elastic/appex-sharedux @elastic/kibana-management +src/platform/plugins/private/event_annotation @elastic/kibana-visualizations +src/platform/plugins/private/event_annotation_listing @elastic/kibana-visualizations +src/platform/plugins/private/files_management @elastic/appex-sharedux +src/platform/plugins/private/ftr_apis @elastic/kibana-core +src/platform/plugins/private/image_embeddable @elastic/appex-sharedux +src/platform/plugins/private/input_control_vis @elastic/kibana-presentation +src/platform/plugins/private/interactive_setup @elastic/kibana-security +src/platform/plugins/private/kibana_overview @elastic/appex-sharedux +src/platform/plugins/private/kibana_usage_collection @elastic/kibana-core +src/platform/plugins/private/links @elastic/kibana-presentation +src/platform/plugins/private/maps_ems @elastic/kibana-presentation +src/platform/plugins/private/no_data_page @elastic/appex-sharedux +src/platform/plugins/private/presentation_panel @elastic/kibana-presentation +src/platform/plugins/private/url_forwarding @elastic/kibana-visualizations +src/platform/plugins/private/vis_default_editor @elastic/kibana-visualizations +src/platform/plugins/private/vis_type_markdown @elastic/kibana-presentation +src/platform/plugins/private/vis_types/gauge @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/heatmap @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/metric @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/pie @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/table @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/tagcloud @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/timelion @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/vega @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/vislib @elastic/kibana-visualizations +src/platform/plugins/private/vis_types/xy @elastic/kibana-visualizations +src/platform/plugins/shared/ai_assistant_management/selection @elastic/obs-ai-assistant +src/platform/plugins/shared/bfetch @elastic/appex-sharedux +src/platform/plugins/shared/chart_expressions/expression_gauge @elastic/kibana-visualizations +src/platform/plugins/shared/chart_expressions/expression_heatmap @elastic/kibana-visualizations +src/platform/plugins/shared/chart_expressions/expression_legacy_metric @elastic/kibana-visualizations +src/platform/plugins/shared/chart_expressions/expression_metric @elastic/kibana-visualizations +src/platform/plugins/shared/chart_expressions/expression_partition_vis @elastic/kibana-visualizations +src/platform/plugins/shared/chart_expressions/expression_tagcloud @elastic/kibana-visualizations +src/platform/plugins/shared/chart_expressions/expression_xy @elastic/kibana-visualizations +src/platform/plugins/shared/charts @elastic/kibana-visualizations +src/platform/plugins/shared/console @elastic/kibana-management +src/platform/plugins/shared/content_management @elastic/appex-sharedux +src/platform/plugins/shared/controls @elastic/kibana-presentation +src/platform/plugins/shared/custom_integrations @elastic/fleet +src/platform/plugins/shared/dashboard @elastic/kibana-presentation +src/platform/plugins/shared/data @elastic/kibana-visualizations @elastic/kibana-data-discovery +src/platform/plugins/shared/data_view_editor @elastic/kibana-data-discovery +src/platform/plugins/shared/data_view_field_editor @elastic/kibana-data-discovery +src/platform/plugins/shared/data_view_management @elastic/kibana-data-discovery +src/platform/plugins/shared/data_views @elastic/kibana-data-discovery +src/platform/plugins/shared/dev_tools @elastic/kibana-management +src/platform/plugins/shared/discover @elastic/kibana-data-discovery +src/platform/plugins/shared/discover_shared @elastic/kibana-data-discovery @elastic/obs-ux-logs-team +src/platform/plugins/shared/embeddable @elastic/kibana-presentation +src/platform/plugins/shared/es_ui_shared @elastic/kibana-management +src/platform/plugins/shared/esql @elastic/kibana-esql +src/platform/plugins/shared/esql_datagrid @elastic/kibana-esql +src/platform/plugins/shared/expression_error @elastic/kibana-presentation +src/platform/plugins/shared/expression_image @elastic/kibana-presentation +src/platform/plugins/shared/expression_metric @elastic/kibana-presentation +src/platform/plugins/shared/expression_repeat_image @elastic/kibana-presentation +src/platform/plugins/shared/expression_reveal_image @elastic/kibana-presentation +src/platform/plugins/shared/expression_shape @elastic/kibana-presentation +src/platform/plugins/shared/expressions @elastic/kibana-visualizations +src/platform/plugins/shared/field_formats @elastic/kibana-data-discovery +src/platform/plugins/shared/files @elastic/appex-sharedux +src/platform/plugins/shared/guided_onboarding @elastic/appex-sharedux +src/platform/plugins/shared/home @elastic/appex-sharedux +src/platform/plugins/shared/inspector @elastic/kibana-presentation +src/platform/plugins/shared/kibana_react @elastic/appex-sharedux +src/platform/plugins/shared/kibana_utils @elastic/appex-sharedux +src/platform/plugins/shared/management @elastic/kibana-management +src/platform/plugins/shared/navigation @elastic/appex-sharedux +src/platform/plugins/shared/newsfeed @elastic/kibana-core +src/platform/plugins/shared/presentation_util @elastic/kibana-presentation +src/platform/plugins/shared/saved_objects @elastic/appex-sharedux +src/platform/plugins/shared/saved_objects_finder @elastic/kibana-data-discovery +src/platform/plugins/shared/saved_objects_management @elastic/kibana-core +src/platform/plugins/shared/saved_objects_tagging_oss @elastic/appex-sharedux +src/platform/plugins/shared/saved_search @elastic/kibana-data-discovery +src/platform/plugins/shared/screenshot_mode @elastic/appex-sharedux +src/platform/plugins/shared/share @elastic/appex-sharedux +src/platform/plugins/shared/telemetry @elastic/kibana-core +src/platform/plugins/shared/telemetry_collection_manager @elastic/kibana-core +src/platform/plugins/shared/telemetry_management_section @elastic/kibana-core +src/platform/plugins/shared/ui_actions @elastic/appex-sharedux +src/platform/plugins/shared/ui_actions_enhanced @elastic/appex-sharedux +src/platform/plugins/shared/unified_doc_viewer @elastic/kibana-data-discovery +src/platform/plugins/shared/unified_histogram @elastic/kibana-data-discovery +src/platform/plugins/shared/unified_search @elastic/kibana-visualizations +src/platform/plugins/shared/usage_collection @elastic/kibana-core +src/platform/plugins/shared/vis_types/timeseries @elastic/kibana-visualizations +src/platform/plugins/shared/visualizations @elastic/kibana-visualizations +x-pack/platform/packages/private/kbn-alerting-state-types @elastic/response-ops +x-pack/platform/packages/private/kbn-infra-forge @elastic/obs-ux-management-team +x-pack/platform/packages/private/kbn-random-sampling @elastic/kibana-visualizations +x-pack/platform/packages/private/maps/vector_tile_utils @elastic/kibana-presentation +x-pack/platform/packages/private/ml/agg_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/aiops_change_point_detection @elastic/ml-ui +x-pack/platform/packages/private/ml/aiops_components @elastic/ml-ui +x-pack/platform/packages/private/ml/aiops_test_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/cancellable_search @elastic/ml-ui +x-pack/platform/packages/private/ml/category_validator @elastic/ml-ui +x-pack/platform/packages/private/ml/creation_wizard_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/data_frame_analytics_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/data_grid @elastic/ml-ui +x-pack/platform/packages/private/ml/data_view_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/date_picker @elastic/ml-ui +x-pack/platform/packages/private/ml/date_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/field_stats_flyout @elastic/ml-ui +x-pack/platform/packages/private/ml/in_memory_table @elastic/ml-ui +x-pack/platform/packages/private/ml/inference_integration_flyout @elastic/ml-ui +x-pack/platform/packages/private/ml/is_defined @elastic/ml-ui +x-pack/platform/packages/private/ml/is_populated_object @elastic/ml-ui +x-pack/platform/packages/private/ml/json_schemas @elastic/ml-ui +x-pack/platform/packages/private/ml/kibana_theme @elastic/ml-ui +x-pack/platform/packages/private/ml/local_storage @elastic/ml-ui +x-pack/platform/packages/private/ml/nested_property @elastic/ml-ui +x-pack/platform/packages/private/ml/number_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/parse_interval @elastic/ml-ui +x-pack/platform/packages/private/ml/query_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/route_utils @elastic/ml-ui +x-pack/platform/packages/private/ml/string_hash @elastic/ml-ui +x-pack/platform/packages/private/ml/time_buckets @elastic/ml-ui +x-pack/platform/packages/private/ml/ui_actions @elastic/ml-ui +x-pack/platform/packages/private/ml/url_state @elastic/ml-ui +x-pack/platform/packages/private/ml/validators @elastic/ml-ui +x-pack/platform/packages/private/rollup @elastic/kibana-management +x-pack/platform/packages/private/security/authorization_core @elastic/kibana-security +x-pack/platform/packages/private/security/authorization_core_common @elastic/kibana-security +x-pack/platform/packages/private/security/role_management_model @elastic/kibana-security +x-pack/platform/packages/private/security/ui_components @elastic/kibana-security +x-pack/platform/packages/shared/ai-infra/inference-common @elastic/appex-ai-infra +x-pack/platform/packages/shared/ai-infra/product-doc-common @elastic/appex-ai-infra +x-pack/platform/packages/shared/index-lifecycle-management/index_lifecycle_management_common_shared @elastic/kibana-management +x-pack/platform/packages/shared/index-management/index_management_shared_types @elastic/kibana-management +x-pack/platform/packages/shared/kbn-ai-assistant @elastic/search-kibana +x-pack/platform/packages/shared/kbn-ai-assistant-common @elastic/search-kibana +x-pack/platform/packages/shared/kbn-alerting-comparators @elastic/response-ops +x-pack/platform/packages/shared/kbn-cloud-security-posture/common @elastic/kibana-cloud-security-posture +x-pack/platform/packages/shared/kbn-data-forge @elastic/obs-ux-management-team +x-pack/platform/packages/shared/kbn-elastic-assistant @elastic/security-generative-ai +x-pack/platform/packages/shared/kbn-elastic-assistant-common @elastic/security-generative-ai +x-pack/platform/packages/shared/kbn-entities-schema @elastic/obs-entities +x-pack/platform/packages/shared/kbn-langchain @elastic/security-generative-ai +x-pack/platform/packages/shared/kbn-slo-schema @elastic/obs-ux-management-team +x-pack/platform/packages/shared/ml/aiops_common @elastic/ml-ui +x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis @elastic/ml-ui +x-pack/platform/packages/shared/ml/aiops_log_rate_analysis @elastic/ml-ui +x-pack/platform/packages/shared/ml/anomaly_utils @elastic/ml-ui +x-pack/platform/packages/shared/ml/chi2test @elastic/ml-ui +x-pack/platform/packages/shared/ml/error_utils @elastic/ml-ui +x-pack/platform/packages/shared/ml/random_sampler_utils @elastic/ml-ui +x-pack/platform/packages/shared/ml/response_stream @elastic/ml-ui +x-pack/platform/packages/shared/ml/runtime_field_utils @elastic/ml-ui +x-pack/platform/packages/shared/ml/trained_models_utils @elastic/ml-ui +x-pack/platform/packages/shared/observability/alerting_rule_utils @elastic/obs-ux-management-team +x-pack/platform/packages/shared/security/api_key_management @elastic/kibana-security +x-pack/platform/packages/shared/security/form_components @elastic/kibana-security +x-pack/platform/packages/shared/security/plugin_types_common @elastic/kibana-security +x-pack/platform/packages/shared/security/plugin_types_public @elastic/kibana-security +x-pack/platform/packages/shared/security/plugin_types_server @elastic/kibana-security +x-pack/platform/plugins/private/banners @elastic/appex-sharedux +x-pack/platform/plugins/private/canvas @elastic/kibana-presentation +x-pack/platform/plugins/private/cloud_integrations/cloud_chat @elastic/kibana-core +x-pack/platform/plugins/private/cloud_integrations/cloud_data_migration @elastic/kibana-management +x-pack/platform/plugins/private/cloud_integrations/cloud_full_story @elastic/kibana-core +x-pack/platform/plugins/private/cloud_integrations/cloud_links @elastic/kibana-core +x-pack/platform/plugins/private/cross_cluster_replication @elastic/kibana-management +x-pack/platform/plugins/private/custom_branding @elastic/appex-sharedux +x-pack/platform/plugins/private/data_usage @elastic/obs-ai-assistant @elastic/security-solution +x-pack/platform/plugins/private/data_visualizer @elastic/ml-ui +x-pack/platform/plugins/private/discover_enhanced @elastic/kibana-data-discovery +x-pack/platform/plugins/private/drilldowns/url_drilldown @elastic/appex-sharedux +x-pack/platform/plugins/private/file_upload @elastic/kibana-presentation @elastic/ml-ui +x-pack/platform/plugins/private/global_search_bar @elastic/appex-sharedux +x-pack/platform/plugins/private/global_search_providers @elastic/appex-sharedux +x-pack/platform/plugins/private/graph @elastic/kibana-visualizations +x-pack/platform/plugins/private/grokdebugger @elastic/kibana-management +x-pack/platform/plugins/private/index_lifecycle_management @elastic/kibana-management +x-pack/platform/plugins/private/license_api_guard @elastic/kibana-management +x-pack/platform/plugins/private/logstash @elastic/logstash +x-pack/platform/plugins/private/monitoring @elastic/stack-monitoring +x-pack/platform/plugins/private/monitoring_collection @elastic/stack-monitoring +x-pack/platform/plugins/private/painless_lab @elastic/kibana-management +x-pack/platform/plugins/private/remote_clusters @elastic/kibana-management +x-pack/platform/plugins/private/reporting @elastic/appex-sharedux +x-pack/platform/plugins/private/rollup @elastic/kibana-management +x-pack/platform/plugins/private/runtime_fields @elastic/kibana-management +x-pack/platform/plugins/private/saved_objects_tagging @elastic/appex-sharedux +x-pack/platform/plugins/private/snapshot_restore @elastic/kibana-management +x-pack/platform/plugins/private/telemetry_collection_xpack @elastic/kibana-core +x-pack/platform/plugins/private/transform @elastic/ml-ui +x-pack/platform/plugins/private/translations @elastic/kibana-localization +x-pack/platform/plugins/private/upgrade_assistant @elastic/kibana-management +x-pack/platform/plugins/private/watcher @elastic/kibana-management +x-pack/platform/plugins/shared/actions @elastic/response-ops +x-pack/platform/plugins/shared/ai_infra/llm_tasks @elastic/appex-ai-infra +x-pack/platform/plugins/shared/ai_infra/product_doc_base @elastic/appex-ai-infra +x-pack/platform/plugins/shared/aiops @elastic/ml-ui +x-pack/platform/plugins/shared/alerting @elastic/response-ops +x-pack/platform/plugins/shared/cases @elastic/response-ops +x-pack/platform/plugins/shared/cloud @elastic/kibana-core +x-pack/platform/plugins/shared/cloud_integrations/cloud_experiments @elastic/kibana-core +x-pack/platform/plugins/shared/dashboard_enhanced @elastic/kibana-presentation +x-pack/platform/plugins/shared/embeddable_enhanced @elastic/kibana-presentation +x-pack/platform/plugins/shared/encrypted_saved_objects @elastic/kibana-security +x-pack/platform/plugins/shared/entity_manager @elastic/obs-entities +x-pack/platform/plugins/shared/event_log @elastic/response-ops +x-pack/platform/plugins/shared/features @elastic/kibana-core +x-pack/platform/plugins/shared/fields_metadata @elastic/obs-ux-logs-team +x-pack/platform/plugins/shared/fleet @elastic/fleet +x-pack/platform/plugins/shared/global_search @elastic/appex-sharedux +x-pack/platform/plugins/shared/index_management @elastic/kibana-management +x-pack/platform/plugins/shared/inference @elastic/appex-ai-infra +x-pack/platform/plugins/shared/ingest_pipelines @elastic/kibana-management +x-pack/platform/plugins/shared/integration_assistant @elastic/security-scalability +x-pack/platform/plugins/shared/lens @elastic/kibana-visualizations +x-pack/platform/plugins/shared/license_management @elastic/kibana-management +x-pack/platform/plugins/shared/licensing @elastic/kibana-core +x-pack/platform/plugins/shared/maps @elastic/kibana-presentation +x-pack/platform/plugins/shared/ml @elastic/ml-ui +x-pack/platform/plugins/shared/notifications @elastic/appex-sharedux +x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant @elastic/obs-ai-assistant +x-pack/platform/plugins/shared/osquery @elastic/security-defend-workflows +x-pack/platform/plugins/shared/rule_registry @elastic/response-ops @elastic/obs-ux-management-team +x-pack/platform/plugins/shared/screenshotting @elastic/kibana-reporting-services +x-pack/platform/plugins/shared/searchprofiler @elastic/kibana-management +x-pack/platform/plugins/shared/security @elastic/kibana-security +x-pack/platform/plugins/shared/serverless @elastic/appex-sharedux +x-pack/platform/plugins/shared/spaces @elastic/kibana-security +x-pack/platform/plugins/shared/stack_alerts @elastic/response-ops +x-pack/platform/plugins/shared/stack_connectors @elastic/response-ops +x-pack/platform/plugins/shared/task_manager @elastic/response-ops +x-pack/platform/plugins/shared/triggers_actions_ui @elastic/response-ops +x-pack/solutions/observability/packages/alert_details @elastic/obs-ux-management-team +x-pack/solutions/observability/packages/alerting_test_data @elastic/obs-ux-management-team +x-pack/solutions/observability/packages/get_padded_alert_time_range_util @elastic/obs-ux-management-team +x-pack/solutions/observability/packages/kbn-alerts-grouping @elastic/response-ops +x-pack/solutions/observability/packages/kbn-apm-types @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/packages/kbn-custom-integrations @elastic/obs-ux-logs-team +x-pack/solutions/observability/packages/kbn-investigation-shared @elastic/obs-ux-management-team +x-pack/solutions/observability/packages/kbn-timerange @elastic/obs-ux-logs-team +x-pack/solutions/observability/packages/kbn-xstate-utils @elastic/obs-ux-logs-team +x-pack/solutions/observability/packages/logs_overview @elastic/obs-ux-logs-team +x-pack/solutions/observability/packages/observability_ai/observability_ai_common @elastic/obs-ai-assistant +x-pack/solutions/observability/packages/observability_ai/observability_ai_server @elastic/obs-ai-assistant +x-pack/solutions/observability/packages/observability_utils/observability_utils_browser @elastic/observability-ui +x-pack/solutions/observability/packages/observability_utils/observability_utils_common @elastic/observability-ui +x-pack/solutions/observability/packages/observability_utils/observability_utils_server @elastic/observability-ui +x-pack/solutions/observability/packages/synthetics_test_data @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/apm @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/apm_data_access @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/data_quality @elastic/obs-ux-logs-team +x-pack/solutions/observability/plugins/dataset_quality @elastic/obs-ux-logs-team +x-pack/solutions/observability/plugins/entities_data_access @elastic/obs-entities +x-pack/solutions/observability/plugins/entity_manager_app @elastic/obs-entities +x-pack/solutions/observability/plugins/exploratory_view @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/infra @elastic/obs-ux-logs-team @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/inventory @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/investigate @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/investigate_app @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/logs_explorer @elastic/obs-ux-logs-team +x-pack/solutions/observability/plugins/metrics_data_access @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/observability @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/observability_ai_assistant_app @elastic/obs-ai-assistant +x-pack/solutions/observability/plugins/observability_ai_assistant_management @elastic/obs-ai-assistant +x-pack/solutions/observability/plugins/observability_logs_explorer @elastic/obs-ux-logs-team +x-pack/solutions/observability/plugins/observability_onboarding @elastic/obs-ux-logs-team @elastic/obs-ux-onboarding-team +x-pack/solutions/observability/plugins/observability_shared @elastic/observability-ui +x-pack/solutions/observability/plugins/profiling @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/profiling_data_access @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/serverless_observability @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/slo @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/streams @elastic/streams-program-team +x-pack/solutions/observability/plugins/streams_app @elastic/streams-program-team +x-pack/solutions/observability/plugins/synthetics @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/uptime @elastic/obs-ux-management-team +x-pack/solutions/observability/plugins/ux @elastic/obs-ux-infra_services-team +x-pack/solutions/search/packages/kbn-ipynb @elastic/search-kibana +x-pack/solutions/search/packages/kbn-search-api-keys-components @elastic/search-kibana +x-pack/solutions/search/packages/kbn-search-api-keys-server @elastic/search-kibana +x-pack/solutions/search/packages/kbn-search-index-documents @elastic/search-kibana +x-pack/solutions/search/packages/search/shared_ui @elastic/search-kibana +x-pack/solutions/search/plugins/enterprise_search @elastic/search-kibana +x-pack/solutions/search/plugins/search_assistant @elastic/search-kibana +x-pack/solutions/search/plugins/search_connectors @elastic/search-kibana +x-pack/solutions/search/plugins/search_homepage @elastic/search-kibana +x-pack/solutions/search/plugins/search_indices @elastic/search-kibana +x-pack/solutions/search/plugins/search_inference_endpoints @elastic/search-kibana +x-pack/solutions/search/plugins/search_notebooks @elastic/search-kibana +x-pack/solutions/search/plugins/search_playground @elastic/search-kibana +x-pack/solutions/search/plugins/search_solution/search_navigation @elastic/search-kibana +x-pack/solutions/search/plugins/serverless_search @elastic/search-kibana +x-pack/solutions/security/packages/data_table @elastic/security-threat-hunting-investigations +x-pack/solutions/security/packages/distribution_bar @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/ecs_data_quality_dashboard @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/features @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/kbn-cloud-security-posture/graph @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/kbn-cloud-security-posture/public @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/kbn-data-stream-adapter @elastic/security-threat-hunting +x-pack/solutions/security/packages/kbn-expandable-flyout @elastic/security-threat-hunting-investigations +x-pack/solutions/security/packages/kbn-index-adapter @elastic/security-threat-hunting +x-pack/solutions/security/packages/kbn-securitysolution-autocomplete @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-endpoint-exceptions-common @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-exception-list-components @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-exceptions-common @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-hook-utils @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-io-ts-alerting-types @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-io-ts-list-types @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-list-api @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-list-constants @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-list-hooks @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-list-utils @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-lists-common @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-t-grid @elastic/security-detection-engine +x-pack/solutions/security/packages/kbn-securitysolution-utils @elastic/security-detection-engine +x-pack/solutions/security/packages/navigation @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/side_nav @elastic/security-threat-hunting-explore +x-pack/solutions/security/packages/upselling @elastic/security-threat-hunting-explore +x-pack/solutions/security/plugins/asset_inventory @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/cloud_defend @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/cloud_security_posture @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/ecs_data_quality_dashboard @elastic/security-threat-hunting-explore +x-pack/solutions/security/plugins/elastic_assistant @elastic/security-generative-ai +x-pack/solutions/security/plugins/kubernetes_security @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/lists @elastic/security-detection-engine +x-pack/solutions/security/plugins/security_solution @elastic/security-solution +x-pack/solutions/security/plugins/security_solution_ess @elastic/security-solution +x-pack/solutions/security/plugins/security_solution_serverless @elastic/security-solution +x-pack/solutions/security/plugins/session_view @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/threat_intelligence @elastic/security-threat-hunting-investigations +x-pack/solutions/security/plugins/timelines @elastic/security-threat-hunting-investigations + #### ## These rules are always last so they take ultimate priority over everything else #### diff --git a/.github/paths-labeller.yml b/.github/paths-labeller.yml index dbbefda24c9ac..dc7f4a126fb25 100644 --- a/.github/paths-labeller.yml +++ b/.github/paths-labeller.yml @@ -24,7 +24,7 @@ - 'x-pack/plugins/observability_solution/synthetics/**/*.*' - 'x-pack/plugins/observability_solution/exploratory_view/**/*.*' - 'Team:Obs AI Assistant': - - 'x-pack/plugins/observability_solution/observability_ai_assistant/**/*.*' + - 'x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/**/*.*' - 'x-pack/plugins/observability_solution/observability_ai_assistant_*/**/*.*' - 'x-pack/test/observability_ai_assistant_api_integration/**/*.*' - 'x-pack/test/observability_ai_assistant_functional/**/*.*' diff --git a/.i18nrc.json b/.i18nrc.json index c11b622291838..dc8ff02da6465 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -1,7 +1,7 @@ { "paths": { "advancedSettings": "src/plugins/advanced_settings", - "aiAssistantManagementSelection": "src/plugins/ai_assistant_management/selection", + "aiAssistantManagementSelection": "src/platform/plugins/shared/ai_assistant_management/selection", "alerts": "packages/kbn-alerts/src", "alertsUIShared": "packages/kbn-alerts-ui-shared/src", "alertingTypes": "packages/kbn-alerting-types", @@ -118,7 +118,7 @@ "searchIndexDocuments": "packages/kbn-search-index-documents", "searchResponseWarnings": "packages/kbn-search-response-warnings", "searchTypes": "packages/kbn-search-types", - "securitySolutionPackages": "x-pack/packages/security-solution", + "securitySolutionPackages": "x-pack/solutions/security/packages", "serverlessPackages": "packages/serverless", "sse": ["packages/kbn-sse-utils"], "coloring": "packages/kbn-coloring/src", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index e6073f0076059..ec6ff0fff797d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 997ee6a63ef41..f70dabe6be2a8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index c4ad90deeffb8..94ea70ba85450 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index e6b8e7795ce88..6cb8da274d40a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index ef112becf2f55..c0aaafea9a245 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index e503010b398a5..7ca22751d2829 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 14883b4493db7..478d6632822ad 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_inventory.mdx b/api_docs/asset_inventory.mdx index 819e37b1619c6..73f4cbba684ca 100644 --- a/api_docs/asset_inventory.mdx +++ b/api_docs/asset_inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetInventory title: "assetInventory" image: https://source.unsplash.com/400x175/?github description: API docs for the assetInventory plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetInventory'] --- import assetInventoryObj from './asset_inventory.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 5c291cd78b05b..c7bd743940d71 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index ac5e1f981534b..3d740e42fdb13 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 91afdb4e2bb2d..fe57b9eb5a839 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 8499d2f7a715f..9cc2ec6c05c56 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.devdocs.json b/api_docs/charts.devdocs.json index 4fdf943a868f4..0e9adb3e303c7 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -153,6 +153,71 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "charts", + "id": "def-public.decreaseOpacity", + "type": "Function", + "tags": [], + "label": "decreaseOpacity", + "description": [ + "\nReduces color opacity, by mixing color with background color.\n\nThis is used when the resulting color needs to be opaque (i.e. alpha of 1)." + ], + "signature": [ + "(baseColor: string, step: number, totalSteps: number) => string" + ], + "path": "src/plugins/charts/public/services/palettes/decrease_opacity.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "charts", + "id": "def-public.decreaseOpacity.$1", + "type": "string", + "tags": [], + "label": "baseColor", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/charts/public/services/palettes/decrease_opacity.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "charts", + "id": "def-public.decreaseOpacity.$2", + "type": "number", + "tags": [], + "label": "step", + "description": [], + "signature": [ + "number" + ], + "path": "src/plugins/charts/public/services/palettes/decrease_opacity.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "charts", + "id": "def-public.decreaseOpacity.$3", + "type": "number", + "tags": [], + "label": "totalSteps", + "description": [], + "signature": [ + "number" + ], + "path": "src/plugins/charts/public/services/palettes/decrease_opacity.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "charts", "id": "def-public.EmptyPlaceholder", diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index edee4b592c729..d0539e01e2390 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 267 | 2 | 252 | 9 | +| 271 | 2 | 255 | 9 | ## Client diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 7ed607fc34070..066e31720f331 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index ee698cda129af..89a92cb9d94f2 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index f34a611a7c225..4200fad84a3da 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 63a2c567ea784..d650611d05319 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 72d4a88a1e654..9fcefc7d3d1f9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 8029dbb584f45..33a73a5365f3e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.devdocs.json b/api_docs/controls.devdocs.json index 5a0a3ae38133d..238864dacb98d 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -1272,7 +1272,13 @@ "text": "HasSaveNotification" }, " & ", - "PublishesReload", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesReload", + "text": "PublishesReload" + }, "> & { allowExpensiveQueries$: ", { "pluginId": "@kbn/presentation-publishing", @@ -1524,7 +1530,13 @@ "text": "HasSaveNotification" }, " & ", - "PublishesReload", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesReload", + "text": "PublishesReload" + }, "> & { allowExpensiveQueries$: ", { "pluginId": "@kbn/presentation-publishing", diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 37e528ee2882a..742a3e132459c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index abf8aae7443f3..4e5d2f485443e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index 79542dae85297..c49fb63ac1caa 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -393,7 +393,7 @@ "description": [], "signature": [ "(() => Partial<", - "SavedDashboardInput", + "DashboardState", ">) | undefined" ], "path": "src/plugins/dashboard/public/dashboard_api/types.ts", @@ -857,6 +857,14 @@ "text": "HasAppContext" }, " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasExecutionContext", + "text": "HasExecutionContext" + }, + " & ", { "pluginId": "@kbn/presentation-containers", "scope": "public", @@ -865,6 +873,14 @@ "text": "HasRuntimeChildState" }, " & ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.HasSaveNotification", + "text": "HasSaveNotification" + }, + " & ", { "pluginId": "@kbn/presentation-containers", "scope": "public", @@ -881,6 +897,14 @@ "text": "HasType" }, "<\"dashboard\"> & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasUniqueId", + "text": "HasUniqueId" + }, + " & ", { "pluginId": "@kbn/presentation-containers", "scope": "public", @@ -889,6 +913,14 @@ "text": "PresentationContainer" }, " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesDataLoading", + "text": "PublishesDataLoading" + }, + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -913,6 +945,14 @@ "text": "PublishesPanelTitle" }, ", \"panelTitle\"> & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesReload", + "text": "PublishesReload" + }, + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -921,6 +961,16 @@ "text": "PublishesSavedObjectId" }, " & ", + "PublishesSearchSession", + " & ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.PublishesSettings", + "text": "PublishesSettings" + }, + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -968,23 +1018,31 @@ "section": "def-public.PublishesViewMode", "text": "PublishesViewMode" }, - " & ", + " & { setViewMode: (viewMode: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.ViewMode", + "text": "ViewMode" + }, + ") => void; } & ", { "pluginId": "@kbn/presentation-containers", "scope": "public", "docId": "kibKbnPresentationContainersPluginApi", - "section": "def-public.TracksOverlays", - "text": "TracksOverlays" + "section": "def-public.TrackContentfulRender", + "text": "TrackContentfulRender" }, - " & { addFromLibrary: () => void; animatePanelTransforms$: ", + " & ", { - "pluginId": "@kbn/presentation-publishing", + "pluginId": "@kbn/presentation-containers", "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.PublishingSubject", - "text": "PublishingSubject" + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.TracksOverlays", + "text": "TracksOverlays" }, - "; asyncResetToLastSavedState: () => Promise; controlGroupApi$: ", + " & { asyncResetToLastSavedState: () => Promise; controlGroupApi$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -1016,25 +1074,7 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; forceRefresh: () => void; getRuntimeStateForControlGroup: () => ", - "UnsavedPanelState", - " | undefined; getSerializedStateForControlGroup: () => ", - { - "pluginId": "@kbn/presentation-containers", - "scope": "public", - "docId": "kibKbnPresentationContainersPluginApi", - "section": "def-public.SerializedPanelState", - "text": "SerializedPanelState" - }, - "<", - { - "pluginId": "controls", - "scope": "common", - "docId": "kibControlsPluginApi", - "section": "def-common.ControlGroupSerializedState", - "text": "ControlGroupSerializedState" - }, - ">; getSettings: () => ", + "; forceRefresh: () => void; getSettings: () => ", "DashboardStateFromSettingsFlyout", "; getDashboardPanelFromId: (id: string) => Promise<", { @@ -1060,14 +1100,6 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; hasRunMigrations$: ", - { - "pluginId": "@kbn/presentation-publishing", - "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.PublishingSubject", - "text": "PublishingSubject" - }, "; hasUnsavedChanges$: ", { "pluginId": "@kbn/presentation-publishing", @@ -1084,15 +1116,23 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; isEmbeddedExternally: boolean; managed$: ", + "; isEmbeddedExternally: boolean; isManaged: boolean; locator?: Pick<", { - "pluginId": "@kbn/presentation-publishing", + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "dashboard", "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.PublishingSubject", - "text": "PublishingSubject" + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardLocatorParams", + "text": "DashboardLocatorParams" }, - "; panels$: ", + ">, \"navigate\" | \"getRedirectUrl\"> | undefined; panels$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -1108,23 +1148,7 @@ "section": "def-common.DashboardPanelMap", "text": "DashboardPanelMap" }, - ">; registerChildApi: (api: ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.DefaultEmbeddableApi", - "text": "DefaultEmbeddableApi" - }, - ") => void; runInteractiveSave: (interactionMode: ", - { - "pluginId": "@kbn/presentation-publishing", - "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.ViewMode", - "text": "ViewMode" - }, - ") => Promise<", + ">; runInteractiveSave: () => Promise<", "SaveDashboardReturn", " | undefined>; runQuickSave: () => Promise; scrollToPanel: (panelRef: HTMLDivElement) => void; scrollToPanelId$: ", { @@ -1134,17 +1158,7 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; scrollToTop: () => void; setControlGroupApi: (controlGroupApi: ", - { - "pluginId": "controls", - "scope": "public", - "docId": "kibControlsPluginApi", - "section": "def-public.ControlGroupApi", - "text": "ControlGroupApi" - }, - ") => void; setSettings: (settings: ", - "DashboardStateFromSettingsFlyout", - ") => void; setFilters: (filters?: ", + "; scrollToTop: () => void; setFilters: (filters?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -1152,7 +1166,7 @@ "section": "def-common.Filter", "text": "Filter" }, - "[] | undefined) => void; setFullScreenMode: (fullScreenMode: boolean) => void; setPanels: (panels: ", + "[] | undefined) => void; setFullScreenMode: (fullScreenMode: boolean) => void; setHighlightPanelId: (id: string | undefined) => void; setPanels: (panels: ", { "pluginId": "dashboard", "scope": "common", @@ -1168,7 +1182,9 @@ "section": "def-common.Query", "text": "Query" }, - " | undefined) => void; setTags: (tags: string[]) => void; setTimeRange: (timeRange?: ", + " | undefined) => void; setScrollToPanelId: (id: string | undefined) => void; setSettings: (settings: ", + "DashboardStateFromSettingsFlyout", + ") => void; setTags: (tags: string[]) => void; setTimeRange: (timeRange?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -1176,15 +1192,7 @@ "section": "def-common.TimeRange", "text": "TimeRange" }, - " | undefined) => void; setViewMode: (viewMode: ", - { - "pluginId": "@kbn/presentation-publishing", - "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.ViewMode", - "text": "ViewMode" - }, - ") => void; useMargins$: ", + " | undefined) => void; unifiedSearchFilters$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -1192,15 +1200,15 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; uuid$: ", + "<", { - "pluginId": "@kbn/presentation-publishing", - "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.PublishingSubject", - "text": "PublishingSubject" + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" }, - "; untilEmbeddableLoaded: (id: string) => Promise<", + "[] | undefined>; untilEmbeddableLoaded: (id: string) => Promise<", { "pluginId": "embeddable", "scope": "public", diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index bca62b080c884..8e7114c3a6f8d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 114 | 0 | 111 | 14 | +| 114 | 0 | 111 | 13 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index dcae3865b0eff..0308f5dab7005 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-12-10 +date: 2024-12-12 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 cfb349a3c4ce3..955840da3eca1 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -8073,6 +8073,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server-internal", "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts" @@ -8085,10 +8089,6 @@ "plugin": "@kbn/core-saved-objects-server-internal", "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts" @@ -12660,14 +12660,14 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" + }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" @@ -19195,14 +19195,14 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" + }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" @@ -24610,6 +24610,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server-internal", "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts" @@ -24622,10 +24626,6 @@ "plugin": "@kbn/core-saved-objects-server-internal", "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts" diff --git a/api_docs/data.mdx b/api_docs/data.mdx index cdf2c82320ff0..7287e82ef5e88 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index ba1938c7b69d7..b0d5df0ce031d 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.devdocs.json b/api_docs/data_query.devdocs.json index eec375eb64279..fede5071491b0 100644 --- a/api_docs/data_query.devdocs.json +++ b/api_docs/data_query.devdocs.json @@ -4534,7 +4534,7 @@ "\nConverts QueryState to expression AST" ], "signature": [ - "({\n filters,\n query,\n inputQuery,\n time,\n dataView,\n titleForInspector,\n descriptionForInspector,\n}: Args) => Promise<", + "({\n filters,\n query,\n inputQuery,\n time,\n timeFieldName,\n titleForInspector,\n descriptionForInspector,\n}: Args) => Promise<", { "pluginId": "expressions", "scope": "common", @@ -4553,7 +4553,7 @@ "id": "def-common.textBasedQueryStateToAstWithValidation.$1", "type": "Object", "tags": [], - "label": "{\n filters,\n query,\n inputQuery,\n time,\n dataView,\n titleForInspector,\n descriptionForInspector,\n}", + "label": "{\n filters,\n query,\n inputQuery,\n time,\n timeFieldName,\n titleForInspector,\n descriptionForInspector,\n}", "description": [], "signature": [ "Args" diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 0f4e5dde32689..2c27762a3d7f5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 5eb53062eff14..9acadb55dab4b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 6701cddffed8d..ff754a8641a22 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index cadeae6860044..3d60015413b05 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index d11847beba423..40620b2734182 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 7857c22209fa2..84ce91056da14 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-12-10 +date: 2024-12-12 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 44f3daa2ba276..13983d2b2e3c1 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -427,14 +427,14 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" + }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" @@ -8301,14 +8301,14 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" + }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" @@ -14159,16 +14159,20 @@ "path": "x-pack/plugins/graph/public/state_management/persistence.ts" }, { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts" + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" }, { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts" + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" }, { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts" + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" + }, + { + "plugin": "timelines", + "path": "x-pack/plugins/timelines/server/search_strategy/index_fields/index.ts" }, { "plugin": "exploratoryView", @@ -14199,28 +14203,24 @@ "path": "x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx" }, { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/external_links.tsx" }, { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts" + "plugin": "graph", + "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" }, { - "plugin": "timelines", - "path": "x-pack/plugins/timelines/server/search_strategy/index_fields/index.ts" + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts" }, { - "plugin": "upgradeAssistant", - "path": "x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/external_links.tsx" + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts" }, { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts" }, { "plugin": "uptime", @@ -16824,14 +16824,14 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts" + }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" @@ -26028,6 +26028,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server-internal", "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts" @@ -26040,10 +26044,6 @@ "plugin": "@kbn/core-saved-objects-server-internal", "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 6515a5af9a5fe..9c3efd1f09420 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index d25f0a7edcdda..9859e4b4c564a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 2ad67db089ee3..cc443b089f15a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 9a20272c7302b..45b7b1db89849 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,12 +17,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, controls, lens, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, securitySolution, timelines, upgradeAssistant, uptime, ux, maps, transform, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | +| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, controls, lens, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, securitySolution, timelines, exploratoryView, stackAlerts, upgradeAssistant, visTypeTimeseries, uptime, ux, maps, transform, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | ml, securitySolution | - | | | actions, savedObjectsTagging, ml, enterpriseSearch | - | -| | @kbn/core-saved-objects-browser-internal, @kbn/core, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-http-router-server-internal, @kbn/core-http-server-internal, @kbn/core-metrics-server-internal, @kbn/core-status-server-internal, @kbn/core-i18n-server-internal, @kbn/core-rendering-server-internal, @kbn/core-capabilities-server-internal, @kbn/core-apps-server-internal, usageCollection, taskManager, security, monitoringCollection, files, banners, telemetry, securitySolution, @kbn/test-suites-xpack, cloudFullStory, customBranding, enterpriseSearch, interactiveSetup, mockIdpPlugin, spaces, ml | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation | - | | | @kbn/core, embeddable, savedObjects, visualizations, canvas, graph, ml | - | -| | @kbn/core-saved-objects-base-server-internal, @kbn/core-saved-objects-migration-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-ui-settings-server-internal, @kbn/core-usage-data-server-internal, taskManager, dataViews, spaces, share, actions, data, alerting, dashboard, @kbn/core-saved-objects-migration-server-mocks, savedSearch, canvas, lens, cases, fleet, cloudSecurityPosture, ml, graph, lists, maps, visualizations, apmDataAccess, infra, securitySolution, apm, slo, synthetics, uptime, eventAnnotation, links, savedObjectsManagement, @kbn/core-test-helpers-so-type-serializer, @kbn/core-saved-objects-api-server-internal | - | +| | @kbn/core-saved-objects-base-server-internal, @kbn/core-saved-objects-migration-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-ui-settings-server-internal, @kbn/core-usage-data-server-internal, taskManager, dataViews, spaces, share, actions, data, alerting, dashboard, @kbn/core-saved-objects-migration-server-mocks, savedSearch, canvas, lens, cases, fleet, cloudSecurityPosture, ml, graph, lists, maps, securitySolution, apmDataAccess, apm, visualizations, infra, slo, synthetics, uptime, eventAnnotation, links, savedObjectsManagement, @kbn/core-test-helpers-so-type-serializer, @kbn/core-saved-objects-api-server-internal | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | | | graph, stackAlerts, inputControlVis, securitySolution | - | | | dataVisualizer, stackAlerts, expressionPartitionVis | - | @@ -33,8 +34,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | ruleRegistry, securitySolution, slo | - | | | security, actions, alerting, ruleRegistry, files, cases, fleet, securitySolution | - | | | alerting, securitySolution | - | -| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-browser-mocks, fleet, graph, lists, osquery, securitySolution, alerting | - | -| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-browser-mocks, fleet, graph, lists, osquery, securitySolution, alerting | - | +| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | +| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | alerting, securitySolution | - | | | securitySolution | - | | | cloudDefend, securitySolution, synthetics | - | @@ -46,10 +47,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/securitysolution-data-table, securitySolution | - | | | securitySolution | - | | | securitySolution | - | -| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-browser-mocks, fleet, graph, lists, osquery, securitySolution, alerting | - | +| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-common, @kbn/core-saved-objects-server, @kbn/core, @kbn/alerting-types, alerting, actions, savedSearch, canvas, enterpriseSearch, securitySolution, taskManager, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-api-server | - | -| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, savedObjectsTagging, home, canvas, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-ui-settings-server-internal | - | -| | @kbn/core-saved-objects-migration-server-internal, dataViews, actions, data, alerting, dashboard, savedSearch, canvas, lens, cases, savedObjectsTagging, graph, lists, maps, visualizations, securitySolution, @kbn/core-test-helpers-so-type-serializer | - | +| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core-saved-objects-browser-mocks, @kbn/core, savedObjectsTagging, home, canvas, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-ui-settings-server-internal | - | +| | @kbn/core-saved-objects-migration-server-internal, dataViews, actions, data, alerting, dashboard, savedSearch, canvas, lens, cases, savedObjectsTagging, graph, lists, maps, securitySolution, visualizations, @kbn/core-test-helpers-so-type-serializer | - | | | security, securitySolution, cloudLinks, cases | - | | | security, cases, searchPlayground, securitySolution | - | | | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - | @@ -66,13 +67,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | @kbn/monaco, securitySolution | - | | | cloudSecurityPosture, securitySolution | - | -| | alerting, observabilityAIAssistant, fleet, cloudSecurityPosture, entityManager, apm, serverlessSearch, upgradeAssistant, synthetics, transform, security | - | +| | alerting, observabilityAIAssistant, fleet, cloudSecurityPosture, apm, serverlessSearch, upgradeAssistant, entityManager, synthetics, transform, security | - | | | actions, alerting | - | | | monitoring | - | +| | observabilityShared, monitoring | - | | | @kbn/core-saved-objects-api-browser, @kbn/core, savedObjectsManagement, savedObjects, visualizations, savedObjectsTagging, eventAnnotation, lens, maps, graph, dashboard, kibanaUtils, expressions, data, savedObjectsTaggingOss, embeddable, uiActionsEnhanced, controls, canvas, dashboardEnhanced, globalSearchProviders | - | -| | @kbn/core-saved-objects-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, home, visualizations, lens, visTypeTimeseries, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-saved-objects-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core, home, visualizations, lens, visTypeTimeseries | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks | - | -| | home, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | +| | @kbn/core-saved-objects-browser-mocks, home, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, visualizations | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | @@ -97,15 +99,15 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal | - | -| | @kbn/core-lifecycle-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, visualizations, exploratoryView, transform, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-lifecycle-browser, @kbn/core, visualizations, exploratoryView, transform | - | +| | @kbn/core-saved-objects-browser-mocks, @kbn/core-root-browser-internal | - | | | @kbn/core-saved-objects-api-server-internal | - | | | @kbn/core-saved-objects-api-server-internal | - | | | @kbn/core-saved-objects-api-server-internal, canvas | - | | | @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-migration-server-internal, spaces, data, dashboard, savedSearch, cloudSecurityPosture, visualizations, @kbn/core-test-helpers-so-type-serializer | - | -| | @kbn/core-root-browser-internal, @kbn/core-saved-objects-browser-mocks | - | -| | fleet, exploratoryView, osquery, synthetics | - | +| | fleet, osquery, exploratoryView, synthetics | - | | | @kbn/security-plugin-types-server, telemetry, fleet, profiling, @kbn/security-authorization-core, security | - | -| | @kbn/core-application-browser-internal, management, @kbn/core-application-browser-mocks, assetInventory, fleet, security, kibanaOverview, @kbn/core | - | +| | @kbn/core-application-browser-internal, @kbn/core-application-browser-mocks, management, assetInventory, fleet, security, kibanaOverview, @kbn/core | - | | | graph, visTypeTimeseries, dataViewManagement, dataViews | - | | | graph, visTypeTimeseries, dataViewManagement, dataViews | - | | | graph, visTypeTimeseries, dataViewManagement | - | @@ -123,12 +125,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | lens, dashboard, maps | - | | | dataViewManagement | - | | | dataViewManagement | - | -| | data, discover, imageEmbeddable, embeddable | - | +| | data, discover, imageEmbeddable | - | | | spaces, savedObjectsManagement | - | | | unifiedSearch | - | | | unifiedSearch | - | | | @kbn/core, lens | - | -| | dashboard, canvas | - | | | canvas | - | | | canvas | - | | | canvas | - | @@ -142,9 +143,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | enterpriseSearch | - | | | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | -| | dashboard, investigateApp | - | -| | dashboard | - | -| | embeddable, dashboard | - | | | embeddableEnhanced | - | | | embeddableEnhanced | - | | | uiActionsEnhanced | - | @@ -153,10 +151,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | visTypePie | - | | | @kbn/core-logging-server-internal, security | - | | | security | - | -| | observabilityShared | - | | | aiAssistantManagementSelection, observabilityAiAssistantManagement | - | | | @kbn/react-kibana-context-styled, kibanaReact | - | | | indexLifecycleManagement | - | +| | embeddable, dashboard | - | +| | dashboard | - | | | @kbn/reporting-public, discover | - | | | discover, @kbn/management-settings-field-definition | - | | | @kbn/content-management-table-list-view, filesManagement | - | @@ -206,7 +205,9 @@ Safe to remove. | | data | | | data | | | embeddableEnhanced | +| | embeddable | | | embeddable | +| | embeddable | | | expressionGauge | | | expressionGauge | | | expressions | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 3f8958aabf462..5f242610865f2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -75,6 +75,22 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/core-apps-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [bundles_route.ts](https://github.com/elastic/kibana/tree/main/packages/core/apps/core-apps-server-internal/src/bundle_routes/bundles_route.ts#:~:text=authRequired), [core_app.ts](https://github.com/elastic/kibana/tree/main/packages/core/apps/core-apps-server-internal/src/core_app.ts#:~:text=authRequired), [core_app.ts](https://github.com/elastic/kibana/tree/main/packages/core/apps/core-apps-server-internal/src/core_app.ts#:~:text=authRequired) | - | + + + +## @kbn/core-capabilities-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [resolve_capabilities.ts](https://github.com/elastic/kibana/tree/main/packages/core/capabilities/core-capabilities-server-internal/src/routes/resolve_capabilities.ts#:~:text=authRequired) | - | + + + ## @kbn/core-elasticsearch-server-internal | Deprecated API | Reference location(s) | Remove By | @@ -83,6 +99,30 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/core-http-router-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [security_route_config_validator.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts#:~:text=authRequired), [security_route_config_validator.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts#:~:text=authRequired), [core_versioned_route.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired), [request.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-router-server-internal/src/request.test.ts#:~:text=authRequired)+ 3 more | - | + + + +## @kbn/core-http-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [http_server.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-server-internal/src/http_server.ts#:~:text=authRequired), [http_server.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-server-internal/src/http_server.ts#:~:text=authRequired), [auth.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-server-internal/src/lifecycle/auth.ts#:~:text=authRequired), [auth.ts](https://github.com/elastic/kibana/tree/main/packages/core/http/core-http-server-internal/src/lifecycle/auth.ts#:~:text=authRequired) | - | + + + +## @kbn/core-i18n-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [translations.ts](https://github.com/elastic/kibana/tree/main/packages/core/i18n/core-i18n-server-internal/src/routes/translations.ts#:~:text=authRequired) | - | + + + ## @kbn/core-lifecycle-browser | Deprecated API | Reference location(s) | Remove By | @@ -107,6 +147,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/core-metrics-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [elu_history.ts](https://github.com/elastic/kibana/tree/main/packages/core/metrics/core-metrics-server-internal/src/routes/elu_history.ts#:~:text=authRequired) | - | + + + ## @kbn/core-plugins-browser-internal | Deprecated API | Reference location(s) | Remove By | @@ -125,6 +173,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/core-rendering-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [register_bootstrap_route.ts](https://github.com/elastic/kibana/tree/main/packages/core/rendering/core-rendering-server-internal/src/bootstrap/register_bootstrap_route.ts#:~:text=authRequired) | - | + + + ## @kbn/core-root-browser-internal | Deprecated API | Reference location(s) | Remove By | @@ -310,6 +366,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/core-status-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [status.ts](https://github.com/elastic/kibana/tree/main/packages/core/status/core-status-server-internal/src/routes/status.ts#:~:text=authRequired), [status_preboot.ts](https://github.com/elastic/kibana/tree/main/packages/core/status/core-status-server-internal/src/routes/status_preboot.ts#:~:text=authRequired) | - | + + + ## @kbn/core-test-helpers-so-type-serializer | Deprecated API | Reference location(s) | Remove By | @@ -472,6 +536,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/test-suites-xpack + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [pagerduty_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/pagerduty_simulation.ts#:~:text=authRequired), [servicenow_oauth_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/servicenow_oauth_simulation.ts#:~:text=authRequired), [jira_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts#:~:text=authRequired), [jira_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts#:~:text=authRequired), [jira_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts#:~:text=authRequired), [jira_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts#:~:text=authRequired), [jira_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts#:~:text=authRequired), [resilient_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts#:~:text=authRequired), [resilient_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts#:~:text=authRequired), [resilient_simulation.ts](https://github.com/elastic/kibana/tree/main/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts#:~:text=authRequired)+ 8 more | - | + + + ## @kbn/unified-field-list | Deprecated API | Reference location(s) | Remove By | @@ -561,13 +633,20 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## banners + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [info.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/banners/server/routes/info.ts#:~:text=authRequired) | - | + + + ## canvas | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [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=EmbeddablePanel), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx#:~:text=EmbeddablePanel) | - | -| | [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx#:~:text=getEmbeddableFactories), [editor_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx#:~:text=getEmbeddableFactories) | - | +| | [editor_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx#:~: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), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.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), [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) | - | | | [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | @@ -613,6 +692,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## cloudFullStory + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [fullstory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_full_story/server/routes/fullstory.ts#:~:text=authRequired) | - | + + + ## cloudLinks | Deprecated API | Reference location(s) | Remove By | @@ -657,12 +744,18 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## customBranding + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [info.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/custom_branding/server/routes/info.ts#:~:text=authRequired) | - | + + + ## dashboard | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [dashboard_grid_item.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx#:~:text=EmbeddablePanel), [dashboard_grid_item.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx#:~:text=EmbeddablePanel) | - | -| | [migrate_dashboard_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.ts#:~:text=getEmbeddableFactory), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=getEmbeddableFactory), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=getEmbeddableFactory), [create_dashboard.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts#:~:text=getEmbeddableFactory), [create_dashboard.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts#:~:text=getEmbeddableFactory), [create_dashboard.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts#:~:text=getEmbeddableFactory), [migrate_dashboard_input.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts#:~:text=getEmbeddableFactory), [migrate_dashboard_input.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts#:~:text=getEmbeddableFactory), [migrate_dashboard_input.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts#:~:text=getEmbeddableFactory), [migrate_dashboard_input.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts#:~:text=getEmbeddableFactory)+ 1 more | - | | | [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) | 8.8.0 | | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/common/bwc/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/common/bwc/types.ts#:~:text=SavedObjectReference) | - | | | [dashboard_saved_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/dashboard_saved_object/dashboard_saved_object.ts#:~:text=migrations) | - | @@ -762,7 +855,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [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 | -| | [helpers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/helpers.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [explicit_input.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/explicit_input.test.ts#:~:text=executeTriggerActions) | - | | | [default_embeddable_factory_provider.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/embeddables/default_embeddable_factory_provider.ts#:~:text=SavedObjectAttributes), [default_embeddable_factory_provider.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/embeddables/default_embeddable_factory_provider.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/types.ts#:~:text=SavedObjectAttributes) | - | | | [migrate_base_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/common/lib/migrate_base_input.ts#:~:text=SavedObjectReference), [migrate_base_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/common/lib/migrate_base_input.ts#:~:text=SavedObjectReference), [migrate_base_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/common/lib/migrate_base_input.ts#:~:text=SavedObjectReference), [inject.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/common/lib/inject.ts#:~:text=SavedObjectReference), [inject.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/common/lib/inject.ts#:~:text=SavedObjectReference) | - | | | [i_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts#:~:text=HasLegacyLibraryTransforms), [i_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts#:~:text=HasLegacyLibraryTransforms) | - | @@ -794,6 +886,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [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) | - | +| | [route_config_helpers.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/route_config_helpers.test.ts#:~:text=authRequired) | - | | | [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes) | - | @@ -862,6 +955,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [download.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/routes/public_facing/download.ts#:~:text=authRequired) | - | | | [file_service_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/file_service/file_service_factory.ts#:~:text=audit), [file_service_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/file_service/file_service_factory.ts#:~:text=audit) | - | @@ -973,11 +1067,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## investigateApp +## interactiveSetup | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [register_embeddable_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/investigate_app/public/items/embeddable_item/register_embeddable_item.tsx#:~:text=getEmbeddableFactory) | - | +| | [configure.ts](https://github.com/elastic/kibana/tree/main/src/plugins/interactive_setup/server/routes/configure.ts#:~:text=authRequired), [enroll.ts](https://github.com/elastic/kibana/tree/main/src/plugins/interactive_setup/server/routes/enroll.ts#:~:text=authRequired), [ping.ts](https://github.com/elastic/kibana/tree/main/src/plugins/interactive_setup/server/routes/ping.ts#:~:text=authRequired), [status.ts](https://github.com/elastic/kibana/tree/main/src/plugins/interactive_setup/server/routes/status.ts#:~:text=authRequired), [verify.ts](https://github.com/elastic/kibana/tree/main/src/plugins/interactive_setup/server/routes/verify.ts#:~:text=authRequired) | - | @@ -1107,17 +1201,35 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [annotations.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/routes/annotations.ts#:~:text=authc) | - | | | [initialization.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/saved_objects/initialization/initialization.ts#:~:text=authz), [sync_task.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/saved_objects/sync_task.ts#:~:text=authz), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/plugin.ts#:~:text=authz), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/plugin.ts#:~:text=authz) | - | +| | [capabilities_switcher.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/lib/capabilities/capabilities_switcher.ts#:~:text=authRequired) | - | | | [kibana.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/common/types/kibana.ts#:~:text=SimpleSavedObject), [kibana.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/common/types/kibana.ts#:~:text=SimpleSavedObject) | - | | | [modules.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/common/types/modules.ts#:~:text=SavedObjectAttributes), [modules.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/common/types/modules.ts#:~:text=SavedObjectAttributes) | - | | | [saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/saved_objects/saved_objects.ts#:~:text=migrations), [saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/saved_objects/saved_objects.ts#:~:text=migrations), [saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/ml/server/saved_objects/saved_objects.ts#:~:text=migrations) | - | +## mockIdpPlugin + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-mock-idp-plugin/server/plugin.ts#:~:text=authRequired), [plugin.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-mock-idp-plugin/server/plugin.ts#:~:text=authRequired), [plugin.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-mock-idp-plugin/server/plugin.ts#:~:text=authRequired), [plugin.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-mock-idp-plugin/server/plugin.ts#:~:text=authRequired) | - | + + + ## monitoring | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [url_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/url_state.ts#:~:text=syncQueryStateWithUrl), [url_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/url_state.ts#:~:text=syncQueryStateWithUrl) | - | +| | [header_menu_portal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/header_menu/header_menu_portal.tsx#:~:text=toMountPoint), [header_menu_portal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/header_menu/header_menu_portal.tsx#:~:text=toMountPoint) | - | + + + +## monitoringCollection + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [get_metrics_by_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.ts#:~:text=authRequired), [get_metrics.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring_collection/server/routes/api/v1/prometheus/get_metrics.ts#:~:text=authRequired) | - | @@ -1314,6 +1426,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | 8.8.0 | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [logout_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=appBasePath) | - | +| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/common.ts#:~:text=authRequired), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/common.ts#:~:text=authRequired), [oidc.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/oidc.ts#:~:text=authRequired), [oidc.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/oidc.ts#:~:text=authRequired), [oidc.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/oidc.ts#:~:text=authRequired), [oidc.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/oidc.ts#:~:text=authRequired), [oidc.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/oidc.ts#:~:text=authRequired), [saml.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authentication/saml.ts#:~:text=authRequired), [reset_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/authorization/reset_session_page.ts#:~:text=authRequired), [capture_url.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/routes/views/capture_url.ts#:~:text=authRequired)+ 12 more | - | | | [config.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/config.ts#:~:text=max) | - | | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=authc) | - | | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=authc) | - | @@ -1352,6 +1465,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields)+ 70 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyRequest), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyRequest) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyResponse), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyResponse) | - | +| | [agent_status_handler.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/agent/agent_status_handler.ts#:~:text=authRequired), [resolver.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts#:~:text=authRequired), [resolver.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts#:~:text=authRequired), [resolver.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts#:~:text=authRequired), [update_insight.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/workflow_insights/update_insight.ts#:~:text=authRequired), [get_insights.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/workflow_insights/get_insights.ts#:~:text=authRequired), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts#:~:text=authRequired), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts#:~:text=authRequired), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts#:~:text=authRequired), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/policy/index.ts#:~:text=authRequired)+ 19 more | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/types.ts#:~:text=SimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/types.ts#:~:text=SimpleSavedObject) | - | | | [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion)+ 34 more | - | | | [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes), [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes) | - | @@ -1418,6 +1532,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | ---------------|-----------|-----------| | | [on_post_auth_interceptor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.ts#:~:text=getKibanaFeatures), [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=getKibanaFeatures), [on_post_auth_interceptor.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.test.ts#:~:text=getKibanaFeatures) | 8.8.0 | | | [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24) | 8.8.0 | +| | [capabilities_switcher.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts#:~:text=authRequired) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/legacy_urls/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/legacy_urls/types.ts#:~:text=ResolvedSimpleSavedObject) | - | | | [copy_to_space_flyout_internal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx#:~:text=createNewCopy) | - | | | [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.ts#:~:text=migrations), [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.ts#:~:text=migrations) | - | @@ -1454,6 +1569,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [background_task_utilization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/routes/background_task_utilization.ts#:~:text=authRequired), [background_task_utilization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts#:~:text=authRequired), [background_task_utilization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts#:~:text=authRequired), [background_task_utilization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts#:~:text=authRequired), [background_task_utilization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts#:~:text=authRequired) | - | | | [task_store.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/task_store.test.ts#:~:text=SavedObjectAttributes), [task_store.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/task_store.test.ts#:~:text=SavedObjectAttributes), [task_store.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/task_store.test.ts#:~:text=SavedObjectAttributes), [task_store.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/task_store.test.ts#:~:text=SavedObjectAttributes), [task_store.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/task_store.test.ts#:~:text=SavedObjectAttributes), [task_store.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/task_store.test.ts#:~:text=SavedObjectAttributes) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/task_manager/server/saved_objects/index.ts#:~:text=migrations) | - | @@ -1464,6 +1580,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [telemetry_usage_stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/telemetry/server/routes/telemetry_usage_stats.ts#:~:text=get), [telemetry_usage_stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/telemetry/server/routes/telemetry_usage_stats.ts#:~:text=get) | - | +| | [telemetry_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/telemetry/server/routes/telemetry_config.ts#:~:text=authRequired) | - | @@ -1546,6 +1663,14 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## usageCollection + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/usage_collection/server/routes/stats/stats.ts#:~:text=authRequired) | - | + + + ## ux | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 9d0be81c71e9a..8cfd5d005e4a4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -42,7 +42,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), [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), [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) | 8.8.0 | +| embeddable | | [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), [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) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 120607e83301d..b1f0ebe643d18 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index 8536402e375e1..bfe67f68a1f5c 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -4710,10 +4710,6 @@ "plugin": "fleet", "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/hooks/use_get_logs_discover_link.tsx" }, - { - "plugin": "exploratoryView", - "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/hooks/use_discover_link.tsx" - }, { "plugin": "osquery", "path": "x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx" @@ -4726,6 +4722,10 @@ "plugin": "osquery", "path": "x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx" }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/hooks/use_discover_link.tsx" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx" diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 65ee06b1e48b5..b69e27c3f325d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index db1b8f1e5cc3d..d1c4000eed832 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 174c8d5113416..b94af33b7878b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index b6eeb24fdb051..eb822d959d6b6 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-12-10 +date: 2024-12-12 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 6292df433806a..953a10650dc73 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -1944,26 +1944,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "elasticAssistant", - "id": "def-server.ElasticAssistantPluginStartDependencies.security", - "type": "Object", - "tags": [], - "label": "security", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "server", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-server.SecurityServiceStart", - "text": "SecurityServiceStart" - } - ], - "path": "x-pack/plugins/elastic_assistant/server/types.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "elasticAssistant", "id": "def-server.ElasticAssistantPluginStartDependencies.licensing", diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 6b43f2332caf1..30384b46d9743 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 56 | 0 | 41 | 2 | +| 55 | 0 | 40 | 2 | ## Server diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 23bb84e398ae2..aa4060c72e4fb 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -8189,24 +8189,7 @@ "path": "src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx", "deprecated": true, "trackAdoption": false, - "references": [ - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx" - }, - { - "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx" - }, - { - "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx" - } - ], + "references": [], "children": [ { "parentPluginId": "embeddable", @@ -8227,99 +8210,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableRenderer", - "type": "Function", - "tags": [], - "label": "EmbeddableRenderer", - "description": [ - "\nHelper react component to render an embeddable\nCan be used if you have an embeddable object or an embeddable factory\nSupports updating input by passing `input` prop\n" - ], - "signature": [ - "(props: ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.EmbeddableRendererProps", - "text": "EmbeddableRendererProps" - }, - ") => React.JSX.Element" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableRenderer.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [ - "- {@link EmbeddableRendererProps }" - ], - "signature": [ - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.EmbeddableRendererProps", - "text": "EmbeddableRendererProps" - }, - "" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableRoot", - "type": "Function", - "tags": [], - "label": "EmbeddableRoot", - "description": [], - "signature": [ - "({ embeddable, loading, error, input }: Props) => React.JSX.Element" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_root.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableRoot.$1", - "type": "Object", - "tags": [], - "label": "{ embeddable, loading, error, input }", - "description": [], - "signature": [ - "Props" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_root.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "embeddable", "id": "def-public.genericEmbeddableInputIsEqual", @@ -9163,7 +9053,7 @@ "section": "def-public.PresentationPanelProps", "text": "PresentationPanelProps" }, - ", \"showShadow\" | \"showBorder\" | \"showBadges\" | \"showNotifications\" | \"hideLoader\" | \"hideHeader\" | \"hideInspector\" | \"getActions\"> | undefined; hidePanelChrome?: boolean | undefined; onAnyStateChange?: ((state: ", + ", \"showShadow\" | \"showBorder\" | \"showBadges\" | \"showNotifications\" | \"hideLoader\" | \"hideHeader\" | \"hideInspector\" | \"getActions\" | \"setDragHandles\"> | undefined; hidePanelChrome?: boolean | undefined; onAnyStateChange?: ((state: ", { "pluginId": "@kbn/presentation-containers", "scope": "public", @@ -9277,7 +9167,7 @@ "section": "def-public.PresentationPanelProps", "text": "PresentationPanelProps" }, - ", \"showShadow\" | \"showBorder\" | \"showBadges\" | \"showNotifications\" | \"hideLoader\" | \"hideHeader\" | \"hideInspector\" | \"getActions\"> | undefined" + ", \"showShadow\" | \"showBorder\" | \"showBadges\" | \"showNotifications\" | \"hideLoader\" | \"hideHeader\" | \"hideInspector\" | \"getActions\" | \"setDragHandles\"> | undefined" ], "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx", "deprecated": false, @@ -9565,63 +9455,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "embeddable", - "id": "def-public.useEmbeddableFactory", - "type": "Function", - "tags": [], - "label": "useEmbeddableFactory", - "description": [], - "signature": [ - "({\n input,\n factory,\n onInputUpdated,\n}: EmbeddableRendererWithFactory) => readonly [", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.ErrorEmbeddable", - "text": "ErrorEmbeddable" - }, - " | ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.IEmbeddable", - "text": "IEmbeddable" - }, - " | undefined, boolean, string | undefined]" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "embeddable", - "id": "def-public.useEmbeddableFactory.$1", - "type": "Object", - "tags": [], - "label": "{\n input,\n factory,\n onInputUpdated,\n}", - "description": [], - "signature": [ - "EmbeddableRendererWithFactory" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "embeddable", "id": "def-public.withEmbeddableSubscription", @@ -13648,23 +13481,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableRendererProps", - "type": "Type", - "tags": [], - "label": "EmbeddableRendererProps", - "description": [ - "\nThis type is a publicly exposed props of {@link EmbeddableRenderer}\nUnion is used to validate that or factory or embeddable is passed in, but it can't be both simultaneously\nIn case when embeddable is passed in, input is optional, because there is already an input inside of embeddable object\nIn case when factory is used, then input is required, because it will be used as initial input to create an embeddable object" - ], - "signature": [ - "EmbeddableRendererPropsWithEmbeddable | EmbeddableRendererWithFactory" - ], - "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "embeddable", "id": "def-public.MULTI_VALUE_CLICK_TRIGGER", @@ -14831,40 +14647,6 @@ "deprecated": false, "trackAdoption": false, "children": [ - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableStart.reactEmbeddableRegistryHasKey", - "type": "Function", - "tags": [], - "label": "reactEmbeddableRegistryHasKey", - "description": [ - "\nChecks if a {@link ReactEmbeddableFactory} has been registered using {@link registerReactEmbeddableFactory}" - ], - "signature": [ - "(type: string) => boolean" - ], - "path": "src/plugins/embeddable/public/plugin.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddableStart.reactEmbeddableRegistryHasKey.$1", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/embeddable/public/plugin.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, { "parentPluginId": "embeddable", "id": "def-public.EmbeddableStart.getEmbeddableFactory", @@ -14944,56 +14726,7 @@ "path": "src/plugins/embeddable/public/plugin.tsx", "deprecated": true, "trackAdoption": false, - "references": [ - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx" - }, - { - "plugin": "investigateApp", - "path": "x-pack/plugins/observability_solution/investigate_app/public/items/embeddable_item/register_embeddable_item.tsx" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/services/dashboard_content_management_service/lib/migrate_dashboard_input.test.ts" - } - ], + "references": [], "children": [ { "parentPluginId": "embeddable", @@ -15085,10 +14818,6 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx" - }, { "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx" diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 322a77db05fd8..3abd689a4c61c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 571 | 1 | 462 | 9 | +| 562 | 1 | 457 | 9 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 27b652f7f4eae..d32808002b4f6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 82b512914871e..43e310874f59d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index f5e294b712406..c1472e01724ac 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index 4fc0397643c0a..dd4a94925ed77 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.devdocs.json b/api_docs/entity_manager.devdocs.json index 9359e3ca7c1d7..74ee98abc3485 100644 --- a/api_docs/entity_manager.devdocs.json +++ b/api_docs/entity_manager.devdocs.json @@ -65,7 +65,7 @@ "section": "def-server.IKibanaResponse", "text": "IKibanaResponse" }, - "<{ source: { id: string; filters: string[]; metadata_fields: string[]; type_id: string; index_patterns: string[]; identity_fields: string[]; timestamp_field?: string | undefined; display_name?: string | undefined; }; }>, undefined>; \"GET /internal/entities/v2/definitions/types\": { endpoint: \"GET /internal/entities/v2/definitions/types\"; handler: ServerRouteHandler<", + ", undefined>; \"GET /internal/entities/v2/definitions/types\": { endpoint: \"GET /internal/entities/v2/definitions/types\"; handler: ServerRouteHandler<", "EntityManagerRouteHandlerResources", ", undefined, ", { @@ -75,7 +75,7 @@ "section": "def-server.IKibanaResponse", "text": "IKibanaResponse" }, - "<{ types: { id: string; }[]; }>>; security?: ", + "<{ types: { id: string; display_name: string; }[]; }>>; security?: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -91,7 +91,7 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"POST /internal/entities/v2/definitions/types\", Zod.ZodObject<{ body: Zod.ZodObject<{ type: Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>; }, \"strip\", Zod.ZodTypeAny, { type: { id: string; }; }, { type: { id: string; }; }>; }, \"strip\", Zod.ZodTypeAny, { body: { type: { id: string; }; }; }, { body: { type: { id: string; }; }; }>, ", + "<\"POST /internal/entities/v2/definitions/types\", Zod.ZodObject<{ body: Zod.ZodObject<{ type: Zod.ZodObject<{ id: Zod.ZodString; display_name: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; display_name: string; }, { id: string; display_name: string; }>; }, \"strip\", Zod.ZodTypeAny, { type: { id: string; display_name: string; }; }, { type: { id: string; display_name: string; }; }>; }, \"strip\", Zod.ZodTypeAny, { body: { type: { id: string; display_name: string; }; }; }, { body: { type: { id: string; display_name: string; }; }; }>, ", "EntityManagerRouteHandlerResources", ", ", { @@ -485,7 +485,7 @@ "section": "def-server.IKibanaResponse", "text": "IKibanaResponse" }, - "<{ source: { id: string; filters: string[]; metadata_fields: string[]; type_id: string; index_patterns: string[]; identity_fields: string[]; timestamp_field?: string | undefined; display_name?: string | undefined; }; }>, undefined>; \"GET /internal/entities/v2/definitions/types\": { endpoint: \"GET /internal/entities/v2/definitions/types\"; handler: ServerRouteHandler<", + ", undefined>; \"GET /internal/entities/v2/definitions/types\": { endpoint: \"GET /internal/entities/v2/definitions/types\"; handler: ServerRouteHandler<", "EntityManagerRouteHandlerResources", ", undefined, ", { @@ -495,7 +495,7 @@ "section": "def-server.IKibanaResponse", "text": "IKibanaResponse" }, - "<{ types: { id: string; }[]; }>>; security?: ", + "<{ types: { id: string; display_name: string; }[]; }>>; security?: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -511,7 +511,7 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"POST /internal/entities/v2/definitions/types\", Zod.ZodObject<{ body: Zod.ZodObject<{ type: Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>; }, \"strip\", Zod.ZodTypeAny, { type: { id: string; }; }, { type: { id: string; }; }>; }, \"strip\", Zod.ZodTypeAny, { body: { type: { id: string; }; }; }, { body: { type: { id: string; }; }; }>, ", + "<\"POST /internal/entities/v2/definitions/types\", Zod.ZodObject<{ body: Zod.ZodObject<{ type: Zod.ZodObject<{ id: Zod.ZodString; display_name: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; display_name: string; }, { id: string; display_name: string; }>; }, \"strip\", Zod.ZodTypeAny, { type: { id: string; display_name: string; }; }, { type: { id: string; display_name: string; }; }>; }, \"strip\", Zod.ZodTypeAny, { body: { type: { id: string; display_name: string; }; }; }, { body: { type: { id: string; display_name: string; }; }; }>, ", "EntityManagerRouteHandlerResources", ", ", { @@ -1494,7 +1494,7 @@ "section": "def-server.IKibanaResponse", "text": "IKibanaResponse" }, - "<{ source: { id: string; filters: string[]; metadata_fields: string[]; type_id: string; index_patterns: string[]; identity_fields: string[]; timestamp_field?: string | undefined; display_name?: string | undefined; }; }>, undefined>; \"GET /internal/entities/v2/definitions/types\": { endpoint: \"GET /internal/entities/v2/definitions/types\"; handler: ServerRouteHandler<", + ", undefined>; \"GET /internal/entities/v2/definitions/types\": { endpoint: \"GET /internal/entities/v2/definitions/types\"; handler: ServerRouteHandler<", "EntityManagerRouteHandlerResources", ", undefined, ", { @@ -1504,7 +1504,7 @@ "section": "def-server.IKibanaResponse", "text": "IKibanaResponse" }, - "<{ types: { id: string; }[]; }>>; security?: ", + "<{ types: { id: string; display_name: string; }[]; }>>; security?: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -1520,7 +1520,7 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"POST /internal/entities/v2/definitions/types\", Zod.ZodObject<{ body: Zod.ZodObject<{ type: Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>; }, \"strip\", Zod.ZodTypeAny, { type: { id: string; }; }, { type: { id: string; }; }>; }, \"strip\", Zod.ZodTypeAny, { body: { type: { id: string; }; }; }, { body: { type: { id: string; }; }; }>, ", + "<\"POST /internal/entities/v2/definitions/types\", Zod.ZodObject<{ body: Zod.ZodObject<{ type: Zod.ZodObject<{ id: Zod.ZodString; display_name: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; display_name: string; }, { id: string; display_name: string; }>; }, \"strip\", Zod.ZodTypeAny, { type: { id: string; display_name: string; }; }, { type: { id: string; display_name: string; }; }>; }, \"strip\", Zod.ZodTypeAny, { body: { type: { id: string; display_name: string; }; }; }, { body: { type: { id: string; display_name: string; }; }; }>, ", "EntityManagerRouteHandlerResources", ", ", { diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index ae6ffb373ccbb..5feddfb2e6086 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index c829036ad0276..632861e161fd6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index b4ff3ce93c735..5b3fc9db79ee2 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index b5060fdb05182..bf1fd0b4206c0 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 11a33d66f096f..122743faac703 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 02d5d22af7bc7..ab93226ad8c0b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 9aa079d38af36..6181e60a90e1c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 0747f3abccb98..2c3a148e5d7b0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index c73e5e84b358b..020acbd57816d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index c635b5fe388e0..73268f02f2144 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index b093aa04f77e4..d0759b592d951 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 89335338a43bc..ccaa164aaa88f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 2e322f6395838..5203b94026240 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index d7280c0b2816e..1aee63eabc8c5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index 8383126e6833c..943695ad45e68 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -773,6 +773,14 @@ "label": "palette", "description": [], "signature": [ + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.PaletteOutput", + "text": "PaletteOutput" + }, + "<", { "pluginId": "charts", "scope": "common", @@ -780,7 +788,7 @@ "section": "def-common.CustomPaletteState", "text": "CustomPaletteState" }, - " | undefined" + "> | undefined" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", "deprecated": false, diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 9977283084d0b..0fef2e7536baa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 312c988229f07..72b0ceb726ebb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 4535d413fc816..143455a401f05 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 7d1ab6f4a9a33..51c92bd508327 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index eff56c07d1a14..4d3a4968bdce7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 734153b77ee31..3c00169d19917 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index fdf09df0f53f1..a18091604ed36 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 8228e88521717..001c15b9e3da0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index c561174f5ce55..3ad83dd85bca3 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-12-10 +date: 2024-12-12 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 b4cab8626387a..f12fc9280b47e 100644 --- a/api_docs/field_formats.devdocs.json +++ b/api_docs/field_formats.devdocs.json @@ -1210,7 +1210,7 @@ "label": "getParamDefaults", "description": [], "signature": [ - "() => { fieldType: null; colors: { range: string; regex: string; text: string; background: string; }[]; }" + "() => { fieldType: null; colors: { range: string; regex: string; text: string; background: string; boolean: string; }[]; }" ], "path": "src/plugins/field_formats/common/converters/color.tsx", "deprecated": false, @@ -1226,7 +1226,7 @@ "label": "findColorRuleForVal", "description": [], "signature": [ - "(val: string | number) => any" + "(val: string | number | boolean) => any" ], "path": "src/plugins/field_formats/common/converters/color.tsx", "deprecated": false, @@ -1240,7 +1240,7 @@ "label": "val", "description": [], "signature": [ - "string | number" + "string | number | boolean" ], "path": "src/plugins/field_formats/common/converters/color.tsx", "deprecated": false, @@ -6577,6 +6577,17 @@ "path": "src/plugins/field_formats/common/constants/color_default.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fieldFormats", + "id": "def-common.DEFAULT_CONVERTER_COLOR.boolean", + "type": "string", + "tags": [], + "label": "boolean", + "description": [], + "path": "src/plugins/field_formats/common/constants/color_default.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 768d75caea360..26061209e7e58 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.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 | |-------------------|-----------|------------------------|-----------------| -| 292 | 5 | 253 | 3 | +| 293 | 5 | 254 | 3 | ## Client diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 55d0837d9cf5a..39341ad00162b 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 612626066ad89..687e7e6540b52 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 7f4e32c22ca35..e3594d9919ddc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 0018dee49f984..fc8ffe6f2c5d9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 1c16c88a74b2d..71db9a08c384b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 63bfa4db9f189..2e4ef7a117603 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index d0591ff26bd29..ed72fe91b3e8c 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index a873a6e0b36a4..af7c1f6ea6b11 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index b013fcc8c6007..2038008dd98f7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 23b176f4d0756..0e7f7ab0cb854 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.devdocs.json b/api_docs/index_management.devdocs.json index ca65364f8319b..1d7969fa33933 100644 --- a/api_docs/index_management.devdocs.json +++ b/api_docs/index_management.devdocs.json @@ -3163,7 +3163,14 @@ "label": "indexMode", "description": [], "signature": [ - "\"standard\" | \"time_series\" | \"logsdb\"" + { + "pluginId": "indexManagement", + "scope": "common", + "docId": "kibIndexManagementPluginApi", + "section": "def-common.IndexMode", + "text": "IndexMode" + }, + " | undefined" ], "path": "x-pack/plugins/index_management/common/types/templates.ts", "deprecated": false, diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 8b38c273afb1a..a2330c94dc8aa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.devdocs.json b/api_docs/inference.devdocs.json index 4cf16dcfec9bf..1ece7676f9681 100644 --- a/api_docs/inference.devdocs.json +++ b/api_docs/inference.devdocs.json @@ -17,7 +17,7 @@ "StreamedHttpResponse", ", T>" ], - "path": "x-pack/plugins/inference/public/util/http_response_into_observable.ts", + "path": "x-pack/platform/plugins/shared/inference/public/util/http_response_into_observable.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -36,7 +36,7 @@ "tags": [], "label": "InferencePublicSetup", "description": [], - "path": "x-pack/plugins/inference/public/types.ts", + "path": "x-pack/platform/plugins/shared/inference/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -50,7 +50,7 @@ "tags": [], "label": "InferencePublicStart", "description": [], - "path": "x-pack/plugins/inference/public/types.ts", + "path": "x-pack/platform/plugins/shared/inference/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -96,7 +96,7 @@ }, "" ], - "path": "x-pack/plugins/inference/public/types.ts", + "path": "x-pack/platform/plugins/shared/inference/public/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -127,7 +127,7 @@ }, " | undefined; } & TToolOptions" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false } @@ -163,7 +163,7 @@ }, "" ], - "path": "x-pack/plugins/inference/public/types.ts", + "path": "x-pack/platform/plugins/shared/inference/public/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -185,7 +185,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false } @@ -203,7 +203,7 @@ "InferenceConnector", "[]>" ], - "path": "x-pack/plugins/inference/public/types.ts", + "path": "x-pack/platform/plugins/shared/inference/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -225,7 +225,7 @@ "label": "naturalLanguageToEsql", "description": [], "signature": [ - "({\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n functionCalling,\n ...rest\n}: ", + "({\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n functionCalling,\n system,\n ...rest\n}: ", "NlToEsqlTaskParams", ") => ", "Observable", @@ -233,7 +233,7 @@ "NlToEsqlTaskEvent", ">" ], - "path": "x-pack/plugins/inference/server/tasks/nl_to_esql/task.ts", + "path": "x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/task.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -242,13 +242,13 @@ "id": "def-server.naturalLanguageToEsql.$1", "type": "CompoundType", "tags": [], - "label": "{\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n functionCalling,\n ...rest\n}", + "label": "{\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n functionCalling,\n system,\n ...rest\n}", "description": [], "signature": [ "NlToEsqlTaskParams", "" ], - "path": "x-pack/plugins/inference/server/tasks/nl_to_esql/task.ts", + "path": "x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/task.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -268,7 +268,7 @@ "description": [ "\nA version of the {@link InferenceClient} that is pre-bound to a set of parameters." ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -316,7 +316,7 @@ }, "" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -339,7 +339,7 @@ }, "[P]; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/bound_api.ts", "deprecated": false, "trackAdoption": false } @@ -377,7 +377,7 @@ }, "" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -390,7 +390,7 @@ "label": "options", "description": [], "signature": [ - "{ id: TId; input: string; schema?: TOutputSchema | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", + "{ id: TId; input: string; schema?: TOutputSchema | undefined; retry?: { onValidationError?: number | boolean | undefined; } | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", { "pluginId": "@kbn/inference-common", "scope": "common", @@ -400,7 +400,7 @@ }, "[] | undefined; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/bound_api.ts", "deprecated": false, "trackAdoption": false } @@ -420,7 +420,7 @@ "InferenceConnector", ">" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -434,7 +434,7 @@ "signature": [ "string" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -454,7 +454,7 @@ "description": [ "\nAn inference client, scoped to a request, that can be used to interact with LLMs." ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -502,7 +502,7 @@ }, "" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -533,7 +533,7 @@ }, " | undefined; } & TToolOptions" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false } @@ -571,7 +571,7 @@ }, "" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -593,7 +593,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false } @@ -613,7 +613,7 @@ "InferenceConnector", ">" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -627,7 +627,7 @@ "signature": [ "string" ], - "path": "x-pack/plugins/inference/server/inference_client/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/inference_client/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -651,7 +651,7 @@ "description": [ "\nSetup contract of the inference plugin." ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -667,7 +667,7 @@ "description": [ "\nStart contract of the inference plugin, exposing APIs to interact with LLMs." ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -702,7 +702,7 @@ "text": "InferenceClient" } ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -716,7 +716,7 @@ "signature": [ "T" ], - "path": "x-pack/plugins/inference/server/types.ts", + "path": "x-pack/platform/plugins/shared/inference/server/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -744,7 +744,7 @@ "signature": [ "(query: string) => { input: string; output: string; isCorrection: boolean; }" ], - "path": "x-pack/plugins/inference/common/tasks/nl_to_esql/correct_esql_query.ts", + "path": "x-pack/platform/plugins/shared/inference/common/tasks/nl_to_esql/correct_esql_query.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -758,7 +758,7 @@ "signature": [ "string" ], - "path": "x-pack/plugins/inference/common/tasks/nl_to_esql/correct_esql_query.ts", + "path": "x-pack/platform/plugins/shared/inference/common/tasks/nl_to_esql/correct_esql_query.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -792,7 +792,7 @@ "text": "OutputAPI" } ], - "path": "x-pack/plugins/inference/common/output/create_output_api.ts", + "path": "x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -812,7 +812,7 @@ "text": "ChatCompleteAPI" } ], - "path": "x-pack/plugins/inference/common/output/create_output_api.ts", + "path": "x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -837,45 +837,31 @@ "section": "def-common.ChatCompleteAPI", "text": "ChatCompleteAPI" }, - ") => ({ id, connectorId, input, schema, system, previousMessages, functionCalling, stream, }: ", + ") => ({ id, connectorId, input, schema, system, previousMessages, functionCalling, stream, retry, }: DefaultOutputOptions) => Promise<", { "pluginId": "@kbn/inference-common", "scope": "common", "docId": "kibKbnInferenceCommonPluginApi", - "section": "def-common.OutputOptions", - "text": "OutputOptions" + "section": "def-common.OutputResponse", + "text": "OutputResponse" }, ") => ", - "Observable", - "<{ type: ", - { - "pluginId": "@kbn/inference-common", - "scope": "common", - "docId": "kibKbnInferenceCommonPluginApi", - "section": "def-common.OutputEventType", - "text": "OutputEventType" - }, - "; id: string; content: string; output?: undefined; } | { id: string; output: ", "AugmentedRequired", "<{ [x: string]: string | number | boolean | ", "AugmentedRequired", - " | FromToolSchemaArray | undefined; }, never> | undefined; content: string; type: ", + " | FromToolSchemaArray | undefined; }, never> | undefined>> | ", { "pluginId": "@kbn/inference-common", "scope": "common", "docId": "kibKbnInferenceCommonPluginApi", - "section": "def-common.OutputEventType", - "text": "OutputEventType" + "section": "def-common.OutputStreamResponse", + "text": "OutputStreamResponse" }, - "; }> | Promise<{ id: string; content: string; output: ", - "AugmentedRequired", - "<{ [x: string]: string | number | boolean | ", - "AugmentedRequired", - " | FromToolSchemaArray | undefined; }, never> | undefined; }>" + "" ], - "path": "x-pack/plugins/inference/common/output/create_output_api.ts", + "path": "x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -895,7 +881,7 @@ "text": "ChatCompleteAPI" } ], - "path": "x-pack/plugins/inference/common/output/create_output_api.ts", + "path": "x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -914,7 +900,7 @@ "signature": [ "() => string" ], - "path": "x-pack/plugins/inference/common/utils/generate_fake_tool_call_id.ts", + "path": "x-pack/platform/plugins/shared/inference/common/utils/generate_fake_tool_call_id.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -931,7 +917,7 @@ "signature": [ "(query: string) => { name: string | undefined; command: string; }[]" ], - "path": "x-pack/plugins/inference/common/tasks/nl_to_esql/non_ast/correct_common_esql_mistakes.ts", + "path": "x-pack/platform/plugins/shared/inference/common/tasks/nl_to_esql/non_ast/correct_common_esql_mistakes.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -945,7 +931,7 @@ "signature": [ "string" ], - "path": "x-pack/plugins/inference/common/tasks/nl_to_esql/non_ast/correct_common_esql_mistakes.ts", + "path": "x-pack/platform/plugins/shared/inference/common/tasks/nl_to_esql/non_ast/correct_common_esql_mistakes.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -963,7 +949,7 @@ "tags": [], "label": "GetConnectorsResponseBody", "description": [], - "path": "x-pack/plugins/inference/common/http_apis.ts", + "path": "x-pack/platform/plugins/shared/inference/common/http_apis.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -978,7 +964,7 @@ "InferenceConnector", "[]" ], - "path": "x-pack/plugins/inference/common/http_apis.ts", + "path": "x-pack/platform/plugins/shared/inference/common/http_apis.ts", "deprecated": false, "trackAdoption": false } @@ -1022,7 +1008,7 @@ }, "" ], - "path": "x-pack/plugins/inference/common/http_apis.ts", + "path": "x-pack/platform/plugins/shared/inference/common/http_apis.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 1bdc62e7c2b57..870cc4e82e3f5 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 6651f313b1ad9..32a7b97961520 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index fc223c19a423c..6a0e60e9790ac 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index a1cd3a60b30b5..0f0d2f48b967e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 3f2edb2b3be01..9062cb081442c 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 973d5a52acacf..0c8daae05eb8f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.devdocs.json b/api_docs/inventory.devdocs.json index 39c0d7b7c7b69..ef6aecc65a8fe 100644 --- a/api_docs/inventory.devdocs.json +++ b/api_docs/inventory.devdocs.json @@ -62,6 +62,24 @@ "InventoryRouteHandlerResources", ", { hasData: boolean; }, ", "InventoryRouteCreateOptions", + ">; \"GET /internal/inventory/entity/definitions/sources\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"GET /internal/inventory/entity/definitions/sources\", ", + "TypeC", + "<{ query: ", + "TypeC", + "<{ type: ", + "StringC", + "; }>; }>, ", + "InventoryRouteHandlerResources", + ", { definitionIndexPatterns: string[][]; }, ", + "InventoryRouteCreateOptions", ">; \"GET /internal/inventory/entities/group_by/{field}\": ", { "pluginId": "@kbn/server-route-repository-utils", diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index e13143d804bad..0f6abe1c45e8e 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 1722696878b63..dc4561c613453 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.devdocs.json b/api_docs/investigate_app.devdocs.json index c33e115dd7cc8..ca0416ae06d42 100644 --- a/api_docs/investigate_app.devdocs.json +++ b/api_docs/investigate_app.devdocs.json @@ -50,7 +50,23 @@ "label": "InvestigateAppServerRouteRepository", "description": [], "signature": [ - "{ \"GET /api/observability/investigations/_tags 2023-10-31\": ", + "{ \"POST /internal/observability/investigation/root_cause_analysis\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"POST /internal/observability/investigation/root_cause_analysis\", Zod.ZodObject<{ body: Zod.ZodObject<{ investigationId: Zod.ZodString; rangeFrom: Zod.ZodString; rangeTo: Zod.ZodString; serviceName: Zod.ZodString; context: Zod.ZodString; connectorId: Zod.ZodString; completeInBackground: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { context: string; connectorId: string; serviceName: string; rangeFrom: string; rangeTo: string; investigationId: string; completeInBackground?: boolean | undefined; }, { context: string; connectorId: string; serviceName: string; rangeFrom: string; rangeTo: string; investigationId: string; completeInBackground?: boolean | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { body: { context: string; connectorId: string; serviceName: string; rangeFrom: string; rangeTo: string; investigationId: string; completeInBackground?: boolean | undefined; }; }, { body: { context: string; connectorId: string; serviceName: string; rangeFrom: string; rangeTo: string; investigationId: string; completeInBackground?: boolean | undefined; }; }>, ", + "InvestigateAppRouteHandlerResources", + ", ", + "Observable", + "<{ event: ", + "RootCauseAnalysisEvent", + "; } & { type: \"event\"; }>, ", + "InvestigateAppRouteCreateOptions", + ">; \"GET /api/observability/investigations/_tags 2023-10-31\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -214,9 +230,9 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"PUT /api/observability/investigations/{investigationId} 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; body: Zod.ZodObject<{ title: Zod.ZodOptional; status: Zod.ZodOptional, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>>; params: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>>; tags: Zod.ZodOptional>; externalIncidentUrl: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }; }, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }; }>, ", + "<\"PUT /api/observability/investigations/{investigationId} 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; body: Zod.ZodObject<{ title: Zod.ZodOptional; status: Zod.ZodOptional, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>>; params: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>>; tags: Zod.ZodOptional>; externalIncidentUrl: Zod.ZodOptional>; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }; }, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, ", + ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, ", "InvestigateAppRouteCreateOptions", ">; \"GET /api/observability/investigations/{investigationId} 2023-10-31\": ", { @@ -228,7 +244,7 @@ }, "<\"GET /api/observability/investigations/{investigationId} 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; }, { path: { investigationId: string; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, ", + ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, ", "InvestigateAppRouteCreateOptions", ">; \"GET /api/observability/investigations 2023-10-31\": ", { @@ -240,7 +256,7 @@ }, "<\"GET /api/observability/investigations 2023-10-31\", Zod.ZodObject<{ query: Zod.ZodOptional; search: Zod.ZodOptional; filter: Zod.ZodOptional; page: Zod.ZodOptional; perPage: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; }, { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { query?: { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; } | undefined; }, { query?: { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; } | undefined; }>, ", "InvestigateAppRouteHandlerResources", - ", { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }, ", + ", { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }[]; perPage: number; total: number; }, ", "InvestigateAppRouteCreateOptions", ">; \"POST /api/observability/investigations 2023-10-31\": ", { @@ -252,7 +268,7 @@ }, "<\"POST /api/observability/investigations 2023-10-31\", Zod.ZodObject<{ body: Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; tags: Zod.ZodArray; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }>; }, \"strip\", Zod.ZodTypeAny, { body: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }; }, { body: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, ", + ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, ", "InvestigateAppRouteCreateOptions", ">; }" ], diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 1a4ba180f6235..bca6c4ff176cd 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 09a37e7f227dc..0c3f47cc48a86 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index f4e7011843e6d..9513ec5be0be1 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index ba42d7599a535..4eaef626172c7 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index e4559025356e7..9007c39f4afd3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index f3a4465f2a03c..810558b7095f7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 7a17dac1060bc..54468b9d3a0fe 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 0f3fbae34a79b..94efd7877c998 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index a186f4a576fae..44b14f0b0c2cd 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index cb3b8816f8a49..cb96e7dbc99c5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 92ecf2e3507c0..b3532c2ac4ea1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 84733e8b9c25f..eeba006fde00c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index c97880560776c..777ab98d6791e 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.devdocs.json b/api_docs/kbn_alerts_ui_shared.devdocs.json index 50b0cf5a6edd9..7a503c08980f5 100644 --- a/api_docs/kbn_alerts_ui_shared.devdocs.json +++ b/api_docs/kbn_alerts_ui_shared.devdocs.json @@ -5537,7 +5537,13 @@ "text": "HasSaveNotification" }, " & ", - "PublishesReload", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesReload", + "text": "PublishesReload" + }, "> & { allowExpensiveQueries$: ", { "pluginId": "@kbn/presentation-publishing", diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 736438c8c985b..96e1ba364301c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index f303e5da39e0a..1c2c8a9c6287a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index c60e928a8b72a..26753d709d79b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 5263e6c4b593c..874102a6dc278 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 30dcd84e6b1be..e1d73e74b5c47 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 8459cbb3a487d..7210f6c5f89e6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index 0c4dcd3b9beb7..9b1507d45eaf4 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -3133,7 +3133,7 @@ "label": "LogDocument", "description": [], "signature": [ - "{ '@timestamp'?: number | undefined; } & Partial<{ _index?: string | undefined; 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'error.message'?: string | undefined; 'event.original'?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'kubernetes.pod.uid'?: string | undefined; 'aws.s3.bucket.name'?: string | undefined; 'aws.kinesis.name'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'container.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.exception.stacktrace'?: string | undefined; 'error.log.stacktrace'?: string | undefined; 'log.custom': Record; 'host.geo.location': number[]; 'host.ip': string; 'network.bytes': number; 'tls.established': boolean; 'event.duration': number; 'event.start': Date; 'event.end': Date; labels?: Record | undefined; test_field: string | string[]; date: Date; severity: string; msg: string; svc: string; hostname: string; 'http.status_code'?: number | undefined; 'http.request.method'?: string | undefined; 'url.path'?: string | undefined; 'process.name'?: string | undefined; 'kubernetes.namespace'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; 'kubernetes.container.name'?: string | undefined; 'orchestrator.resource.name'?: string | undefined; thisisaverylongfieldnamethatevendoesnotcontainanyspaceswhyitcouldpotentiallybreakouruiinseveralplaces: string; }>" + "{ '@timestamp'?: number | undefined; } & Partial<{ _index?: string | undefined; 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'error.message'?: string | undefined; 'event.original'?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'kubernetes.pod.uid'?: string | undefined; 'aws.s3.bucket.name'?: string | undefined; 'aws.kinesis.name'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'container.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.exception.stacktrace'?: string | undefined; 'error.log.stacktrace'?: string | undefined; 'log.custom': Record; 'host.geo.location': number[]; 'host.ip': string; 'network.bytes': number; 'tls.established': boolean; 'event.duration': number; 'event.start': Date; 'event.end': Date; labels?: Record | undefined; test_field: string | string[]; date: Date; severity: string; msg: string; svc: string; hostname: string; 'http.status_code'?: number | undefined; 'http.request.method'?: string | undefined; 'url.path'?: string | undefined; 'process.name'?: string | undefined; 'kubernetes.namespace'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; 'kubernetes.container.name'?: string | undefined; 'orchestrator.resource.name'?: string | undefined; tags?: string | string[] | undefined; thisisaverylongfieldnamethatevendoesnotcontainanyspaceswhyitcouldpotentiallybreakouruiinseveralplaces: string; }>" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index f8ea0e05eec1b..d5faaa0be2fee 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_types.mdx b/api_docs/kbn_apm_types.mdx index 361888d87985c..c7eebae264bc6 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index c24f24b655be2..60051e6f1d759 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 3a4e80771680f..9390c5524d55c 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index de53c7e0ab5ac..e041ac5a9c7ea 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index bfb2cb98b9771..a64676034749f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 5d60df594b8f6..f14e2f0aef967 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index aaea3f4b78ac1..92ee22f35fbe1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 9d3b9443409d6..e295ad8173895 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index 4cb2f4c237720..a98cb42b2f4f8 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 7d00616784a6d..3082bd2159433 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index d9163287fa9c3..2411a34894cd7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 1731b12caba48..9d2b6f34fda02 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 207061dbb6b12..438deed8c30ab 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 05bf5103fe6d7..342409a587adc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 3cd2545713d53..44ac9fa840e92 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index ca530b7a61383..707d0390306bf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index cf5bcab952a02..cc9470b46999c 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index 229bbd63114a0..398475c201797 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_graph.mdx b/api_docs/kbn_cloud_security_posture_graph.mdx index 84e189f3d758a..8a9a4b7102d1e 100644 --- a/api_docs/kbn_cloud_security_posture_graph.mdx +++ b/api_docs/kbn_cloud_security_posture_graph.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-graph title: "@kbn/cloud-security-posture-graph" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-graph plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-graph'] --- import kbnCloudSecurityPostureGraphObj from './kbn_cloud_security_posture_graph.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 468b5f6efd416..ac3d5b6395cc2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 8d330b5352d7f..cca7643392c87 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.devdocs.json b/api_docs/kbn_code_owners.devdocs.json index 8a9168cad1d76..cdaa686aed3f6 100644 --- a/api_docs/kbn_code_owners.devdocs.json +++ b/api_docs/kbn_code_owners.devdocs.json @@ -37,7 +37,14 @@ "section": "def-common.PathWithOwners", "text": "PathWithOwners" }, - "[] | undefined) => string | undefined" + "[] | undefined) => ", + { + "pluginId": "@kbn/code-owners", + "scope": "common", + "docId": "kibKbnCodeOwnersPluginApi", + "section": "def-common.CodeOwnership", + "text": "CodeOwnership" + } ], "path": "packages/kbn-code-owners/src/file_code_owner.ts", "deprecated": false, @@ -188,7 +195,31 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "@kbn/code-owners", + "id": "def-common.CodeOwnership", + "type": "Type", + "tags": [], + "label": "CodeOwnership", + "description": [], + "signature": [ + "Partial> | undefined" + ], + "path": "packages/kbn-code-owners/src/file_code_owner.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 86b94b9825f56..b624eb6388757 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) for | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 9 | 0 | 4 | 0 | +| 10 | 0 | 5 | 0 | ## Common @@ -31,3 +31,6 @@ Contact [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) for ### Interfaces +### Consts, variables and types + + diff --git a/api_docs/kbn_coloring.devdocs.json b/api_docs/kbn_coloring.devdocs.json index c219a0dfa7778..8084df1bd1b25 100644 --- a/api_docs/kbn_coloring.devdocs.json +++ b/api_docs/kbn_coloring.devdocs.json @@ -209,6 +209,97 @@ } ], "functions": [ + { + "parentPluginId": "@kbn/coloring", + "id": "def-common.applyPaletteParams", + "type": "Function", + "tags": [], + "label": "applyPaletteParams", + "description": [], + "signature": [ + "(palettes: ", + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.PaletteRegistry", + "text": "PaletteRegistry" + }, + ", activePalette: T, dataBounds: ", + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.DataBounds", + "text": "DataBounds" + }, + ") => { stop: number; color: string; }[]" + ], + "path": "packages/kbn-coloring/src/palettes/utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/coloring", + "id": "def-common.applyPaletteParams.$1", + "type": "Object", + "tags": [], + "label": "palettes", + "description": [], + "signature": [ + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.PaletteRegistry", + "text": "PaletteRegistry" + } + ], + "path": "packages/kbn-coloring/src/palettes/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/coloring", + "id": "def-common.applyPaletteParams.$2", + "type": "Uncategorized", + "tags": [], + "label": "activePalette", + "description": [], + "signature": [ + "T" + ], + "path": "packages/kbn-coloring/src/palettes/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/coloring", + "id": "def-common.applyPaletteParams.$3", + "type": "Object", + "tags": [], + "label": "dataBounds", + "description": [], + "signature": [ + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.DataBounds", + "text": "DataBounds" + } + ], + "path": "packages/kbn-coloring/src/palettes/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/coloring", "id": "def-common.checkIsMaxContinuity", @@ -486,8 +577,14 @@ "GradientColor", " | (", "LoopColor", - " & { paletteId: string; colorIndex: number; }), getPaletteFn: (paletteId: string) => ", - "CategoricalPalette", + " & { paletteId: string; colorIndex: number; }), palettes: ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + }, ", isDarkMode: boolean, index: number, total: number) => string" ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", @@ -536,13 +633,18 @@ { "parentPluginId": "@kbn/coloring", "id": "def-common.getAssignmentColor.$3", - "type": "Function", + "type": "Object", "tags": [], - "label": "getPaletteFn", + "label": "palettes", "description": [], "signature": [ - "(paletteId: string) => ", - "CategoricalPalette" + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", "deprecated": false, @@ -612,9 +714,15 @@ "ColorCode", " | (", "LoopColor", - " & { paletteId: string; colorIndex: number; }), getPaletteFn: (paletteId: string) => ", - "CategoricalPalette", - ", isDarkMode: boolean) => string" + " & { paletteId: string; colorIndex: number; }), palettes: ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + }, + ") => string" ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", "deprecated": false, @@ -643,28 +751,18 @@ { "parentPluginId": "@kbn/coloring", "id": "def-common.getColor.$2", - "type": "Function", - "tags": [], - "label": "getPaletteFn", - "description": [], - "signature": [ - "(paletteId: string) => ", - "CategoricalPalette" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.getColor.$3", - "type": "boolean", + "type": "Object", "tags": [], - "label": "isDarkMode", + "label": "palettes", "description": [], "signature": [ - "boolean" + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", "deprecated": false, @@ -718,8 +816,14 @@ "signature": [ "({ assignments, specialAssignments, colorMode, paletteId }: ", "Config", - ", getPaletteFn: (paletteId: string) => ", - "CategoricalPalette", + ", palettes: ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + }, ", isDarkMode: boolean, data: ", { "pluginId": "@kbn/coloring", @@ -752,13 +856,18 @@ { "parentPluginId": "@kbn/coloring", "id": "def-common.getColorFactory.$2", - "type": "Function", + "type": "Object", "tags": [], - "label": "getPaletteFn", + "label": "palettes", "description": [], "signature": [ - "(paletteId: string) => ", - "CategoricalPalette" + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", "deprecated": false, @@ -813,7 +922,15 @@ "label": "getColorsFromMapping", "description": [], "signature": [ - "(isDarkMode: boolean, colorMappings: ", + "(palettes: ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + }, + ", isDarkMode: boolean, colorMappings: ", "Config", " | undefined) => string[]" ], @@ -824,6 +941,27 @@ { "parentPluginId": "@kbn/coloring", "id": "def-common.getColorsFromMapping.$1", + "type": "Object", + "tags": [], + "label": "palettes", + "description": [], + "signature": [ + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } + ], + "path": "packages/kbn-coloring/src/shared_components/color_mapping/config/default_color_mapping.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/coloring", + "id": "def-common.getColorsFromMapping.$2", "type": "boolean", "tags": [], "label": "isDarkMode", @@ -838,7 +976,7 @@ }, { "parentPluginId": "@kbn/coloring", - "id": "def-common.getColorsFromMapping.$2", + "id": "def-common.getColorsFromMapping.$3", "type": "Object", "tags": [], "label": "colorMappings", @@ -968,8 +1106,14 @@ "signature": [ "(colorMode: ", "GradientColorMode", - ", getPaletteFn: (paletteId: string) => ", - "CategoricalPalette", + ", palettes: ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + }, ", isDarkMode: boolean) => (value: number) => string" ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", @@ -994,13 +1138,18 @@ { "parentPluginId": "@kbn/coloring", "id": "def-common.getGradientColorScale.$2", - "type": "Function", + "type": "Object", "tags": [], - "label": "getPaletteFn", + "label": "palettes", "description": [], "signature": [ - "(paletteId: string) => ", - "CategoricalPalette" + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts", "deprecated": false, @@ -1028,56 +1177,71 @@ }, { "parentPluginId": "@kbn/coloring", - "id": "def-common.getPalette", + "id": "def-common.getOverridePaletteStops", "type": "Function", "tags": [], - "label": "getPalette", + "label": "getOverridePaletteStops", "description": [ - "\nThis function should be instanciated once at the root of the component with the available palettes and\na choosed default one and shared across components to keep a single point of truth of the available palettes and the default\none." + "\nReturns color stops for given palette type:\n\n- custom - User has modified the stops in some way - return stops as is\n- non-custom - Default palette stops - Return new stops based on palette\n\n> This is needed for BWC when switching between kibana themes." ], "signature": [ - "(palettes: Map, defaultPalette: ", - "CategoricalPalette", - ") => (paletteId: string) => ", - "CategoricalPalette" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts", + "(paletteService: ", + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.PaletteRegistry", + "text": "PaletteRegistry" + }, + ", activePalette: T | undefined) => ", + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.ColorStop", + "text": "ColorStop" + }, + "[] | undefined" + ], + "path": "packages/kbn-coloring/src/palettes/utils.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/coloring", - "id": "def-common.getPalette.$1", + "id": "def-common.getOverridePaletteStops.$1", "type": "Object", "tags": [], - "label": "palettes", + "label": "paletteService", "description": [], "signature": [ - "Map" + { + "pluginId": "@kbn/coloring", + "scope": "common", + "docId": "kibKbnColoringPluginApi", + "section": "def-common.PaletteRegistry", + "text": "PaletteRegistry" + } ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts", + "path": "packages/kbn-coloring/src/palettes/utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true }, { "parentPluginId": "@kbn/coloring", - "id": "def-common.getPalette.$2", - "type": "Object", + "id": "def-common.getOverridePaletteStops.$2", + "type": "Uncategorized", "tags": [], - "label": "defaultPalette", + "label": "activePalette", "description": [], "signature": [ - "CategoricalPalette" + "T | undefined" ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts", + "path": "packages/kbn-coloring/src/palettes/utils.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "isRequired": false } ], "returnComment": [], @@ -1091,7 +1255,15 @@ "label": "getPaletteColors", "description": [], "signature": [ - "(isDarkMode: boolean, colorMappings: ", + "(palettes: ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + }, + ", colorMappings: ", "Config", " | undefined) => string[]" ], @@ -1102,12 +1274,18 @@ { "parentPluginId": "@kbn/coloring", "id": "def-common.getPaletteColors.$1", - "type": "boolean", + "type": "Object", "tags": [], - "label": "isDarkMode", + "label": "palettes", "description": [], "signature": [ - "boolean" + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/config/default_color_mapping.ts", "deprecated": false, @@ -1991,12 +2169,16 @@ "tags": [], "label": "palettes", "description": [ - "A map of paletteId and palette configuration" + "A collection of palette configurations" ], "signature": [ - "Map" + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.tsx", "deprecated": false, @@ -2258,7 +2440,9 @@ "type": "Array", "tags": [], "label": "stops", - "description": [], + "description": [ + "lower color stops" + ], "signature": [ { "pluginId": "@kbn/coloring", @@ -2279,7 +2463,9 @@ "type": "Array", "tags": [], "label": "colorStops", - "description": [], + "description": [ + "upper color stops" + ], "signature": [ { "pluginId": "@kbn/coloring", @@ -3113,36 +3299,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ELASTIC_BRAND_PALETTE_COLORS", - "type": "Array", - "tags": [], - "label": "ELASTIC_BRAND_PALETTE_COLORS", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUI_AMSTERDAM_PALETTE_COLORS", - "type": "Array", - "tags": [], - "label": "EUI_AMSTERDAM_PALETTE_COLORS", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/coloring", "id": "def-common.FIXED_PROGRESSION", @@ -3158,21 +3314,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KIBANA_V7_LEGACY_PALETTE_COLORS", - "type": "Array", - "tags": [], - "label": "KIBANA_V7_LEGACY_PALETTE_COLORS", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/coloring", "id": "def-common.LEGACY_COMPLIMENTARY_PALETTE", @@ -3188,36 +3329,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NEUTRAL_COLOR_DARK", - "type": "Array", - "tags": [], - "label": "NEUTRAL_COLOR_DARK", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NEUTRAL_COLOR_LIGHT", - "type": "Array", - "tags": [], - "label": "NEUTRAL_COLOR_LIGHT", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/coloring", "id": "def-common.PaletteContinuity", @@ -3241,23 +3352,23 @@ "label": "RequiredPaletteParamTypes", "description": [], "signature": [ - "{ reverse: boolean; name: string; rangeType: \"number\" | \"percent\"; continuity: ", + "{ reverse: boolean; name: string; rangeType: \"number\" | \"percent\"; stops: ", { "pluginId": "@kbn/coloring", "scope": "common", "docId": "kibKbnColoringPluginApi", - "section": "def-common.PaletteContinuity", - "text": "PaletteContinuity" + "section": "def-common.ColorStop", + "text": "ColorStop" }, - "; progression: \"fixed\"; rangeMin: number; rangeMax: number; stops: ", + "[]; continuity: ", { "pluginId": "@kbn/coloring", "scope": "common", "docId": "kibKbnColoringPluginApi", - "section": "def-common.ColorStop", - "text": "ColorStop" + "section": "def-common.PaletteContinuity", + "text": "PaletteContinuity" }, - "[]; colorStops: ", + "; progression: \"fixed\"; rangeMin: number; rangeMax: number; colorStops: ", { "pluginId": "@kbn/coloring", "scope": "common", @@ -3274,23 +3385,6 @@ } ], "objects": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.AVAILABLE_PALETTES", - "type": "Object", - "tags": [], - "label": "AVAILABLE_PALETTES", - "description": [], - "signature": [ - "Map" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/coloring", "id": "def-common.DEFAULT_COLOR_MAPPING_CONFIG", @@ -3373,483 +3467,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette", - "type": "Object", - "tags": [], - "label": "ElasticBrandPalette", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.colorCount", - "type": "number", - "tags": [], - "label": "colorCount", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "\"categorical\"" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.getColor", - "type": "Function", - "tags": [], - "label": "getColor", - "description": [], - "signature": [ - "(indexInRange: number, isDarkMode: boolean, loop: boolean) => string" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.getColor.$1", - "type": "number", - "tags": [], - "label": "indexInRange", - "description": [], - "signature": [ - "number" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.getColor.$2", - "type": "boolean", - "tags": [], - "label": "isDarkMode", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.ElasticBrandPalette.getColor.$3", - "type": "boolean", - "tags": [], - "label": "loop", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette", - "type": "Object", - "tags": [], - "label": "EUIAmsterdamColorBlindPalette", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.colorCount", - "type": "number", - "tags": [], - "label": "colorCount", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "\"categorical\"" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.getColor", - "type": "Function", - "tags": [], - "label": "getColor", - "description": [], - "signature": [ - "(indexInRange: number, isDarkMode: boolean, loop: boolean) => string" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.getColor.$1", - "type": "number", - "tags": [], - "label": "indexInRange", - "description": [], - "signature": [ - "number" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.getColor.$2", - "type": "boolean", - "tags": [], - "label": "isDarkMode", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.EUIAmsterdamColorBlindPalette.getColor.$3", - "type": "boolean", - "tags": [], - "label": "loop", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette", - "type": "Object", - "tags": [], - "label": "KibanaV7LegacyPalette", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.colorCount", - "type": "number", - "tags": [], - "label": "colorCount", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "\"categorical\"" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.getColor", - "type": "Function", - "tags": [], - "label": "getColor", - "description": [], - "signature": [ - "(indexInRange: number, isDarkMode: boolean, loop: boolean) => string" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.getColor.$1", - "type": "number", - "tags": [], - "label": "indexInRange", - "description": [], - "signature": [ - "number" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.getColor.$2", - "type": "boolean", - "tags": [], - "label": "isDarkMode", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.KibanaV7LegacyPalette.getColor.$3", - "type": "boolean", - "tags": [], - "label": "loop", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette", - "type": "Object", - "tags": [], - "label": "NeutralPalette", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.colorCount", - "type": "number", - "tags": [], - "label": "colorCount", - "description": [], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "\"categorical\"" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.getColor", - "type": "Function", - "tags": [], - "label": "getColor", - "description": [], - "signature": [ - "(valueInRange: number, isDarkMode: boolean) => string" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.getColor.$1", - "type": "number", - "tags": [], - "label": "valueInRange", - "description": [], - "signature": [ - "number" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/coloring", - "id": "def-common.NeutralPalette.getColor.$2", - "type": "boolean", - "tags": [], - "label": "isDarkMode", - "description": [], - "signature": [ - "boolean" - ], - "path": "packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/coloring", "id": "def-common.SPECIAL_TOKENS_STRING_CONVERSION", diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 1495e93f55355..747c5b41c79aa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 227 | 0 | 188 | 9 | +| 190 | 0 | 149 | 8 | ## Common diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 4495a9d666e32..f5da03cb27b4c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 52dc8a5302807..7a2f97d7b1734 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 8d6f34dec6a17..8e6dc2b78783b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 1e141bcb1989d..981ded0417046 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index f27aed576d940..b2ec994ec929e 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index 4c87ff91d8cdb..93108e3f4a50f 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_common.mdx b/api_docs/kbn_content_management_favorites_common.mdx index b520a79a5bd4f..00c6fdd10dce4 100644 --- a/api_docs/kbn_content_management_favorites_common.mdx +++ b/api_docs/kbn_content_management_favorites_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-common title: "@kbn/content-management-favorites-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-common plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-common'] --- import kbnContentManagementFavoritesCommonObj from './kbn_content_management_favorites_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 6c4acde0a5d14..0da86468d76e7 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index 3aedb8d008ab7..c2470be8a8954 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 8414c4c621aa8..b2a73ef3d261a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 381897e6a3e5c..e4ba9f6257b6e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index dd1dc03266130..e5ee04b583828 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index ed02b594ff00a..0325cf046a2a6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 2b422b7c4fe14..b4f2acd488697 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index bc0eace880eea..4a8d88953d445 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.devdocs.json b/api_docs/kbn_core_analytics_browser.devdocs.json index d9e9918f342d9..b96b1d3f29972 100644 --- a/api_docs/kbn_core_analytics_browser.devdocs.json +++ b/api_docs/kbn_core_analytics_browser.devdocs.json @@ -478,14 +478,6 @@ "deprecated": false, "trackAdoption": true, "references": [ - { - "plugin": "@kbn/core-notifications-browser-internal", - "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" - }, - { - "plugin": "@kbn/core-notifications-browser-internal", - "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" - }, { "plugin": "@kbn/ebt-tools", "path": "packages/kbn-ebt-tools/src/performance_metric_events/helpers.ts" @@ -514,6 +506,14 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts" }, + { + "plugin": "@kbn/core-notifications-browser-internal", + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" + }, + { + "plugin": "@kbn/core-notifications-browser-internal", + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" + }, { "plugin": "@kbn/core-root-browser-internal", "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" @@ -648,7 +648,7 @@ }, { "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx" + "path": "src/plugins/dashboard/public/dashboard_api/track_contentful_render.ts" }, { "plugin": "discover", @@ -758,70 +758,6 @@ "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts" @@ -926,6 +862,70 @@ "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/public/services/telemetry/telemetry_client.ts" }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, { "plugin": "inventory", "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" @@ -1720,14 +1720,6 @@ "deprecated": false, "trackAdoption": true, "references": [ - { - "plugin": "@kbn/core-execution-context-browser-internal", - "path": "packages/core/execution-context/core-execution-context-browser-internal/src/execution_context_service.ts" - }, - { - "plugin": "@kbn/core-application-browser-internal", - "path": "packages/core/application/core-application-browser-internal/src/register_analytics_context_provider.ts" - }, { "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_viewport_size.ts" @@ -1756,6 +1748,14 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts" }, + { + "plugin": "@kbn/core-execution-context-browser-internal", + "path": "packages/core/execution-context/core-execution-context-browser-internal/src/execution_context_service.ts" + }, + { + "plugin": "@kbn/core-application-browser-internal", + "path": "packages/core/application/core-application-browser-internal/src/register_analytics_context_provider.ts" + }, { "plugin": "@kbn/core-chrome-browser-internal", "path": "packages/core/chrome/core-chrome-browser-internal/src/register_analytics_context_provider.ts" diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 5268cf635993e..cbd2f3ad062ed 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index a5006de5b1484..ecdecd831d5b6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 6ccf946f3472d..d0c8f1f0a7e01 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.devdocs.json b/api_docs/kbn_core_analytics_server.devdocs.json index f551b259301d1..04884767d1f56 100644 --- a/api_docs/kbn_core_analytics_server.devdocs.json +++ b/api_docs/kbn_core_analytics_server.devdocs.json @@ -486,14 +486,6 @@ "deprecated": false, "trackAdoption": true, "references": [ - { - "plugin": "@kbn/core-notifications-browser-internal", - "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" - }, - { - "plugin": "@kbn/core-notifications-browser-internal", - "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" - }, { "plugin": "@kbn/ebt-tools", "path": "packages/kbn-ebt-tools/src/performance_metric_events/helpers.ts" @@ -522,6 +514,14 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts" }, + { + "plugin": "@kbn/core-notifications-browser-internal", + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" + }, + { + "plugin": "@kbn/core-notifications-browser-internal", + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" + }, { "plugin": "@kbn/core-root-browser-internal", "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" @@ -656,7 +656,7 @@ }, { "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx" + "path": "src/plugins/dashboard/public/dashboard_api/track_contentful_render.ts" }, { "plugin": "discover", @@ -766,70 +766,6 @@ "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.ts" @@ -934,6 +870,70 @@ "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/public/services/telemetry/telemetry_client.ts" }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/services/telemetry/telemetry_client.ts" + }, { "plugin": "inventory", "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" @@ -1728,14 +1728,6 @@ "deprecated": false, "trackAdoption": true, "references": [ - { - "plugin": "@kbn/core-execution-context-browser-internal", - "path": "packages/core/execution-context/core-execution-context-browser-internal/src/execution_context_service.ts" - }, - { - "plugin": "@kbn/core-application-browser-internal", - "path": "packages/core/application/core-application-browser-internal/src/register_analytics_context_provider.ts" - }, { "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_viewport_size.ts" @@ -1764,6 +1756,14 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts" }, + { + "plugin": "@kbn/core-execution-context-browser-internal", + "path": "packages/core/execution-context/core-execution-context-browser-internal/src/execution_context_service.ts" + }, + { + "plugin": "@kbn/core-application-browser-internal", + "path": "packages/core/application/core-application-browser-internal/src/register_analytics_context_provider.ts" + }, { "plugin": "@kbn/core-chrome-browser-internal", "path": "packages/core/chrome/core-chrome-browser-internal/src/register_analytics_context_provider.ts" diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 8fd7a6c7db4f6..ebeaf0e4dd8d5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index f32edcf1c90f0..e479fedda9dd4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index e13bfd11f70d8..ba732fb89b608 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.devdocs.json b/api_docs/kbn_core_application_browser.devdocs.json index ebe47e7422312..149c4d9451d89 100644 --- a/api_docs/kbn_core_application_browser.devdocs.json +++ b/api_docs/kbn_core_application_browser.devdocs.json @@ -1193,14 +1193,14 @@ "plugin": "@kbn/core-application-browser-internal", "path": "packages/core/application/core-application-browser-internal/src/ui/app_container.tsx" }, - { - "plugin": "management", - "path": "src/plugins/management/public/application.tsx" - }, { "plugin": "@kbn/core-application-browser-mocks", "path": "packages/core/application/core-application-browser-mocks/src/application_service.mock.ts" }, + { + "plugin": "management", + "path": "src/plugins/management/public/application.tsx" + }, { "plugin": "assetInventory", "path": "x-pack/plugins/asset_inventory/public/application.tsx" diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 7a220a921f5c0..112f64a878343 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index ef5aed04efdee..e18d6b602684f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 5992dbbfd4286..33aef87d7b967 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 0f05b5dba4f7d..e19b8344a4189 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 0a92b458e618a..906eb019207a9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 1829d5574b6ff..f90f1b3231373 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 1c52009f749fb..dc00d4fef1ccf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 0c94ffc318014..e002a7d87afb7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 1bf883e34cf34..d24653ef360c9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 54dca2606eecd..5afe6f63cdc03 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index b62bf102300c2..9ab28838787c2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index a4778701fe075..714b87cfd842a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 0bb412893d351..d2b23ec3d137c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 6bafdc9098db7..9f77847c23164 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index f94a07a92fa02..21955fc2c2b0d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 3ff5c647421b5..62a73282a1a24 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index facf6c49d14a9..4333ae85588ed 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 456531968563b..215d711805105 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index ca9eb8edba744..0ee69cf00c58a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 8f9889ca56aef..a747e84d9315c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 3e647c5acecdc..f5bb1275540d7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 425fa315c24b8..4ade1c397c3c2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 3160fcad89990..ff33e4a7e0b9c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index b131ab29af775..ef10e66f17816 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 08d626b5426e5..d6b562e104d66 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 38a020f2e6b36..e362ae0d47284 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index c7e94ae340b18..0aa70fd4e48cf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 6c719b4ab17db..bc0abfea0c978 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 25eb627f3a029..504550f3bcb44 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 5fb5a51b22258..61f97f7aa7602 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 5e5ab6f149601..97cc081d7bc7f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 88dc4dfb3126d..3141c6a8f2859 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index e519eaee2c944..6524ad0c1f1c9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 56ed022113504..a708c822c1d51 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index bed1728d3ef7d..9d2168e872964 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 7a57afe9bb727..c867e373fb318 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index b772e4bf03bea..a60b93efd2da6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 0e2889f354f7f..4be05eb81280a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index f800236689dab..72f3db15def5a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index dac12bb55fb74..e36a84c95acd5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 44695a10fcafc..9cda3f5abfc1e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 92926382d0de3..d9df234e1c5f6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 4a9c088e1695b..bec77bc32c068 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index ba036780ab010..0db5799c99e65 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 71955a5f6319e..f431758d09bac 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 819a5924cc4ed..5d16ef7785dae 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 163e3cd854d19..635a2f23fe238 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 7c02cf9672d79..c82fa5b006406 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index b117a9535574c..d0ebe5919eebf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 5c3d77b99ed28..c97d0afa60f69 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index d1515de746e4d..fad18861f21ca 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index db642ff24ab84..8b39d778b0515 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index ddc168e318469..bbbd56e4b2e58 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index 67cd7542de7e7..36a8194b0ceb4 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 3174685b34dcc..c78d69070568d 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index beda8b77721d1..c73b99b360592 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 2b4bfb233f54e..8e285c68c3c3e 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index d8b3e2cf5cb90..4ca3ec85f84d2 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 376b09de8c7e0..03d0dc46dcc24 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index dc43923bfe5a1..1f3346f2c0d04 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 4a67f90d582ea..83c80bc66b36e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 46720ed3b6b03..8a3cad6a3c2a1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 3c81379f64f70..480c9b304f69c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index a8b1b23e8fe00..81a35c30b779d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index d9fc15578ca96..a3eac9b6567ff 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 1f6439187e6b7..b99f1f9b7fe4d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 6e6c372256735..06213f257f15d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 3d50d993f4a9d..f0363b0a19094 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index e2dbfc0121b19..ae677d7f86f66 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 8c6fcf6c11a15..698a2cc74de4b 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -4027,7 +4027,7 @@ }, { "plugin": "inference", - "path": "x-pack/plugins/inference/server/routes/connectors.ts" + "path": "x-pack/platform/plugins/shared/inference/server/routes/connectors.ts" }, { "plugin": "assetInventory", @@ -4195,7 +4195,7 @@ }, { "plugin": "productDocBase", - "path": "x-pack/plugins/ai_infra/product_doc_base/server/routes/installation.ts" + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/routes/installation.ts" }, { "plugin": "globalSearch", @@ -4677,22 +4677,6 @@ "plugin": "logstash", "path": "x-pack/plugins/logstash/server/routes/pipelines/list.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/routes/fields.ts" - }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/routes/metric_indices/index.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "monitoring", "path": "x-pack/plugins/monitoring/server/plugin.ts" @@ -4721,6 +4705,14 @@ "plugin": "@kbn/test-suites-xpack", "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/tines_simulation.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/routes/metric_indices/index.ts" + }, { "plugin": "reporting", "path": "x-pack/plugins/reporting/server/routes/internal/deprecations/deprecations.ts" @@ -4989,6 +4981,14 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/routes/fields.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "profiling", "path": "x-pack/plugins/observability_solution/profiling/server/routes/apm.ts" @@ -6753,11 +6753,11 @@ }, { "plugin": "inference", - "path": "x-pack/plugins/inference/server/routes/chat_complete.ts" + "path": "x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts" }, { "plugin": "inference", - "path": "x-pack/plugins/inference/server/routes/chat_complete.ts" + "path": "x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts" }, { "plugin": "savedObjectsTagging", @@ -6893,11 +6893,11 @@ }, { "plugin": "productDocBase", - "path": "x-pack/plugins/ai_infra/product_doc_base/server/routes/installation.ts" + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/routes/installation.ts" }, { "plugin": "productDocBase", - "path": "x-pack/plugins/ai_infra/product_doc_base/server/routes/installation.ts" + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/routes/installation.ts" }, { "plugin": "globalSearch", @@ -7303,18 +7303,6 @@ "plugin": "logstash", "path": "x-pack/plugins/logstash/server/routes/pipelines/delete.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/server/routes/vis.ts" - }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "monitoring", "path": "x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts" @@ -7395,6 +7383,10 @@ "plugin": "@kbn/test-suites-xpack", "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/tines_simulation.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "painlessLab", "path": "x-pack/plugins/painless_lab/server/routes/api/execute.ts" @@ -7579,6 +7571,14 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/routes/vis.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "profiling", "path": "x-pack/plugins/observability_solution/profiling/server/routes/setup/route.ts" @@ -9061,14 +9061,6 @@ "plugin": "logstash", "path": "x-pack/plugins/logstash/server/routes/pipeline/save.ts" }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "monitoring", "path": "x-pack/plugins/monitoring/server/plugin.ts" @@ -9077,6 +9069,10 @@ "plugin": "@kbn/test-suites-xpack", "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "reporting", "path": "x-pack/plugins/reporting/server/routes/internal/deprecations/deprecations.ts" @@ -9133,6 +9129,10 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -9487,6 +9487,10 @@ "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts" }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts" + }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -9495,10 +9499,6 @@ "plugin": "infra", "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" }, - { - "plugin": "@kbn/test-suites-xpack", - "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts" - }, { "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/router.ts" @@ -9985,10 +9985,6 @@ "plugin": "metricsDataAccess", "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "reporting", "path": "x-pack/plugins/reporting/server/routes/internal/management/jobs.ts" @@ -10037,6 +10033,10 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -13323,181 +13323,665 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouteConfigOptions.authRequired", "type": "CompoundType", - "tags": [], + "tags": [ + "deprecated" + ], "label": "authRequired", "description": [ - "\nDefines authentication mode for a route:\n- true. A user has to have valid credentials to access a resource\n- false. A user can access a resource without any credentials.\n- 'optional'. A user can access a resource, and will be authenticated if provided credentials are valid.\n Can be useful when we grant access to a resource but want to identify a user if possible.\n\nDefaults to `true` if an auth mechanism is registered." + "\nDefines authentication mode for a route:\n- true. A user has to have valid credentials to access a resource\n- false. A user can access a resource without any credentials.\n- 'optional'. A user can access a resource, and will be authenticated if provided credentials are valid.\n Can be useful when we grant access to a resource but want to identify a user if possible.\n\nDefaults to `true` if an auth mechanism is registered.\n" ], "signature": [ "boolean | \"optional\" | undefined" ], "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.xsrfRequired", - "type": "Uncategorized", - "tags": [], - "label": "xsrfRequired", - "description": [ - "\nDefines xsrf protection requirements for a route:\n- true. Requires an incoming POST/PUT/DELETE request to contain `kbn-xsrf` header.\n- false. Disables xsrf protection.\n\nSet to true by default" - ], - "signature": [ - "(Method extends \"get\" ? never : boolean) | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.access", - "type": "CompoundType", - "tags": [], - "label": "access", - "description": [ - "\nDefines intended request origin of the route:\n- public. The route is public, declared stable and intended for external access.\n In the future, may require an incoming request to contain a specified header.\n- internal. The route is internal and intended for internal access only.\n\nDefaults to 'internal' If not declared," - ], - "signature": [ + "deprecated": true, + "trackAdoption": false, + "references": [ { - "pluginId": "@kbn/core-http-server", - "scope": "server", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.RouteAccess", - "text": "RouteAccess" + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts" }, - " | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.tags", - "type": "Object", - "tags": [], - "label": "tags", - "description": [ - "\nAdditional metadata tag strings to attach to the route." - ], - "signature": [ - "readonly string[] | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.body", - "type": "Uncategorized", - "tags": [], - "label": "body", - "description": [ - "\nAdditional body options {@link RouteConfigOptionsBody}." - ], - "signature": [ - "(Method extends \"get\" | \"options\" ? undefined : ", { - "pluginId": "@kbn/core-http-server", - "scope": "server", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.RouteConfigOptionsBody", - "text": "RouteConfigOptionsBody" + "plugin": "@kbn/core-http-server-internal", + "path": "packages/core/http/core-http-server-internal/src/http_server.ts" }, - ") | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.timeout", - "type": "Object", - "tags": [], - "label": "timeout", - "description": [ - "\nDefines per-route timeouts." - ], - "signature": [ - "{ payload?: (Method extends \"get\" | \"options\" ? undefined : number) | undefined; idleSocket?: number | undefined; } | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.summary", - "type": "string", - "tags": [], - "label": "summary", - "description": [ - "\nShort summary of this route. Required for all routes used in OAS documentation.\n" - ], - "signature": [ - "string | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.description", - "type": "string", - "tags": [], - "label": "description", - "description": [ - "\nOptional API description, which supports [CommonMark](https://spec.commonmark.org) markdown formatting\n" - ], - "signature": [ - "string | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.deprecated", - "type": "Object", - "tags": [], - "label": "deprecated", - "description": [ - "\nDescription of deprecations for this HTTP API.\n" - ], - "signature": [ { - "pluginId": "@kbn/core-http-server", - "scope": "server", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.RouteDeprecationInfo", - "text": "RouteDeprecationInfo" + "plugin": "@kbn/core-http-server-internal", + "path": "packages/core/http/core-http-server-internal/src/http_server.ts" }, - " | undefined" - ], - "path": "packages/core/http/core-http-server/src/router/route.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.RouteConfigOptions.excludeFromOAS", - "type": "CompoundType", - "tags": [ - "default" - ], - "label": "excludeFromOAS", - "description": [ - "\nWhether this route should be treated as \"invisible\" and excluded from router\nOAS introspection.\n" - ], - "signature": [ - "boolean | undefined" + { + "plugin": "@kbn/core-metrics-server-internal", + "path": "packages/core/metrics/core-metrics-server-internal/src/routes/elu_history.ts" + }, + { + "plugin": "@kbn/core-status-server-internal", + "path": "packages/core/status/core-status-server-internal/src/routes/status.ts" + }, + { + "plugin": "@kbn/core-status-server-internal", + "path": "packages/core/status/core-status-server-internal/src/routes/status_preboot.ts" + }, + { + "plugin": "@kbn/core-i18n-server-internal", + "path": "packages/core/i18n/core-i18n-server-internal/src/routes/translations.ts" + }, + { + "plugin": "@kbn/core-rendering-server-internal", + "path": "packages/core/rendering/core-rendering-server-internal/src/bootstrap/register_bootstrap_route.ts" + }, + { + "plugin": "@kbn/core-capabilities-server-internal", + "path": "packages/core/capabilities/core-capabilities-server-internal/src/routes/resolve_capabilities.ts" + }, + { + "plugin": "@kbn/core-apps-server-internal", + "path": "packages/core/apps/core-apps-server-internal/src/bundle_routes/bundles_route.ts" + }, + { + "plugin": "@kbn/core-apps-server-internal", + "path": "packages/core/apps/core-apps-server-internal/src/core_app.ts" + }, + { + "plugin": "@kbn/core-apps-server-internal", + "path": "packages/core/apps/core-apps-server-internal/src/core_app.ts" + }, + { + "plugin": "usageCollection", + "path": "src/plugins/usage_collection/server/routes/stats/stats.ts" + }, + { + "plugin": "taskManager", + "path": "x-pack/plugins/task_manager/server/routes/background_task_utilization.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/common.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/common.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/oidc.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/oidc.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/oidc.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/oidc.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/oidc.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authentication/saml.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authorization/reset_session_page.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/views/capture_url.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/views/logged_out.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/views/login.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/views/login.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/views/logout.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/analytics/record_violations.ts" + }, + { + "plugin": "monitoringCollection", + "path": "x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.ts" + }, + { + "plugin": "monitoringCollection", + "path": "x-pack/plugins/monitoring_collection/server/routes/api/v1/prometheus/get_metrics.ts" + }, + { + "plugin": "files", + "path": "src/plugins/files/server/routes/public_facing/download.ts" + }, + { + "plugin": "banners", + "path": "x-pack/plugins/banners/server/routes/info.ts" + }, + { + "plugin": "telemetry", + "path": "src/plugins/telemetry/server/routes/telemetry_config.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/agent/agent_status_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/workflow_insights/update_insight.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/workflow_insights/get_insights.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/policy/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/details.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/status.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/state.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/list.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/pagerduty_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/servicenow_oauth_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/jira_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/resilient_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/ms_exchage_server_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/ms_exchage_server_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/xmatters_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/torq_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/tines_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/tines_simulation.ts" + }, + { + "plugin": "@kbn/test-suites-xpack", + "path": "x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/tines_simulation.ts" + }, + { + "plugin": "cloudFullStory", + "path": "x-pack/plugins/cloud_integrations/cloud_full_story/server/routes/fullstory.ts" + }, + { + "plugin": "customBranding", + "path": "x-pack/plugins/custom_branding/server/routes/info.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/lib/route_config_helpers.test.ts" + }, + { + "plugin": "taskManager", + "path": "x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts" + }, + { + "plugin": "taskManager", + "path": "x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts" + }, + { + "plugin": "taskManager", + "path": "x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts" + }, + { + "plugin": "taskManager", + "path": "x-pack/plugins/task_manager/server/routes/background_task_utilization.test.ts" + }, + { + "plugin": "interactiveSetup", + "path": "src/plugins/interactive_setup/server/routes/configure.ts" + }, + { + "plugin": "interactiveSetup", + "path": "src/plugins/interactive_setup/server/routes/enroll.ts" + }, + { + "plugin": "interactiveSetup", + "path": "src/plugins/interactive_setup/server/routes/ping.ts" + }, + { + "plugin": "interactiveSetup", + "path": "src/plugins/interactive_setup/server/routes/status.ts" + }, + { + "plugin": "interactiveSetup", + "path": "src/plugins/interactive_setup/server/routes/verify.ts" + }, + { + "plugin": "mockIdpPlugin", + "path": "packages/kbn-mock-idp-plugin/server/plugin.ts" + }, + { + "plugin": "mockIdpPlugin", + "path": "packages/kbn-mock-idp-plugin/server/plugin.ts" + }, + { + "plugin": "mockIdpPlugin", + "path": "packages/kbn-mock-idp-plugin/server/plugin.ts" + }, + { + "plugin": "mockIdpPlugin", + "path": "packages/kbn-mock-idp-plugin/server/plugin.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, + { + "plugin": "@kbn/core-http-server-internal", + "path": "packages/core/http/core-http-server-internal/src/lifecycle/auth.ts" + }, + { + "plugin": "@kbn/core-http-server-internal", + "path": "packages/core/http/core-http-server-internal/src/lifecycle/auth.ts" + }, + { + "plugin": "spaces", + "path": "x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/anonymous.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/basic.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/kerberos.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/saml.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/token.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/oidc.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authentication/providers/pki.ts" + }, + { + "plugin": "ml", + "path": "x-pack/platform/plugins/shared/ml/server/lib/capabilities/capabilities_switcher.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/request.test.ts" + } + ] + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.xsrfRequired", + "type": "Uncategorized", + "tags": [], + "label": "xsrfRequired", + "description": [ + "\nDefines xsrf protection requirements for a route:\n- true. Requires an incoming POST/PUT/DELETE request to contain `kbn-xsrf` header.\n- false. Disables xsrf protection.\n\nSet to true by default" + ], + "signature": [ + "(Method extends \"get\" ? never : boolean) | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.access", + "type": "CompoundType", + "tags": [], + "label": "access", + "description": [ + "\nDefines intended request origin of the route:\n- public. The route is public, declared stable and intended for external access.\n In the future, may require an incoming request to contain a specified header.\n- internal. The route is internal and intended for internal access only.\n\nDefaults to 'internal' If not declared," + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteAccess", + "text": "RouteAccess" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.tags", + "type": "Object", + "tags": [], + "label": "tags", + "description": [ + "\nAdditional metadata tag strings to attach to the route." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.body", + "type": "Uncategorized", + "tags": [], + "label": "body", + "description": [ + "\nAdditional body options {@link RouteConfigOptionsBody}." + ], + "signature": [ + "(Method extends \"get\" | \"options\" ? undefined : ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteConfigOptionsBody", + "text": "RouteConfigOptionsBody" + }, + ") | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.timeout", + "type": "Object", + "tags": [], + "label": "timeout", + "description": [ + "\nDefines per-route timeouts." + ], + "signature": [ + "{ payload?: (Method extends \"get\" | \"options\" ? undefined : number) | undefined; idleSocket?: number | undefined; } | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.summary", + "type": "string", + "tags": [], + "label": "summary", + "description": [ + "\nShort summary of this route. Required for all routes used in OAS documentation.\n" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.description", + "type": "string", + "tags": [], + "label": "description", + "description": [ + "\nOptional API description, which supports [CommonMark](https://spec.commonmark.org) markdown formatting\n" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.deprecated", + "type": "Object", + "tags": [], + "label": "deprecated", + "description": [ + "\nDescription of deprecations for this HTTP API.\n" + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteDeprecationInfo", + "text": "RouteDeprecationInfo" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.excludeFromOAS", + "type": "CompoundType", + "tags": [ + "default" + ], + "label": "excludeFromOAS", + "description": [ + "\nWhether this route should be treated as \"invisible\" and excluded from router\nOAS introspection.\n" + ], + "signature": [ + "boolean | undefined" ], "path": "packages/core/http/core-http-server/src/router/route.ts", "deprecated": false, @@ -15869,14 +16353,6 @@ "plugin": "maps", "path": "x-pack/plugins/maps/server/routes.ts" }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts" @@ -16185,6 +16661,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "sessionView", "path": "x-pack/plugins/session_view/server/routes/alerts_route.ts" @@ -16205,6 +16685,10 @@ "plugin": "sessionView", "path": "x-pack/plugins/session_view/server/routes/get_total_io_bytes_route.ts" }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -16616,14 +17100,6 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/update_list_route.ts" }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "osquery", "path": "x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts" @@ -16676,6 +17152,14 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/retry.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -17443,14 +17927,6 @@ "plugin": "maps", "path": "x-pack/plugins/maps/server/data_indexing/indexing_routes.ts" }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts" @@ -17727,6 +18203,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts" @@ -17735,6 +18215,14 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -18002,14 +18490,6 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/patch_list_route.ts" }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/patch_rule/route.ts" @@ -18030,6 +18510,14 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts" @@ -18253,14 +18741,6 @@ "plugin": "maps", "path": "x-pack/plugins/maps/server/data_indexing/indexing_routes.ts" }, - { - "plugin": "metricsDataAccess", - "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" - }, { "plugin": "osquery", "path": "x-pack/plugins/osquery/server/routes/saved_query/delete_saved_query_route.ts" @@ -18309,6 +18789,14 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/delete.ts" }, + { + "plugin": "metricsDataAccess", + "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index b1acc091b418b..aabb760f2ae2c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 2334b6a7f8198..eb5a09fa1abed 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index b9b3aba6760dd..727a2b5fdf4ef 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_utils.mdx b/api_docs/kbn_core_http_server_utils.mdx index 351ec41bd0da1..ac6f127c457bb 100644 --- a/api_docs/kbn_core_http_server_utils.mdx +++ b/api_docs/kbn_core_http_server_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-utils title: "@kbn/core-http-server-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-utils'] --- import kbnCoreHttpServerUtilsObj from './kbn_core_http_server_utils.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 000c47c06f11e..b834141b65538 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index f51782ce75aa5..9af4dd4782653 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 94ac5fc27c3c8..2d7a3c7ad775c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index f479d00514093..64913b26667b2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 2f4b11a249567..cd661ea77c46b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 8bddc5cb232c4..5358dc3022a9f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index b2b12dd060495..7da9303261a8a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 8f05f4294eaf9..df73d24b31628 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 98465eeca9168..d4b251bc4d909 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 68530f37b0796..be8da7adb8e4c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 0de8193218662..eff3c1d508e7c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 766bbc64b06f9..6f3ecd1f26110 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 7291faa25100f..5653327878f87 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 81572a65f7952..3143dce2c59b4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 0f323c502f4b0..c8f0502e87774 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index b76221057d868..f996369f35a5a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 2b08e85635d85..fb243a285fbcf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index b96515f47e56e..ffc6368bc3616 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index e2eac2c41f700..19ca64edfe0c0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 1a5a185d7207d..1c595a567dcec 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index fc8307aa40291..c83ef82417ca3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 3e4acefdb49a8..9fe977af42580 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 2b37f619035cd..31f2f84fdb35d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 21b1476a1cd5c..d6a526fb135fc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 16471f6082d2a..a2a6cf6e8e8e4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index b8348d5b4e0d0..18cebeaba59a7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 99a19348d6f6e..9be8b116499c7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index a1f82fd6f4204..9ba2ee22bb382 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 498781a110368..cfbafda348088 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index e61fa73f779fd..ebb3b68c41854 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index fb97edb750679..c3ca6b121f988 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 998ea01939498..c4dbd1ad6e5be 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 9006f61580752..546867b399623 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 26c6cca6859d1..6f443edbbfcab 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 6773f689157a5..a3d2d87bb5ebe 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 59b5cd14f66ff..fd23f732c9fe1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 00d2daf5e7e29..1cab6fc40615b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 087e03ad8fec0..94948400a4541 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 05dc9cc0932c6..f364e8eea8546 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 6278e07552b72..124e72d415ae7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser.mdx b/api_docs/kbn_core_rendering_browser.mdx index 72720bbe02cfc..2772d8e4c207c 100644 --- a/api_docs/kbn_core_rendering_browser.mdx +++ b/api_docs/kbn_core_rendering_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser title: "@kbn/core-rendering-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser'] --- import kbnCoreRenderingBrowserObj from './kbn_core_rendering_browser.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 014a20a1d146f..48de33decb424 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 65ad02a75a9df..cf8d609527b63 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index bfae09edfb668..41fef5aba5f0c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 6d45673e4888e..f8366a46bbd77 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index 6c099d5f78424..5879bf7544b6e 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -886,6 +886,14 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core", "path": "src/core/public/index.ts" @@ -926,14 +934,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/application/contexts/query_input_bar_context.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.test.ts" @@ -1121,14 +1121,14 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "home", - "path": "src/plugins/home/public/application/components/home_app.js" - }, { "plugin": "@kbn/core-saved-objects-browser-mocks", "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/home_app.js" + }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" @@ -2767,6 +2767,18 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core", "path": "src/core/public/index.ts" @@ -2878,18 +2890,6 @@ { "plugin": "visualizations", "path": "src/plugins/visualizations/public/wizard/search_selection/show_saved_object.test.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" } ], "children": [ diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 6c9bcdd0c2ae3..aff61fcab297b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.devdocs.json b/api_docs/kbn_core_saved_objects_api_server.devdocs.json index faaa627699590..b8dd073bb0056 100644 --- a/api_docs/kbn_core_saved_objects_api_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_server.devdocs.json @@ -2330,6 +2330,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server-internal", "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts" @@ -2342,10 +2346,6 @@ "plugin": "@kbn/core-saved-objects-server-internal", "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts" diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 0203fbac2f876..3919067b4256e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 98d41a1e3380d..42fae065a453c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 8557124bdcda4..dffb464a50731 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 1a71c86b70763..ef60170a9f022 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.devdocs.json b/api_docs/kbn_core_saved_objects_browser.devdocs.json index f625e14052421..8a01915ae9add 100644 --- a/api_docs/kbn_core_saved_objects_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_browser.devdocs.json @@ -17,18 +17,6 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "@kbn/core-lifecycle-browser", - "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts" - }, - { - "plugin": "@kbn/core-lifecycle-browser", - "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts" - }, - { - "plugin": "@kbn/core-lifecycle-browser", - "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts" @@ -41,6 +29,26 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" + }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" + }, + { + "plugin": "@kbn/core-lifecycle-browser", + "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts" + }, + { + "plugin": "@kbn/core-lifecycle-browser", + "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts" + }, + { + "plugin": "@kbn/core-lifecycle-browser", + "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts" + }, { "plugin": "@kbn/core", "path": "src/core/public/index.ts" @@ -72,14 +80,6 @@ { "plugin": "@kbn/core", "path": "src/core/server/index.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" } ], "children": [ diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 00436cf886dbf..5463bb8a58cd2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json b/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json index 83b0893914e67..016c97e0e12c7 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json @@ -36,24 +36,24 @@ "trackAdoption": false, "references": [ { - "plugin": "@kbn/core-root-browser-internal", - "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" }, { - "plugin": "@kbn/core-root-browser-internal", - "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" }, { "plugin": "@kbn/core-root-browser-internal", "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" }, { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" + "plugin": "@kbn/core-root-browser-internal", + "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" }, { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" + "plugin": "@kbn/core-root-browser-internal", + "path": "packages/core/root/core-root-browser-internal/src/core_system.ts" } ], "children": [ diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 67e0027d173cf..440ddeac8a5b3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 185c5151a73dc..857f97abe2335 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index 27c7f50f6423b..635e336f001b6 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -1213,6 +1213,18 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core", "path": "src/core/public/index.ts" @@ -1437,18 +1449,6 @@ "plugin": "@kbn/core-saved-objects-import-export-server-internal", "path": "packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/apply_export_transforms.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.test.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 8a856f1f061b0..836200cf58306 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index a6e4abed4ba57..26a7caacf22ab 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 5e5163d7f8191..96479a7c58f93 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 68cd1c18dca8e..072765c8df67e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 4372cddba9070..615a4149d5a78 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index 144ba6e5eaad2..aef7aef255a30 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -5859,6 +5859,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-mocks", + "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server-internal", "path": "packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts" @@ -5871,10 +5875,6 @@ "plugin": "@kbn/core-saved-objects-server-internal", "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.ts" }, - { - "plugin": "@kbn/core-saved-objects-browser-mocks", - "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts" @@ -10763,18 +10763,6 @@ "plugin": "maps", "path": "x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts" }, - { - "plugin": "visualizations", - "path": "src/plugins/visualizations/server/saved_objects/visualization.ts" - }, - { - "plugin": "apmDataAccess", - "path": "x-pack/plugins/observability_solution/apm_data_access/server/saved_objects/apm_indices.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/server/lib/sources/saved_object_type.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts" @@ -10795,10 +10783,22 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/lib/artifacts/saved_object_mappings.ts" }, + { + "plugin": "apmDataAccess", + "path": "x-pack/plugins/observability_solution/apm_data_access/server/saved_objects/apm_indices.ts" + }, { "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/server/saved_objects/apm_service_groups.ts" }, + { + "plugin": "visualizations", + "path": "src/plugins/visualizations/server/saved_objects/visualization.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/server/lib/sources/saved_object_type.ts" + }, { "plugin": "slo", "path": "x-pack/plugins/observability_solution/slo/server/saved_objects/slo.ts" @@ -11554,10 +11554,6 @@ "plugin": "maps", "path": "x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts" }, - { - "plugin": "visualizations", - "path": "src/plugins/visualizations/server/saved_objects/visualization.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts" @@ -11574,6 +11570,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_saved_object_mappings.ts" }, + { + "plugin": "visualizations", + "path": "src/plugins/visualizations/server/saved_objects/visualization.ts" + }, { "plugin": "@kbn/core-test-helpers-so-type-serializer", "path": "packages/core/test-helpers/core-test-helpers-so-type-serializer/src/extract_migration_info.ts" diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 6bf2d1e33f8d7..74a389ff39017 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 739ca5468b704..d62c6b57515f4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index e6c9a86b32220..011f577aeed1a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index c97c2df724aac..30ed70f93e8d0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index b682c8c3f93e8..e04b54286e93d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 5560e404afe26..cd545bcf2b915 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index f6e0d4d13add9..4e83a2288a621 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 4cd19de06ef2a..b4a0993d64ad5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 8483bdd8ec7c9..fc68ffb4ff751 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index ca0e0bc1dfbc0..05c4167c5c410 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index af698f43cb8c0..5396d8be7657c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 968ba728ad4f4..078fa1d084aca 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index e343f288eb9a2..65272e368a4fa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index bfb89bf975f5a..bb5a6ba4ab0d5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index a737b79d3f5ba..48f8719a97fcc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index ae97e67fb0870..911596660fd16 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 8a02a9580c5f2..26de448953d66 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index a2b4375d91f5a..738c1b40eeee2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 911958b64f6c9..ffc278bee7628 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 9ec25179db891..6b736d8f736df 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index cec40d2fe58a9..9e80be29d67b4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 65fc9b6ef2294..5c05b33139fa3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 8015c2037ecd5..81fa49bfeb0b6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index aac24cc2b8797..9357d351a90d2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 5a6ef4545f06d..1219cbb85fca4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 8af2f1ec3fce1..a3cb23f23ae86 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 03f68c1f67911..8bf2e2c331513 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 955b7c0888321..79bd939b353f8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index ef649a85cf818..88e4198742512 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index d302813051089..27241722637bc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index af698de3ef9b3..d2716dbda2553 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index dd6adadc08ff9..b4dda22a16fb2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index ea631910b93bb..f3c7d98e70664 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 828142fa1f6e5..b3f9c245dd194 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 83eded117948e..9aa734c22a48f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 3f10d256503f5..35da6db3b343e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index dd8af1cabec67..5c4c524887626 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 99c739e8a177b..67b7bebac4cbe 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 791f5e818e5d1..8f9dc0413e716 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index da9ff6c990cbe..b7992747463fe 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 0b86dd76cf67b..1622cbd5f0497 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 5f612d4d57144..1b974c7561136 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index e23337554b692..a7d50a7c1790e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 230823f25eff1..b94549a7fbe46 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 1b1780d005298..06c25e9d46e62 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index b31685f6774ca..7f985d813e7e6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index c0be02f585d99..af0f26589df95 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 2feb4a4bed699..bae84d2de6b40 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 6f21ad94849af..686bfbdcc5aa3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 05cfd5ec31920..5a1c11d4d6137 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index cb9cccfb17deb..c5b9a09fa3dcf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 35014b0edd438..41add7061877c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 2e2fce64e82fc..7af8d8273310c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 6218b621946d6..0f532c8b9fe81 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index b24ee1dfcb045..934e11659c1af 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 5bcfb2b802902..e14f3c1eb13bb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index af32b698c4d59..2852757ac172e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 0047fe3a09f97..bbaaeb2565efd 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index b3b2a6acac31f..2ed3d171e1e38 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index c43fa4a74365a..f485cde81d95b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 83acd15dc1054..7d1502ffd0b98 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index db7b2f78fd2f0..ecdf21cbe14d9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 55d16c3017982..eea13281f09d5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 6c8b9026a4f9d..87e89b6113b26 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index bdcd160265547..83057985e344a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 866e5088336f3..6905c82d51707 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 55746584265c7..34d477eccdbf7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 184adee02717f..30222f2c560d0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 3ad4e255b7699..29344ba7c55c4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_contextual_components.mdx b/api_docs/kbn_discover_contextual_components.mdx index 17f27301f23ad..26d9384199104 100644 --- a/api_docs/kbn_discover_contextual_components.mdx +++ b/api_docs/kbn_discover_contextual_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-contextual-components title: "@kbn/discover-contextual-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-contextual-components plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-contextual-components'] --- import kbnDiscoverContextualComponentsObj from './kbn_discover_contextual_components.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 127098ca2d2e5..422494601c885 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-12-10 +date: 2024-12-12 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 9e7a1ab119ce3..ab451f2b88259 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -543,7 +543,7 @@ "label": "securitySolution", "description": [], "signature": [ - "{ readonly aiAssistant: string; readonly artifactControl: string; readonly avcResults: string; readonly bidirectionalIntegrations: string; readonly trustedApps: string; readonly eventFilters: string; readonly eventMerging: string; readonly blocklist: string; readonly endpointArtifacts: string; readonly policyResponseTroubleshooting: { full_disk_access: string; macos_system_ext: string; linux_deadlock: string; }; readonly packageActionTroubleshooting: { es_connection: string; }; readonly threatIntelInt: string; readonly responseActions: string; readonly configureEndpointIntegrationPolicy: string; readonly exceptions: { value_lists: string; }; readonly privileges: string; readonly manageDetectionRules: string; readonly createDetectionRules: string; readonly createEsqlRuleType: string; readonly ruleUiAdvancedParams: string; readonly entityAnalytics: { readonly riskScorePrerequisites: string; readonly entityRiskScoring: string; readonly assetCriticality: string; }; readonly detectionEngineOverview: string; }" + "{ readonly aiAssistant: string; readonly artifactControl: string; readonly avcResults: string; readonly bidirectionalIntegrations: string; readonly trustedApps: string; readonly eventFilters: string; readonly eventMerging: string; readonly blocklist: string; readonly endpointArtifacts: string; readonly policyResponseTroubleshooting: { full_disk_access: string; macos_system_ext: string; linux_deadlock: string; }; readonly packageActionTroubleshooting: { es_connection: string; }; readonly threatIntelInt: string; readonly responseActions: string; readonly configureEndpointIntegrationPolicy: string; readonly exceptions: { value_lists: string; }; readonly privileges: string; readonly manageDetectionRules: string; readonly createDetectionRules: string; readonly createEsqlRuleType: string; readonly ruleUiAdvancedParams: string; readonly entityAnalytics: { readonly riskScorePrerequisites: string; readonly entityRiskScoring: string; readonly assetCriticality: string; }; readonly detectionEngineOverview: string; readonly signalsMigrationApi: string; }" ], "path": "src/platform/packages/shared/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 796964c86f5af..885814cdf94ac 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 198f7ae9e46c5..b41b2d51fe724 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index f9b7f0f22d2c9..a4eae443fa790 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 4cdac1f86fcbf..1caded4d88f85 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 5438fc2be9b33..a566309e3daf1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 8b2fb8cef2815..4817f8a0583d6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 7df32d5195bce..7480de2f1b314 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-12-10 +date: 2024-12-12 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 a864611adb34f..fa5f7a3f2b558 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -3525,7 +3525,7 @@ "tags": [], "label": "NonEmptyString", "description": [ - "\nA string that is not empty and does not contain only whitespace" + "\nA string that does not contain only whitespace characters" ], "signature": [ "string" @@ -4292,7 +4292,7 @@ "label": "AppendConversationMessageRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ messages: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }>" + "Zod.ZodObject<{ messages: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/append_message.gen.ts", "deprecated": false, @@ -4307,7 +4307,7 @@ "label": "AppendConversationMessageRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/append_message.gen.ts", "deprecated": false, @@ -4322,7 +4322,7 @@ "label": "AppendConversationMessageResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/append_message.gen.ts", "deprecated": false, @@ -4337,7 +4337,7 @@ "label": "AttackDiscoveries", "description": [], "signature": [ - "Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">" + "Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", "deprecated": false, @@ -4352,7 +4352,7 @@ "label": "AttackDiscovery", "description": [], "signature": [ - "Zod.ZodObject<{ alertIds: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>" + "Zod.ZodObject<{ alertIds: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", "deprecated": false, @@ -4367,7 +4367,7 @@ "label": "AttackDiscoveryCancelRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ connectorId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; }, { connectorId: string; }>" + "Zod.ZodObject<{ connectorId: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; }, { connectorId: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", "deprecated": false, @@ -4382,7 +4382,7 @@ "label": "AttackDiscoveryCancelResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", "deprecated": false, @@ -4397,7 +4397,7 @@ "label": "AttackDiscoveryCreateProps", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodOptional; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; alertsContextCount: Zod.ZodOptional; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodOptional; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; alertsContextCount: Zod.ZodOptional; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", "deprecated": false, @@ -4412,7 +4412,7 @@ "label": "AttackDiscoveryGetRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ connectorId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; }, { connectorId: string; }>" + "Zod.ZodObject<{ connectorId: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; }, { connectorId: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", "deprecated": false, @@ -4427,7 +4427,7 @@ "label": "AttackDiscoveryGetResponse", "description": [], "signature": [ - "Zod.ZodObject<{ data: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>>; stats: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }, { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { stats: { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }[]; data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; } | undefined; }, { stats: { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }[]; data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; } | undefined; }>" + "Zod.ZodObject<{ data: Zod.ZodOptional; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>>; stats: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }, { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { stats: { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }[]; data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; } | undefined; }, { stats: { connectorId: string; count: number; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; hasViewed: boolean; }[]; data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; } | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", "deprecated": false, @@ -4442,7 +4442,7 @@ "label": "AttackDiscoveryPostRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ alertsIndexPattern: Zod.ZodString; anonymizationFields: Zod.ZodArray; field: Zod.ZodString; allowed: Zod.ZodOptional; anonymized: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; model: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; size: Zod.ZodNumber; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" + "Zod.ZodObject<{ alertsIndexPattern: Zod.ZodString; anonymizationFields: Zod.ZodArray; timestamp: Zod.ZodOptional>; field: Zod.ZodString; allowed: Zod.ZodOptional; anonymized: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; model: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; size: Zod.ZodNumber; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, @@ -4457,7 +4457,7 @@ "label": "AttackDiscoveryPostResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, @@ -4472,7 +4472,7 @@ "label": "AttackDiscoveryResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; alertsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; lastViewedAt: string; attackDiscoveries: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; alertsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", "deprecated": false, @@ -4547,7 +4547,7 @@ "label": "AttackDiscoveryUpdateProps", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; alertsContextCount: Zod.ZodOptional; attackDiscoveries: Zod.ZodOptional; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; alertsContextCount: Zod.ZodOptional; attackDiscoveries: Zod.ZodOptional; id: Zod.ZodOptional; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodOptional; mitreAttackTactics: Zod.ZodOptional>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; summaryMarkdown: string; id?: string | undefined; timestamp?: string | undefined; entitySummaryMarkdown?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", "deprecated": false, @@ -4622,7 +4622,7 @@ "label": "BaseUpdateProps", "description": [], "signature": [ - "Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, \"strip\", Zod.ZodTypeAny, { id: string; namespace?: string | undefined; name?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; }, { id: string; namespace?: string | undefined; name?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; }>" + "Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, \"strip\", Zod.ZodTypeAny, { id: string; namespace?: string | undefined; name?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; }, { id: string; namespace?: string | undefined; name?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -4802,7 +4802,7 @@ "label": "ConversationCreateProps", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodOptional; title: Zod.ZodString; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodOptional; title: Zod.ZodString; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -4832,7 +4832,7 @@ "label": "ConversationMessageCreateProps", "description": [], "signature": [ - "Zod.ZodObject<{ messages: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }>" + "Zod.ZodObject<{ messages: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }, { messages: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[]; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -4847,7 +4847,7 @@ "label": "ConversationResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -4892,7 +4892,7 @@ "label": "ConversationsBulkCrudActionResponse", "description": [], "signature": [ - "Zod.ZodObject<{ success: Zod.ZodOptional; status_code: Zod.ZodOptional; message: Zod.ZodOptional; conversations_count: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; created: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"CONVERSATION_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; conversations: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }>" + "Zod.ZodObject<{ success: Zod.ZodOptional; status_code: Zod.ZodOptional; message: Zod.ZodOptional; conversations_count: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; created: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"CONVERSATION_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; conversations: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/bulk_crud_conversations_route.gen.ts", "deprecated": false, @@ -4907,7 +4907,7 @@ "label": "ConversationsBulkCrudActionResults", "description": [], "signature": [ - "Zod.ZodObject<{ updated: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; created: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"CONVERSATION_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>" + "Zod.ZodObject<{ updated: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; created: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"CONVERSATION_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/bulk_crud_conversations_route.gen.ts", "deprecated": false, @@ -4922,7 +4922,7 @@ "label": "ConversationSummary", "description": [], "signature": [ - "Zod.ZodObject<{ content: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>" + "Zod.ZodObject<{ content: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -4937,7 +4937,7 @@ "label": "ConversationUpdateProps", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodOptional; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodOptional; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -4952,7 +4952,7 @@ "label": "CreateConversationRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodOptional; title: Zod.ZodString; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodOptional; title: Zod.ZodString; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -4967,7 +4967,7 @@ "label": "CreateConversationResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -4997,7 +4997,7 @@ "label": "CreateKnowledgeBaseEntryResponse", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -5089,7 +5089,7 @@ "label": "DefendInsightCreateProps", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodOptional; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; eventsContextCount: Zod.ZodOptional; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodOptional; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; eventsContextCount: Zod.ZodOptional; endpointIds: Zod.ZodArray, \"many\">; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; id?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", "deprecated": false, @@ -5134,7 +5134,7 @@ "label": "DefendInsightGetRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", "deprecated": false, @@ -5149,7 +5149,7 @@ "label": "DefendInsightGetResponse", "description": [], "signature": [ - "Zod.ZodObject<{ data: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>>>; }, \"strip\", Zod.ZodTypeAny, { data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }, { data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }>" + "Zod.ZodObject<{ data: Zod.ZodOptional; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray, \"many\">; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>>>; }, \"strip\", Zod.ZodTypeAny, { data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }, { data?: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; } | null | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insight_route.gen.ts", "deprecated": false, @@ -5179,7 +5179,7 @@ "label": "DefendInsightsGetRequestQuery", "description": [], "signature": [ - "Zod.ZodObject<{ ids: Zod.ZodOptional, string[], unknown>>; connector_id: Zod.ZodOptional; type: Zod.ZodOptional>; status: Zod.ZodOptional>; endpoint_ids: Zod.ZodOptional, string[], unknown>>; size: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: string[] | undefined; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: string[] | undefined; }, { type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: unknown; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: unknown; }>" + "Zod.ZodObject<{ ids: Zod.ZodOptional, \"many\">, string[], unknown>>; connector_id: Zod.ZodOptional>; type: Zod.ZodOptional>; status: Zod.ZodOptional>; endpoint_ids: Zod.ZodOptional, \"many\">, string[], unknown>>; size: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: string[] | undefined; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: string[] | undefined; }, { type?: \"incompatible_antivirus\" | \"noisy_process_tree\" | undefined; size?: number | undefined; ids?: unknown; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; connector_id?: string | undefined; endpoint_ids?: unknown; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", "deprecated": false, @@ -5194,7 +5194,7 @@ "label": "DefendInsightsGetResponse", "description": [], "signature": [ - "Zod.ZodObject<{ data: Zod.ZodArray; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }, { data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }>" + "Zod.ZodObject<{ data: Zod.ZodArray; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray, \"many\">; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }, { data: { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }[]; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/get_defend_insights_route.gen.ts", "deprecated": false, @@ -5209,7 +5209,7 @@ "label": "DefendInsightsPostRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; anonymizationFields: Zod.ZodArray; field: Zod.ZodString; allowed: Zod.ZodOptional; anonymized: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; model: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" + "Zod.ZodObject<{ endpointIds: Zod.ZodArray, \"many\">; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; anonymizationFields: Zod.ZodArray; timestamp: Zod.ZodOptional>; field: Zod.ZodString; allowed: Zod.ZodOptional; anonymized: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }, { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; model: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { subAction: \"invokeAI\" | \"invokeStream\"; anonymizationFields: { id: string; field: string; namespace?: string | undefined; timestamp?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", "deprecated": false, @@ -5224,7 +5224,7 @@ "label": "DefendInsightsPostResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray, \"many\">; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/post_defend_insights_route.gen.ts", "deprecated": false, @@ -5239,7 +5239,7 @@ "label": "DefendInsightsResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodString; lastViewedAt: Zod.ZodString; eventsContextCount: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; endpointIds: Zod.ZodArray, \"many\">; insightType: Zod.ZodEnum<[\"incompatible_antivirus\", \"noisy_process_tree\"]>; insights: Zod.ZodArray, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }, { id: string; namespace: string; createdAt: string; updatedAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }; endpointIds: string[]; insightType: \"incompatible_antivirus\" | \"noisy_process_tree\"; lastViewedAt: string; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; insights: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[]; timestamp?: string | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; eventsContextCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", "deprecated": false, @@ -5284,7 +5284,7 @@ "label": "DefendInsightsUpdateProps", "description": [], "signature": [ - "Zod.ZodArray; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; eventsContextCount: Zod.ZodOptional; insights: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }>, \"many\">" + "Zod.ZodArray; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; eventsContextCount: Zod.ZodOptional; insights: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }>, \"many\">" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", "deprecated": false, @@ -5329,7 +5329,7 @@ "label": "DefendInsightUpdateProps", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; eventsContextCount: Zod.ZodOptional; insights: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; eventsContextCount: Zod.ZodOptional; insights: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }, { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }>, \"many\">>; status: Zod.ZodOptional>; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional; lastViewedAt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }, { id: string; backingIndex: string; status?: \"running\" | \"succeeded\" | \"failed\" | \"canceled\" | undefined; failureReason?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; lastViewedAt?: string | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; eventsContextCount?: number | undefined; insights?: { group: string; events?: { id: string; value: string; endpointId: string; }[] | undefined; }[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/defend_insights/common_attributes.gen.ts", "deprecated": false, @@ -5344,7 +5344,7 @@ "label": "DeleteConversationRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -5359,7 +5359,7 @@ "label": "DeleteConversationResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -5374,7 +5374,7 @@ "label": "DeleteKnowledgeBaseEntryRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -5389,7 +5389,7 @@ "label": "DeleteKnowledgeBaseEntryResponse", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -5404,7 +5404,7 @@ "label": "DocumentEntry", "description": [], "signature": [ - "Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>" + "Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -5494,7 +5494,7 @@ "label": "DocumentEntryUpdateFields", "description": [], "signature": [ - "Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>" + "Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -5509,7 +5509,7 @@ "label": "ErrorSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodOptional; error: Zod.ZodObject<{ status_code: Zod.ZodNumber; message: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { message: string; status_code: number; }, { message: string; status_code: number; }>; }, \"strict\", Zod.ZodTypeAny, { error: { message: string; status_code: number; }; id?: string | undefined; }, { error: { message: string; status_code: number; }; id?: string | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodOptional>; error: Zod.ZodObject<{ status_code: Zod.ZodNumber; message: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { message: string; status_code: number; }, { message: string; status_code: number; }>; }, \"strict\", Zod.ZodTypeAny, { error: { message: string; status_code: number; }; id?: string | undefined; }, { error: { message: string; status_code: number; }; id?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -5524,7 +5524,7 @@ "label": "ExecuteConnectorRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ conversationId: Zod.ZodOptional; message: Zod.ZodOptional; model: Zod.ZodOptional; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; actionTypeId: Zod.ZodString; alertsIndexPattern: Zod.ZodOptional; allow: Zod.ZodOptional>; allowReplacement: Zod.ZodOptional>; replacements: Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>; size: Zod.ZodOptional; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { actionTypeId: string; subAction: \"invokeAI\" | \"invokeStream\"; replacements: {} & { [k: string]: string; }; message?: string | undefined; size?: number | undefined; allow?: string[] | undefined; conversationId?: string | undefined; model?: string | undefined; alertsIndexPattern?: string | undefined; allowReplacement?: string[] | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { actionTypeId: string; subAction: \"invokeAI\" | \"invokeStream\"; replacements: {} & { [k: string]: string; }; message?: string | undefined; size?: number | undefined; allow?: string[] | undefined; conversationId?: string | undefined; model?: string | undefined; alertsIndexPattern?: string | undefined; allowReplacement?: string[] | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" + "Zod.ZodObject<{ conversationId: Zod.ZodOptional>; message: Zod.ZodOptional; model: Zod.ZodOptional; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; actionTypeId: Zod.ZodString; alertsIndexPattern: Zod.ZodOptional; allow: Zod.ZodOptional>; allowReplacement: Zod.ZodOptional>; replacements: Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>; size: Zod.ZodOptional; langSmithProject: Zod.ZodOptional; langSmithApiKey: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { actionTypeId: string; subAction: \"invokeAI\" | \"invokeStream\"; replacements: {} & { [k: string]: string; }; message?: string | undefined; size?: number | undefined; allow?: string[] | undefined; conversationId?: string | undefined; model?: string | undefined; alertsIndexPattern?: string | undefined; allowReplacement?: string[] | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }, { actionTypeId: string; subAction: \"invokeAI\" | \"invokeStream\"; replacements: {} & { [k: string]: string; }; message?: string | undefined; size?: number | undefined; allow?: string[] | undefined; conversationId?: string | undefined; model?: string | undefined; alertsIndexPattern?: string | undefined; allowReplacement?: string[] | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/actions_connector/post_actions_connector_execute_route.gen.ts", "deprecated": false, @@ -5584,7 +5584,7 @@ "label": "FindConversationsResponse", "description": [], "signature": [ - "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; data: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; data: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; perPage: number; total: number; }, { page: number; data: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; perPage: number; total: number; }>" + "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; data: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; data: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; perPage: number; total: number; }, { page: number; data: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; perPage: number; total: number; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/find_conversations_route.gen.ts", "deprecated": false, @@ -5644,7 +5644,7 @@ "label": "FindKnowledgeBaseEntriesResponse", "description": [], "signature": [ - "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; data: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; data: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; perPage: number; total: number; }, { page: number; data: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; perPage: number; total: number; }>" + "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; data: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; data: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; perPage: number; total: number; }, { page: number; data: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; perPage: number; total: number; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/find_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -5704,7 +5704,7 @@ "label": "FindPromptsResponse", "description": [], "signature": [ - "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; data: Zod.ZodArray; name: Zod.ZodString; promptType: Zod.ZodEnum<[\"system\", \"quick\"]>; content: Zod.ZodString; categories: Zod.ZodOptional>; color: Zod.ZodOptional; isNewConversationDefault: Zod.ZodOptional; isDefault: Zod.ZodOptional; consumer: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; data: { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[]; perPage: number; total: number; }, { page: number; data: { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[]; perPage: number; total: number; }>" + "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; data: Zod.ZodArray; timestamp: Zod.ZodOptional>; name: Zod.ZodString; promptType: Zod.ZodEnum<[\"system\", \"quick\"]>; content: Zod.ZodString; categories: Zod.ZodOptional>; color: Zod.ZodOptional; isNewConversationDefault: Zod.ZodOptional; isDefault: Zod.ZodOptional; consumer: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; data: { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[]; perPage: number; total: number; }, { page: number; data: { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[]; perPage: number; total: number; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/prompts/find_prompts_route.gen.ts", "deprecated": false, @@ -5809,7 +5809,7 @@ "label": "IndexEntry", "description": [], "signature": [ - "Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>" + "Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -5899,7 +5899,7 @@ "label": "IndexEntryUpdateFields", "description": [], "signature": [ - "Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>" + "Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -5974,7 +5974,7 @@ "label": "KnowledgeBaseEntryBulkCrudActionResponse", "description": [], "signature": [ - "Zod.ZodObject<{ success: Zod.ZodOptional; statusCode: Zod.ZodOptional; message: Zod.ZodOptional; knowledgeBaseEntriesCount: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; created: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; knowledgeBaseEntries: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }>" + "Zod.ZodObject<{ success: Zod.ZodOptional; statusCode: Zod.ZodOptional; message: Zod.ZodOptional; knowledgeBaseEntriesCount: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; created: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; knowledgeBaseEntries: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/bulk_crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -5989,7 +5989,7 @@ "label": "KnowledgeBaseEntryBulkCrudActionResults", "description": [], "signature": [ - "Zod.ZodObject<{ updated: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; created: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>" + "Zod.ZodObject<{ updated: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; created: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/bulk_crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6064,7 +6064,7 @@ "label": "KnowledgeBaseEntryResponse", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -6079,7 +6079,7 @@ "label": "KnowledgeBaseEntryUpdateProps", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -6109,7 +6109,7 @@ "label": "Message", "description": [], "signature": [ - "Zod.ZodObject<{ content: Zod.ZodString; reader: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>" + "Zod.ZodObject<{ content: Zod.ZodString; reader: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -6184,7 +6184,7 @@ "label": "NonEmptyString", "description": [], "signature": [ - "Zod.ZodString" + "Zod.ZodEffects" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/common_attributes.gen.ts", "deprecated": false, @@ -6229,7 +6229,7 @@ "label": "PerformBulkActionRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ delete: Zod.ZodOptional; ids: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { ids?: string[] | undefined; query?: string | undefined; }, { ids?: string[] | undefined; query?: string | undefined; }>>; create: Zod.ZodOptional; title: Zod.ZodString; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">>; update: Zod.ZodOptional; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { create?: { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; update?: { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }, { create?: { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; update?: { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }>" + "Zod.ZodObject<{ delete: Zod.ZodOptional; ids: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { ids?: string[] | undefined; query?: string | undefined; }, { ids?: string[] | undefined; query?: string | undefined; }>>; create: Zod.ZodOptional; title: Zod.ZodString; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">>; update: Zod.ZodOptional; title: Zod.ZodOptional; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { create?: { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; update?: { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }, { create?: { title: string; id?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; update?: { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/bulk_crud_conversations_route.gen.ts", "deprecated": false, @@ -6244,7 +6244,7 @@ "label": "PerformBulkActionResponse", "description": [], "signature": [ - "Zod.ZodObject<{ success: Zod.ZodOptional; status_code: Zod.ZodOptional; message: Zod.ZodOptional; conversations_count: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; created: Zod.ZodArray; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"CONVERSATION_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; conversations: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }>" + "Zod.ZodObject<{ success: Zod.ZodOptional; status_code: Zod.ZodOptional; message: Zod.ZodOptional; conversations_count: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; created: Zod.ZodArray; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"CONVERSATION_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; conversations: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }, { attributes: { results: { created: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; updated: { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }[]; skipped: { id: string; skip_reason: \"CONVERSATION_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; status_code: number; conversations: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; status_code?: number | undefined; conversations_count?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/bulk_crud_conversations_route.gen.ts", "deprecated": false, @@ -6259,7 +6259,7 @@ "label": "PerformKnowledgeBaseEntryBulkActionRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ delete: Zod.ZodOptional; ids: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { ids?: string[] | undefined; query?: string | undefined; }, { ids?: string[] | undefined; query?: string | undefined; }>>; create: Zod.ZodOptional; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>, \"strip\", Zod.ZodTypeAny, { source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>, \"strip\", Zod.ZodTypeAny, { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">>; update: Zod.ZodOptional; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { create?: ({ source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; update?: ({ source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }, { create?: ({ source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; update?: ({ source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }>" + "Zod.ZodObject<{ delete: Zod.ZodOptional; ids: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { ids?: string[] | undefined; query?: string | undefined; }, { ids?: string[] | undefined; query?: string | undefined; }>>; create: Zod.ZodOptional; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>, \"strip\", Zod.ZodTypeAny, { source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>, \"strip\", Zod.ZodTypeAny, { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">>; update: Zod.ZodOptional; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { create?: ({ source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; update?: ({ source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }, { create?: ({ source: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; update?: ({ source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/bulk_crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6274,7 +6274,7 @@ "label": "PerformKnowledgeBaseEntryBulkActionResponse", "description": [], "signature": [ - "Zod.ZodObject<{ success: Zod.ZodOptional; statusCode: Zod.ZodOptional; message: Zod.ZodOptional; knowledgeBaseEntriesCount: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; created: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; knowledgeBaseEntries: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }>" + "Zod.ZodObject<{ success: Zod.ZodOptional; statusCode: Zod.ZodOptional; message: Zod.ZodOptional; knowledgeBaseEntriesCount: Zod.ZodOptional; attributes: Zod.ZodObject<{ results: Zod.ZodObject<{ updated: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; created: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>, \"many\">; deleted: Zod.ZodArray; skipped: Zod.ZodArray; skip_reason: Zod.ZodLiteral<\"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\">; }, \"strip\", Zod.ZodTypeAny, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }, { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }, { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }>; summary: Zod.ZodObject<{ failed: Zod.ZodNumber; skipped: Zod.ZodNumber; succeeded: Zod.ZodNumber; total: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { total: number; succeeded: number; failed: number; skipped: number; }, { total: number; succeeded: number; failed: number; skipped: number; }>; errors: Zod.ZodOptional; knowledgeBaseEntries: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { id: string; name?: string | undefined; }, { id: string; name?: string | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }, { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }>, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }, { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }, { attributes: { results: { created: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; updated: ({ source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; } | { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; })[]; skipped: { id: string; skip_reason: \"KNOWLEDGE_BASE_ENTRY_NOT_MODIFIED\"; name?: string | undefined; }[]; deleted: string[]; }; summary: { total: number; succeeded: number; failed: number; skipped: number; }; errors?: { message: string; statusCode: number; knowledgeBaseEntries: { id: string; name?: string | undefined; }[]; err_code?: string | undefined; }[] | undefined; }; message?: string | undefined; success?: boolean | undefined; statusCode?: number | undefined; knowledgeBaseEntriesCount?: number | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/bulk_crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6334,7 +6334,7 @@ "label": "PromptResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional; name: Zod.ZodString; promptType: Zod.ZodEnum<[\"system\", \"quick\"]>; content: Zod.ZodString; categories: Zod.ZodOptional>; color: Zod.ZodOptional; isNewConversationDefault: Zod.ZodOptional; isDefault: Zod.ZodOptional; consumer: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; timestamp: Zod.ZodOptional>; name: Zod.ZodString; promptType: Zod.ZodEnum<[\"system\", \"quick\"]>; content: Zod.ZodString; categories: Zod.ZodOptional>; color: Zod.ZodOptional; isNewConversationDefault: Zod.ZodOptional; isDefault: Zod.ZodOptional; consumer: Zod.ZodOptional; updatedAt: Zod.ZodOptional; updatedBy: Zod.ZodOptional; createdAt: Zod.ZodOptional; createdBy: Zod.ZodOptional; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; namespace: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }, { id: string; name: string; content: string; promptType: \"system\" | \"quick\"; namespace?: string | undefined; consumer?: string | undefined; timestamp?: string | undefined; color?: string | undefined; createdBy?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/prompts/bulk_crud_prompts_route.gen.ts", "deprecated": false, @@ -6394,7 +6394,7 @@ "label": "ReadConversationRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -6409,7 +6409,7 @@ "label": "ReadConversationResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -6439,7 +6439,7 @@ "label": "ReadKnowledgeBaseEntryRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6454,7 +6454,7 @@ "label": "ReadKnowledgeBaseEntryResponse", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6514,7 +6514,7 @@ "label": "ResponseFields", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; }, { id: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; }, { id: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -6544,7 +6544,7 @@ "label": "SharedResponseProps", "description": [], "signature": [ - "Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; }, { id: string; namespace: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; }>" + "Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; }, { id: string; namespace: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/common_attributes.gen.ts", "deprecated": false, @@ -6604,7 +6604,7 @@ "label": "UpdateConversationRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodOptional; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodOptional; category: Zod.ZodOptional>; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; excludeFromLastConversationStorage: Zod.ZodOptional; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; title?: string | undefined; category?: \"assistant\" | \"insights\" | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -6619,7 +6619,7 @@ "label": "UpdateConversationRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -6634,7 +6634,7 @@ "label": "UpdateConversationResponse", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodString; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; title: Zod.ZodString; category: Zod.ZodEnum<[\"assistant\", \"insights\"]>; summary: Zod.ZodOptional; timestamp: Zod.ZodOptional>; public: Zod.ZodOptional; confidence: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }, { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; }>>; timestamp: Zod.ZodOptional>; updatedAt: Zod.ZodOptional; createdAt: Zod.ZodString; replacements: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; messages: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; timestamp: Zod.ZodEffects; isError: Zod.ZodOptional; traceData: Zod.ZodOptional; traceId: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>, \"many\">>; apiConfig: Zod.ZodOptional; provider: Zod.ZodOptional>; model: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }, { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; }>>; isDefault: Zod.ZodOptional; excludeFromLastConversationStorage: Zod.ZodOptional; namespace: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }, { id: string; namespace: string; title: string; createdAt: string; category: \"assistant\" | \"insights\"; users: { id?: string | undefined; name?: string | undefined; }[]; timestamp?: string | undefined; updatedAt?: string | undefined; summary?: { timestamp?: string | undefined; content?: string | undefined; public?: boolean | undefined; confidence?: \"medium\" | \"high\" | \"low\" | undefined; } | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; apiConfig?: { connectorId: string; actionTypeId: string; provider?: \"Other\" | \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; defaultSystemPromptId?: string | undefined; } | undefined; messages?: { timestamp: string; role: \"user\" | \"system\" | \"assistant\"; content: string; isError?: boolean | undefined; reader?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; traceData?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }[] | undefined; isDefault?: boolean | undefined; excludeFromLastConversationStorage?: boolean | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/crud_conversation_route.gen.ts", "deprecated": false, @@ -6649,7 +6649,7 @@ "label": "UpdateKnowledgeBaseEntryRequestBody", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodString; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }>, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; text: string; name: string; kbResource: string; namespace?: string | undefined; required?: boolean | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; namespace: Zod.ZodOptional>; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>>; }, { id: Zod.ZodEffects; }>, Zod.objectUtil.extendShape; users: Zod.ZodOptional; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">>; }>, { type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }>, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; name: string; index: string; field: string; description: string; queryDescription: string; namespace?: string | undefined; users?: { id?: string | undefined; name?: string | undefined; }[] | undefined; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6664,7 +6664,7 @@ "label": "UpdateKnowledgeBaseEntryRequestParams", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" + "Zod.ZodObject<{ id: Zod.ZodEffects; }, \"strip\", Zod.ZodTypeAny, { id: string; }, { id: string; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, @@ -6679,7 +6679,7 @@ "label": "UpdateKnowledgeBaseEntryResponse", "description": [], "signature": [ - "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodString; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" + "Zod.ZodDiscriminatedUnion<\"type\", [Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"document\">; kbResource: Zod.ZodString; source: Zod.ZodString; text: Zod.ZodString; }, { required: Zod.ZodOptional; vector: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodNumber, \"strip\">>; }, \"strip\", Zod.ZodTypeAny, { modelId: string; tokens: {} & { [k: string]: number; }; }, { modelId: string; tokens: {} & { [k: string]: number; }; }>>; }>>, \"strip\", Zod.ZodTypeAny, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }, { source: string; id: string; type: \"document\"; namespace: string; text: string; name: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; kbResource: string; required?: boolean | undefined; vector?: { modelId: string; tokens: {} & { [k: string]: number; }; } | undefined; }>, Zod.ZodObject; name: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; }>, { id: Zod.ZodEffects; createdAt: Zod.ZodString; createdBy: Zod.ZodString; updatedAt: Zod.ZodString; updatedBy: Zod.ZodString; }>, Zod.objectUtil.extendShape<{ type: Zod.ZodLiteral<\"index\">; index: Zod.ZodString; field: Zod.ZodString; description: Zod.ZodString; queryDescription: Zod.ZodString; }, { inputSchema: Zod.ZodOptional, \"many\">>; outputFields: Zod.ZodOptional>; }>>, \"strip\", Zod.ZodTypeAny, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }, { id: string; type: \"index\"; namespace: string; name: string; index: string; field: string; description: string; createdBy: string; updatedBy: string; createdAt: string; updatedAt: string; users: { id?: string | undefined; name?: string | undefined; }[]; queryDescription: string; inputSchema?: { description: string; fieldName: string; fieldType: string; }[] | undefined; outputFields?: string[] | undefined; }>]>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/knowledge_base/entries/crud_knowledge_base_entries_route.gen.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 638efcb519e5e..b472f75ffdfda 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 44dd0e169a22c..20e445ce63ad1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 5543f3a6b731e..ceb3ac6d439a2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 97f4a71795a7d..6de31221c08b6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 9d3f70b0ee967..99b67bff52d0c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 0262b0586b2ff..c7d0a3515af48 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.devdocs.json b/api_docs/kbn_es_types.devdocs.json index ec62dd1cd61ff..31946760a86fb 100644 --- a/api_docs/kbn_es_types.devdocs.json +++ b/api_docs/kbn_es_types.devdocs.json @@ -584,6 +584,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/es-types", + "id": "def-common.ESSearchRequestWithoutBody", + "type": "Type", + "tags": [], + "label": "ESSearchRequestWithoutBody", + "description": [], + "signature": [ + "SearchRequest" + ], + "path": "packages/kbn-es-types/src/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/es-types", "id": "def-common.ESSearchResponse", diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index d9681706b3663..146b0e4dc24d6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.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 | |-------------------|-----------|------------------------|-----------------| -| 30 | 0 | 30 | 1 | +| 31 | 0 | 31 | 1 | ## Common diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index fd86888ec92f7..9a9ab5ae34dc7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 8ed0263341e48..b26c6b0142042 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.devdocs.json b/api_docs/kbn_esql_editor.devdocs.json index ca2d78c9c89eb..b464c8bd5f1eb 100644 --- a/api_docs/kbn_esql_editor.devdocs.json +++ b/api_docs/kbn_esql_editor.devdocs.json @@ -83,15 +83,7 @@ "section": "def-common.TimeRange", "text": "TimeRange" }, - " | undefined, abortController: AbortController | undefined, dataView: ", - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined) => Promise<", + " | undefined, abortController: AbortController | undefined, timeFieldName: string | undefined) => Promise<", { "pluginId": "expressions", "scope": "common", @@ -195,19 +187,12 @@ { "parentPluginId": "@kbn/esql-editor", "id": "def-public.fetchFieldsFromESQL.$5", - "type": "Object", + "type": "string", "tags": [], - "label": "dataView", + "label": "timeFieldName", "description": [], "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined" + "string | undefined" ], "path": "src/platform/packages/private/kbn-esql-editor/src/fetch_fields_from_esql.ts", "deprecated": false, diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index fe9ce1cc47c81..ad036878b97d7 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 147541982ac31..28eb1a4dec1d4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 0a9ac9b139b28..b35b06ebe4226 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 135919de21d39..609df834e4f73 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index d16d03113ce27..fe36f6d7fbd14 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.devdocs.json b/api_docs/kbn_expandable_flyout.devdocs.json index 10de89b7d3657..d1f035d2aef69 100644 --- a/api_docs/kbn_expandable_flyout.devdocs.json +++ b/api_docs/kbn_expandable_flyout.devdocs.json @@ -113,6 +113,33 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/expandable-flyout", + "id": "def-public.useExpandableFlyoutHistory", + "type": "Function", + "tags": [], + "label": "useExpandableFlyoutHistory", + "description": [ + "\nThis hook allows you to access the flyout state, read open right, left and preview panels." + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/expandable-flyout", + "scope": "public", + "docId": "kibKbnExpandableFlyoutPluginApi", + "section": "def-public.FlyoutPanelProps", + "text": "FlyoutPanelProps" + }, + "[]" + ], + "path": "packages/kbn-expandable-flyout/src/hooks/use_expandable_flyout_history.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/expandable-flyout", "id": "def-public.useExpandableFlyoutState", @@ -786,6 +813,27 @@ "path": "packages/kbn-expandable-flyout/src/store/state.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/expandable-flyout", + "id": "def-public.FlyoutPanels.history", + "type": "Array", + "tags": [], + "label": "history", + "description": [], + "signature": [ + { + "pluginId": "@kbn/expandable-flyout", + "scope": "public", + "docId": "kibKbnExpandableFlyoutPluginApi", + "section": "def-public.FlyoutPanelProps", + "text": "FlyoutPanelProps" + }, + "[]" + ], + "path": "packages/kbn-expandable-flyout/src/store/state.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 67c2c53ceb4d0..f50dd5267d5aa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-threat-hunting-investigations](https://github.com/org | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 41 | 0 | 14 | 2 | +| 43 | 0 | 15 | 2 | ## Client diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 9796938facfbb..d87b1c636eb2f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 8e5483df68d9f..faa90d68fe170 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 589fa07000ee9..7b4662e8c0f12 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 05ff409798bae..82d8417bc4ac0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index a601c6945befa..c832a6d2c1f83 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 41a1ed2e9cf6e..6335981cf9801 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_gen_ai_functional_testing.mdx b/api_docs/kbn_gen_ai_functional_testing.mdx index ebc94ef881e85..e4db6cbb18453 100644 --- a/api_docs/kbn_gen_ai_functional_testing.mdx +++ b/api_docs/kbn_gen_ai_functional_testing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-gen-ai-functional-testing title: "@kbn/gen-ai-functional-testing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/gen-ai-functional-testing plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/gen-ai-functional-testing'] --- import kbnGenAiFunctionalTestingObj from './kbn_gen_ai_functional_testing.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 2e84064392c76..7649b162ba480 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 7c7da8e893bb9..ceb6745fc86aa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 1ba4e75358a94..f307e0b88c84f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 3abfaaebaaa51..3fb3dda41b1dc 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index e4933bb1ff4a2..f5c1f30b0c1a8 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index bbc027ad2c3c7..7b5cbf617b776 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 638ba0efb44a1..bbaa9397c34b7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index d19a016a5d9f6..2e70f5d98ff40 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 36325139bd057..93a8b285b01f1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 227d38b14298a..8143c92e02df2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 21cb65455ca07..07a965ca088ef 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index b7a54c71affa3..e4538a8305647 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index de7ebf0e5ea50..2b97488573fa4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index ae94fc2a4d033..1a956852ff190 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_adapter.mdx b/api_docs/kbn_index_adapter.mdx index 18930da423ca8..60f87e00bfa3c 100644 --- a/api_docs/kbn_index_adapter.mdx +++ b/api_docs/kbn_index_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-adapter title: "@kbn/index-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-adapter plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-adapter'] --- import kbnIndexAdapterObj from './kbn_index_adapter.devdocs.json'; diff --git a/api_docs/kbn_index_lifecycle_management_common_shared.mdx b/api_docs/kbn_index_lifecycle_management_common_shared.mdx index 261488413d7a3..1a18d4308d232 100644 --- a/api_docs/kbn_index_lifecycle_management_common_shared.mdx +++ b/api_docs/kbn_index_lifecycle_management_common_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-lifecycle-management-common-shared title: "@kbn/index-lifecycle-management-common-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-lifecycle-management-common-shared plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-lifecycle-management-common-shared'] --- import kbnIndexLifecycleManagementCommonSharedObj from './kbn_index_lifecycle_management_common_shared.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 8bb71f78d7ec5..5d2ac98ca443d 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_common.devdocs.json b/api_docs/kbn_inference_common.devdocs.json index 9cb8c900b21db..6811cb39c58d0 100644 --- a/api_docs/kbn_inference_common.devdocs.json +++ b/api_docs/kbn_inference_common.devdocs.json @@ -37,7 +37,7 @@ }, " extends Error" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -51,7 +51,7 @@ "signature": [ "any" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -65,7 +65,7 @@ "signature": [ "TCode" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -80,7 +80,7 @@ "signature": [ "string" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -95,7 +95,7 @@ "signature": [ "TMeta" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -120,7 +120,7 @@ "text": "InferenceTaskErrorEvent" } ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -148,7 +148,7 @@ "text": "InferenceTaskInternalError" } ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -162,7 +162,7 @@ "signature": [ "string" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -177,7 +177,7 @@ "signature": [ "Record | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": false @@ -203,7 +203,7 @@ "text": "InferenceTaskRequestError" } ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -217,7 +217,7 @@ "signature": [ "string" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -232,7 +232,7 @@ "signature": [ "number" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -269,7 +269,7 @@ }, ">) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -298,7 +298,7 @@ }, ">" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -327,7 +327,7 @@ }, ") => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -347,7 +347,7 @@ "text": "InferenceTaskEvent" } ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -376,7 +376,7 @@ }, ") => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -397,7 +397,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -434,7 +434,7 @@ }, ">) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -463,7 +463,7 @@ }, ">" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -482,7 +482,7 @@ "signature": [ "(error: unknown) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -496,7 +496,7 @@ "signature": [ "unknown" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -515,7 +515,7 @@ "signature": [ "(error: unknown) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -529,7 +529,7 @@ "signature": [ "unknown" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -548,7 +548,7 @@ "signature": [ "(error: unknown) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -562,7 +562,7 @@ "signature": [ "unknown" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -583,7 +583,7 @@ "signature": [ "(event: TOutputEvent) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -597,7 +597,7 @@ "signature": [ "TOutputEvent" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -626,7 +626,7 @@ }, ") => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -646,7 +646,7 @@ "text": "InferenceTaskEvent" } ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -675,7 +675,7 @@ }, ") => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -696,7 +696,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -717,7 +717,7 @@ "signature": [ "(error: Error) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -731,7 +731,7 @@ "signature": [ "Error" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -752,7 +752,7 @@ "signature": [ "(error: Error) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -766,7 +766,7 @@ "signature": [ "Error" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -787,7 +787,7 @@ "signature": [ "(error: Error | undefined) => boolean" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -801,7 +801,7 @@ "signature": [ "Error | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "isRequired": false @@ -820,7 +820,7 @@ "signature": [ "(values: T[], limit: number) => (string | T)[]" ], - "path": "x-pack/packages/ai-infra/inference-common/src/truncate_list.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/truncate_list.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -834,7 +834,7 @@ "signature": [ "T[]" ], - "path": "x-pack/packages/ai-infra/inference-common/src/truncate_list.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/truncate_list.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -849,7 +849,7 @@ "signature": [ "number" ], - "path": "x-pack/packages/ai-infra/inference-common/src/truncate_list.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/truncate_list.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -880,7 +880,7 @@ }, ">>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -909,7 +909,7 @@ }, ">>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -938,7 +938,7 @@ }, ">>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/event_utils.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/event_utils.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -966,7 +966,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -979,7 +979,7 @@ "description": [ "\nThe text content of the LLM response." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1002,7 +1002,7 @@ }, "[\"toolCalls\"]" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1025,7 +1025,7 @@ }, " | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false } @@ -1041,7 +1041,7 @@ "description": [ "\nRepresent a partial tool call present in a chunk event.\n\nNote that all properties of the structure, except from the index,\nare partial and must be aggregated." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1054,7 +1054,7 @@ "description": [ "\nThe tool call index (position in the tool call array)." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false }, @@ -1067,7 +1067,7 @@ "description": [ "\nchunk of tool call id." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false }, @@ -1081,7 +1081,7 @@ "signature": [ "{ name: string; arguments: string; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false } @@ -1097,7 +1097,7 @@ "description": [ "\nToken count structure for the chatComplete API." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1110,7 +1110,7 @@ "description": [ "\nInput token count" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false }, @@ -1123,7 +1123,7 @@ "description": [ "\nOutput token count" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false }, @@ -1136,7 +1136,7 @@ "description": [ "\nTotal token count" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false } @@ -1162,7 +1162,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/inference_task.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/inference_task.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1178,7 +1178,7 @@ "signature": [ "TEventType" ], - "path": "x-pack/packages/ai-infra/inference-common/src/inference_task.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/inference_task.ts", "deprecated": false, "trackAdoption": false } @@ -1204,7 +1204,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1220,7 +1220,7 @@ "signature": [ "TId" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1233,7 +1233,7 @@ "description": [ "\nThe ID of the connector to use.\nMust be an inference connector, or an error will be thrown." ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1249,7 +1249,7 @@ "signature": [ "string | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1262,7 +1262,7 @@ "description": [ "\nThe prompt for the LLM." ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1278,7 +1278,7 @@ "signature": [ "TOutputSchema | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1301,7 +1301,7 @@ }, "[] | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1324,7 +1324,7 @@ }, " | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1340,7 +1340,23 @@ "signature": [ "TStream | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.OutputOptions.retry", + "type": "Object", + "tags": [], + "label": "retry", + "description": [ + "\nOptional configuration for retrying the call if an error occurs." + ], + "signature": [ + "{ onValidationError?: number | boolean | undefined; } | undefined" + ], + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false } @@ -1366,7 +1382,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1382,7 +1398,7 @@ "signature": [ "TId" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1398,7 +1414,7 @@ "signature": [ "TOutput" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false }, @@ -1411,7 +1427,7 @@ "description": [ "\nPotential text content provided by the LLM, if it was provided in addition to the tool call." ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false } @@ -1437,7 +1453,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1450,7 +1466,7 @@ "description": [ "\nThe id of the tool call, that must be re-used when providing the tool call response" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false }, @@ -1464,7 +1480,7 @@ "signature": [ "{ name: TName; } & (TArguments extends Record ? { arguments: TArguments; } : {})" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false } @@ -1480,7 +1496,7 @@ "description": [ "\nThe definition of a tool that will be provided to the LLM for it to eventually call." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1493,7 +1509,7 @@ "description": [ "\nA description of what the tool does. Note that this will be exposed to the LLM,\nso the description should be explicit about what the tool does and when to call it." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false }, @@ -1510,7 +1526,7 @@ "ToolSchemaTypeObject", " | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false } @@ -1536,7 +1552,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1559,7 +1575,7 @@ }, " | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false }, @@ -1583,7 +1599,7 @@ }, "> | undefined" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false } @@ -1599,7 +1615,7 @@ "description": [ "\nRepresents a tool call from the LLM before correctly converted to the schema type.\n\nOnly publicly exposed because referenced by {@link ChatCompletionToolValidationError}" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1610,7 +1626,7 @@ "tags": [], "label": "toolCallId", "description": [], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false }, @@ -1624,7 +1640,7 @@ "signature": [ "{ name: string; arguments: string; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false } @@ -1642,7 +1658,7 @@ "description": [ "\nList of code of error that are specific to the {@link ChatCompleteAPI}" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1656,7 +1672,7 @@ "description": [ "\nList possible values of {@link ChatCompletionEvent} types." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1670,7 +1686,7 @@ "description": [ "\nEnum for generic inference error codes." ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1684,7 +1700,7 @@ "description": [ "\nEnum for all possible {@link Message} roles." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/messages.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1698,7 +1714,7 @@ "description": [ "\nList possible values of {@link OutputEvent} types." ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1712,7 +1728,7 @@ "description": [ "\nTool invocation choice type.\n\nRefer to {@link ToolChoice} for more details." ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1747,7 +1763,40 @@ }, " | undefined>[] | undefined; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/messages.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.AssistantMessageOf", + "type": "Type", + "tags": [], + "label": "AssistantMessageOf", + "description": [ + "\nUtility type to get the Assistant message type of a {@link ToolOptions} type." + ], + "signature": [ + "Omit<", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.AssistantMessage", + "text": "AssistantMessage" + }, + ", \"toolCalls\"> & ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ToolCallsOf", + "text": "ToolCallsOf" + }, + "" + ], + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1796,7 +1845,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/bound_api.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -1819,7 +1868,7 @@ }, "[P]; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/bound_api.ts", "deprecated": false, "trackAdoption": false } @@ -1854,7 +1903,7 @@ }, "[\"functionCalling\"] | undefined; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/bound_api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1891,7 +1940,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/bound_api.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -1904,7 +1953,7 @@ "label": "options", "description": [], "signature": [ - "{ id: TId; input: string; schema?: TOutputSchema | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", + "{ id: TId; input: string; schema?: TOutputSchema | undefined; retry?: { onValidationError?: number | boolean | undefined; } | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", { "pluginId": "@kbn/inference-common", "scope": "common", @@ -1914,7 +1963,7 @@ }, "[] | undefined; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/bound_api.ts", "deprecated": false, "trackAdoption": false } @@ -1941,7 +1990,7 @@ }, " | undefined; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/bound_api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1990,7 +2039,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -2021,7 +2070,7 @@ }, " | undefined; } & TToolOptions" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false } @@ -2056,7 +2105,7 @@ }, ">" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2089,7 +2138,7 @@ }, " | undefined; } & TToolOptions" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2115,7 +2164,7 @@ }, ">" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2155,7 +2204,7 @@ }, "[]; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2195,7 +2244,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2235,7 +2284,7 @@ }, "[\"toolCalls\"]; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2275,7 +2324,7 @@ }, "; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2307,7 +2356,7 @@ }, ".TokenLimitReachedError, { tokenLimit?: number | undefined; tokenCount?: number | undefined; }>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2339,7 +2388,7 @@ }, ".ToolNotFoundError, { name: string; }>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2379,7 +2428,7 @@ }, "[] | undefined; }>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2398,7 +2447,7 @@ "ToolSchemaTypeObject", " ? FromToolSchemaObject : TToolSchema extends ToolSchemaTypeArray ? FromToolSchemaArray : TToolSchema extends ToolSchemaTypeBoolean ? boolean : TToolSchema extends ToolSchemaTypeNumber ? number : TToolSchema extends ToolSchemaTypeString ? FromToolSchemaString : never" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tool_schema.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tool_schema.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2415,7 +2464,7 @@ "signature": [ "\"native\" | \"simulated\"" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2445,7 +2494,7 @@ }, "> & { error: { code: string; message: string; meta?: Record | undefined; }; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2467,7 +2516,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/inference_task.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/inference_task.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2479,7 +2528,7 @@ "tags": [], "label": "InferenceTaskEventType", "description": [], - "path": "x-pack/packages/ai-infra/inference-common/src/inference_task.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/inference_task.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2509,7 +2558,7 @@ }, ".internalError, Record>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2539,7 +2588,7 @@ }, ".requestError, { status: number; }>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/errors.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2577,9 +2626,49 @@ "section": "def-common.ToolMessage", "text": "ToolMessage" }, - "" + " | undefined>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/messages.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.MessageOf", + "type": "Type", + "tags": [], + "label": "MessageOf", + "description": [ + "\nUtility type to get the mixin Message type of a {@link ToolOptions} type." + ], + "signature": [ + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.UserMessage", + "text": "UserMessage" + }, + " | ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.AssistantMessageOf", + "text": "AssistantMessageOf" + }, + " | ", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.ToolMessageOf", + "text": "ToolMessageOf" + }, + "" + ], + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2596,7 +2685,7 @@ "signature": [ "unknown" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2633,7 +2722,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -2655,7 +2744,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false } @@ -2689,7 +2778,7 @@ }, ".OutputComplete> & { id: TId; output: TOutput; content: string; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2732,7 +2821,7 @@ }, " : undefined>>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2764,7 +2853,7 @@ }, "" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2800,7 +2889,7 @@ }, " : undefined>>" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2832,7 +2921,7 @@ }, ".OutputUpdate> & { id: TId; content: string; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/events.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/events.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2863,9 +2952,11 @@ "section": "def-common.ToolChoiceType", "text": "ToolChoiceType" }, - ".none; } ? { toolCalls: []; } : { toolCalls: ToolResponsesOf>; } : { toolCalls: never; }" + ".none; } ? { toolCalls: []; } : { toolCalls: ", + "ToolResponsesOf", + ">; } : { toolCalls: never; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2889,7 +2980,7 @@ }, " | CustomToolChoice" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tools.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2912,9 +3003,38 @@ "section": "def-common.MessageRole", "text": "MessageRole" }, - ".Tool> & { toolCallId: string; response: TToolResponse; }" + ".Tool> & { name: TName; toolCallId: string; response: TToolResponse; } & (TToolData extends undefined ? {} : { data: TToolData; })" + ], + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/inference-common", + "id": "def-common.ToolMessageOf", + "type": "Type", + "tags": [], + "label": "ToolMessageOf", + "description": [ + "\nUtility type to get the Tool message type of a {@link ToolOptions} type." + ], + "signature": [ + "MessageBase<", + { + "pluginId": "@kbn/inference-common", + "scope": "common", + "docId": "kibKbnInferenceCommonPluginApi", + "section": "def-common.MessageRole", + "text": "MessageRole" + }, + ".Tool> & { name: ", + "ToolNamesOf", + "; toolCallId: string; response: ", + "ToolResponsesOf", + "; } & ({} | { data: Record; })" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/messages.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2931,7 +3051,7 @@ "signature": [ "ToolSchemaTypeObject" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tool_schema.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tool_schema.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2949,7 +3069,7 @@ "ToolSchemaTypeObject", " | ToolSchemaTypeString | ToolSchemaTypeBoolean | ToolSchemaTypeNumber | ToolSchemaTypeArray" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/tool_schema.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tool_schema.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2974,7 +3094,7 @@ }, "[P]; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/bound_api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2989,7 +3109,7 @@ "\nOptions used to call the {@link BoundOutputAPI}" ], "signature": [ - "{ id: TId; input: string; schema?: TOutputSchema | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", + "{ id: TId; input: string; schema?: TOutputSchema | undefined; retry?: { onValidationError?: number | boolean | undefined; } | undefined; system?: string | undefined; stream?: TStream | undefined; previousMessages?: ", { "pluginId": "@kbn/inference-common", "scope": "common", @@ -2999,7 +3119,7 @@ }, "[] | undefined; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/output/bound_api.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/output/bound_api.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -3024,7 +3144,7 @@ }, ".User> & { content: string; }" ], - "path": "x-pack/packages/ai-infra/inference-common/src/chat_complete/messages.ts", + "path": "x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_inference_common.mdx b/api_docs/kbn_inference_common.mdx index ae7b81e2ecca6..e06eadfac6641 100644 --- a/api_docs/kbn_inference_common.mdx +++ b/api_docs/kbn_inference_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference-common title: "@kbn/inference-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference-common plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference-common'] --- import kbnInferenceCommonObj from './kbn_inference_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 132 | 0 | 43 | 1 | +| 136 | 0 | 43 | 3 | ## Common diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 835d28fa31cbd..11ff80cead1fc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 1da04c3ca95de..dc5dff31454cb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 6f7eb31206d9a..cb075a9a16d81 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.devdocs.json b/api_docs/kbn_investigation_shared.devdocs.json index 9d9586f583ec8..933acf9a229f4 100644 --- a/api_docs/kbn_investigation_shared.devdocs.json +++ b/api_docs/kbn_investigation_shared.devdocs.json @@ -105,7 +105,7 @@ "label": "CreateInvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -240,7 +240,7 @@ "label": "FindInvestigationsResponse", "description": [], "signature": [ - "{ page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }" + "{ page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }[]; perPage: number; total: number; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/find.ts", "deprecated": false, @@ -390,7 +390,7 @@ "label": "GetInvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get.ts", "deprecated": false, @@ -450,7 +450,7 @@ "label": "InvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/investigation.ts", "deprecated": false, @@ -555,7 +555,7 @@ "label": "UpdateInvestigationParams", "description": [], "signature": [ - "{ params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }" + "{ params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -570,7 +570,7 @@ "label": "UpdateInvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -692,7 +692,7 @@ "label": "createInvestigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -827,7 +827,7 @@ "label": "findInvestigationsResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; results: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }>" + "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; results: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }[]; perPage: number; total: number; }, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }[]; perPage: number; total: number; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/find.ts", "deprecated": false, @@ -1037,7 +1037,7 @@ "label": "getInvestigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get.ts", "deprecated": false, @@ -1112,7 +1112,7 @@ "label": "investigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/investigation.ts", "deprecated": false, @@ -1127,7 +1127,7 @@ "label": "investigationSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }>" ], "path": "packages/kbn-investigation-shared/src/schema/investigation.ts", "deprecated": false, @@ -1232,7 +1232,7 @@ "label": "updateInvestigationParamsSchema", "description": [], "signature": [ - "Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; body: Zod.ZodObject<{ title: Zod.ZodOptional; status: Zod.ZodOptional, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>>; params: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>>; tags: Zod.ZodOptional>; externalIncidentUrl: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }; }, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }; }>" + "Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; body: Zod.ZodObject<{ title: Zod.ZodOptional; status: Zod.ZodOptional, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>>; params: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>>; tags: Zod.ZodOptional>; externalIncidentUrl: Zod.ZodOptional>; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }; }, { path: { investigationId: string; }; body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; rootCauseAnalysis?: { events: any[]; } | undefined; }; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -1247,7 +1247,7 @@ "label": "updateInvestigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray; notes: Zod.ZodArray, \"many\">; items: Zod.ZodArray, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { params: Record; type: string; title: string; }, { params: Record; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable; rootCauseAnalysis: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { events: any[]; }, { events: any[]; }>>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; rootCauseAnalysis?: { events: any[]; } | undefined; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index a3d2e84dae6ef..75a014fd20cfe 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index db2a188e33c6a..82d889115e85e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 901e82a929989..de26fe850d7d2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index 6a6ffb8478cb0..2b6fe80eae010 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 7c0a7ae507c34..b773d2d03c8c6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 8a0a6c7fddd10..fd9d9b39ea390 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 7ed7865c98c88..d33d04a42b623 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 4435f176abf77..c1af51798ebe5 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 8f7927fb7441a..5628d4a2dd99b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation.mdx b/api_docs/kbn_language_documentation.mdx index b5ee3a53170b7..8eb339ac1f945 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 3de194aa8dd62..a2f49766ef022 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 2e10d60a23927..cd4d6ed5f047e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index b12d106b4540b..4b36de821b0af 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index fabf0158d77f7..66186c7f3d6f2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 975c1366844ac..32406939ddf55 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 20f5993d3784e..1ef80ce454eb0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 0fef8c4259ef7..e730bdd104797 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 4c180b669e6ef..ae7d06da2ae09 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index cb28f1307bdc5..507812c8f67b2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 74afbf9357178..64fd820d62cb1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 4986de7fed647..a60c6d9bb053e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index d67e63f9fd578..11a9c54696ac1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index af5f139fae409..eb0581899034c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index d3881d109ada5..b137cb8000953 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index a1d50b9c81982..75b3ac682c832 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 9adad01d8feb8..010597ce8720b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 331cb1ceddeac..70d3766e38873 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index ce8a3fd26d1b2..062f568dfdc12 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx index 64218575a83a2..943d31bd06687 100644 --- a/api_docs/kbn_manifest.mdx +++ b/api_docs/kbn_manifest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-manifest title: "@kbn/manifest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/manifest plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] --- import kbnManifestObj from './kbn_manifest.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 0e365ab6aebdf..829634b406a43 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index e0b147e3efe0f..2eb0b429a4cb1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index ff0fc16114bba..5f35c28d6c321 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 4db52f230beba..bc1733521f438 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 8f2d2ccdf2544..afd58c069f74f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 57f44e3457aa2..ef1cba9038493 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index f5ccbecdde615..59eb31936ddc9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index b0c26c2b62916..446110dd1443d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index dcd567834c179..83b4ecdc76e30 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index aa266265b7c5f..2f15dac7039bc 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 060ab12936358..2a77af48b8b65 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index f88871437f8b5..67ce597ffffeb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index fb9d0ca713611..af07f7967854a 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 86aa8bae3a8ef..01544a326db61 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 69647a59e5d50..af39d621a8c29 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 2ea520000e77b..657530041ff1f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index ec8c6abba4bc9..6da104935cadf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index eeac5337d3760..86b1161aea16b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 72b0bd264a59f..a3ebe1494ae0f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index b213f2abdbca3..94cad78ee58ee 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 3bf9b5d5c9618..e798f3af221f9 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 1a60664793716..ba22d54a0f32f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index f69df764055bf..adc4c4aa58305 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 7e6193f7913de..6c6371db5fc8c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 9cb3071903dbc..be6f10c7a79b5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 75f14776987da..4259570b0f40c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 88bd28976b294..272b7192f1b75 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.devdocs.json b/api_docs/kbn_ml_trained_models_utils.devdocs.json index 601f27d5df2d1..acceffa09d977 100644 --- a/api_docs/kbn_ml_trained_models_utils.devdocs.json +++ b/api_docs/kbn_ml_trained_models_utils.devdocs.json @@ -112,7 +112,7 @@ "\nModel name, e.g. elser" ], "signature": [ - "\"elser\" | \"e5\"" + "\"rerank\" | \"elser\" | \"e5\"" ], "path": "x-pack/platform/packages/shared/ml/trained_models_utils/src/constants/trained_models.ts", "deprecated": false, @@ -300,6 +300,22 @@ "path": "x-pack/platform/packages/shared/ml/trained_models_utils/src/constants/trained_models.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.ModelDefinition.techPreview", + "type": "CompoundType", + "tags": [], + "label": "techPreview", + "description": [ + "Indicates if model is in tech preview" + ], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/platform/packages/shared/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -417,7 +433,7 @@ "label": "ElasticCuratedModelName", "description": [], "signature": [ - "\"elser\" | \"e5\"" + "\"rerank\" | \"elser\" | \"e5\"" ], "path": "x-pack/platform/packages/shared/ml/trained_models_utils/src/constants/trained_models.ts", "deprecated": false, diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 5b424e788fa4c..4cb1d6dd90544 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 47 | 0 | 41 | 1 | +| 48 | 0 | 41 | 1 | ## Common diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 77a49b4237d19..b580387b288ff 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index ee7e90997496a..b9e348532d12b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index b6ae503df089d..d62ab3aeb860f 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index aa1e3a3a44da7..0181f1485b63f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 89a2aa83a701f..c39d63fa217d4 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 62193d39e1e39..571d0f172c528 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index 5f48f93631b5a..d39194a0adfc1 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index fc1c9ad0e3723..dbc1f6e54db72 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 92530c3edb177..090647b97e0db 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index f8f849871e1cd..b11e90dbcc891 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 5c5c59993a441..d27d9612718a0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 276476ac7430b..6a6b348e5ac93 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.devdocs.json b/api_docs/kbn_observability_synthetics_test_data.devdocs.json index 21c91a98e0540..d45f020030a29 100644 --- a/api_docs/kbn_observability_synthetics_test_data.devdocs.json +++ b/api_docs/kbn_observability_synthetics_test_data.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({ name, timestamp, monitorId, location, configId, }?: ", "DocOverrides", - ") => { summary: { up: number; down: number; final_attempt: boolean; }; monitor: { duration: { us: number; }; origin: string; ip: string; name: string; fleet_managed: boolean; check_group: string; timespan: { lt: string; gte: string | moment.Moment; }; id: string; type: string; status: \"up\" | \"down\"; }; error: { message: string; type: string; }; '@timestamp': string; config_id: string; state: { duration_ms: number; checks: number; ends: null; started_at: string; id: string; up: number; down: number; flap_history: never[]; status: string; }; url: { scheme: string; port: number; domain: string; full: string; }; ecs: { version: string; }; tcp: { rtt: { connect: { us: number; }; }; }; event: { agent_id_status: string; ingested: string; dataset: string; }; agent: { name: string; id: string; type: string; ephemeral_id: string; version: string; }; elastic_agent: { id: string; version: string; snapshot: boolean; }; data_stream: { namespace: string; type: string; dataset: string; }; resolve: { rtt: { us: number; }; ip: string; }; tls: { established: boolean; cipher: string; certificate_not_valid_before: string; server: { x509: { not_after: string; subject: { distinguished_name: string; common_name: string; }; not_before: string; public_key_algorithm: string; public_key_curve: string; signature_algorithm: string; serial_number: string; issuer: { distinguished_name: string; common_name: string; }; }; hash: { sha1: string; sha256: string; }; }; rtt: { handshake: { us: number; }; }; version: string; certificate_not_valid_after: string; version_protocol: string; }; http: { rtt: { response_header: { us: number; }; total: { us: number; }; write_request: { us: number; }; content: { us: number; }; validate: { us: number; }; }; response: { headers: { Server: string; P3p: string; Date: string; 'X-Frame-Options': string; 'Accept-Ranges': string; 'Cache-Control': string; 'X-Xss-Protection': string; 'Cross-Origin-Opener-Policy-Report-Only': string; Vary: string; Expires: string; 'Content-Type': string; }; status_code: number; mime_type: string; body: { bytes: number; hash: string; }; }; }; observer: { geo: { name: string; location: string; }; name: string; }; }" + ") => { summary: { up: number; down: number; final_attempt: boolean; }; monitor: { duration: { us: number; }; origin: string; ip: string; name: string; fleet_managed: boolean; check_group: string; timespan: { lt: string; gte: string | moment.Moment; }; id: string; type: string; status: \"up\" | \"down\"; }; error: { message: string; type: string; }; '@timestamp': string; config_id: string; state: { duration_ms: number; checks: number; ends: null; started_at: string; id: string; up: number; down: number; flap_history: never[]; status: string; }; url: { scheme: string; port: number; domain: string; full: string; }; ecs: { version: string; }; tcp: { rtt: { connect: { us: number; }; }; }; event: { agent_id_status: string; ingested: string; dataset: string; }; agent: { name: string; id: string; type: string; ephemeral_id: string; version: string; }; elastic_agent: { id: string; version: string; snapshot: boolean; }; data_stream: { namespace: string; type: string; dataset: string; }; resolve: { rtt: { us: number; }; ip: string; }; tls: { established: boolean; cipher: string; certificate_not_valid_before: string; server: { x509: { not_after: string; subject: { distinguished_name: string; common_name: string; }; not_before: string; public_key_algorithm: string; public_key_curve: string; signature_algorithm: string; serial_number: string; issuer: { distinguished_name: string; common_name: string; }; }; hash: { sha1: string; sha256: string; }; }; rtt: { handshake: { us: number; }; }; version: string; certificate_not_valid_after: string; version_protocol: string; }; http: { rtt: { response_header: { us: number; }; total: { us: number; }; write_request: { us: number; }; content: { us: number; }; validate: { us: number; }; }; response: { headers: { Server: string; P3p: string; Date: string; 'X-Frame-Options': string; 'Accept-Ranges': string; 'Cache-Control': string; 'X-Xss-Protection': string; 'Cross-Origin-Opener-Policy-Report-Only': string; Vary: string; Expires: string; 'Content-Type': string; }; status_code: number; mime_type: string; body: { bytes: number; hash: string; }; }; }; meta: { space_id: string; }; observer: { geo: { name: string; location: string; }; name: string; }; }" ], "path": "x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts", "deprecated": false, @@ -64,7 +64,7 @@ "signature": [ "({ name, timestamp, monitorId, configId, testRunId, location, }?: ", "DocOverrides", - ") => { test_run_id?: string | undefined; summary: { up: number; down: number; final_attempt: boolean; }; monitor: { duration: { us: number; }; origin: string; ip: string; name: string; fleet_managed: boolean; check_group: string; timespan: { lt: string; gte: string | moment.Moment; }; id: string; type: string; status: \"up\" | \"down\"; }; '@timestamp': string; config_id: string; state: { duration_ms: number; checks: number; ends: null; started_at: string; up: number; id: string; down: number; flap_history: never[]; status: string; }; url: { scheme: string; port: number; domain: string; full: string; }; ecs: { version: string; }; tcp: { rtt: { connect: { us: number; }; }; }; event: { agent_id_status: string; ingested: string; dataset: string; }; agent: { name: string; id: string; type: string; ephemeral_id: string; version: string; }; elastic_agent: { id: string; version: string; snapshot: boolean; }; data_stream: { namespace: string; type: string; dataset: string; }; resolve: { rtt: { us: number; }; ip: string; }; tls: { established: boolean; cipher: string; certificate_not_valid_before: string; server: { x509: { not_after: string; subject: { distinguished_name: string; common_name: string; }; not_before: string; public_key_algorithm: string; public_key_curve: string; signature_algorithm: string; serial_number: string; issuer: { distinguished_name: string; common_name: string; }; }; hash: { sha1: string; sha256: string; }; }; rtt: { handshake: { us: number; }; }; version: string; certificate_not_valid_after: string; version_protocol: string; }; http: { rtt: { response_header: { us: number; }; total: { us: number; }; write_request: { us: number; }; content: { us: number; }; validate: { us: number; }; }; response: { headers: { Server: string; P3p: string; Date: string; 'X-Frame-Options': string; 'Accept-Ranges': string; 'Cache-Control': string; 'X-Xss-Protection': string; 'Cross-Origin-Opener-Policy-Report-Only': string; Vary: string; Expires: string; 'Content-Type': string; }; status_code: number; mime_type: string; body: { bytes: number; hash: string; }; }; }; observer: { geo: { name: string; location: string; }; name: string; }; }" + ") => { test_run_id?: string | undefined; summary: { up: number; down: number; final_attempt: boolean; }; monitor: { duration: { us: number; }; origin: string; ip: string; name: string; fleet_managed: boolean; check_group: string; timespan: { lt: string; gte: string | moment.Moment; }; id: string; type: string; status: \"up\" | \"down\"; }; '@timestamp': string; config_id: string; state: { duration_ms: number; checks: number; ends: null; started_at: string; up: number; id: string; down: number; flap_history: never[]; status: string; }; url: { scheme: string; port: number; domain: string; full: string; }; ecs: { version: string; }; tcp: { rtt: { connect: { us: number; }; }; }; event: { agent_id_status: string; ingested: string; dataset: string; }; agent: { name: string; id: string; type: string; ephemeral_id: string; version: string; }; elastic_agent: { id: string; version: string; snapshot: boolean; }; data_stream: { namespace: string; type: string; dataset: string; }; resolve: { rtt: { us: number; }; ip: string; }; tls: { established: boolean; cipher: string; certificate_not_valid_before: string; server: { x509: { not_after: string; subject: { distinguished_name: string; common_name: string; }; not_before: string; public_key_algorithm: string; public_key_curve: string; signature_algorithm: string; serial_number: string; issuer: { distinguished_name: string; common_name: string; }; }; hash: { sha1: string; sha256: string; }; }; rtt: { handshake: { us: number; }; }; version: string; certificate_not_valid_after: string; version_protocol: string; }; http: { rtt: { response_header: { us: number; }; total: { us: number; }; write_request: { us: number; }; content: { us: number; }; validate: { us: number; }; }; response: { headers: { Server: string; P3p: string; Date: string; 'X-Frame-Options': string; 'Accept-Ranges': string; 'Cache-Control': string; 'X-Xss-Protection': string; 'Cross-Origin-Opener-Policy-Report-Only': string; Vary: string; Expires: string; 'Content-Type': string; }; status_code: number; mime_type: string; body: { bytes: number; hash: string; }; }; }; meta: { space_id: string; }; observer: { geo: { name: string; location: string; }; name: string; }; }" ], "path": "x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts", "deprecated": false, diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index fe1ff61f417f9..6a60e39436e57 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 03890b35301f6..a4e89e2db8fb7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 8a7c6d88ea4d4..8423348379027 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 175d8c0e1b5f3..1d7ddf8dbf36d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 9807ae3e162c7..0d63c8826c533 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.devdocs.json b/api_docs/kbn_osquery_io_ts_types.devdocs.json index 4fd8870da6eaf..c63d3feefe73c 100644 --- a/api_docs/kbn_osquery_io_ts_types.devdocs.json +++ b/api_docs/kbn_osquery_io_ts_types.devdocs.json @@ -32,7 +32,7 @@ "signature": [ "{ agents: string[]; allAgentsSelected: boolean; platformsSelected: string[]; policiesSelected: string[]; }" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -47,7 +47,7 @@ "signature": [ "{ agents: string[]; allAgentsSelected: boolean; platformsSelected: string[]; policiesSelected: string[]; } | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -62,7 +62,7 @@ "signature": [ "{ id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[]" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -77,7 +77,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -92,7 +92,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -107,7 +107,7 @@ "signature": [ "{ [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; }" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -122,7 +122,7 @@ "signature": [ "{ [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -137,7 +137,7 @@ "signature": [ "{ name: string | undefined; url: string | undefined; }" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -152,7 +152,7 @@ "signature": [ "{ name: string | undefined; url: string | undefined; } | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -167,7 +167,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -182,7 +182,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -197,7 +197,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -212,7 +212,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -227,7 +227,7 @@ "signature": [ "{ [x: string]: { query: string; id: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; saved_query_id: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }; }" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -242,7 +242,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -257,7 +257,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -272,7 +272,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -287,7 +287,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -302,7 +302,7 @@ "signature": [ "{ id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | { [x: string]: { query: string; id: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; saved_query_id: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }; }" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -317,7 +317,7 @@ "signature": [ "{ id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -332,7 +332,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -347,7 +347,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -362,7 +362,7 @@ "signature": [ "boolean" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -377,7 +377,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -392,7 +392,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -407,7 +407,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -422,7 +422,7 @@ "signature": [ "boolean" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -437,7 +437,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -452,7 +452,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -467,7 +467,7 @@ "signature": [ "number" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -482,7 +482,7 @@ "signature": [ "number | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -497,7 +497,7 @@ "signature": [ "string" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -512,7 +512,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -544,7 +544,7 @@ "StringC", ">; }>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -578,7 +578,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -644,7 +644,7 @@ "UndefinedC", "]>; }>>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -659,7 +659,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -679,7 +679,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -709,7 +709,7 @@ "StringC", ">]>; }>>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -743,7 +743,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -771,7 +771,7 @@ "UndefinedC", "]>; }>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -803,7 +803,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -818,7 +818,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -838,7 +838,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -853,7 +853,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -873,7 +873,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -947,7 +947,7 @@ "UndefinedC", "]>; }>>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -962,7 +962,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -982,7 +982,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -997,7 +997,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1017,7 +1017,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1145,7 +1145,7 @@ "UndefinedC", "]>; }>>]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1215,7 +1215,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1230,7 +1230,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1250,7 +1250,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1265,7 +1265,7 @@ "signature": [ "BooleanC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1285,7 +1285,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1300,7 +1300,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1320,7 +1320,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1335,7 +1335,7 @@ "signature": [ "BooleanC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1355,7 +1355,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1377,7 +1377,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1393,7 +1393,7 @@ "Type", "" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1413,7 +1413,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1428,7 +1428,7 @@ "signature": [ "StringC" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1448,7 +1448,7 @@ "UndefinedC", "]>" ], - "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "path": "src/platform/packages/shared/kbn-osquery-io-ts-types/src/live_query/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 736ca4874ace0..c62e369a07996 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_palettes.devdocs.json b/api_docs/kbn_palettes.devdocs.json new file mode 100644 index 0000000000000..0f5ba9d2d0b21 --- /dev/null +++ b/api_docs/kbn_palettes.devdocs.json @@ -0,0 +1,796 @@ +{ + "id": "@kbn/palettes", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes", + "type": "Class", + "tags": [], + "label": "KbnPalettes", + "description": [], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.palettes", + "type": "Object", + "tags": [], + "label": "#palettes", + "description": [], + "signature": [ + "Map" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.aliasMappings", + "type": "Object", + "tags": [], + "label": "#aliasMappings", + "description": [], + "signature": [ + "Map" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.defaultPalette", + "type": "Object", + "tags": [], + "label": "#defaultPalette", + "description": [], + "signature": [ + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.IKbnPalette", + "text": "IKbnPalette" + } + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.Unnamed.$1", + "type": "Array", + "tags": [], + "label": "palettes", + "description": [], + "signature": [ + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.IKbnPalette", + "text": "IKbnPalette" + }, + "[]" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.Unnamed.$2", + "type": "Object", + "tags": [], + "label": "defaultPalette", + "description": [], + "signature": [ + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.IKbnPalette", + "text": "IKbnPalette" + } + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.query", + "type": "Function", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "(id: string) => ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.IKbnPalette", + "text": "IKbnPalette" + }, + " | undefined" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.query.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.get", + "type": "Function", + "tags": [], + "label": "get", + "description": [], + "signature": [ + "(id: string) => ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.IKbnPalette", + "text": "IKbnPalette" + } + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.get.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalettes.getAll", + "type": "Function", + "tags": [], + "label": "getAll", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.IKbnPalette", + "text": "IKbnPalette" + }, + "[]" + ], + "path": "packages/kbn-palettes/classes/palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.getKbnPalettes", + "type": "Function", + "tags": [], + "label": "getKbnPalettes", + "description": [], + "signature": [ + "({ name, darkMode }: ", + { + "pluginId": "@kbn/core-theme-browser", + "scope": "public", + "docId": "kibKbnCoreThemeBrowserPluginApi", + "section": "def-public.CoreTheme", + "text": "CoreTheme" + }, + ") => ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } + ], + "path": "packages/kbn-palettes/palettes/get_kbn_palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.getKbnPalettes.$1", + "type": "Object", + "tags": [], + "label": "{ name, darkMode }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-theme-browser", + "scope": "public", + "docId": "kibKbnCoreThemeBrowserPluginApi", + "section": "def-public.CoreTheme", + "text": "CoreTheme" + } + ], + "path": "packages/kbn-palettes/palettes/get_kbn_palettes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.getPalettes", + "type": "Function", + "tags": [], + "label": "getPalettes", + "description": [], + "signature": [ + "(darkMode: boolean) => ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } + ], + "path": "packages/kbn-palettes/palettes/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.getPalettes.$1", + "type": "boolean", + "tags": [], + "label": "darkMode", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-palettes/palettes/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.useKbnPalettes", + "type": "Function", + "tags": [], + "label": "useKbnPalettes", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/palettes", + "scope": "common", + "docId": "kibKbnPalettesPluginApi", + "section": "def-common.KbnPalettes", + "text": "KbnPalettes" + } + ], + "path": "packages/kbn-palettes/hooks/use_kbn_palettes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette", + "type": "Interface", + "tags": [], + "label": "IKbnPalette", + "description": [ + "\nCommon palette definition used throughout kibana" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "\nUnique identifier for the palette" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nDisplay name of this palette." + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [ + "\nType of pallette" + ], + "signature": [ + "\"gradient\" | \"categorical\"" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.colorCount", + "type": "number", + "tags": [], + "label": "colorCount", + "description": [ + "\nNumber of colors to display" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.legacy", + "type": "boolean", + "tags": [], + "label": "legacy", + "description": [ + "\nPalette belongs to an outdated theme set" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.aliases", + "type": "Array", + "tags": [], + "label": "aliases", + "description": [ + "\nAlternate aliases/ids this palette matches" + ], + "signature": [ + "string[]" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.standalone", + "type": "CompoundType", + "tags": [], + "label": "standalone", + "description": [ + "\nExcluded from `getAll` but can still query for palette with `get`/`query`\n\nAn example would be `KbnPalette.Neutral` palette. I want to exclude it from the list of all available palettes, but I still want to `get`/`query` the palette." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.colors", + "type": "Function", + "tags": [], + "label": "colors", + "description": [ + "\nReturns array of colors, optionally provide desired number of colors (`n`)" + ], + "signature": [ + "(n?: number | undefined) => string[]" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.colors.$1", + "type": "number", + "tags": [], + "label": "n", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.getColor", + "type": "Function", + "tags": [], + "label": "getColor", + "description": [ + "\nReturns color provided index and optional total number of colors" + ], + "signature": [ + "(colorIndex: number, numberOfColors?: number | undefined) => string" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.getColor.$1", + "type": "number", + "tags": [], + "label": "colorIndex", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.IKbnPalette.getColor.$2", + "type": "number", + "tags": [], + "label": "numberOfColors", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.DEFAULT_FALLBACK_PALETTE", + "type": "string", + "tags": [], + "label": "DEFAULT_FALLBACK_PALETTE", + "description": [], + "signature": [ + "\"default\"" + ], + "path": "packages/kbn-palettes/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPaletteType", + "type": "Type", + "tags": [], + "label": "KbnPaletteType", + "description": [], + "signature": [ + "\"gradient\" | \"categorical\"" + ], + "path": "packages/kbn-palettes/classes/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.elasticPalette", + "type": "Object", + "tags": [], + "label": "elasticPalette", + "description": [ + "\nThis is not correctly returning the updated vis colors from eui.\nAll gradient function work correctly." + ], + "signature": [ + "KbnColorFnPalette" + ], + "path": "packages/kbn-palettes/palettes/categorical/elastic.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalette", + "type": "Object", + "tags": [], + "label": "KbnPalette", + "description": [ + "\nEnum of all kbn palette ids, including by type" + ], + "path": "packages/kbn-palettes/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalette.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [ + "// Categorical palettes" + ], + "signature": [ + "any" + ], + "path": "packages/kbn-palettes/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalette.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [ + "// Gradient palettes" + ], + "signature": [ + "any" + ], + "path": "packages/kbn-palettes/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalette.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [ + "// Semantic palettes" + ], + "signature": [ + "any" + ], + "path": "packages/kbn-palettes/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.KbnPalette.Amsterdam", + "type": "string", + "tags": [], + "label": "Amsterdam", + "description": [ + "// ---- Deprecated palettes ----\n/**\n * Amsterdam theme\n * @deprecated use `KbnPalette.kibana7`\n */" + ], + "signature": [ + "\"eui_amsterdam_color_blind\"" + ], + "path": "packages/kbn-palettes/constants.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.logLevelPalette", + "type": "Object", + "tags": [], + "label": "logLevelPalette", + "description": [ + "\nDefines a palette to be used directly and does not fully implement IKbnPalette" + ], + "path": "packages/kbn-palettes/palettes/semantic/log_level.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.logLevelPalette.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "\"log_level\"" + ], + "path": "packages/kbn-palettes/palettes/semantic/log_level.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.logLevelPalette.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-palettes/palettes/semantic/log_level.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.logLevelPalette.getColor", + "type": "Function", + "tags": [], + "label": "getColor", + "description": [], + "signature": [ + "(key: \"Error\" | \"Other\" | \"Debug\" | \"Info\" | \"Notice\" | \"Alert\" | \"Emerg\" | \"Crit\" | \"Warn\") => string" + ], + "path": "packages/kbn-palettes/palettes/semantic/log_level.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.logLevelPalette.getColor.$1", + "type": "CompoundType", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "\"Error\" | \"Other\" | \"Debug\" | \"Info\" | \"Notice\" | \"Alert\" | \"Emerg\" | \"Crit\" | \"Warn\"" + ], + "path": "packages/kbn-palettes/palettes/semantic/log_level.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/palettes", + "id": "def-common.logLevelPalette.colors", + "type": "Object", + "tags": [], + "label": "colors", + "description": [], + "signature": [ + "{ Emerg: string; Alert: string; Crit: string; Error: string; Warn: string; Notice: string; Info: string; Debug: string; Other: string; }" + ], + "path": "packages/kbn-palettes/palettes/semantic/log_level.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/kbn_palettes.mdx b/api_docs/kbn_palettes.mdx new file mode 100644 index 0000000000000..f0306c7c1faf7 --- /dev/null +++ b/api_docs/kbn_palettes.mdx @@ -0,0 +1,42 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnPalettesPluginApi +slug: /kibana-dev-docs/api/kbn-palettes +title: "@kbn/palettes" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/palettes plugin +date: 2024-12-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/palettes'] +--- +import kbnPalettesObj from './kbn_palettes.devdocs.json'; + + + +Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 44 | 3 | 27 | 1 | + +## Common + +### Objects + + +### Functions + + +### Classes + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 6cbe5e72b18cd..6ed44cce81dd6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 5d30afaad94f7..e04bf5a19ce65 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 61775fada02fc..2f75564de250f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 8b9db012aca7e..f7e97650a506b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index ae741374afa7c..5f2862d786045 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.devdocs.json b/api_docs/kbn_presentation_containers.devdocs.json index 3fa2ed6691aa9..3cf96f290c21f 100644 --- a/api_docs/kbn_presentation_containers.devdocs.json +++ b/api_docs/kbn_presentation_containers.devdocs.json @@ -1914,7 +1914,9 @@ "section": "def-public.OverlayRef", "text": "OverlayRef" }, - ", options?: TracksOverlaysOptions | undefined) => void" + ", options?: ", + "TracksOverlaysOptions", + " | undefined) => void" ], "path": "packages/presentation/presentation_containers/interfaces/tracks_overlays.ts", "deprecated": false, @@ -1949,7 +1951,8 @@ "label": "options", "description": [], "signature": [ - "TracksOverlaysOptions | undefined" + "TracksOverlaysOptions", + " | undefined" ], "path": "packages/presentation/presentation_containers/interfaces/tracks_overlays.ts", "deprecated": false, @@ -1977,73 +1980,6 @@ } ], "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/presentation-containers", - "id": "def-public.TracksQueryPerformance", - "type": "Interface", - "tags": [], - "label": "TracksQueryPerformance", - "description": [], - "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/presentation-containers", - "id": "def-public.TracksQueryPerformance.firstLoad", - "type": "boolean", - "tags": [], - "label": "firstLoad", - "description": [], - "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/presentation-containers", - "id": "def-public.TracksQueryPerformance.creationStartTime", - "type": "number", - "tags": [], - "label": "creationStartTime", - "description": [], - "signature": [ - "number | undefined" - ], - "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/presentation-containers", - "id": "def-public.TracksQueryPerformance.creationEndTime", - "type": "number", - "tags": [], - "label": "creationEndTime", - "description": [], - "signature": [ - "number | undefined" - ], - "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/presentation-containers", - "id": "def-public.TracksQueryPerformance.lastLoadStartTime", - "type": "number", - "tags": [], - "label": "lastLoadStartTime", - "description": [], - "signature": [ - "number | undefined" - ], - "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false } ], "enums": [], diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 2219051de19e4..a0627cfe388ec 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.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 | |-------------------|-----------|------------------------|-----------------| -| 92 | 0 | 80 | 0 | +| 87 | 0 | 75 | 1 | ## Client diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index ab054f8e4ee19..c706f1179f602 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -930,6 +930,46 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.apiPublishesReload", + "type": "Function", + "tags": [], + "label": "apiPublishesReload", + "description": [], + "signature": [ + "(unknownApi: unknown) => unknownApi is ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesReload", + "text": "PublishesReload" + } + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.apiPublishesReload.$1", + "type": "Unknown", + "tags": [], + "label": "unknownApi", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-public.apiPublishesRendered", @@ -6124,6 +6164,180 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.PublishesReload", + "type": "Interface", + "tags": [], + "label": "PublishesReload", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.PublishesReload.reload$", + "type": "Object", + "tags": [], + "label": "reload$", + "description": [], + "signature": [ + "{ source: ", + "Observable", + " | undefined; forEach: { (next: (value: void) => void): Promise; (next: (value: void) => void, promiseCtor: PromiseConstructorLike): Promise; }; pipe: { (): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + ", ...operations: ", + "OperatorFunction", + "[]): ", + "Observable", + "; }; operator: ", + "Operator", + " | undefined; lift: (operator?: ", + "Operator", + " | undefined) => ", + "Observable", + "; subscribe: { (observerOrNext?: Partial<", + "Observer", + "> | ((value: void) => void) | undefined): ", + "Subscription", + "; (next?: ((value: void) => void) | null | undefined, error?: ((error: any) => void) | null | undefined, complete?: (() => void) | null | undefined): ", + "Subscription", + "; }; toPromise: { (): Promise; (PromiseCtor: PromiseConstructor): Promise; (PromiseCtor: PromiseConstructorLike): Promise; }; }" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-public.PublishesRendered", diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 57156f455fc4a..642382490d170 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-12-10 +date: 2024-12-12 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 | |-------------------|-----------|------------------------|-----------------| -| 229 | 0 | 193 | 6 | +| 233 | 0 | 197 | 6 | ## Client diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index 2a27a3eb5c837..dcfe87c3a6f97 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_product_doc_common.devdocs.json b/api_docs/kbn_product_doc_common.devdocs.json index f5c8ea4e0e653..33547649b923a 100644 --- a/api_docs/kbn_product_doc_common.devdocs.json +++ b/api_docs/kbn_product_doc_common.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({ productName, productVersion, excludeExtension, }: { productName: \"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"; productVersion: string; excludeExtension?: boolean | undefined; }) => string" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -40,7 +40,7 @@ "tags": [], "label": "{\n productName,\n productVersion,\n excludeExtension = false,\n}", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -54,7 +54,7 @@ "signature": [ "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false }, @@ -65,7 +65,7 @@ "tags": [], "label": "productVersion", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false }, @@ -79,7 +79,7 @@ "signature": [ "boolean | undefined" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false } @@ -99,7 +99,7 @@ "signature": [ "(productName: \"security\" | \"kibana\" | \"observability\" | \"elasticsearch\") => string" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/indices.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -113,7 +113,7 @@ "signature": [ "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/indices.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -132,7 +132,7 @@ "signature": [ "(path: string) => boolean" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact_content.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact_content.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -146,7 +146,7 @@ "signature": [ "string" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact_content.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact_content.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -165,7 +165,7 @@ "signature": [ "(artifactName: string) => { productName: \"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"; productVersion: string; } | undefined" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -179,7 +179,7 @@ "signature": [ "string" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/artifact.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/artifact.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -197,7 +197,7 @@ "tags": [], "label": "ArtifactManifest", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/manifest.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -208,7 +208,7 @@ "tags": [], "label": "formatVersion", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/manifest.ts", "deprecated": false, "trackAdoption": false }, @@ -222,7 +222,7 @@ "signature": [ "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/manifest.ts", "deprecated": false, "trackAdoption": false }, @@ -233,7 +233,7 @@ "tags": [], "label": "productVersion", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/manifest.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/manifest.ts", "deprecated": false, "trackAdoption": false } @@ -247,7 +247,7 @@ "tags": [], "label": "ProductDocumentationAttributes", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -258,7 +258,7 @@ "tags": [], "label": "content_title", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -272,7 +272,7 @@ "signature": [ "SemanticTextField" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -286,7 +286,7 @@ "signature": [ "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -297,7 +297,7 @@ "tags": [], "label": "root_type", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -308,7 +308,7 @@ "tags": [], "label": "slug", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -319,7 +319,7 @@ "tags": [], "label": "url", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -330,7 +330,7 @@ "tags": [], "label": "version", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -341,7 +341,7 @@ "tags": [], "label": "ai_subtitle", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -355,7 +355,7 @@ "signature": [ "SemanticTextField" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -369,7 +369,7 @@ "signature": [ "SemanticTextArrayField" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false }, @@ -383,7 +383,7 @@ "signature": [ "string[]" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/documents.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/documents.ts", "deprecated": false, "trackAdoption": false } @@ -399,7 +399,7 @@ "tags": [], "label": "DocumentationProduct", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/product.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/product.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -413,7 +413,7 @@ "tags": [], "label": "productDocIndexPattern", "description": [], - "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/indices.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -428,7 +428,7 @@ "signature": [ "\".kibana_ai_product_doc\"" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/indices.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/indices.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -443,7 +443,7 @@ "signature": [ "\"security\" | \"kibana\" | \"observability\" | \"elasticsearch\"" ], - "path": "x-pack/packages/ai-infra/product-doc-common/src/product.ts", + "path": "x-pack/platform/packages/shared/ai-infra/product-doc-common/src/product.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_product_doc_common.mdx b/api_docs/kbn_product_doc_common.mdx index fa1ddf25aeb27..bb11c5283a035 100644 --- a/api_docs/kbn_product_doc_common.mdx +++ b/api_docs/kbn_product_doc_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-common title: "@kbn/product-doc-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-common plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-common'] --- import kbnProductDocCommonObj from './kbn_product_doc_common.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 16f9e36a856f7..3bd299366289f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 6fd0b3d1727b4..fcffd2d98d170 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index acde3d9b4c4db..51cb0e5ac3e9d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 7a13604cc9a0a..de1e90b9bf207 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.devdocs.json b/api_docs/kbn_react_kibana_context_common.devdocs.json index 0f29deb8b761e..3795856330269 100644 --- a/api_docs/kbn_react_kibana_context_common.devdocs.json +++ b/api_docs/kbn_react_kibana_context_common.devdocs.json @@ -225,6 +225,30 @@ "path": "packages/react/kibana_context/common/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/react-kibana-context-common", + "id": "def-common.ThemeServiceStart.getTheme", + "type": "Function", + "tags": [], + "label": "getTheme", + "description": [], + "signature": [ + "(() => ", + { + "pluginId": "@kbn/react-kibana-context-common", + "scope": "common", + "docId": "kibKbnReactKibanaContextCommonPluginApi", + "section": "def-common.KibanaTheme", + "text": "KibanaTheme" + }, + ") | undefined" + ], + "path": "packages/react/kibana_context/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index e4478b802c0c4..c09d068ada367 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.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 | |-------------------|-----------|------------------------|-----------------| -| 15 | 0 | 8 | 0 | +| 16 | 0 | 9 | 0 | ## Common diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index de6526007e27a..c3ec91cad5cae 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.devdocs.json b/api_docs/kbn_react_kibana_context_root.devdocs.json index 074a223560fa5..3aef4a4374cae 100644 --- a/api_docs/kbn_react_kibana_context_root.devdocs.json +++ b/api_docs/kbn_react_kibana_context_root.devdocs.json @@ -29,7 +29,7 @@ "\nPrepares and returns a configured `EuiProvider` for use in Kibana roots. In most cases, this utility context\nshould not be used. Instead, refer to `KibanaRootContextProvider` to set up the root of Kibana." ], "signature": [ - "({ theme: { theme$ }, globalStyles: globalStylesProp, colorMode: colorModeProp, modify, children, }: React.PropsWithChildren<", + "({ theme, globalStyles: globalStylesProp, colorMode: colorModeProp, modify, children, }: React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-root", "scope": "common", @@ -48,7 +48,7 @@ "id": "def-common.KibanaEuiProvider.$1", "type": "CompoundType", "tags": [], - "label": "{\n theme: { theme$ },\n globalStyles: globalStylesProp,\n colorMode: colorModeProp,\n modify,\n children,\n}", + "label": "{\n theme,\n globalStyles: globalStylesProp,\n colorMode: colorModeProp,\n modify,\n children,\n}", "description": [], "signature": [ "React.PropsWithChildren<", diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 5ae581983f572..ce07fa99402ad 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 040b05718f8c6..4ef83e6b3b908 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index a10eb5ae7ca0d..8091930a38cdb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 1b2af6522c1cd..3e0892dcce9ba 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_react_mute_legacy_root_warning.mdx b/api_docs/kbn_react_mute_legacy_root_warning.mdx index a0b6111a5b56a..0236382b69767 100644 --- a/api_docs/kbn_react_mute_legacy_root_warning.mdx +++ b/api_docs/kbn_react_mute_legacy_root_warning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-mute-legacy-root-warning title: "@kbn/react-mute-legacy-root-warning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-mute-legacy-root-warning plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-mute-legacy-root-warning'] --- import kbnReactMuteLegacyRootWarningObj from './kbn_react_mute_legacy_root_warning.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 1c7322e524649..194801549b362 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_relocate.devdocs.json b/api_docs/kbn_relocate.devdocs.json new file mode 100644 index 0000000000000..ba9cd4ccc1f19 --- /dev/null +++ b/api_docs/kbn_relocate.devdocs.json @@ -0,0 +1,47 @@ +{ + "id": "@kbn/relocate", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/relocate", + "id": "def-server.runKbnRelocateCli", + "type": "Function", + "tags": [], + "label": "runKbnRelocateCli", + "description": [ + "\nA CLI to move Kibana modules into the right folder structure,\naccording to the Sustainable Kibana Architecture" + ], + "signature": [ + "() => void" + ], + "path": "packages/kbn-relocate/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_relocate.mdx b/api_docs/kbn_relocate.mdx new file mode 100644 index 0000000000000..74cef20d2cc11 --- /dev/null +++ b/api_docs/kbn_relocate.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnRelocatePluginApi +slug: /kibana-dev-docs/api/kbn-relocate +title: "@kbn/relocate" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/relocate plugin +date: 2024-12-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/relocate'] +--- +import kbnRelocateObj from './kbn_relocate.devdocs.json'; + + + +Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 0 | 0 | + +## Server + +### Functions + + diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index cf7709abb7f35..5f5c56cd0d5d9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 354c33d80654e..f5e1303df7897 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 54526e5317998..503d35ae23f1c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 77193b39aaf89..75984d828b7ae 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index fc271f63ea3d2..a5d3df678ceea 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index ef317de7ff4bb..9760a29037bfb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index b1f0cba5d2309..5de44f60d73f0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 6797e44a17699..2e3cc36ad6afb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index ba65a70ac6bb1..1135cf13b9876 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index a73dd9fedb5e4..37a5a95e94a0e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index e575f36bcf820..411c4ff3725fa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 2387ddfb2b759..27b9f5a4831a2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 6ad57318e6a09..d0b3c63c1519d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index f2d6aca304578..7f90d5abbab7f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 54280e3d10199..97a4893232851 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 697be56d70d0b..5c989140001f1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 57f0048adcf1c..8d2db26cd4511 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_form.mdx b/api_docs/kbn_response_ops_rule_form.mdx index d11ded24d77dc..ab7f15764a44a 100644 --- a/api_docs/kbn_response_ops_rule_form.mdx +++ b/api_docs/kbn_response_ops_rule_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-form title: "@kbn/response-ops-rule-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-form plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-form'] --- import kbnResponseOpsRuleFormObj from './kbn_response_ops_rule_form.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_params.mdx b/api_docs/kbn_response_ops_rule_params.mdx index d7cddafb1e606..e010faee7dc41 100644 --- a/api_docs/kbn_response_ops_rule_params.mdx +++ b/api_docs/kbn_response_ops_rule_params.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-params title: "@kbn/response-ops-rule-params" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-params plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-params'] --- import kbnResponseOpsRuleParamsObj from './kbn_response_ops_rule_params.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index f2f4a8baf58be..453c4500cceff 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index db40f919b9dca..ef7c98b4099ec 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 354dedf7e6620..fb5de66f471c8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 499bad3166c47..58fa9c5734559 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index ef55ace7e4222..fefe9344b3af1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 30bd03d23c3cb..a2a1b792373c9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index dc4cfeb2093f8..4b002742a812e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_saved_search_component.mdx b/api_docs/kbn_saved_search_component.mdx index 83958a1b8f7a3..fd76829ea42fd 100644 --- a/api_docs/kbn_saved_search_component.mdx +++ b/api_docs/kbn_saved_search_component.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-search-component title: "@kbn/saved-search-component" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-search-component plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-search-component'] --- import kbnSavedSearchComponentObj from './kbn_saved_search_component.devdocs.json'; diff --git a/api_docs/kbn_scout.devdocs.json b/api_docs/kbn_scout.devdocs.json index 3eaffaf3d88cd..7c66238149dc1 100644 --- a/api_docs/kbn_scout.devdocs.json +++ b/api_docs/kbn_scout.devdocs.json @@ -1612,7 +1612,7 @@ "section": "def-common.ScoutTestFixtures", "text": "ScoutTestFixtures" }, - ", ", + " & { validateTags: void; }, ", "PlaywrightWorkerArgs", " & ", "PlaywrightWorkerOptions", @@ -1798,7 +1798,7 @@ }, " extends Pick<", "PlaywrightTestConfig", - "<{}, {}>, \"testDir\" | \"workers\">" + "<{}, {}>, \"workers\" | \"testDir\">" ], "path": "packages/kbn-scout/src/playwright/types/index.ts", "deprecated": false, @@ -2144,6 +2144,63 @@ "initialIsOpen": false } ], - "objects": [] + "objects": [ + { + "parentPluginId": "@kbn/scout", + "id": "def-common.tags", + "type": "Object", + "tags": [], + "label": "tags", + "description": [], + "path": "packages/kbn-scout/src/playwright/tags.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/scout", + "id": "def-common.tags.ESS_ONLY", + "type": "Array", + "tags": [], + "label": "ESS_ONLY", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-scout/src/playwright/tags.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/scout", + "id": "def-common.tags.SERVERLESS_ONLY", + "type": "Array", + "tags": [], + "label": "SERVERLESS_ONLY", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-scout/src/playwright/tags.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/scout", + "id": "def-common.tags.DEPLOYMENT_AGNOSTIC", + "type": "Array", + "tags": [], + "label": "DEPLOYMENT_AGNOSTIC", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-scout/src/playwright/tags.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/kbn_scout.mdx b/api_docs/kbn_scout.mdx index e5b3bff9f472a..f687c91c57f54 100644 --- a/api_docs/kbn_scout.mdx +++ b/api_docs/kbn_scout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-scout title: "@kbn/scout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/scout plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scout'] --- import kbnScoutObj from './kbn_scout.devdocs.json'; @@ -21,10 +21,13 @@ Contact [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) for | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 117 | 0 | 86 | 8 | +| 121 | 0 | 90 | 8 | ## Common +### Objects + + ### Functions diff --git a/api_docs/kbn_scout_info.mdx b/api_docs/kbn_scout_info.mdx index e06c3d3af8170..5bca42d7c7019 100644 --- a/api_docs/kbn_scout_info.mdx +++ b/api_docs/kbn_scout_info.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-scout-info title: "@kbn/scout-info" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/scout-info plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scout-info'] --- import kbnScoutInfoObj from './kbn_scout_info.devdocs.json'; diff --git a/api_docs/kbn_scout_reporting.mdx b/api_docs/kbn_scout_reporting.mdx index 83f93554a4c59..fffa67261fb4a 100644 --- a/api_docs/kbn_scout_reporting.mdx +++ b/api_docs/kbn_scout_reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-scout-reporting title: "@kbn/scout-reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/scout-reporting plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scout-reporting'] --- import kbnScoutReportingObj from './kbn_scout_reporting.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index 7ada739fa09a9..db9b13a0ffa26 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index ce83b7341015f..6b66e1f53ed26 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index 6af6e2a754994..217ae28d1ddba 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 0eaeae8c49c00..66a30275e2314 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 31c2ae5d16f11..536454d0d2b4c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index d807d557e6404..040f9d55d876e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index c87dba5e4faad..294bb9bf2d8ac 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 0b28331cd33a5..2b2c0d0d75069 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index 9012e3a9da187..3078af717b709 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 4c448ff834846..76dac64ac6cab 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index dd6c4e355b536..bffab6f05d30d 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 08692cd14f622..0a1b41182f0e1 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index 8fd2cf460021e..8989a6146c54d 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 4defccc0e674a..bce0c37a351fe 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 0c4468431ffe9..b39dffd1cb710 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index df118cc8509c0..835f22fc68e0e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index f476cf48ccdd7..0fc031b87b1dd 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index b8a5df3a3b0c9..386700234fc84 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -4873,26 +4873,6 @@ "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts" }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/enable.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/disable.ts" - }, { "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts" @@ -4921,6 +4901,26 @@ "plugin": "upgradeAssistant", "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/enable.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/disable.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 7976f4a945fb8..067825f7c3280 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 9a4ab0b9242e9..7316697b397ff 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 697f727b79d61..10b13b345c6d2 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index ba2edfd501e56..c856b861bb979 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 09fe67fe7946a..7d7680e99d99c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index e06a281b52d67..548bd210c8c6b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 440095f2cc18c..0bc6877cc48a3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index 369deb84d5fdd..07ff5df4cd320 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index e06d9857ba312..28fe1b177ec17 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index bd1680ab7c165..6dbc000b54e18 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 3088d20513408..94d84923666a6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.devdocs.json b/api_docs/kbn_securitysolution_es_utils.devdocs.json index e7dcb1d4de62f..6708767007105 100644 --- a/api_docs/kbn_securitysolution_es_utils.devdocs.json +++ b/api_docs/kbn_securitysolution_es_utils.devdocs.json @@ -613,9 +613,9 @@ "\nRetrieves all index aliases for a given alias name\n" ], "signature": [ - "({ esClient, alias, }: { esClient: ", + "({ esClient, alias, index, }: { esClient: ", "ElasticsearchClient", - "; alias: string; }) => Promise" + "; alias: string; index?: string | undefined; }) => Promise" ], "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", "deprecated": false, @@ -626,7 +626,7 @@ "id": "def-common.getIndexAliases.$1", "type": "Object", "tags": [], - "label": "{\n esClient,\n alias,\n}", + "label": "{\n esClient,\n alias,\n index,\n}", "description": [], "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", "deprecated": false, @@ -1906,6 +1906,20 @@ "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/securitysolution-es-utils", + "id": "def-common.getIndexAliases.$1.index", + "type": "string", + "tags": [], + "label": "index", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", + "deprecated": false, + "trackAdoption": false } ] } diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 6d98ee04fb159..00c0d5c4b2d37 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-detection-engine](https://github.com/orgs/elastic/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 87 | 0 | 76 | 1 | +| 88 | 0 | 77 | 1 | ## Common diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index b267a800bb667..7004c724d3afa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index f26d3d93dfc4e..dabb828dac19a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 2c8bcf2913986..59b566d94b168 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 1cfd4acdd73eb..f20a051ed19e6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 63131851f322e..2efb0c9588f32 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index aadaa9bb5e058..d12de254d6ad9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index acda4d82918e1..f963e87f9de3b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 6cc5f6231ab41..8ce90797f4c63 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 4b4ae0c9f0a3a..5580cf931177f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 0bb78551477da..5e053e1fa7074 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 0a9a4ac9323e0..c57e1d4b31a43 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 62a0d9909e409..333d339b49da1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 0673ea18beffb..52edb4c0bb6d7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index c467d3e2445ac..a4718693249ff 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index c569f7af69c10..ebf51687d724f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index bf4bea214db22..59a4c11d82ec3 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index 1cc5a5d72b0d7..a4045c2661c2a 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index cd0c189f2a912..13fa1d7387f3b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 756a31d3679cd..76af0a080a46b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 7444f55f614df..82a61783a9769 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 09f93f60ffc6a..062cd0db13140 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index a8758f5ecad7e..14475bae7630b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index c5a5f69686dfc..7e2db45870409 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index e2e57260035d2..49b88feefabcd 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 5cc189ae94891..6bb7400afff4e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 6eb5a4029897d..8249cf743756a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 3757ca9c569ee..712522e7f39ee 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index f0252f01c744c..c1da4a23b306d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index fb0e3a99631db..40ea31ade9ca5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 5e3fe38d97284..8fa595041f7df 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index ae38a19b7f620..b8239709715ac 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 6beb3f26d8480..1e2df0eb3c631 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 706879497645a..953afff1c787d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 9dad1bda446b4..50bde33d89597 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index cf98a19607492..785baa3f78c6d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 1b3576896484e..662d2f8c009aa 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 60b250e385b9d..abe456e74e57c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index cc92bd7686b6a..2e92c74711eef 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index ba6df33a865c1..ad30af4290d0e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index d1908e5a20433..b1dcbdd7870c9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 68514ec9753e4..709e5be2c6d08 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 2604477f27e1b..af2101c24e12d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 26126b89dc85d..a66b5f64c3bc2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 471a0023258bb..01d573cf39b86 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 265d15cbaf4d2..1dc1a75d64020 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 83e3c89c5514a..05e30c3cc0e18 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 9913f12207e24..8478df950a395 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 067d0719f9b2a..891a809721ef8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 28f6bbf10e0c7..4ff1daf73dcf2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index f3f85740ba4d2..fbe616c1fa79e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 9d2b9dff40a0c..7a444c113168c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 19760b957cb9a..0b2c592ab0e8f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index e970f0fc22c63..29dbb49a0af17 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 5aa822627f552..8a922aa386084 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 240e58147a121..4fb033aa7187c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 8642aa9ac4f84..7fd83dab84675 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 1a02155b99cbf..1d3cd5724ac8b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 95ebb75b17f29..bff394b546908 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 18ffcec0fd798..334a99729d090 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 32cbf9523ead0..97872450e7f05 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 55867fa84a977..fd8124adaf5c8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index a69c91c82d529..2fa817f8c9a1d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 23c94ff6dd4fa..7de242e19a1c1 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 2cc2dc17261d9..af119c469d802 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 0e07f12737d33..8f030208e013e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 266e25316751e..4551bf1865054 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 6df76da5ee1c7..afa9d7c1e88fe 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index c7e2ed7c6e7ff..5b6488c2e3643 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index 71c40e3e32ecf..322d629396659 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.devdocs.json b/api_docs/kbn_sse_utils_server.devdocs.json index dbf75dfc2083a..3039d2e3389a7 100644 --- a/api_docs/kbn_sse_utils_server.devdocs.json +++ b/api_docs/kbn_sse_utils_server.devdocs.json @@ -29,7 +29,15 @@ "signature": [ "(source$: ", "Observable", - " & { type: string; }>) => ", + " & { type: string; }>, {\n logger,\n signal,\n }: { logger: Pick<", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", \"error\" | \"debug\">; signal: AbortSignal; }) => ", "PassThrough" ], "path": "packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts", @@ -51,6 +59,95 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/sse-utils-server", + "id": "def-common.observableIntoEventSourceStream.$2", + "type": "Object", + "tags": [], + "label": "{\n logger,\n signal,\n }", + "description": [], + "path": "packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/sse-utils-server", + "id": "def-common.observableIntoEventSourceStream.$2.logger", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + "{ error: (errorOrMessage: Error | ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.LogMessageSource", + "text": "LogMessageSource" + }, + ", meta?: Meta | undefined) => void; debug: (message: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.LogMessageSource", + "text": "LogMessageSource" + }, + ", meta?: Meta | undefined) => void; }" + ], + "path": "packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/sse-utils-server", + "id": "def-common.observableIntoEventSourceStream.$2.signal", + "type": "Object", + "tags": [], + "label": "signal", + "description": [], + "signature": [ + "AbortSignal" + ], + "path": "packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "returnComment": [], diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index ba641ade176f3..fe73491e89db6 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 4 | 0 | 3 | 0 | +| 7 | 0 | 6 | 0 | ## Common diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 713b5a6e82643..0c57f571acb44 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 434de060b7cb1..5a82c6a570b57 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 5e4273929e997..0ea0ea23404ec 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 21c5a7dfe8815..43ec2f6354d9d 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index fcc0b28808d36..fe6ad55dd8648 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index bf80b02cdbb5f..eb2ed66249261 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 90b99d676f20b..919f92d0fa957 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index c2087a4d8dcc4..15cef4643ff03 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index a4c009f13823c..3e17b02e7da81 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 3eee4b5fcf634..3296599516daf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index c623e767d0235..801ca447c8c1a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 7e39333f85ded..edb6f980b23c8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_transpose_utils.mdx b/api_docs/kbn_transpose_utils.mdx index ee25d7b22877f..33c354e0cbc15 100644 --- a/api_docs/kbn_transpose_utils.mdx +++ b/api_docs/kbn_transpose_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-transpose-utils title: "@kbn/transpose-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/transpose-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/transpose-utils'] --- import kbnTransposeUtilsObj from './kbn_transpose_utils.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 1ed43aacfbebd..cf8d11b7f962b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index ab433f5c8f1c8..22a2c9d15b4b7 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 089172c24b07f..047a028117e9a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index e71c62047b2e0..e4c77e35b9dd6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 91519393d174e..7c9e158dba81f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 8ef4bbb1b2dd9..1a22ce93e2cae 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 50f9bb53556b5..5c662b5a072b2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index ecf1da9eed3f9..0212e2534da46 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-12-10 +date: 2024-12-12 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 9adf0481ac2ce..8faf2155925f8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index a25c3dc4592e4..328dd3e53fa61 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index a39c3736b9066..31f97b34d4abd 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 58ddf3fd5c7a5..bf2ff70a453c2 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index a00d54551c2d0..c31e540fc9b20 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 1eaf4a327fa29..0480fb8b5cdf6 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index a70e0d6405ebc..fab76c3d222b1 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index f6f8885e181e6..10ad4490790ed 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index f5093649e563e..6044ba898eee9 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.devdocs.json b/api_docs/kbn_visualization_ui_components.devdocs.json index c89a8276981bb..f6e3a7ee20b24 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -47,7 +47,7 @@ "label": "ColorPicker", "description": [], "signature": [ - "({ overwriteColor, defaultColor, isClearable, setConfig, label, disableHelpTooltip, disabledMessage, showAlpha, }: ", + "({ overwriteColor, defaultColor, isClearable, setConfig, label, disableHelpTooltip, disabledMessage, showAlpha, swatches, }: ", { "pluginId": "@kbn/visualization-ui-components", "scope": "public", @@ -66,7 +66,7 @@ "id": "def-public.ColorPicker.$1", "type": "Object", "tags": [], - "label": "{\n overwriteColor,\n defaultColor,\n isClearable,\n setConfig,\n label,\n disableHelpTooltip,\n disabledMessage,\n showAlpha,\n}", + "label": "{\n overwriteColor,\n defaultColor,\n isClearable,\n setConfig,\n label,\n disableHelpTooltip,\n disabledMessage,\n showAlpha,\n swatches,\n}", "description": [], "signature": [ { @@ -2058,6 +2058,20 @@ "path": "packages/kbn-visualization-ui-components/components/color_picker.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/visualization-ui-components", + "id": "def-public.ColorPickerProps.swatches", + "type": "Array", + "tags": [], + "label": "swatches", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-visualization-ui-components/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index a375d6d38afb0..a0636961c1573 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 144 | 0 | 138 | 4 | +| 145 | 0 | 139 | 4 | ## Client diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index ed9aad8b4139b..1c0eae24bde80 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 9004a0f42745e..7d0244abca01a 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 653fcb4d79bff..ca4178c6ae652 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index 40a181dc684d8..9d303cbb445f1 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.devdocs.json b/api_docs/kbn_zod_helpers.devdocs.json index ea7b86d74c0c4..885029ffc0434 100644 --- a/api_docs/kbn_zod_helpers.devdocs.json +++ b/api_docs/kbn_zod_helpers.devdocs.json @@ -167,6 +167,54 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/zod-helpers", + "id": "def-common.isNonEmptyString", + "type": "Function", + "tags": [], + "label": "isNonEmptyString", + "description": [], + "signature": [ + "(input: string, ctx: Zod.RefinementCtx) => void" + ], + "path": "packages/kbn-zod-helpers/src/non_empty_string.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/zod-helpers", + "id": "def-common.isNonEmptyString.$1", + "type": "string", + "tags": [], + "label": "input", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-zod-helpers/src/non_empty_string.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/zod-helpers", + "id": "def-common.isNonEmptyString.$2", + "type": "Object", + "tags": [], + "label": "ctx", + "description": [], + "signature": [ + "Zod.RefinementCtx" + ], + "path": "packages/kbn-zod-helpers/src/non_empty_string.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/zod-helpers", "id": "def-common.isValidDateMath", diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 0885ecaca7222..d445023e6a284 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-detection-rule-management](https://github.com/orgs/el | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 20 | 0 | 10 | 0 | +| 23 | 0 | 13 | 0 | ## Common diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 6aff7fa949e00..51e21c08239bd 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index c893f92835185..01171c1c6caab 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -966,6 +966,14 @@ { "plugin": "observabilityShared", "path": "x-pack/plugins/observability_solution/observability_shared/public/components/header_menu/header_menu_portal.tsx" + }, + { + "plugin": "monitoring", + "path": "x-pack/plugins/monitoring/public/components/header_menu/header_menu_portal.tsx" + }, + { + "plugin": "monitoring", + "path": "x-pack/plugins/monitoring/public/components/header_menu/header_menu_portal.tsx" } ], "children": [ diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index be05b56eda8bb..7d369754dd524 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 5396d6f8ed22b..906f22ea352f3 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 2e7cf52c6ee91..d82b93a52a62c 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 17f5de4a4d6e4..a83d1413e89af 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -689,7 +689,15 @@ "section": "def-common.AggregateQuery", "text": "AggregateQuery" }, - " | undefined>; rendered$: ", + " | undefined>; searchSessionId$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; rendered$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -6678,7 +6686,7 @@ "\nReact component which can be used to embed a Lens visualization into another application.\nSee `x-pack/examples/embedded_lens_example` for exemplary usage.\n\nThis API might undergo breaking changes even in minor versions.\n" ], "signature": [ - "({ title, withDefaultActions, extraActions, showInspector, syncColors, syncCursor, syncTooltips, viewMode, id, query, filters, timeRange, disabledActions, ...props }: { id?: string | undefined; className?: string | undefined; style?: React.CSSProperties | undefined; title?: string | undefined; description?: string | undefined; viewMode?: ", + "({ title, withDefaultActions, extraActions, showInspector, syncColors, syncCursor, syncTooltips, viewMode, id, query, filters, timeRange, disabledActions, searchSessionId, hidePanelTitles, ...props }: { id?: string | undefined; className?: string | undefined; style?: React.CSSProperties | undefined; title?: string | undefined; description?: string | undefined; viewMode?: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -18313,7 +18321,15 @@ "section": "def-common.AggregateQuery", "text": "AggregateQuery" }, - " | undefined>; rendered$: ", + " | undefined>; searchSessionId$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; rendered$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -20867,7 +20883,15 @@ "section": "def-common.AggregateQuery", "text": "AggregateQuery" }, - " | undefined>; rendered$: ", + " | undefined>; searchSessionId$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; rendered$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index e90abb70f6549..b585d444f4505 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 7229770a2ce29..b88ba925e754d 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 704efebb74b73..089f7a432491e 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index cb2fa10f2037f..96d491a523142 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 3624254804ce6..53cf063917b54 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index c01f7076c28f9..3245e84c91ff0 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/llm_tasks.devdocs.json b/api_docs/llm_tasks.devdocs.json index be33e1e8cbf53..39638b49a1e87 100644 --- a/api_docs/llm_tasks.devdocs.json +++ b/api_docs/llm_tasks.devdocs.json @@ -24,7 +24,7 @@ "description": [ "\nDescribes public llmTasks plugin contract returned at the `setup` stage." ], - "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/llm_tasks/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -40,7 +40,7 @@ "description": [ "\nDescribes public llmTasks plugin contract returned at the `start` stage." ], - "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/llm_tasks/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -56,7 +56,7 @@ "signature": [ "() => Promise" ], - "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/llm_tasks/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -80,7 +80,7 @@ "RetrieveDocumentationResult", ">" ], - "path": "x-pack/plugins/ai_infra/llm_tasks/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/llm_tasks/server/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -95,7 +95,7 @@ "signature": [ "RetrieveDocumentationParams" ], - "path": "x-pack/plugins/ai_infra/llm_tasks/server/tasks/retrieve_documentation/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/llm_tasks/server/tasks/retrieve_documentation/types.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/llm_tasks.mdx b/api_docs/llm_tasks.mdx index 2adb45f4aaf45..ddf5d6390fe63 100644 --- a/api_docs/llm_tasks.mdx +++ b/api_docs/llm_tasks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/llmTasks title: "llmTasks" image: https://source.unsplash.com/400x175/?github description: API docs for the llmTasks plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'llmTasks'] --- import llmTasksObj from './llm_tasks.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index c1e10f806bb00..25126164707de 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 6149d530e0934..9c7ed77f6a5ee 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index aadc044bb6f73..8fc563ef251af 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 02f48da672886..26077601f5b43 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 13be2f6257719..a8015e6947fe2 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index acb7b46255e2f..7d3c5eb38e123 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 59a57b0fade86..11030a6de1080 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 792589e932c7e..c4a052be6cd32 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 17d3e33d2eba0..8897332ac7856 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 5b7f69096f7c8..075a3cd29f294 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 782c0b380c1f9..12f3a8b1505d4 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index cfa72847f2677..224653f1e6d70 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 5cae7cf8fb46f..6cfcebe1c7013 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 186c617fbef8d..a9bb03659b0eb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 3e281d9a87f84..66434f2d4bbb0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 397f23be76136..8080f664fdee9 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-12-10 +date: 2024-12-12 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 548b3f1e3fd6c..5fa74fc0931e1 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -7771,8 +7771,1616 @@ } }, "server": { - "classes": [], + "classes": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient", + "type": "Class", + "tags": [], + "label": "ObservabilityAIAssistantClient", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "dependencies", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.config", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "signature": [ + "{ readonly scope?: \"search\" | \"observability\" | undefined; readonly enabled: boolean; readonly enableKnowledgeBase: boolean; }" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.core", + "type": "Object", + "tags": [], + "label": "core", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "server", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-server.CoreSetup", + "text": "CoreSetup" + }, + "<", + "ObservabilityAIAssistantPluginStartDependencies", + ", unknown>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.actionsClient", + "type": "Object", + "tags": [], + "label": "actionsClient", + "description": [], + "signature": [ + "{ execute: (connectorExecuteParams: ", + "ConnectorExecuteParams", + ") => Promise<", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.ActionTypeExecutorResult", + "text": "ActionTypeExecutorResult" + }, + ">; create: ({ action, options, }: Omit<", + "ConnectorCreateParams", + ", \"context\">) => Promise<", + "Connector", + ">; update: ({ id, action, }: Pick<", + "ConnectorUpdateParams", + ", \"id\" | \"action\">) => Promise<", + "Connector", + ">; get: ({ id, throwIfSystemAction, }: { id: string; throwIfSystemAction?: boolean | undefined; }) => Promise<", + "Connector", + ">; getAll: ({ includeSystemActions }?: { includeSystemActions?: boolean | undefined; }) => Promise<", + { + "pluginId": "actions", + "scope": "server", + "docId": "kibActionsPluginApi", + "section": "def-server.ConnectorWithExtraFindData", + "text": "ConnectorWithExtraFindData" + }, + "[]>; getAllSystemConnectors: () => Promise<", + { + "pluginId": "actions", + "scope": "server", + "docId": "kibActionsPluginApi", + "section": "def-server.ConnectorWithExtraFindData", + "text": "ConnectorWithExtraFindData" + }, + "[]>; getBulk: ({ ids, throwIfSystemAction, }: { ids: string[]; throwIfSystemAction?: boolean | undefined; }) => Promise<", + "Connector", + "[]>; getOAuthAccessToken: ({ type, options }: Readonly<{} & { type: \"jwt\" | \"client\"; options: Readonly<{} & { tokenUrl: string; config: Readonly<{} & { clientId: string; jwtKeyId: string; userIdentifierValue: string; }>; secrets: Readonly<{ privateKeyPassword?: string | undefined; } & { clientSecret: string; privateKey: string; }>; }> | Readonly<{} & { tokenUrl: string; config: Readonly<{} & { clientId: string; tenantId: string; }>; secrets: Readonly<{} & { clientSecret: string; }>; scope: string; }>; }>, configurationUtilities: ", + "ActionsConfigurationUtilities", + ") => Promise<{ accessToken: string | null; }>; delete: ({ id }: { id: string; }) => Promise<{}>; bulkEnqueueExecution: (options: ", + "ExecuteOptions", + "[]) => Promise<", + "ExecutionResponse", + ">; listTypes: ({ featureId, includeSystemActionTypes, }?: ", + "ListTypesParams", + ") => Promise<", + "ConnectorType", + "[]>; isActionTypeEnabled: (actionTypeId: string, options?: { notifyUsage: boolean; }) => boolean; isPreconfigured: (connectorId: string) => boolean; isSystemAction: (connectorId: string) => boolean; getGlobalExecutionLogWithAuth: ({ dateStart, dateEnd, filter, page, perPage, sort, namespaces, }: ", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.GetGlobalExecutionLogParams", + "text": "GetGlobalExecutionLogParams" + }, + ") => Promise<", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.IExecutionLogResult", + "text": "IExecutionLogResult" + }, + ">; getGlobalExecutionKpiWithAuth: ({ dateStart, dateEnd, filter, namespaces, }: ", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.GetGlobalExecutionKPIParams", + "text": "GetGlobalExecutionKPIParams" + }, + ") => Promise<{ success: number; unknown: number; failure: number; warning: number; }>; }" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.uiSettingsClient", + "type": "Object", + "tags": [], + "label": "uiSettingsClient", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-ui-settings-server", + "scope": "server", + "docId": "kibKbnCoreUiSettingsServerPluginApi", + "section": "def-server.IUiSettingsClient", + "text": "IUiSettingsClient" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.namespace", + "type": "string", + "tags": [], + "label": "namespace", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.esClient", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + "{ asInternalUser: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "server", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + "; asCurrentUser: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "server", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + "; }" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.inferenceClient", + "type": "Object", + "tags": [], + "label": "inferenceClient", + "description": [], + "signature": [ + { + "pluginId": "inference", + "scope": "server", + "docId": "kibInferencePluginApi", + "section": "def-server.InferenceClient", + "text": "InferenceClient" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.logger", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "{ id?: string | undefined; name: string; } | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.knowledgeBaseService", + "type": "Object", + "tags": [], + "label": "knowledgeBaseService", + "description": [], + "signature": [ + "KnowledgeBaseService" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.Unnamed.$1.scopes", + "type": "Array", + "tags": [], + "label": "scopes", + "description": [], + "signature": [ + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.get", + "type": "Function", + "tags": [], + "label": "get", + "description": [], + "signature": [ + "(conversationId: string) => Promise<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Conversation", + "text": "Conversation" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.get.$1", + "type": "string", + "tags": [], + "label": "conversationId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.delete", + "type": "Function", + "tags": [], + "label": "delete", + "description": [], + "signature": [ + "(conversationId: string) => Promise" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.delete.$1", + "type": "string", + "tags": [], + "label": "conversationId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete", + "type": "Function", + "tags": [], + "label": "complete", + "description": [], + "signature": [ + "({ functionClient, connectorId, simulateFunctionCalling, instructions: adHocInstructions, messages: initialMessages, signal, persist, kibanaPublicUrl, isPublic, title: predefinedTitle, conversationId: predefinedConversationId, disableFunctions, }: { messages: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[]; connectorId: string; signal: AbortSignal; functionClient: ", + "ChatFunctionClient", + "; persist: boolean; conversationId?: string | undefined; title?: string | undefined; isPublic?: boolean | undefined; kibanaPublicUrl?: string | undefined; instructions?: ", + "AdHocInstruction", + "[] | undefined; simulateFunctionCalling?: boolean | undefined; disableFunctions?: boolean | { except: string[]; } | undefined; }) => ", + "Observable", + "<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.ConversationCreateEvent", + "text": "ConversationCreateEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.ConversationUpdateEvent", + "text": "ConversationUpdateEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.MessageAddEvent", + "text": "MessageAddEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.ChatCompletionChunkEvent", + "text": "ChatCompletionChunkEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.ChatCompletionMessageEvent", + "text": "ChatCompletionMessageEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.TokenCountEvent", + "text": "TokenCountEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.BufferFlushEvent", + "text": "BufferFlushEvent" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1", + "type": "Object", + "tags": [], + "label": "{\n functionClient,\n connectorId,\n simulateFunctionCalling = false,\n instructions: adHocInstructions = [],\n messages: initialMessages,\n signal,\n persist,\n kibanaPublicUrl,\n isPublic,\n title: predefinedTitle,\n conversationId: predefinedConversationId,\n disableFunctions = false,\n }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.messages", + "type": "Array", + "tags": [], + "label": "messages", + "description": [], + "signature": [ + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[]" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.connectorId", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.signal", + "type": "Object", + "tags": [], + "label": "signal", + "description": [], + "signature": [ + "AbortSignal" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.functionClient", + "type": "Object", + "tags": [], + "label": "functionClient", + "description": [], + "signature": [ + "ChatFunctionClient" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.persist", + "type": "boolean", + "tags": [], + "label": "persist", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.conversationId", + "type": "string", + "tags": [], + "label": "conversationId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.isPublic", + "type": "CompoundType", + "tags": [], + "label": "isPublic", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.kibanaPublicUrl", + "type": "string", + "tags": [], + "label": "kibanaPublicUrl", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.instructions", + "type": "Array", + "tags": [], + "label": "instructions", + "description": [], + "signature": [ + "AdHocInstruction", + "[] | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.simulateFunctionCalling", + "type": "CompoundType", + "tags": [], + "label": "simulateFunctionCalling", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.complete.$1.disableFunctions", + "type": "CompoundType", + "tags": [], + "label": "disableFunctions", + "description": [], + "signature": [ + "boolean | { except: string[]; } | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat", + "type": "Function", + "tags": [], + "label": "chat", + "description": [], + "signature": [ + "(name: string, { messages, connectorId, functions, functionCall, signal, simulateFunctionCalling, tracer, }: { messages: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[]; connectorId: string; functions?: { name: string; description: string; parameters?: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.CompatibleJSONSchema", + "text": "CompatibleJSONSchema" + }, + " | undefined; }[] | undefined; functionCall?: string | undefined; signal: AbortSignal; simulateFunctionCalling?: boolean | undefined; tracer: ", + "LangTracer", + "; }) => ", + "Observable", + "<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.ChatCompletionChunkEvent", + "text": "ChatCompletionChunkEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.ChatCompletionMessageEvent", + "text": "ChatCompletionMessageEvent" + }, + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.TokenCountEvent", + "text": "TokenCountEvent" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2", + "type": "Object", + "tags": [], + "label": "{\n messages,\n connectorId,\n functions,\n functionCall,\n signal,\n simulateFunctionCalling,\n tracer,\n }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.messages", + "type": "Array", + "tags": [], + "label": "messages", + "description": [], + "signature": [ + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Message", + "text": "Message" + }, + "[]" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.connectorId", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.functions", + "type": "Array", + "tags": [], + "label": "functions", + "description": [], + "signature": [ + "{ name: string; description: string; parameters?: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.CompatibleJSONSchema", + "text": "CompatibleJSONSchema" + }, + " | undefined; }[] | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.functionCall", + "type": "string", + "tags": [], + "label": "functionCall", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.signal", + "type": "Object", + "tags": [], + "label": "signal", + "description": [], + "signature": [ + "AbortSignal" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.simulateFunctionCalling", + "type": "CompoundType", + "tags": [], + "label": "simulateFunctionCalling", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.chat.$2.tracer", + "type": "Object", + "tags": [], + "label": "tracer", + "description": [], + "signature": [ + "LangTracer" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.find", + "type": "Function", + "tags": [], + "label": "find", + "description": [], + "signature": [ + "(options?: { query?: string | undefined; } | undefined) => Promise<{ conversations: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Conversation", + "text": "Conversation" + }, + "[]; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.find.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.find.$1.query", + "type": "string", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [], + "signature": [ + "(conversationId: string, conversation: ", + "ConversationUpdateRequest", + ") => Promise<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Conversation", + "text": "Conversation" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.update.$1", + "type": "string", + "tags": [], + "label": "conversationId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.update.$2", + "type": "CompoundType", + "tags": [], + "label": "conversation", + "description": [], + "signature": [ + "ConversationUpdateRequest" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.setTitle", + "type": "Function", + "tags": [], + "label": "setTitle", + "description": [], + "signature": [ + "({ conversationId, title }: { conversationId: string; title: string; }) => Promise<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Conversation", + "text": "Conversation" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.setTitle.$1", + "type": "Object", + "tags": [], + "label": "{ conversationId, title }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.setTitle.$1.conversationId", + "type": "string", + "tags": [], + "label": "conversationId", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.setTitle.$1.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "(conversation: ", + "ConversationRequestBase", + ") => Promise<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.Conversation", + "text": "Conversation" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.create.$1", + "type": "CompoundType", + "tags": [], + "label": "conversation", + "description": [], + "signature": [ + "ConversationRequestBase" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.recall", + "type": "Function", + "tags": [], + "label": "recall", + "description": [], + "signature": [ + "({ queries, categories, limit, }: { queries: { text: string; boost?: number | undefined; }[]; categories?: string[] | undefined; limit?: { size?: number | undefined; tokenCount?: number | undefined; } | undefined; }) => Promise<", + "RecalledEntry", + "[]>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.recall.$1", + "type": "Object", + "tags": [], + "label": "{\n queries,\n categories,\n limit,\n }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.recall.$1.queries", + "type": "Array", + "tags": [], + "label": "queries", + "description": [], + "signature": [ + "{ text: string; boost?: number | undefined; }[]" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.recall.$1.categories", + "type": "Array", + "tags": [], + "label": "categories", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.recall.$1.limit", + "type": "Object", + "tags": [], + "label": "limit", + "description": [], + "signature": [ + "{ size?: number | undefined; tokenCount?: number | undefined; } | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseStatus", + "type": "Function", + "tags": [], + "label": "getKnowledgeBaseStatus", + "description": [], + "signature": [ + "() => Promise<{ ready: boolean; enabled: boolean; errorMessage: string; endpoint?: undefined; model_stats?: undefined; } | { endpoint: ", + "InferenceInferenceEndpointInfo", + "; ready: boolean; enabled: boolean; model_stats: { allocation_count: number; deployment_state: ", + "MlDeploymentState", + " | undefined; allocation_state: ", + "MlDeploymentAllocationState", + " | undefined; }; errorMessage?: undefined; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.setupKnowledgeBase", + "type": "Function", + "tags": [], + "label": "setupKnowledgeBase", + "description": [], + "signature": [ + "(modelId: string | undefined) => Promise<", + "InferenceInferenceEndpointInfo", + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.setupKnowledgeBase.$1", + "type": "string", + "tags": [], + "label": "modelId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.resetKnowledgeBase", + "type": "Function", + "tags": [], + "label": "resetKnowledgeBase", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.migrateKnowledgeBaseToSemanticText", + "type": "Function", + "tags": [], + "label": "migrateKnowledgeBaseToSemanticText", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.addUserInstruction", + "type": "Function", + "tags": [], + "label": "addUserInstruction", + "description": [], + "signature": [ + "({ entry, }: { entry: Omit<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.KnowledgeBaseEntry", + "text": "KnowledgeBaseEntry" + }, + ", \"type\" | \"@timestamp\" | \"role\" | \"confidence\" | \"is_correction\">; }) => Promise" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.addUserInstruction.$1", + "type": "Object", + "tags": [], + "label": "{\n entry,\n }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.addUserInstruction.$1.entry", + "type": "Object", + "tags": [], + "label": "entry", + "description": [], + "signature": [ + "{ id: string; text: string; title?: string | undefined; labels?: Record | undefined; public: boolean; user?: { name: string; } | undefined; }" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.addKnowledgeBaseEntry", + "type": "Function", + "tags": [], + "label": "addKnowledgeBaseEntry", + "description": [], + "signature": [ + "({ entry, }: { entry: Omit<", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.KnowledgeBaseEntry", + "text": "KnowledgeBaseEntry" + }, + ", \"type\" | \"@timestamp\">; }) => Promise" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.addKnowledgeBaseEntry.$1", + "type": "Object", + "tags": [], + "label": "{\n entry,\n }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.addKnowledgeBaseEntry.$1.entry", + "type": "Object", + "tags": [], + "label": "entry", + "description": [], + "signature": [ + "{ id: string; text: string; title?: string | undefined; role: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.KnowledgeBaseEntryRole", + "text": "KnowledgeBaseEntryRole" + }, + "; labels?: Record | undefined; public: boolean; user?: { name: string; } | undefined; confidence: \"medium\" | \"high\" | \"low\"; is_correction: boolean; }" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseEntries", + "type": "Function", + "tags": [], + "label": "getKnowledgeBaseEntries", + "description": [], + "signature": [ + "({ query, sortBy, sortDirection, }: { query: string; sortBy: string; sortDirection: \"asc\" | \"desc\"; }) => Promise<{ entries: ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.KnowledgeBaseEntry", + "text": "KnowledgeBaseEntry" + }, + "[]; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseEntries.$1", + "type": "Object", + "tags": [], + "label": "{\n query,\n sortBy,\n sortDirection,\n }", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseEntries.$1.query", + "type": "string", + "tags": [], + "label": "query", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseEntries.$1.sortBy", + "type": "string", + "tags": [], + "label": "sortBy", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseEntries.$1.sortDirection", + "type": "CompoundType", + "tags": [], + "label": "sortDirection", + "description": [], + "signature": [ + "\"asc\" | \"desc\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.deleteKnowledgeBaseEntry", + "type": "Function", + "tags": [], + "label": "deleteKnowledgeBaseEntry", + "description": [], + "signature": [ + "(id: string) => Promise" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.deleteKnowledgeBaseEntry.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.ObservabilityAIAssistantClient.getKnowledgeBaseUserInstructions", + "type": "Function", + "tags": [], + "label": "getKnowledgeBaseUserInstructions", + "description": [], + "signature": [ + "() => Promise<(", + "Instruction", + " & { public?: boolean | undefined; })[]>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "functions": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionRequestMessage", + "type": "Function", + "tags": [], + "label": "createFunctionRequestMessage", + "description": [], + "signature": [ + "({\n name,\n args,\n}: { name: string; args?: Record | undefined; }) => ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.MessageAddEvent", + "text": "MessageAddEvent" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionRequestMessage.$1", + "type": "Object", + "tags": [], + "label": "{\n name,\n args,\n}", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionRequestMessage.$1.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionRequestMessage.$1.args", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionResponseMessage", + "type": "Function", + "tags": [], + "label": "createFunctionResponseMessage", + "description": [], + "signature": [ + "({\n name,\n content,\n data,\n}: { name: string; content: unknown; data?: unknown; }) => ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.MessageAddEvent", + "text": "MessageAddEvent" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionResponseMessage.$1", + "type": "Object", + "tags": [], + "label": "{\n name,\n content,\n data,\n}", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionResponseMessage.$1.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionResponseMessage.$1.content", + "type": "Unknown", + "tags": [], + "label": "content", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.createFunctionResponseMessage.$1.data", + "type": "Unknown", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-server.streamIntoObservable", @@ -8847,7 +10455,13 @@ "({}: { signal: AbortSignal; resources: ", "RespondFunctionResources", "; client: ", - "ObservabilityAIAssistantClient", + { + "pluginId": "observabilityAIAssistant", + "scope": "server", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-server.ObservabilityAIAssistantClient", + "text": "ObservabilityAIAssistantClient" + }, "; functions: ", "ChatFunctionClient", "; scopes: ", @@ -8876,7 +10490,13 @@ "{ signal: AbortSignal; resources: ", "RespondFunctionResources", "; client: ", - "ObservabilityAIAssistantClient", + { + "pluginId": "observabilityAIAssistant", + "scope": "server", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-server.ObservabilityAIAssistantClient", + "text": "ObservabilityAIAssistantClient" + }, "; functions: ", "ChatFunctionClient", "; scopes: ", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a238101a6e23b..a11f50e99dffb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 298 | 1 | 296 | 28 | +| 385 | 1 | 383 | 30 | ## Client @@ -60,6 +60,9 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai ### Functions +### Classes + + ### Consts, variables and types diff --git a/api_docs/observability_a_i_assistant_app.devdocs.json b/api_docs/observability_a_i_assistant_app.devdocs.json index b20b594df3987..c5aaf84aeb5fa 100644 --- a/api_docs/observability_a_i_assistant_app.devdocs.json +++ b/api_docs/observability_a_i_assistant_app.devdocs.json @@ -6,7 +6,69 @@ "interfaces": [], "enums": [], "misc": [], - "objects": [] + "objects": [], + "setup": { + "parentPluginId": "observabilityAIAssistantApp", + "id": "def-public.ObservabilityAIAssistantAppPublicSetup", + "type": "Interface", + "tags": [], + "label": "ObservabilityAIAssistantAppPublicSetup", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant_app/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "observabilityAIAssistantApp", + "id": "def-public.ObservabilityAIAssistantAppPublicStart", + "type": "Interface", + "tags": [], + "label": "ObservabilityAIAssistantAppPublicStart", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant_app/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistantApp", + "id": "def-public.ObservabilityAIAssistantAppPublicStart.RootCauseAnalysisContainer", + "type": "Function", + "tags": [], + "label": "RootCauseAnalysisContainer", + "description": [], + "signature": [ + "React.ExoticComponent<{ events?: ", + "RootCauseAnalysisEvent", + "[] | undefined; completeInBackground: boolean; onStartAnalysisClick: () => void; onStopAnalysisClick: () => void; onResetAnalysisClick: () => void; onClearAnalysisClick: () => void; onCompleteInBackgroundClick: () => void; loading: boolean; error?: Error | undefined; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant_app/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "observabilityAIAssistantApp", + "id": "def-public.ObservabilityAIAssistantAppPublicStart.RootCauseAnalysisContainer.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/ts5.0/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } }, "server": { "classes": [], diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index d17a9e0e27f08..fce33f51b91f1 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; @@ -21,7 +21,15 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 4 | 0 | 4 | 0 | +| 8 | 0 | 7 | 0 | + +## Client + +### Setup + + +### Start + ## Server diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index ee6994ae7dc22..7c883c17ee397 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index eefd6bbbc17b9..1c18a2acff0e8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 46b8953d5f670..0862c9313f0a0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index d8f637861d6e7..2548bd285c51d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index deaeb4de2d923..3b832057c9a89 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index c701e7935d091..0b3225543a27f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index a010cb19a416e..e9159bc864bb2 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-12-10 +date: 2024-12-12 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 | |--------------|----------|------------------------| -| 901 | 768 | 43 | +| 905 | 770 | 43 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 55052 | 240 | 41416 | 2030 | +| 55140 | 243 | 41486 | 2033 | ## Plugin Directory @@ -39,7 +39,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 60 | 1 | 59 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 125 | 0 | 105 | 28 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 267 | 2 | 252 | 9 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 271 | 2 | 255 | 9 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 83 | 0 | 20 | 1 | | 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/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 | @@ -54,7 +54,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 268 | 0 | 249 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 114 | 0 | 111 | 14 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 114 | 0 | 111 | 13 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3209 | 31 | 2594 | 24 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 6 | 0 | 6 | 0 | @@ -70,8 +70,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 35 | 0 | 33 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A stateful layer to register shared features and provide an access point to discover without a direct dependency | 26 | 0 | 23 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 56 | 0 | 41 | 2 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 571 | 1 | 462 | 9 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 55 | 0 | 40 | 2 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 562 | 1 | 457 | 9 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 54 | 0 | 47 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | @@ -100,7 +100,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart. | 182 | 0 | 171 | 13 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2241 | 17 | 1769 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 270 | 0 | 110 | 3 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 293 | 5 | 254 | 3 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes services for async usage and search of fields metadata. | 45 | 0 | 45 | 9 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 89 | 0 | 89 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | @@ -156,8 +156,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 697 | 2 | 689 | 23 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 298 | 1 | 296 | 28 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 0 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 385 | 1 | 383 | 30 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 8 | 0 | 7 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 19 | 0 | 19 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 24 | 0 | 24 | 0 | @@ -165,7 +165,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 159 | 2 | 129 | 10 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 126 | 2 | 102 | 8 | | | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 10 | 0 | 10 | 4 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 16 | 1 | 16 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 22 | 0 | 22 | 7 | @@ -199,13 +199,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | Serverless customizations for observability. | 6 | 0 | 6 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Serverless customizations for search. | 7 | 0 | 7 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 136 | 0 | 73 | 15 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 48 | 0 | 48 | 2 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 136 | 0 | 73 | 16 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 54 | 0 | 54 | 2 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 269 | 0 | 73 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 25 | 0 | 25 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 10 | 0 | 10 | 0 | -| | [@elastic/streams-program-team](https://github.com/orgs/elastic/teams/streams-program-team) | A manager for Streams | 13 | 0 | 13 | 4 | +| | [@elastic/streams-program-team](https://github.com/orgs/elastic/teams/streams-program-team) | A manager for Streams | 13 | 0 | 13 | 3 | | | [@elastic/streams-program-team](https://github.com/orgs/elastic/teams/streams-program-team) | - | 8 | 0 | 8 | 0 | | synthetics | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 108 | 0 | 64 | 7 | @@ -228,7 +228,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | urlDrilldown | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds drilldown implementations to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 12 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 52 | 0 | 14 | 5 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 2 | 0 | 2 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The default editor used in most aggregation-based visualizations. | 70 | 0 | 63 | 4 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the gauge chart implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy charts library advanced setting. | 7 | 0 | 7 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the heatmap implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy heatmap charts library advanced setting. | 3 | 0 | 3 | 2 | @@ -289,8 +289,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 20 | 0 | 15 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 41 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | -| | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 9 | 0 | 4 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 227 | 0 | 188 | 9 | +| | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 10 | 0 | 5 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 190 | 0 | 149 | 8 | | | [@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) | - | 149 | 2 | 143 | 20 | @@ -527,7 +527,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 6 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 271 | 1 | 210 | 14 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 30 | 0 | 30 | 1 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 31 | 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) | - | 285 | 1 | 223 | 25 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 12 | 0 | @@ -535,7 +535,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 205 | 0 | 193 | 12 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 40 | 0 | 40 | 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) | - | 41 | 0 | 14 | 2 | +| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 43 | 0 | 15 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 18 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 51 | 0 | 42 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 0 | 0 | @@ -560,7 +560,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting](https://github.com/orgs/elastic/teams/security-threat-hunting) | - | 85 | 0 | 80 | 2 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 75 | 0 | 73 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 126 | 3 | 126 | 0 | -| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 132 | 0 | 43 | 1 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 136 | 0 | 43 | 3 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | @@ -620,7 +620,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 8 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 2 | 0 | 1 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 34 | 0 | 0 | 0 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 47 | 0 | 41 | 1 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 48 | 0 | 41 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 18 | 0 | 18 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 42 | 1 | 35 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 32 | 0 | 0 | 0 | @@ -639,20 +639,21 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 46 | 0 | 46 | 9 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 51 | 5 | 34 | 0 | | | [@elastic/security-asset-management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 66 | 0 | 66 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 44 | 3 | 27 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-performance-testing](https://github.com/orgs/elastic/teams/kibana-performance-testing) | - | 3 | 0 | 3 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 92 | 0 | 80 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 229 | 0 | 193 | 6 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 87 | 0 | 75 | 1 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 233 | 0 | 197 | 6 | | | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 31 | 0 | 31 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 9 | 0 | 8 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 8 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 5 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 18 | 0 | 3 | 0 | @@ -660,6 +661,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 14 | 0 | 7 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 18 | 0 | 18 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 40 | 0 | 38 | 5 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 9 | 0 | @@ -687,7 +689,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 152 | 0 | 140 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 15 | 0 | 14 | 0 | -| | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 117 | 0 | 86 | 8 | +| | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 121 | 0 | 90 | 8 | | | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 6 | 0 | 6 | 0 | | | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 68 | 0 | 53 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 35 | 0 | 34 | 0 | @@ -718,7 +720,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 56 | 1 | 41 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 92 | 0 | 70 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 341 | 1 | 337 | 32 | -| | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 87 | 0 | 76 | 1 | +| | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 88 | 0 | 77 | 1 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 107 | 0 | 96 | 1 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 15 | 0 | 7 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 147 | 0 | 125 | 0 | @@ -788,7 +790,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 19 | 0 | 19 | 3 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 1 | 0 | 1 | 1 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 3 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 7 | 0 | 6 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 108 | 2 | 70 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 21 | 0 | @@ -819,10 +821,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 16 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 26 | 0 | 15 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 144 | 0 | 138 | 4 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 145 | 0 | 139 | 4 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 24 | 0 | 22 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1254 | 0 | 4 | 0 | -| | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 20 | 0 | 10 | 0 | +| | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 23 | 0 | 13 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 405058c4edb25..b07eb72bbfa45 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.devdocs.json b/api_docs/presentation_util.devdocs.json index 3ceb843da051a..ea50ab8480f1e 100644 --- a/api_docs/presentation_util.devdocs.json +++ b/api_docs/presentation_util.devdocs.json @@ -3,62 +3,6 @@ "client": { "classes": [], "functions": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.cleanFiltersForSerialize", - "type": "Function", - "tags": [], - "label": "cleanFiltersForSerialize", - "description": [], - "signature": [ - "(filters?: ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | undefined) => ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[]" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/clean_redux_embeddable_state.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.cleanFiltersForSerialize.$1", - "type": "Array", - "tags": [], - "label": "filters", - "description": [], - "signature": [ - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | undefined" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/clean_redux_embeddable_state.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "presentationUtil", "id": "def-public.DashboardDrilldownOptionsComponent", @@ -350,31 +294,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.lazyLoadReduxToolsPackage", - "type": "Function", - "tags": [], - "label": "lazyLoadReduxToolsPackage", - "description": [], - "signature": [ - "() => Promise<", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxToolsPackage", - "text": "ReduxToolsPackage" - }, - ">" - ], - "path": "src/plugins/presentation_util/public/redux_tools/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "presentationUtil", "id": "def-public.LazySavedObjectSaveModalDashboard", @@ -899,678 +818,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableState", - "type": "Interface", - "tags": [], - "label": "ReduxEmbeddableState", - "description": [ - "\nThe Embeddable Redux store should contain Input, Output and State. Input is serialized and used to create the embeddable,\nOutput is used as a communication layer for state that the Embeddable creates, and State is used to store ephemeral state which needs\nto be communicated between an embeddable and its inner React components." - ], - "signature": [ - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxEmbeddableState", - "text": "ReduxEmbeddableState" - }, - "" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableState.explicitInput", - "type": "Uncategorized", - "tags": [], - "label": "explicitInput", - "description": [], - "signature": [ - "InputType" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableState.output", - "type": "Uncategorized", - "tags": [], - "label": "output", - "description": [], - "signature": [ - "OutputType" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableState.componentState", - "type": "Uncategorized", - "tags": [], - "label": "componentState", - "description": [], - "signature": [ - "StateType" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools", - "type": "Interface", - "tags": [], - "label": "ReduxEmbeddableTools", - "description": [ - "\nThe return type from createReduxEmbeddableTools. Contains tools to get state, select state for react components,\nset state, and react to state changes." - ], - "signature": [ - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxEmbeddableTools", - "text": "ReduxEmbeddableTools" - }, - "" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.cleanup", - "type": "Function", - "tags": [], - "label": "cleanup", - "description": [], - "signature": [ - "() => void" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.store", - "type": "Object", - "tags": [], - "label": "store", - "description": [], - "signature": [ - "ToolkitStore", - ">" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.select", - "type": "Function", - "tags": [], - "label": "select", - "description": [], - "signature": [ - "(selector: (state: ReduxEmbeddableStateType) => Selected, equalityFn?: ((previous: Selected, next: Selected) => boolean) | undefined) => Selected" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.select.$1", - "type": "Function", - "tags": [], - "label": "selector", - "description": [], - "signature": [ - "(state: ReduxStateType) => Selected" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.select.$1.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - "ReduxStateType" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.select.$2", - "type": "Function", - "tags": [], - "label": "equalityFn", - "description": [], - "signature": [ - "((previous: Selected, next: Selected) => boolean) | undefined" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.getState", - "type": "Function", - "tags": [], - "label": "getState", - "description": [], - "signature": [ - "() => ReduxEmbeddableStateType & {}" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.dispatch", - "type": "Object", - "tags": [], - "label": "dispatch", - "description": [], - "signature": [ - "{ [ReducerKey in keyof ReducerType]: (payload: Parameters[1][\"payload\"]) => void; }" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.onStateChange", - "type": "Function", - "tags": [], - "label": "onStateChange", - "description": [], - "signature": [ - "(listener: () => void) => ", - "Unsubscribe" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxEmbeddableTools.onStateChange.$1", - "type": "Function", - "tags": [], - "label": "listener", - "description": [], - "signature": [ - "() => void" - ], - "path": "node_modules/redux/index.d.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [] - } - ] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools", - "type": "Interface", - "tags": [], - "label": "ReduxTools", - "description": [ - "\nThe return type from createReduxTools. Contains tools to get state, select state for react components,\nset state, and react to state changes." - ], - "signature": [ - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxTools", - "text": "ReduxTools" - }, - "" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.store", - "type": "Object", - "tags": [], - "label": "store", - "description": [], - "signature": [ - "ToolkitStore", - ">" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.select", - "type": "Function", - "tags": [], - "label": "select", - "description": [], - "signature": [ - "(selector: (state: ReduxStateType) => Selected, equalityFn?: ((previous: Selected, next: Selected) => boolean) | undefined) => Selected" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.select.$1", - "type": "Function", - "tags": [], - "label": "selector", - "description": [], - "signature": [ - "(state: ReduxStateType) => Selected" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.select.$1.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - "ReduxStateType" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.select.$2", - "type": "Function", - "tags": [], - "label": "equalityFn", - "description": [], - "signature": [ - "((previous: Selected, next: Selected) => boolean) | undefined" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.getState", - "type": "Function", - "tags": [], - "label": "getState", - "description": [], - "signature": [ - "() => ReduxStateType & {}" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.onStateChange", - "type": "Function", - "tags": [], - "label": "onStateChange", - "description": [], - "signature": [ - "(listener: () => void) => ", - "Unsubscribe" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.onStateChange.$1", - "type": "Function", - "tags": [], - "label": "listener", - "description": [], - "signature": [ - "() => void" - ], - "path": "node_modules/redux/index.d.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [] - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxTools.dispatch", - "type": "Object", - "tags": [], - "label": "dispatch", - "description": [], - "signature": [ - "{ [ReducerKey in keyof ReducerType]: (payload: Parameters[1][\"payload\"]) => void; }" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxToolsPackage", - "type": "Interface", - "tags": [], - "label": "ReduxToolsPackage", - "description": [ - "\nThe package type is lazily exported from presentation_util and should contain all methods needed to use the redux embeddable tools." - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxToolsPackage.createReduxTools", - "type": "Function", - "tags": [], - "label": "createReduxTools", - "description": [], - "signature": [ - " = ", - "ReduxToolsReducers", - ">({ reducers, additionalMiddleware, initialState, }: { additionalMiddleware?: ", - "Middleware", - "<", - "AnyAction", - ", any, ", - "Dispatch", - "<", - "AnyAction", - ">>[] | undefined; initialState: ReduxStateType; reducers: ReducerType; }) => ", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxTools", - "text": "ReduxTools" - }, - "" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxToolsPackage.createReduxTools.$1", - "type": "Object", - "tags": [], - "label": "__0", - "description": [], - "signature": [ - "{ additionalMiddleware?: ", - "Middleware", - "<", - "AnyAction", - ", any, ", - "Dispatch", - "<", - "AnyAction", - ">>[] | undefined; initialState: ReduxStateType; reducers: ReducerType; }" - ], - "path": "src/plugins/presentation_util/public/redux_tools/create_redux_tools.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxToolsPackage.createReduxEmbeddableTools", - "type": "Function", - "tags": [], - "label": "createReduxEmbeddableTools", - "description": [], - "signature": [ - " = ", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxEmbeddableState", - "text": "ReduxEmbeddableState" - }, - "<", - { - "pluginId": "embeddable", - "scope": "common", - "docId": "kibEmbeddablePluginApi", - "section": "def-common.EmbeddableInput", - "text": "EmbeddableInput" - }, - ", ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.EmbeddableOutput", - "text": "EmbeddableOutput" - }, - ", unknown>, ReducerType extends ", - "ReduxToolsReducers", - " = ", - "ReduxToolsReducers", - ">({ reducers, embeddable, syncSettings, additionalMiddleware, initialComponentState, }: { embeddable: ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.Embeddable", - "text": "Embeddable" - }, - "; additionalMiddleware?: ", - "Middleware", - "<", - "AnyAction", - ", any, ", - "Dispatch", - "<", - "AnyAction", - ">>[] | undefined; initialComponentState?: ReduxEmbeddableStateType[\"componentState\"] | undefined; syncSettings?: ", - "ReduxEmbeddableSyncSettings", - "<", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxEmbeddableState", - "text": "ReduxEmbeddableState" - }, - "<", - { - "pluginId": "embeddable", - "scope": "common", - "docId": "kibEmbeddablePluginApi", - "section": "def-common.EmbeddableInput", - "text": "EmbeddableInput" - }, - ", ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.EmbeddableOutput", - "text": "EmbeddableOutput" - }, - ", unknown>> | undefined; reducers: ReducerType; }) => ", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxEmbeddableTools", - "text": "ReduxEmbeddableTools" - }, - "" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.ReduxToolsPackage.createReduxEmbeddableTools.$1", - "type": "Object", - "tags": [], - "label": "__0", - "description": [], - "signature": [ - "{ embeddable: ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.Embeddable", - "text": "Embeddable" - }, - "; additionalMiddleware?: ", - "Middleware", - "<", - "AnyAction", - ", any, ", - "Dispatch", - "<", - "AnyAction", - ">>[] | undefined; initialComponentState?: ReduxEmbeddableStateType[\"componentState\"] | undefined; syncSettings?: ", - "ReduxEmbeddableSyncSettings", - "<", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxEmbeddableState", - "text": "ReduxEmbeddableState" - }, - "<", - { - "pluginId": "embeddable", - "scope": "common", - "docId": "kibEmbeddablePluginApi", - "section": "def-common.EmbeddableInput", - "text": "EmbeddableInput" - }, - ", ", - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.EmbeddableOutput", - "text": "EmbeddableOutput" - }, - ", unknown>> | undefined; reducers: ReducerType; }" - ], - "path": "src/plugins/presentation_util/public/redux_tools/redux_embeddables/create_redux_embeddable_tools.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "presentationUtil", "id": "def-public.SaveModalDashboardProps", diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index f76c594cfb617..1de6ffd56974c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.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 | |-------------------|-----------|------------------------|-----------------| -| 159 | 2 | 129 | 10 | +| 126 | 2 | 102 | 8 | ## Client diff --git a/api_docs/product_doc_base.devdocs.json b/api_docs/product_doc_base.devdocs.json index c6d82bc6f79ef..71ded441b875c 100644 --- a/api_docs/product_doc_base.devdocs.json +++ b/api_docs/product_doc_base.devdocs.json @@ -14,7 +14,7 @@ "tags": [], "label": "ProductDocBasePluginSetup", "description": [], - "path": "x-pack/plugins/ai_infra/product_doc_base/public/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -28,7 +28,7 @@ "tags": [], "label": "ProductDocBasePluginStart", "description": [], - "path": "x-pack/plugins/ai_infra/product_doc_base/public/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -42,7 +42,7 @@ "signature": [ "InstallationAPI" ], - "path": "x-pack/plugins/ai_infra/product_doc_base/public/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/public/types.ts", "deprecated": false, "trackAdoption": false } @@ -71,7 +71,7 @@ "DocSearchResponse", ">" ], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/services/search/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/services/search/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -86,7 +86,7 @@ "signature": [ "DocSearchOptions" ], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/services/search/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/services/search/types.ts", "deprecated": false, "trackAdoption": false } @@ -102,7 +102,7 @@ "tags": [], "label": "ProductDocBaseSetupContract", "description": [], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -116,7 +116,7 @@ "tags": [], "label": "ProductDocBaseStartContract", "description": [], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -134,7 +134,7 @@ "DocSearchResponse", ">" ], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/types.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -149,7 +149,7 @@ "signature": [ "DocSearchOptions" ], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/services/search/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/services/search/types.ts", "deprecated": false, "trackAdoption": false } @@ -165,7 +165,7 @@ "signature": [ "DocumentationManagerAPI" ], - "path": "x-pack/plugins/ai_infra/product_doc_base/server/types.ts", + "path": "x-pack/platform/plugins/shared/ai_infra/product_doc_base/server/types.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/product_doc_base.mdx b/api_docs/product_doc_base.mdx index 8697949c31bc7..0c999cc46b6cb 100644 --- a/api_docs/product_doc_base.mdx +++ b/api_docs/product_doc_base.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/productDocBase title: "productDocBase" image: https://source.unsplash.com/400x175/?github description: API docs for the productDocBase plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'productDocBase'] --- import productDocBaseObj from './product_doc_base.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 2f2edbd73b900..e1d7cda063201 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 522147b1c44c4..c80b8fc90659e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index fa12a3aa38bdd..dd7e8634b62bf 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 517733987a9a3..0d30e2948588a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index ddc9a17fdda4e..b8d098c2f4070 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 2dfad9af095ad..9974f1856919b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 6ec93b8215ca5..16182f463931a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 7a4f8e71721f2..02ab09a16920d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index f84b1de547b6c..315a57a30dfe2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 5af681ef08084..7cb638f62db70 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index b32e5a9d99d35..069b8275519e5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index dd7b41d92559d..7597d35f9a82d 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 5a2fae0d7abd3..e9e2a2f120a84 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index eb3e94d6aeabb..4b1665e2b74b2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 7519647f5d444..4e5f3133af5e2 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index 10999a62b75f5..74df8286d2f0a 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 4c51a6bfb01e1..47a8e0342cfeb 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 26fd2f09cf18c..1c3b0426c7f05 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index d3e710662efa5..82a5298b1bfea 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 586130aa4c7fb..8922c4087e8d5 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_navigation.mdx b/api_docs/search_navigation.mdx index 68c346df437e9..1f7579fce5236 100644 --- a/api_docs/search_navigation.mdx +++ b/api_docs/search_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNavigation title: "searchNavigation" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNavigation plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNavigation'] --- import searchNavigationObj from './search_navigation.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 60127da7c23ad..29fd99ddef1ec 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index f21a543026a9b..76252b107f11c 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-12-10 +date: 2024-12-12 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 c1f411fb8b769..a37923287efca 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -6489,26 +6489,6 @@ "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts" }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/enable.ts" - }, - { - "plugin": "entityManager", - "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/disable.ts" - }, { "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts" @@ -6537,6 +6517,26 @@ "plugin": "upgradeAssistant", "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/lib/auth/api_key/api_key.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/enable.ts" + }, + { + "plugin": "entityManager", + "path": "x-pack/platform/plugins/shared/entity_manager/server/routes/enablement/disable.ts" + }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" diff --git a/api_docs/security.mdx b/api_docs/security.mdx index ee526e2bdc142..3f692bd927bf5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 83890026a0c99..35eea88c3daa6 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -522,7 +522,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantModelEvaluation\" | \"defendInsights\" | \"alertSuppressionForSequenceEqlRuleEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"serviceEntityStoreEnabled\" | \"siemMigrationsEnabled\" | undefined" + "\"assistantModelEvaluation\" | \"defendInsights\" | \"alertSuppressionForSequenceEqlRuleEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"serviceEntityStoreEnabled\" | \"siemMigrationsEnabled\" | \"newExpandableFlyoutNavigationEnabled\" | \"crowdstrikeRunScriptEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -602,7 +602,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantModelEvaluation\" | \"defendInsights\" | \"alertSuppressionForSequenceEqlRuleEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"serviceEntityStoreEnabled\" | \"siemMigrationsEnabled\" | undefined" + "\"assistantModelEvaluation\" | \"defendInsights\" | \"alertSuppressionForSequenceEqlRuleEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesDisabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"serviceEntityStoreEnabled\" | \"siemMigrationsEnabled\" | \"newExpandableFlyoutNavigationEnabled\" | \"crowdstrikeRunScriptEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1882,7 +1882,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly alertSuppressionForSequenceEqlRuleEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly serviceEntityStoreEnabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; }" + "{ readonly alertSuppressionForSequenceEqlRuleEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly serviceEntityStoreEnabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; readonly newExpandableFlyoutNavigationEnabled: boolean; readonly crowdstrikeRunScriptEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3130,7 +3130,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly alertSuppressionForSequenceEqlRuleEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly serviceEntityStoreEnabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; }" + "{ readonly alertSuppressionForSequenceEqlRuleEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly serviceEntityStoreEnabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; readonly newExpandableFlyoutNavigationEnabled: boolean; readonly crowdstrikeRunScriptEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3303,7 +3303,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly alertSuppressionForSequenceEqlRuleEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly serviceEntityStoreEnabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; }" + "{ readonly alertSuppressionForSequenceEqlRuleEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesDisabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly serviceEntityStoreEnabled: boolean; readonly siemMigrationsEnabled: boolean; readonly defendInsights: boolean; readonly newExpandableFlyoutNavigationEnabled: boolean; readonly crowdstrikeRunScriptEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3369,7 +3369,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 alertSuppressionForSequenceEqlRuleEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: false; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesDisabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly graphVisualizationInFlyoutEnabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly serviceEntityStoreEnabled: true; readonly siemMigrationsEnabled: false; readonly defendInsights: false; }" + "{ readonly alertSuppressionForSequenceEqlRuleEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: false; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesDisabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly graphVisualizationInFlyoutEnabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly serviceEntityStoreEnabled: false; readonly siemMigrationsEnabled: false; readonly defendInsights: false; readonly newExpandableFlyoutNavigationEnabled: false; readonly crowdstrikeRunScriptEnabled: 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 3187c6ebb1327..2c64df3008fe8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index ac50037684913..44d9a410fda9e 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index c564182e3e4a8..b810d7a190728 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index b8f60227062d9..cb0ce86eba800 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 2b29dcbc97034..69b9215634643 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 4c4ffb23c5acc..fb1da6191f9b5 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index b085908391dcc..dc296c3a80fc3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.devdocs.json b/api_docs/share.devdocs.json index f059f4827715a..36ca1c42b9b08 100644 --- a/api_docs/share.devdocs.json +++ b/api_docs/share.devdocs.json @@ -528,7 +528,7 @@ ], "signature": [ "(params: P, options?: ", - "FormatSearchParamsOptions", + "GetRedirectUrlOptions", " | undefined) => string" ], "path": "src/plugins/share/common/url_service/locators/types.ts", @@ -562,7 +562,7 @@ "URL serialization options." ], "signature": [ - "FormatSearchParamsOptions", + "GetRedirectUrlOptions", " | undefined" ], "path": "src/plugins/share/common/url_service/locators/types.ts", @@ -847,7 +847,9 @@ "\nAllows for passing contextual information that each consumer can provide to customize the share menu" ], "signature": [ - "{ title: string; }" + "{ title: string; config?: Partial> | undefined; }" ], "path": "src/plugins/share/public/types.ts", "deprecated": false, @@ -2318,7 +2320,7 @@ ], "signature": [ "(params: P, options?: ", - "FormatSearchParamsOptions", + "GetRedirectUrlOptions", " | undefined) => string" ], "path": "src/plugins/share/common/url_service/locators/types.ts", @@ -2352,7 +2354,7 @@ "URL serialization options." ], "signature": [ - "FormatSearchParamsOptions", + "GetRedirectUrlOptions", " | undefined" ], "path": "src/plugins/share/common/url_service/locators/types.ts", diff --git a/api_docs/share.mdx b/api_docs/share.mdx index b533d5e9cdafa..b281758d2cc9a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.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 | |-------------------|-----------|------------------------|-----------------| -| 136 | 0 | 73 | 15 | +| 136 | 0 | 73 | 16 | ## Client diff --git a/api_docs/slo.devdocs.json b/api_docs/slo.devdocs.json index 6103989a90a7a..410a5f83698d0 100644 --- a/api_docs/slo.devdocs.json +++ b/api_docs/slo.devdocs.json @@ -1221,10 +1221,124 @@ "server": { "classes": [], "functions": [], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "slo", + "id": "def-server.SloClient", + "type": "Interface", + "tags": [], + "label": "SloClient", + "description": [], + "path": "x-pack/plugins/observability_solution/slo/server/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "slo", + "id": "def-server.SloClient.getSummaryIndices", + "type": "Function", + "tags": [], + "label": "getSummaryIndices", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "x-pack/plugins/observability_solution/slo/server/client/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [], - "objects": [] + "objects": [], + "setup": { + "parentPluginId": "slo", + "id": "def-server.SLOServerSetup", + "type": "Interface", + "tags": [], + "label": "SLOServerSetup", + "description": [], + "path": "x-pack/plugins/observability_solution/slo/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "slo", + "id": "def-server.SLOServerStart", + "type": "Interface", + "tags": [], + "label": "SLOServerStart", + "description": [], + "path": "x-pack/plugins/observability_solution/slo/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "slo", + "id": "def-server.SLOServerStart.getSloClientWithRequest", + "type": "Function", + "tags": [], + "label": "getSloClientWithRequest", + "description": [], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + ") => ", + { + "pluginId": "slo", + "scope": "server", + "docId": "kibSloPluginApi", + "section": "def-server.SloClient", + "text": "SloClient" + } + ], + "path": "x-pack/plugins/observability_solution/slo/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "slo", + "id": "def-server.SLOServerStart.getSloClientWithRequest.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "x-pack/plugins/observability_solution/slo/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } }, "common": { "classes": [], diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 34be1f29719bd..9e41696fdeed6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 48 | 2 | +| 54 | 0 | 54 | 2 | ## Client @@ -34,6 +34,17 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ ### Interfaces +## Server + +### Setup + + +### Start + + +### Interfaces + + ## Common ### Objects diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index fe3e8f32c653d..a51232cb0616b 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 27ce322add6ab..eb227b9b11122 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 5303fd771eb84..02112a1d7af72 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 8e9ed5dc29325..385aaca2ea390 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/streams.devdocs.json b/api_docs/streams.devdocs.json index 095b9b87cb116..8cb1b7522b5ad 100644 --- a/api_docs/streams.devdocs.json +++ b/api_docs/streams.devdocs.json @@ -14,7 +14,7 @@ "tags": [], "label": "StreamsPluginSetup", "description": [], - "path": "x-pack/plugins/streams/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -29,7 +29,7 @@ "Observable", "<{ status: \"unknown\" | \"disabled\" | \"enabled\"; }>" ], - "path": "x-pack/plugins/streams/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/public/types.ts", "deprecated": false, "trackAdoption": false } @@ -44,7 +44,7 @@ "tags": [], "label": "StreamsPluginStart", "description": [], - "path": "x-pack/plugins/streams/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -131,9 +131,7 @@ "Condition", "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", - "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }[]; trees: ", - "StreamTree", - "[]; }, undefined>; \"DELETE /api/streams/{id}\": ", + "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }[]; }, undefined>; \"DELETE /api/streams/{id}\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -159,7 +157,7 @@ "Condition", "; }, { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", - "; }>, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; children: Zod.ZodDefault, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; managed: Zod.ZodDefault; children: Zod.ZodDefault, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { children: { id: string; condition?: ", "Condition", - "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[]; }, { children?: { id: string; condition?: ", "Condition", - "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; managed?: boolean | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { path: { id: string; }; body: { children: { id: string; condition?: ", "Condition", - "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[]; }; }, { path: { id: string; }; body: { children?: { id: string; condition?: ", "Condition", - "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; managed?: boolean | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[] | undefined; }; }>, ", "StreamsRouteHandlerResources", @@ -215,7 +213,7 @@ "Condition", "; }, { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", - "; }>, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; children: Zod.ZodDefault, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; managed: Zod.ZodDefault; children: Zod.ZodDefault, \"many\">>; }, { id: Zod.ZodString; managed: Zod.ZodDefault; unmanaged_elasticsearch_assets: Zod.ZodOptional; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }>, \"many\">>; }>, \"children\">, \"strip\", Zod.ZodTypeAny, { id: string; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }>, \"many\">>; }, { id: Zod.ZodString; unmanaged_elasticsearch_assets: Zod.ZodOptional; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }>, \"many\">>; }>, \"children\">, \"strip\", Zod.ZodTypeAny, { id: string; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }, { id: string; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; managed?: boolean | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", @@ -269,11 +267,11 @@ }, "<\"POST /api/streams/_enable\", Zod.ZodObject<{}, \"strip\", Zod.ZodTypeAny, {}, {}>, ", "StreamsRouteHandlerResources", - ", { acknowledged: true; }, undefined>; }, ", + ", { acknowledged: true; message: string; }, undefined>; }, ", "StreamsRepositoryClientOptions", ">" ], - "path": "x-pack/plugins/streams/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/public/types.ts", "deprecated": false, "trackAdoption": false }, @@ -288,7 +286,7 @@ "Observable", "<{ status: \"unknown\" | \"disabled\" | \"enabled\"; }>" ], - "path": "x-pack/plugins/streams/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/public/types.ts", "deprecated": false, "trackAdoption": false } @@ -308,7 +306,7 @@ "tags": [], "label": "ListStreamResponse", "description": [], - "path": "x-pack/plugins/streams/server/lib/streams/stream_crud.ts", + "path": "x-pack/solutions/observability/plugins/streams/server/lib/streams/stream_crud.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -326,7 +324,7 @@ "Condition", "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }[]" ], - "path": "x-pack/plugins/streams/server/lib/streams/stream_crud.ts", + "path": "x-pack/solutions/observability/plugins/streams/server/lib/streams/stream_crud.ts", "deprecated": false, "trackAdoption": false } @@ -346,7 +344,7 @@ "signature": [ "{}" ], - "path": "x-pack/plugins/streams/common/config.ts", + "path": "x-pack/solutions/observability/plugins/streams/common/config.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -427,9 +425,7 @@ "Condition", "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", - "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }[]; trees: ", - "StreamTree", - "[]; }, undefined>; \"DELETE /api/streams/{id}\": ", + "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }[]; }, undefined>; \"DELETE /api/streams/{id}\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -455,7 +451,7 @@ "Condition", "; }, { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", - "; }>, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; children: Zod.ZodDefault, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; managed: Zod.ZodDefault; children: Zod.ZodDefault, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { children: { id: string; condition?: ", "Condition", - "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[]; }, { children?: { id: string; condition?: ", "Condition", - "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; managed?: boolean | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { path: { id: string; }; body: { children: { id: string; condition?: ", "Condition", - "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[]; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[]; }; }, { path: { id: string; }; body: { children?: { id: string; condition?: ", "Condition", - "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }[] | undefined; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; managed?: boolean | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[] | undefined; }; }>, ", "StreamsRouteHandlerResources", @@ -511,7 +507,7 @@ "Condition", "; }, { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", - "; }>, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; children: Zod.ZodDefault, \"many\">>; fields: Zod.ZodDefault; }, \"strip\", Zod.ZodTypeAny, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }, { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }>, \"many\">>; managed: Zod.ZodDefault; children: Zod.ZodDefault, \"many\">>; }, { id: Zod.ZodString; managed: Zod.ZodDefault; unmanaged_elasticsearch_assets: Zod.ZodOptional; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }>, \"many\">>; }>, \"children\">, \"strip\", Zod.ZodTypeAny, { id: string; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", + "; }>, \"many\">>; }, { id: Zod.ZodString; unmanaged_elasticsearch_assets: Zod.ZodOptional; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }, { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }>, \"many\">>; }>, \"children\">, \"strip\", Zod.ZodTypeAny, { id: string; fields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[]; managed: boolean; processing: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }, { id: string; fields?: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; }[] | undefined; managed?: boolean | undefined; processing?: { config: { type: \"grok\"; field: string; patterns: string[]; pattern_definitions?: Record | undefined; } | { type: \"dissect\"; field: string; pattern: string; }; condition?: ", "Condition", @@ -565,9 +561,9 @@ }, "<\"POST /api/streams/_enable\", Zod.ZodObject<{}, \"strip\", Zod.ZodTypeAny, {}, {}>, ", "StreamsRouteHandlerResources", - ", { acknowledged: true; }, undefined>; }" + ", { acknowledged: true; message: string; }, undefined>; }" ], - "path": "x-pack/plugins/streams/server/routes/index.ts", + "path": "x-pack/solutions/observability/plugins/streams/server/routes/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -581,7 +577,7 @@ "tags": [], "label": "StreamsPluginSetup", "description": [], - "path": "x-pack/plugins/streams/server/plugin.ts", + "path": "x-pack/solutions/observability/plugins/streams/server/plugin.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -595,7 +591,7 @@ "tags": [], "label": "StreamsPluginStart", "description": [], - "path": "x-pack/plugins/streams/server/plugin.ts", + "path": "x-pack/solutions/observability/plugins/streams/server/plugin.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -623,7 +619,7 @@ "Condition", "; }[]; inheritedFields: { type: \"boolean\" | \"ip\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"match_only_text\"; name: string; from: string; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }" ], - "path": "x-pack/plugins/streams/common/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/common/types.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -642,7 +638,7 @@ "Condition", "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }" ], - "path": "x-pack/plugins/streams/common/types.ts", + "path": "x-pack/solutions/observability/plugins/streams/common/types.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/streams.mdx b/api_docs/streams.mdx index c998504b68e13..82987f880ee08 100644 --- a/api_docs/streams.mdx +++ b/api_docs/streams.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/streams title: "streams" image: https://source.unsplash.com/400x175/?github description: API docs for the streams plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'streams'] --- import streamsObj from './streams.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/streams-program-team](https://github.com/orgs/elastic/teams/st | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 13 | 0 | 13 | 4 | +| 13 | 0 | 13 | 3 | ## Client diff --git a/api_docs/streams_app.devdocs.json b/api_docs/streams_app.devdocs.json index 12a4d9b1b7d5a..262c9995a7b55 100644 --- a/api_docs/streams_app.devdocs.json +++ b/api_docs/streams_app.devdocs.json @@ -14,7 +14,7 @@ "tags": [], "label": "StreamsAppPublicSetup", "description": [], - "path": "x-pack/plugins/streams_app/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -28,7 +28,7 @@ "tags": [], "label": "StreamsAppPublicStart", "description": [], - "path": "x-pack/plugins/streams_app/public/types.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/public/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -50,7 +50,7 @@ "tags": [], "label": "StreamsAppServerSetup", "description": [], - "path": "x-pack/plugins/streams_app/server/types.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -64,7 +64,7 @@ "tags": [], "label": "StreamsAppServerStart", "description": [], - "path": "x-pack/plugins/streams_app/server/types.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/server/types.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -83,7 +83,7 @@ "tags": [], "label": "EntityTypeDefinition", "description": [], - "path": "x-pack/plugins/streams_app/common/index.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/common/index.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -94,7 +94,7 @@ "tags": [], "label": "displayName", "description": [], - "path": "x-pack/plugins/streams_app/common/index.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/common/index.ts", "deprecated": false, "trackAdoption": false } @@ -118,7 +118,7 @@ "Condition", "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }; }" ], - "path": "x-pack/plugins/streams_app/common/index.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/common/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -137,7 +137,7 @@ "Condition", "; }[]; unmanaged_elasticsearch_assets?: { id: string; type: \"ingest_pipeline\" | \"data_stream\" | \"index_template\" | \"component_template\"; }[] | undefined; }; }" ], - "path": "x-pack/plugins/streams_app/common/index.ts", + "path": "x-pack/solutions/observability/plugins/streams_app/common/index.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/streams_app.mdx b/api_docs/streams_app.mdx index c33f416e0da40..65da30bb42508 100644 --- a/api_docs/streams_app.mdx +++ b/api_docs/streams_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/streamsApp title: "streamsApp" image: https://source.unsplash.com/400x175/?github description: API docs for the streamsApp plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'streamsApp'] --- import streamsAppObj from './streams_app.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 34fb36b7d6fd0..f534e3a81654c 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 207ac79533832..69cd8dd95de87 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 627e061f33085..6ff285040f802 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 32336fbcf4fd3..aab03f9e5264a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 058f185518266..da7c0075d4130 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index c404e4317d82e..4026e39ceda38 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -3996,47 +3996,47 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/add_data_provider_popover.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/add_data_provider_popover.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/empty.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/components/top_n/index.tsx" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/empty.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/components/top_n/index.tsx" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/providers.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/add_data_provider_popover.tsx" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/providers.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/add_data_provider_popover.tsx" + "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/empty.tsx" + "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/empty.tsx" + "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/providers.tsx" + "path": "x-pack/plugins/security_solution/public/common/components/top_n/index.tsx" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/providers.tsx" + "path": "x-pack/plugins/security_solution/public/common/components/top_n/index.tsx" }, { "plugin": "securitySolution", @@ -4068,19 +4068,19 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/flyout/document_details/right/utils/enriched_field_info.ts" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/utils.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/flyout/document_details/right/utils/enriched_field_info.ts" + "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/utils.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/utils.ts" + "path": "x-pack/plugins/security_solution/public/flyout/document_details/right/utils/enriched_field_info.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/utils.ts" + "path": "x-pack/plugins/security_solution/public/flyout/document_details/right/utils/enriched_field_info.ts" }, { "plugin": "securitySolution", diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index d3c4eb10322de..8b4b9f4d10571 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 47e11b4c27bff..3772d1202eab8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index f6897f079dd4f..1308721958950 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.devdocs.json b/api_docs/ui_actions.devdocs.json index 902cbd0c015da..ec4ba804fb8e2 100644 --- a/api_docs/ui_actions.devdocs.json +++ b/api_docs/ui_actions.devdocs.json @@ -772,26 +772,6 @@ { "plugin": "imageEmbeddable", "path": "src/plugins/image_embeddable/public/components/image_embeddable.tsx" - }, - { - "plugin": "embeddable", - "path": "src/plugins/embeddable/public/tests/helpers.ts" - }, - { - "plugin": "embeddable", - "path": "src/plugins/embeddable/public/tests/container.test.ts" - }, - { - "plugin": "embeddable", - "path": "src/plugins/embeddable/public/tests/container.test.ts" - }, - { - "plugin": "embeddable", - "path": "src/plugins/embeddable/public/tests/container.test.ts" - }, - { - "plugin": "embeddable", - "path": "src/plugins/embeddable/public/tests/explicit_input.test.ts" } ], "children": [ diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index b259a3b7ab81a..5c5935d778868 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 3cadaea195dc2..c9e93bdfab4d8 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 795a362575f0c..79a096e3501af 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 8c934b6a5263e..febe5491252d3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 10bbb6d686cf2..3078eabb39337 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index f6d9d17e126d7..a7e5c58c2a5de 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index dc8ab141643a6..6d2859eb543e6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index e8a3ff383b534..708ada3d2b54a 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 0dae6d29e8b4d..39f15a7b471e0 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 606ada6a8816d..6363397a4e7ae 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; -Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) for questions regarding this plugin. +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index fbaea5e2d110d..56ee8706757f6 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 05e17b746a628..2ad5f3b2a3729 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 91d0b3ba9e2cc..3a21f059145a3 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 51ad1945ad75a..f87568485599f 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 0adee8b9b5585..893a8a6c4e900 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 37fe584a900b1..555c346dc5f91 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index f59f7e828cdd1..a62a4348445d9 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index af2b3adaa3d40..be8aa081b6418 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index a48db75fbdd6e..e1ff5a1bc62ed 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index ec33e813e88bf..b2063e4a4eb55 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 234558c6457ac..9abcdb472edf8 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -6970,7 +6970,7 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; lockHoverActions: (lock: boolean) => void; disableTriggers: boolean; savedObjectId: ", + "; lockHoverActions: (lock: boolean) => void; disableTriggers: boolean; filters$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -6978,7 +6978,15 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; timeRange$: ", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; savedObjectId: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -6986,15 +6994,7 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.TimeRange", - "text": "TimeRange" - }, - " | undefined>; filters$: ", + "; timeRange$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -7007,10 +7007,10 @@ "pluginId": "@kbn/es-query", "scope": "common", "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.TimeRange", + "text": "TimeRange" }, - "[] | undefined>; isCompatibleWithUnifiedSearch: (() => boolean) | undefined; query$: ", + " | undefined>; isCompatibleWithUnifiedSearch: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index a8031263a8f9f..40cca4affd227 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-12-10 +date: 2024-12-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/config/serverless.security.yml b/config/serverless.security.yml index b9190df608540..47a67c293565a 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -10,6 +10,7 @@ xpack.observabilityAIAssistant.enabled: false xpack.search.notebooks.enabled: false xpack.searchPlayground.enabled: false xpack.searchInferenceEndpoints.enabled: false +xpack.inventory.enabled: false ## Fine-tune the security solution feature privileges. Also, refer to `serverless.yml` for the project-agnostic overrides. xpack.features.overrides: diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 3266b5e836b27..c00d47d5515ef 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -28,7 +28,7 @@ allowing users to configure their advanced settings, also known as uiSettings within the code. -|{kib-repo}blob/{branch}/src/plugins/ai_assistant_management/selection/README.md[aiAssistantManagementSelection] +|{kib-repo}blob/{branch}/src/platform/plugins/shared/ai_assistant_management/selection/README.md[aiAssistantManagementSelection] |The aiAssistantManagementSelection plugin manages the Ai Assistant management section. @@ -541,7 +541,7 @@ Plugin server-side only. Plugin has three main functions: |In order to make ongoing maintenance of log collection easy we want to introduce the concept of data set quality, where users can easily get an overview on the data sets they have with information such as integration, size, last activity, among others. -|{kib-repo}blob/{branch}/x-pack/plugins/data_usage/README.md[dataUsage] +|{kib-repo}blob/{branch}/x-pack/platform/plugins/private/data_usage/README.md[dataUsage] |Serverless only plugin for users to view data usage @@ -747,15 +747,15 @@ Elastic. |This plugin provides shared components and services for use across observability solutions, as well as the observability landing page UI. -|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/observability_ai_assistant/README.md[observabilityAIAssistant] +|{kib-repo}blob/{branch}/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/README.md[observabilityAIAssistant] |This document gives an overview of the features of the Observability AI Assistant at the time of writing, and how to use them. At a high level, the Observability AI Assistant offers contextual insights, and a chat functionality that we enrich with function calling, allowing the LLM to hook into the user's data. We also allow the LLM to store things it considers new information as embeddings into Elasticsearch, and query this knowledge base when it decides it needs more information, using ELSER. -|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/observability_ai_assistant_app/README.md[observabilityAIAssistantApp] +|{kib-repo}blob/{branch}/x-pack/solutions/observability/plugins/observability_ai_assistant_app/README.md[observabilityAIAssistantApp] |This app registers defaults functions. It exists as a separate plugin to avoid cyclical dependencies. -|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/observability_ai_assistant_management/README.md[observabilityAiAssistantManagement] +|{kib-repo}blob/{branch}/x-pack/solutions/observability/plugins/observability_ai_assistant_management/README.md[observabilityAiAssistantManagement] |The observabilityAiAssistantManagement plugin manages the Ai Assistant for Observability and Search management section. diff --git a/docs/user/security/audit-logging.asciidoc b/docs/user/security/audit-logging.asciidoc index ef12f4303c1b4..0c5bee6106f01 100644 --- a/docs/user/security/audit-logging.asciidoc +++ b/docs/user/security/audit-logging.asciidoc @@ -151,6 +151,18 @@ Refer to the corresponding {es} logs for potential write errors. .1+| `product_documentation_create` | `unknown` | User requested to install the product documentation for use in AI Assistants. +.2+| `knowledge_base_entry_create` +| `success` | User has created knowledge base entry [id=x] +| `failure` | Failed attempt to create a knowledge base entry + +.2+| `knowledge_base_entry_update` +| `success` | User has updated knowledge base entry [id=x] +| `failure` | Failed attempt to update a knowledge base entry + +.2+| `knowledge_base_entry_delete` +| `success` | User has deleted knowledge base entry [id=x] +| `failure` | Failed attempt to delete a knowledge base entry + 3+a| ====== Type: change diff --git a/kbn_pm/src/commands/watch_command.mjs b/kbn_pm/src/commands/watch_command.mjs index c9e12620d9107..9a98b5c128102 100644 --- a/kbn_pm/src/commands/watch_command.mjs +++ b/kbn_pm/src/commands/watch_command.mjs @@ -27,6 +27,7 @@ export const command = { async run({ args, log }) { await Bazel.watch(log, { offline: args.getBooleanValue('offline') ?? true, + reactVersion: process.env.REACT_18 ? '18' : '17', }); }, }; diff --git a/kbn_pm/src/lib/bazel.mjs b/kbn_pm/src/lib/bazel.mjs index 53a1c87f164c2..f3a0e287cf3fd 100644 --- a/kbn_pm/src/lib/bazel.mjs +++ b/kbn_pm/src/lib/bazel.mjs @@ -83,7 +83,7 @@ async function runBazel(log, inputArgs, opts = undefined) { /** * * @param {import('./log.mjs').Log} log - * @param {{ offline: boolean } | undefined} opts + * @param {{ offline: boolean, reactVersion?: string } | undefined} opts */ export async function watch(log, opts = undefined) { const ibazel = (await getBazelRunner()).runIBazel; @@ -97,10 +97,12 @@ export async function watch(log, opts = undefined) { ...BAZEL_TARGETS, '--show_result=1', ...(opts?.offline ? ['--config=offline'] : []), + `--define=REACT_18=${opts?.reactVersion === '18' ? 'true' : 'false'}`, ]; log.debug(`> ibazel ${args.join(' ')}`); await ibazel(args, { cwd: REPO_ROOT, + env: { ...process.env, REACT_18: opts?.reactVersion === '18' ? 'true' : 'false' }, logPrefix: Color.info('[ibazel]'), onErrorExit(code, output) { throwBazelError(log, 'ibazel', code, output); diff --git a/package.json b/package.json index a5687c0ae3729..ca7c719092f4b 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@kbn/advanced-settings-plugin": "link:src/plugins/advanced_settings", "@kbn/ai-assistant": "link:x-pack/packages/kbn-ai-assistant", "@kbn/ai-assistant-common": "link:x-pack/packages/kbn-ai-assistant-common", - "@kbn/ai-assistant-management-plugin": "link:src/plugins/ai_assistant_management/selection", + "@kbn/ai-assistant-management-plugin": "link:src/platform/plugins/shared/ai_assistant_management/selection", "@kbn/aiops-change-point-detection": "link:x-pack/platform/packages/private/ml/aiops_change_point_detection", "@kbn/aiops-common": "link:x-pack/platform/packages/shared/ml/aiops_common", "@kbn/aiops-components": "link:x-pack/platform/packages/private/ml/aiops_components", @@ -429,7 +429,7 @@ "@kbn/data-search-plugin": "link:test/plugin_functional/plugins/data_search", "@kbn/data-service": "link:packages/kbn-data-service", "@kbn/data-stream-adapter": "link:packages/kbn-data-stream-adapter", - "@kbn/data-usage-plugin": "link:x-pack/plugins/data_usage", + "@kbn/data-usage-plugin": "link:x-pack/platform/plugins/private/data_usage", "@kbn/data-view-editor-plugin": "link:src/plugins/data_view_editor", "@kbn/data-view-field-editor-example-plugin": "link:examples/data_view_field_editor_example", "@kbn/data-view-field-editor-plugin": "link:src/plugins/data_view_field_editor", @@ -463,7 +463,7 @@ "@kbn/doc-links": "link:src/platform/packages/shared/kbn-doc-links", "@kbn/dom-drag-drop": "link:packages/kbn-dom-drag-drop", "@kbn/ebt-tools": "link:packages/kbn-ebt-tools", - "@kbn/ecs-data-quality-dashboard": "link:x-pack/packages/security-solution/ecs_data_quality_dashboard", + "@kbn/ecs-data-quality-dashboard": "link:x-pack/solutions/security/packages/ecs_data_quality_dashboard", "@kbn/ecs-data-quality-dashboard-plugin": "link:x-pack/plugins/ecs_data_quality_dashboard", "@kbn/elastic-agent-utils": "link:packages/kbn-elastic-agent-utils", "@kbn/elastic-assistant": "link:x-pack/packages/kbn-elastic-assistant", @@ -692,9 +692,11 @@ "@kbn/notifications-plugin": "link:x-pack/plugins/notifications", "@kbn/object-versioning": "link:packages/kbn-object-versioning", "@kbn/object-versioning-utils": "link:packages/kbn-object-versioning-utils", - "@kbn/observability-ai-assistant-app-plugin": "link:x-pack/plugins/observability_solution/observability_ai_assistant_app", - "@kbn/observability-ai-assistant-management-plugin": "link:x-pack/plugins/observability_solution/observability_ai_assistant_management", - "@kbn/observability-ai-assistant-plugin": "link:x-pack/plugins/observability_solution/observability_ai_assistant", + "@kbn/observability-ai-assistant-app-plugin": "link:x-pack/solutions/observability/plugins/observability_ai_assistant_app", + "@kbn/observability-ai-assistant-management-plugin": "link:x-pack/solutions/observability/plugins/observability_ai_assistant_management", + "@kbn/observability-ai-assistant-plugin": "link:x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant", + "@kbn/observability-ai-common": "link:x-pack/solutions/observability/packages/observability_ai/observability_ai_common", + "@kbn/observability-ai-server": "link:x-pack/solutions/observability/packages/observability_ai/observability_ai_server", "@kbn/observability-alert-details": "link:x-pack/packages/observability/alert_details", "@kbn/observability-alerting-rule-utils": "link:x-pack/packages/observability/alerting_rule_utils", "@kbn/observability-alerting-test-data": "link:x-pack/packages/observability/alerting_test_data", @@ -716,6 +718,7 @@ "@kbn/osquery-plugin": "link:x-pack/plugins/osquery", "@kbn/paertial-results-example-plugin": "link:examples/partial_results_example", "@kbn/painless-lab-plugin": "link:x-pack/plugins/painless_lab", + "@kbn/palettes": "link:packages/kbn-palettes", "@kbn/panel-loader": "link:packages/kbn-panel-loader", "@kbn/plugin-check": "link:packages/kbn-plugin-check", "@kbn/portable-dashboards-example": "link:examples/portable_dashboards_example", @@ -824,20 +827,20 @@ "@kbn/security-plugin-types-public": "link:x-pack/packages/security/plugin_types_public", "@kbn/security-plugin-types-server": "link:x-pack/packages/security/plugin_types_server", "@kbn/security-role-management-model": "link:x-pack/packages/security/role_management_model", - "@kbn/security-solution-distribution-bar": "link:x-pack/packages/security-solution/distribution_bar", + "@kbn/security-solution-distribution-bar": "link:x-pack/solutions/security/packages/distribution_bar", "@kbn/security-solution-ess": "link:x-pack/plugins/security_solution_ess", - "@kbn/security-solution-features": "link:x-pack/packages/security-solution/features", + "@kbn/security-solution-features": "link:x-pack/solutions/security/packages/features", "@kbn/security-solution-fixtures-plugin": "link:x-pack/test/cases_api_integration/common/plugins/security_solution", - "@kbn/security-solution-navigation": "link:x-pack/packages/security-solution/navigation", + "@kbn/security-solution-navigation": "link:x-pack/solutions/security/packages/navigation", "@kbn/security-solution-plugin": "link:x-pack/plugins/security_solution", "@kbn/security-solution-serverless": "link:x-pack/plugins/security_solution_serverless", - "@kbn/security-solution-side-nav": "link:x-pack/packages/security-solution/side_nav", - "@kbn/security-solution-storybook-config": "link:x-pack/packages/security-solution/storybook/config", - "@kbn/security-solution-upselling": "link:x-pack/packages/security-solution/upselling", + "@kbn/security-solution-side-nav": "link:x-pack/solutions/security/packages/side_nav", + "@kbn/security-solution-storybook-config": "link:x-pack/solutions/security/packages/storybook/config", + "@kbn/security-solution-upselling": "link:x-pack/solutions/security/packages/upselling", "@kbn/security-test-endpoints-plugin": "link:x-pack/test/security_functional/plugins/test_endpoints", "@kbn/security-ui-components": "link:x-pack/packages/security/ui_components", "@kbn/securitysolution-autocomplete": "link:packages/kbn-securitysolution-autocomplete", - "@kbn/securitysolution-data-table": "link:x-pack/packages/security-solution/data_table", + "@kbn/securitysolution-data-table": "link:x-pack/solutions/security/packages/data_table", "@kbn/securitysolution-ecs": "link:packages/kbn-securitysolution-ecs", "@kbn/securitysolution-endpoint-exceptions-common": "link:packages/kbn-securitysolution-endpoint-exceptions-common", "@kbn/securitysolution-es-utils": "link:packages/kbn-securitysolution-es-utils", @@ -1130,7 +1133,7 @@ "del": "^6.1.0", "diff": "^5.1.0", "dotenv": "^16.4.5", - "elastic-apm-node": "^4.8.1", + "elastic-apm-node": "^4.9.0", "email-addresses": "^5.0.0", "eventsource-parser": "^3.0.0", "execa": "^5.1.1", @@ -1145,6 +1148,7 @@ "fnv-plus": "^1.3.1", "formik": "^2.4.6", "fp-ts": "^2.3.1", + "fuse.js": "^7.0.0", "get-port": "^5.0.0", "getopts": "^2.2.5", "getos": "^3.1.0", @@ -1168,7 +1172,7 @@ "joi-to-json": "^4.3.0", "jquery": "^3.5.0", "js-search": "^1.4.3", - "js-sha256": "^0.9.0", + "js-sha256": "^0.11.0", "js-yaml": "^4.1.0", "json-schema-to-ts": "^2.9.1", "json-stable-stringify": "^1.0.1", @@ -1487,6 +1491,7 @@ "@kbn/plugin-generator": "link:packages/kbn-plugin-generator", "@kbn/plugin-helpers": "link:packages/kbn-plugin-helpers", "@kbn/product-doc-artifact-builder": "link:x-pack/packages/ai-infra/product-doc-artifact-builder", + "@kbn/relocate": "link:packages/kbn-relocate", "@kbn/repo-file-maps": "link:packages/kbn-repo-file-maps", "@kbn/repo-linter": "link:packages/kbn-repo-linter", "@kbn/repo-path": "link:packages/kbn-repo-path", @@ -1613,7 +1618,7 @@ "@types/mime": "^2.0.1", "@types/mime-types": "^2.1.0", "@types/minimatch": "^2.0.29", - "@types/minimist": "^1.2.2", + "@types/minimist": "^1.2.5", "@types/mock-fs": "^4.13.1", "@types/moment-duration-format": "^2.2.3", "@types/multistream": "^4.1.0", @@ -1785,7 +1790,7 @@ "micromatch": "^4.0.8", "mini-css-extract-plugin": "1.1.0", "minimist": "^1.2.6", - "mocha": "^10.1.0", + "mocha": "^10.3.0", "mocha-junit-reporter": "^2.0.2", "mocha-multi-reporters": "^1.5.1", "mochawesome": "^7.1.3", @@ -1842,7 +1847,7 @@ "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", "table": "^6.8.2", - "tape": "^5.0.1", + "tape": "^5.9.0", "terser": "^5.36.0", "terser-webpack-plugin": "^4.2.3", "tough-cookie": "^5.0.0", diff --git a/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap b/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap index 9df54435ba9a0..192c892b0128f 100644 --- a/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap +++ b/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap @@ -160,7 +160,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -280,7 +293,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, diff --git a/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap b/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap index cc2dc671f9210..c0e94fc9fb2d6 100644 --- a/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap +++ b/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap @@ -102,7 +102,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -380,7 +393,28 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -715,7 +749,36 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + Array [], + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -969,7 +1032,36 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + Array [], + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -1228,7 +1320,36 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + Array [], + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -1482,7 +1603,36 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + Array [], + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -1696,7 +1846,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -1816,7 +1979,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -1941,7 +2117,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, @@ -2061,7 +2250,20 @@ Array [ } theme={ Object { - "getTheme": [MockFunction], + "getTheme": [MockFunction] { + "calls": Array [ + Array [], + ], + "results": Array [ + Object { + "type": "return", + "value": Object { + "darkMode": false, + "name": "amsterdam", + }, + }, + ], + }, "theme$": Observable { "_subscribe": [Function], }, diff --git a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts index 8fa7a5997f4f7..e4e382860767d 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts @@ -83,6 +83,7 @@ export type LogDocument = Fields & 'kubernetes.pod.name'?: string; 'kubernetes.container.name'?: string; 'orchestrator.resource.name'?: string; + tags?: string | string[]; }>; class Log extends Serializable { diff --git a/packages/kbn-babel-preset/styled_components_files.js b/packages/kbn-babel-preset/styled_components_files.js index 89b71c06d9e84..20bbaa3172cba 100644 --- a/packages/kbn-babel-preset/styled_components_files.js +++ b/packages/kbn-babel-preset/styled_components_files.js @@ -18,6 +18,6 @@ module.exports = { /x-pack[\/\\]plugins[\/\\](observability_solution\/apm|beats_management|fleet|observability_solution\/infra|lists|observability_solution\/observability|observability_solution\/observability_shared|observability_solution\/exploratory_view|security_solution|timelines|observability_solution\/synthetics|observability_solution\/ux|observability_solution\/uptime)[\/\\]/, /x-pack[\/\\]test[\/\\]plugin_functional[\/\\]plugins[\/\\]resolver_test[\/\\]/, /x-pack[\/\\]packages[\/\\]elastic_assistant[\/\\]/, - /x-pack[\/\\]packages[\/\\]security-solution[\/\\]ecs_data_quality_dashboard[\/\\]/, + /x-pack[\/\\]solutions[\/\\]security[\/\\]packages[\/\\]ecs_data_quality_dashboard[\/\\]/, ], }; diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 45313933ab1b4..75601611ad3d4 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -3,7 +3,9 @@ "actionTypeId", "name" ], - "action_task_params": [], + "action_task_params": [ + "apiKeyId" + ], "ad_hoc_run_params": [ "apiKeyId", "createdAt", @@ -1098,6 +1100,7 @@ "enabled", "ownerId", "partition", + "priority", "retryAt", "runAt", "schedule", diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 663fef8f4fef1..37263aa85e1ab 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -17,7 +17,11 @@ }, "action_task_params": { "dynamic": false, - "properties": {} + "properties": { + "apiKeyId": { + "type": "keyword" + } + } }, "ad_hoc_run_params": { "dynamic": false, @@ -3630,6 +3634,9 @@ "partition": { "type": "integer" }, + "priority": { + "type": "integer" + }, "retryAt": { "type": "date" }, diff --git a/packages/kbn-coloring/src/palettes/types.ts b/packages/kbn-coloring/src/palettes/types.ts index b5e81a437f6da..5a43c65097960 100644 --- a/packages/kbn-coloring/src/palettes/types.ts +++ b/packages/kbn-coloring/src/palettes/types.ts @@ -140,7 +140,9 @@ export interface CustomPaletteParams { progression?: 'fixed'; rangeMin?: number; rangeMax?: number; + /** lower color stops */ stops?: ColorStop[]; + /** upper color stops */ colorStops?: ColorStop[]; steps?: number; maxSteps?: number | undefined; diff --git a/packages/kbn-coloring/src/palettes/utils.test.ts b/packages/kbn-coloring/src/palettes/utils.test.ts index 8292c7440063e..e7595a738bf11 100644 --- a/packages/kbn-coloring/src/palettes/utils.test.ts +++ b/packages/kbn-coloring/src/palettes/utils.test.ts @@ -9,6 +9,7 @@ import { getPaletteRegistry } from './mocks/palettes_registry'; import { + applyPaletteParams, getDataMinMax, getPaletteStops, getStepValue, @@ -312,3 +313,43 @@ describe('getStepValue', () => { ).toBe(1); }); }); + +describe('applyPaletteParams', () => { + const paletteRegistry = getPaletteRegistry(); + it('should return a palette stops array only by the name', () => { + expect( + applyPaletteParams( + paletteRegistry, + { name: 'default', type: 'palette', params: { name: 'default' } }, + { min: 0, max: 100 } + ) + ).toEqual([ + // stops are 0 and 50 by with a 20 offset (100 divided by 5 steps) for display + // the mock palette service has only 2 colors so tests are a bit off by that + { color: 'red', stop: 20 }, + { color: 'black', stop: 70 }, + ]); + }); + + it('should return a palette stops array reversed', () => { + expect( + applyPaletteParams( + paletteRegistry, + { name: 'default', type: 'palette', params: { name: 'default', reverse: true } }, + { min: 0, max: 100 } + ) + ).toEqual([ + { color: 'black', stop: 20 }, + { color: 'red', stop: 70 }, + ]); + }); + + it('should pick the default palette from the activePalette object when passed', () => { + expect( + applyPaletteParams(paletteRegistry, { name: 'mocked', type: 'palette' }, { min: 0, max: 100 }) + ).toEqual([ + { color: 'blue', stop: 20 }, + { color: 'yellow', stop: 70 }, + ]); + }); +}); diff --git a/packages/kbn-coloring/src/palettes/utils.ts b/packages/kbn-coloring/src/palettes/utils.ts index c10ef98f825af..a4a3c24f6a797 100644 --- a/packages/kbn-coloring/src/palettes/utils.ts +++ b/packages/kbn-coloring/src/palettes/utils.ts @@ -13,6 +13,7 @@ import { CustomPaletteParams, DataBounds, ColorStop, + PaletteOutput, } from './types'; import { @@ -20,9 +21,10 @@ import { DEFAULT_PALETTE_NAME, DEFAULT_MAX_STOP, DEFAULT_MIN_STOP, + CUSTOM_PALETTE, + COMPLEMENTARY_PALETTE, DEFAULT_FALLBACK_PALETTE, LEGACY_COMPLIMENTARY_PALETTE, - COMPLEMENTARY_PALETTE, } from './constants'; /** @internal **/ @@ -204,3 +206,46 @@ export function getActivePaletteName(name?: string): string { } return paletteName; } + +export function applyPaletteParams>( + palettes: PaletteRegistry, + activePalette: T, + dataBounds: DataBounds +) { + // make a copy of it as they have to be manipulated later on + const displayStops = getPaletteStops(palettes, activePalette?.params || {}, { + dataBounds, + defaultPaletteName: activePalette?.name, + }); + + if (activePalette?.params?.reverse && activePalette?.params?.name !== CUSTOM_PALETTE) { + return reversePalette(displayStops); + } + return displayStops; +} + +/** + * Returns color stops for given palette type: + * + * - custom - User has modified the stops in some way - return stops as is + * - non-custom - Default palette stops - Return new stops based on palette + * + * > This is needed for BWC when switching between kibana themes. + */ +export function getOverridePaletteStops>( + paletteService: PaletteRegistry, + activePalette?: T +) { + if (!activePalette || activePalette.name === CUSTOM_PALETTE || !activePalette.params?.stops) { + return activePalette?.params?.stops; + } + + const { stops, ...otherParams } = activePalette.params; + const colors = paletteService + .get(activePalette.name ?? DEFAULT_PALETTE_NAME) + .getCategoricalColors(stops.length, otherParams); + return stops.map((stop, i) => ({ + ...stop, + color: colors[i], + })); +} diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/__stories__/color_mapping.stories.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/__stories__/color_mapping.stories.tsx index 3eebf74205a07..3ebc8064987b4 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/__stories__/color_mapping.stories.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/__stories__/color_mapping.stories.tsx @@ -8,11 +8,11 @@ */ import React, { FC, useState } from 'react'; +import { getKbnPalettes } from '@kbn/palettes'; import { EuiFlyout, EuiForm, EuiPage, isColorDark } from '@elastic/eui'; import { ComponentStory } from '@storybook/react'; import { css } from '@emotion/react'; import { CategoricalColorMapping, ColorMappingProps } from '../categorical_color_mapping'; -import { AVAILABLE_PALETTES, getPalette, NeutralPalette } from '../palettes'; import { DEFAULT_COLOR_MAPPING_CONFIG } from '../config/default_color_mapping'; import { ColorMapping } from '../config'; import { getColorFactory } from '../color/color_handling'; @@ -30,9 +30,8 @@ const Template: ComponentStory> = (args) => { DEFAULT_COLOR_MAPPING_CONFIG ); - const getPaletteFn = getPalette(AVAILABLE_PALETTES, NeutralPalette); - - const colorFactory = getColorFactory(updatedModel, getPaletteFn, false, args.data); + const palettes = getKbnPalettes({ name: 'amsterdam', darkMode: false }); + const colorFactory = getColorFactory(updatedModel, palettes, false, args.data); return ( @@ -71,7 +70,7 @@ const Template: ComponentStory> = (args) => { ownFocus={false} > - + @@ -82,6 +81,7 @@ export const Default = Template.bind({}); Default.args = { model: { ...DEFAULT_COLOR_MAPPING_CONFIG, + paletteId: 'eui_amsterdam', colorMode: { type: 'categorical', @@ -119,7 +119,6 @@ Default.args = { ], }, - palettes: AVAILABLE_PALETTES, specialTokens: new Map(), // eslint-disable-next-line no-console onModelUpdate: (model) => console.log(model), diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.test.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.test.tsx index dd7b12305fdad..530f16f912d0d 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.test.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.test.tsx @@ -10,9 +10,9 @@ import React from 'react'; import { mount } from 'enzyme'; import { CategoricalColorMapping, ColorMappingInputData } from './categorical_color_mapping'; -import { AVAILABLE_PALETTES } from './palettes'; import { DEFAULT_COLOR_MAPPING_CONFIG } from './config/default_color_mapping'; import { MULTI_FIELD_KEY_SEPARATOR } from '@kbn/data-plugin/common'; +import { getKbnPalettes } from '@kbn/palettes'; const ASSIGNMENTS_LIST = '[data-test-subj="lns-colorMapping-assignmentsList"]'; const ASSIGNMENTS_PROMPT = '[data-test-subj="lns-colorMapping-assignmentsPrompt"]'; @@ -20,6 +20,8 @@ const ASSIGNMENTS_PROMPT_ADD_ALL = '[data-test-subj="lns-colorMapping-assignment const ASSIGNMENT_ITEM = (i: number) => `[data-test-subj="lns-colorMapping-assignmentsItem${i}"]`; describe('color mapping', () => { + const palettes = getKbnPalettes({ name: 'amsterdam', darkMode: false }); + it('load a default color mapping', () => { const dataInput: ColorMappingInputData = { type: 'categories', @@ -31,7 +33,7 @@ describe('color mapping', () => { data={dataInput} isDarkMode={false} model={{ ...DEFAULT_COLOR_MAPPING_CONFIG }} - palettes={AVAILABLE_PALETTES} + palettes={palettes} onModelUpdate={onModelUpdateFn} specialTokens={new Map()} /> @@ -53,7 +55,7 @@ describe('color mapping', () => { data={dataInput} isDarkMode={false} model={{ ...DEFAULT_COLOR_MAPPING_CONFIG }} - palettes={AVAILABLE_PALETTES} + palettes={palettes} onModelUpdate={onModelUpdateFn} specialTokens={new Map()} /> @@ -81,7 +83,7 @@ describe('color mapping', () => { data={dataInput} isDarkMode={false} model={{ ...DEFAULT_COLOR_MAPPING_CONFIG }} - palettes={AVAILABLE_PALETTES} + palettes={palettes} onModelUpdate={onModelUpdateFn} specialTokens={ new Map([ diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.tsx index 668cdc7ce07fd..8bd006ba9c663 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.tsx @@ -11,6 +11,7 @@ import React from 'react'; import { Provider } from 'react-redux'; import { type EnhancedStore, configureStore } from '@reduxjs/toolkit'; import { isEqual } from 'lodash'; +import { KbnPalettes } from '@kbn/palettes'; import { colorMappingReducer, updateModel } from './state/color_mapping'; import { Container } from './components/container/container'; import { ColorMapping } from './config'; @@ -43,8 +44,8 @@ export type ColorMappingInputData = export interface ColorMappingProps { /** The initial color mapping model, usually coming from a the visualization saved object */ model: ColorMapping.Config; - /** A map of paletteId and palette configuration */ - palettes: Map; + /** A collection of palette configurations */ + palettes: KbnPalettes; /** A data description of what needs to be colored */ data: ColorMappingInputData; /** Theme dark mode */ diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.test.ts b/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.test.ts index 627f39e5026ac..c97100781e005 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.test.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.test.ts @@ -12,64 +12,52 @@ import { DEFAULT_NEUTRAL_PALETTE_INDEX, } from '../config/default_color_mapping'; import { getColorFactory } from './color_handling'; -import { getPalette, AVAILABLE_PALETTES } from '../palettes'; -import { - EUIAmsterdamColorBlindPalette, - EUI_AMSTERDAM_PALETTE_COLORS, -} from '../palettes/eui_amsterdam'; -import { NeutralPalette, NEUTRAL_COLOR_DARK, NEUTRAL_COLOR_LIGHT } from '../palettes/neutral'; import { toHex } from './color_math'; -import { ColorMapping } from '../config'; +import { KbnPalette, getKbnPalettes } from '@kbn/palettes'; describe('Color mapping - color generation', () => { - const getPaletteFn = getPalette(AVAILABLE_PALETTES, NeutralPalette); + const palettes = getKbnPalettes({ name: 'amsterdam', darkMode: false }); + const neutralPaletteColors = palettes + .get(KbnPalette.Neutral) + .colors() + .map((c) => c.toLowerCase()); + const elasticPaletteColors = palettes + .get(KbnPalette.Default) + .colors() + .map((c) => c.toLowerCase()); it('returns EUI light colors from default config', () => { - const colorFactory = getColorFactory(DEFAULT_COLOR_MAPPING_CONFIG, getPaletteFn, false, { + const colorFactory = getColorFactory(DEFAULT_COLOR_MAPPING_CONFIG, palettes, false, { type: 'categories', categories: ['catA', 'catB', 'catC'], }); - expect(colorFactory('catA')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[0]); - expect(colorFactory('catB')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[1]); - expect(colorFactory('catC')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[2]); + expect(colorFactory('catA')).toBe(elasticPaletteColors[0]); + expect(colorFactory('catB')).toBe(elasticPaletteColors[1]); + expect(colorFactory('catC')).toBe(elasticPaletteColors[2]); // if the category is not available in the `categories` list then a default netural is used // this is an edge case and ideally never happen expect(colorFactory('not_available_1')).toBe( - NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX] + neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX] ); }); // currently there is no difference in the two colors, but this could change in the future // this test will catch the change it('returns EUI dark colors from default config', () => { - const colorFactory = getColorFactory(DEFAULT_COLOR_MAPPING_CONFIG, getPaletteFn, true, { + const colorFactory = getColorFactory(DEFAULT_COLOR_MAPPING_CONFIG, palettes, true, { type: 'categories', categories: ['catA', 'catB', 'catC'], }); - expect(colorFactory('catA')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[0]); - expect(colorFactory('catB')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[1]); - expect(colorFactory('catC')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[2]); + expect(colorFactory('catA')).toBe(elasticPaletteColors[0]); + expect(colorFactory('catB')).toBe(elasticPaletteColors[1]); + expect(colorFactory('catC')).toBe(elasticPaletteColors[2]); // if the category is not available in the `categories` list then a default netural is used // this is an edge case and ideally never happen - expect(colorFactory('not_available')).toBe(NEUTRAL_COLOR_DARK[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('not_available')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); }); it('by default loops colors defined in palette', () => { - const twoColorPalette: ColorMapping.CategoricalPalette = { - id: 'twoColors', - name: 'twoColors', - colorCount: 2, - type: 'categorical', - getColor(indexInRange, isDarkMode, loop) { - return ['red', 'blue'][loop ? indexInRange % 2 : indexInRange]; - }, - }; - - const simplifiedGetPaletteGn = getPalette( - new Map([[twoColorPalette.id, twoColorPalette]]), - NeutralPalette - ); const colorFactory = getColorFactory( { ...DEFAULT_COLOR_MAPPING_CONFIG, @@ -84,37 +72,26 @@ describe('Color mapping - color generation', () => { touched: false, }, ], - paletteId: twoColorPalette.id, + paletteId: KbnPalette.Neutral, }, - simplifiedGetPaletteGn, + palettes, false, { type: 'categories', - categories: ['cat1', 'cat2', 'cat3', 'cat4'], + categories: ['cat1', 'cat2', 'cat3', 'cat4', 'cat5', 'cat6', 'cat7'], } ); - expect(colorFactory('cat1')).toBe('#ff0000'); - expect(colorFactory('cat2')).toBe('#0000ff'); + expect(colorFactory('cat1')).toBe(neutralPaletteColors[0]); + expect(colorFactory('cat2')).toBe(neutralPaletteColors[1]); + expect(colorFactory('cat3')).toBe(neutralPaletteColors[2]); + expect(colorFactory('cat4')).toBe(neutralPaletteColors[3]); + expect(colorFactory('cat5')).toBe(neutralPaletteColors[4]); // the palette will loop depending on the number of colors available - expect(colorFactory('cat3')).toBe('#ff0000'); - expect(colorFactory('cat4')).toBe('#0000ff'); + expect(colorFactory('cat6')).toBe(neutralPaletteColors[0]); + expect(colorFactory('cat7')).toBe(neutralPaletteColors[1]); }); it('returns the unassigned color if configured statically', () => { - const twoColorPalette: ColorMapping.CategoricalPalette = { - id: 'twoColors', - name: 'twoColors', - colorCount: 2, - type: 'categorical', - getColor(indexInRange, darkMode, loop) { - return ['red', 'blue'][loop ? indexInRange % 2 : indexInRange]; - }, - }; - - const simplifiedGetPaletteGn = getPalette( - new Map([[twoColorPalette.id, twoColorPalette]]), - NeutralPalette - ); const colorFactory = getColorFactory( { ...DEFAULT_COLOR_MAPPING_CONFIG, @@ -122,7 +99,7 @@ describe('Color mapping - color generation', () => { { color: { type: 'categorical', - paletteId: NeutralPalette.id, + paletteId: KbnPalette.Neutral, colorIndex: DEFAULT_NEUTRAL_PALETTE_INDEX, }, rule: { @@ -131,33 +108,32 @@ describe('Color mapping - color generation', () => { touched: false, }, ], - paletteId: twoColorPalette.id, }, - simplifiedGetPaletteGn, + palettes, false, { type: 'categories', categories: ['cat1', 'cat2', 'cat3', 'cat4'], } ); - expect(colorFactory('cat1')).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); - expect(colorFactory('cat2')).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); - expect(colorFactory('cat3')).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); - expect(colorFactory('cat4')).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('cat1')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('cat2')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('cat3')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('cat4')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); // if the category is not available in the `categories` list then a default netural is used // this is an edge case and ideally never happen - expect(colorFactory('not_available')).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('not_available')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); }); it('handles special tokens, multi-field categories and non-trimmed whitespaces', () => { - const colorFactory = getColorFactory(DEFAULT_COLOR_MAPPING_CONFIG, getPaletteFn, false, { + const colorFactory = getColorFactory(DEFAULT_COLOR_MAPPING_CONFIG, palettes, false, { type: 'categories', categories: ['__other__', ['fieldA', 'fieldB'], '__empty__', ' with-whitespaces '], }); - expect(colorFactory('__other__')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[0]); - // expect(colorFactory(['fieldA', 'fieldB'])).toBe(EUI_AMSTERDAM_PALETTE_COLORS[1]); - expect(colorFactory('__empty__')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[2]); - expect(colorFactory(' with-whitespaces ')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[3]); + expect(colorFactory('__other__')).toBe(elasticPaletteColors[0]); + // expect(colorFactory(['fieldA', 'fieldB'])).toBe(elasticPaletteColors[1]); + expect(colorFactory('__empty__')).toBe(elasticPaletteColors[2]); + expect(colorFactory(' with-whitespaces ')).toBe(elasticPaletteColors[3]); }); it('ignores configured assignments in loop mode', () => { @@ -172,17 +148,17 @@ describe('Color mapping - color generation', () => { }, ], }, - getPaletteFn, + palettes, false, { type: 'categories', categories: ['catA', 'catB', 'configuredAssignment', 'nextCat'], } ); - expect(colorFactory('catA')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[0]); - expect(colorFactory('catB')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[1]); + expect(colorFactory('catA')).toBe(elasticPaletteColors[0]); + expect(colorFactory('catB')).toBe(elasticPaletteColors[1]); expect(colorFactory('configuredAssignment')).toBe('red'); - expect(colorFactory('nextCat')).toBe(EUI_AMSTERDAM_PALETTE_COLORS[2]); + expect(colorFactory('nextCat')).toBe(elasticPaletteColors[2]); }); it('color with auto rule are assigned in order of the configured data input', () => { @@ -207,7 +183,7 @@ describe('Color mapping - color generation', () => { }, ], }, - getPaletteFn, + palettes, false, { type: 'categories', @@ -222,7 +198,7 @@ describe('Color mapping - color generation', () => { expect(colorFactory('greenCat')).toBe('green'); // if the category is not available in the `categories` list then a default netural is used // this is an edge case and ideally never happen - expect(colorFactory('not_available')).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('not_available')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); }); it('returns sequential gradient colors from darker to lighter [desc, lightMode]', () => { @@ -234,7 +210,7 @@ describe('Color mapping - color generation', () => { steps: [ { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 0, touched: false, }, @@ -242,7 +218,7 @@ describe('Color mapping - color generation', () => { sort: 'desc', }, }, - getPaletteFn, + palettes, false, { type: 'categories', @@ -250,7 +226,7 @@ describe('Color mapping - color generation', () => { } ); // this matches exactly with the initial step selected - expect(toHex(colorFactory('cat1'))).toBe(toHex(EUI_AMSTERDAM_PALETTE_COLORS[0])); + expect(toHex(colorFactory('cat1'))).toBe(toHex(elasticPaletteColors[0])); expect(toHex(colorFactory('cat2'))).toBe('#93cebc'); expect(toHex(colorFactory('cat3'))).toBe('#cce8e0'); }); @@ -264,7 +240,7 @@ describe('Color mapping - color generation', () => { steps: [ { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 0, touched: false, }, @@ -272,7 +248,7 @@ describe('Color mapping - color generation', () => { sort: 'asc', }, }, - getPaletteFn, + palettes, false, { type: 'categories', @@ -284,7 +260,7 @@ describe('Color mapping - color generation', () => { // mid green point expect(toHex(colorFactory('cat2'))).toBe('#93cebc'); // initial gradient color - expect(toHex(colorFactory('cat3'))).toBe(EUI_AMSTERDAM_PALETTE_COLORS[0]); + expect(toHex(colorFactory('cat3'))).toBe(elasticPaletteColors[0]); }); it('sequential gradients and static color from lighter to darker [asc, lightMode]', () => { const colorFactory = getColorFactory( @@ -300,7 +276,7 @@ describe('Color mapping - color generation', () => { steps: [ { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 0, touched: false, }, @@ -312,7 +288,7 @@ describe('Color mapping - color generation', () => { color: { type: 'categorical', colorIndex: DEFAULT_NEUTRAL_PALETTE_INDEX, - paletteId: NeutralPalette.id, + paletteId: KbnPalette.Neutral, }, rule: { type: 'other', @@ -321,7 +297,7 @@ describe('Color mapping - color generation', () => { }, ], }, - getPaletteFn, + palettes, false, { type: 'categories', @@ -329,9 +305,9 @@ describe('Color mapping - color generation', () => { } ); expect(toHex(colorFactory('cat1'))).toBe('#cce8e0'); - expect(toHex(colorFactory('cat2'))).toBe(EUI_AMSTERDAM_PALETTE_COLORS[0]); + expect(toHex(colorFactory('cat2'))).toBe(elasticPaletteColors[0]); // this matches exactly with the initial step selected - expect(toHex(colorFactory('cat3'))).toBe(NEUTRAL_COLOR_LIGHT[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(toHex(colorFactory('cat3'))).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); }); it('returns 2 colors gradient [desc, lightMode]', () => { @@ -343,13 +319,13 @@ describe('Color mapping - color generation', () => { steps: [ { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 0, touched: false, }, { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 2, touched: false, }, @@ -357,16 +333,16 @@ describe('Color mapping - color generation', () => { sort: 'desc', }, }, - getPaletteFn, + palettes, false, { type: 'categories', categories: ['cat1', 'cat2', 'cat3'], } ); - expect(toHex(colorFactory('cat1'))).toBe(toHex(EUI_AMSTERDAM_PALETTE_COLORS[0])); // EUI green - expect(toHex(colorFactory('cat2'))).toBe('#a4908f'); // red gray green - expect(toHex(colorFactory('cat3'))).toBe(toHex(EUI_AMSTERDAM_PALETTE_COLORS[2])); // EUI pink + expect(toHex(colorFactory('cat1'))).toBe(toHex(elasticPaletteColors[0])); + expect(toHex(colorFactory('cat2'))).toBe('#a4908f'); + expect(toHex(colorFactory('cat3'))).toBe(toHex(elasticPaletteColors[2])); }); it('returns divergent gradient [asc, darkMode]', () => { @@ -378,14 +354,14 @@ describe('Color mapping - color generation', () => { steps: [ { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 0, touched: false, }, - { type: 'categorical', paletteId: NeutralPalette.id, colorIndex: 0, touched: false }, + { type: 'categorical', paletteId: KbnPalette.Neutral, colorIndex: 0, touched: false }, { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Default, colorIndex: 2, touched: false, }, @@ -393,18 +369,18 @@ describe('Color mapping - color generation', () => { sort: 'asc', // testing in ascending order }, }, - getPaletteFn, + palettes, true, // testing in dark mode { type: 'categories', categories: ['cat1', 'cat2', 'cat3'], } ); - expect(toHex(colorFactory('cat1'))).toBe(toHex(EUI_AMSTERDAM_PALETTE_COLORS[2])); // EUI pink - expect(toHex(colorFactory('cat2'))).toBe(NEUTRAL_COLOR_DARK[0]); // NEUTRAL LIGHT GRAY - expect(toHex(colorFactory('cat3'))).toBe(toHex(EUI_AMSTERDAM_PALETTE_COLORS[0])); // EUI green - // if the category is not available in the `categories` list then a default netural is used + expect(toHex(colorFactory('cat1'))).toBe(toHex(elasticPaletteColors[2])); + expect(toHex(colorFactory('cat2'))).toBe(neutralPaletteColors[0]); + expect(toHex(colorFactory('cat3'))).toBe(toHex(elasticPaletteColors[0])); + // if the category is not available in the `categories` list then a default neutral is used // this is an edge case and ideally never happen - expect(colorFactory('not_available')).toBe(NEUTRAL_COLOR_DARK[DEFAULT_NEUTRAL_PALETTE_INDEX]); + expect(colorFactory('not_available')).toBe(neutralPaletteColors[DEFAULT_NEUTRAL_PALETTE_INDEX]); }); }); diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts b/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts index 373e56e3cb8f6..0031ac81908c0 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/color/color_handling.ts @@ -9,9 +9,9 @@ import chroma from 'chroma-js'; import { findLast } from 'lodash'; +import { KbnPalette, KbnPalettes } from '@kbn/palettes'; import { ColorMapping } from '../config'; import { changeAlpha, combineColors, getValidColor } from './color_math'; -import { getPalette, NeutralPalette } from '../palettes'; import { ColorMappingInputData } from '../categorical_color_mapping'; import { ruleMatch } from './rule_matching'; import { GradientColorMode } from '../config/types'; @@ -25,7 +25,7 @@ export function getAssignmentColor( color: | ColorMapping.Config['assignments'][number]['color'] | (ColorMapping.LoopColor & { paletteId: string; colorIndex: number }), - getPaletteFn: ReturnType, + palettes: KbnPalettes, isDarkMode: boolean, index: number, total: number @@ -34,12 +34,12 @@ export function getAssignmentColor( case 'colorCode': case 'categorical': case 'loop': - return getColor(color, getPaletteFn, isDarkMode); + return getColor(color, palettes); case 'gradient': { if (colorMode.type === 'categorical') { return 'red'; } - const colorScale = getGradientColorScale(colorMode, getPaletteFn, isDarkMode); + const colorScale = getGradientColorScale(colorMode, palettes, isDarkMode); return total === 0 ? 'red' : total === 1 ? colorScale(0) : colorScale(index / (total - 1)); } } @@ -50,19 +50,16 @@ export function getColor( | ColorMapping.ColorCode | ColorMapping.CategoricalColor | (ColorMapping.LoopColor & { paletteId: string; colorIndex: number }), - getPaletteFn: ReturnType, - isDarkMode: boolean + palettes: KbnPalettes ): string { return color.type === 'colorCode' ? color.colorCode - : getValidColor( - getPaletteFn(color.paletteId).getColor(color.colorIndex, isDarkMode, true) - ).hex(); + : getValidColor(palettes.get(color.paletteId).getColor(color.colorIndex)).hex(); } export function getColorFactory( { assignments, specialAssignments, colorMode, paletteId }: ColorMapping.Config, - getPaletteFn: ReturnType, + palettes: KbnPalettes, isDarkMode: boolean, data: ColorMappingInputData ): (category: string | string[]) => string { @@ -104,7 +101,7 @@ export function getColorFactory( return getAssignmentColor( colorMode, autoByOrderAssignments[nonAssignedCategoryIndex].color, - getPaletteFn, + palettes, isDarkMode, autoAssignmentIndex, assignments.length @@ -129,7 +126,7 @@ export function getColorFactory( paletteId, } : specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX].color, - getPaletteFn, + palettes, isDarkMode, indexIfGradient, totalColorsIfGradient @@ -146,7 +143,7 @@ export function getColorFactory( return getAssignmentColor( colorMode, assignment.color, - getPaletteFn, + palettes, isDarkMode, matchingAssignmentIndex, assignments.length @@ -155,30 +152,29 @@ export function getColorFactory( return getColor( { type: 'categorical', - paletteId: NeutralPalette.id, + paletteId: KbnPalette.Neutral, colorIndex: DEFAULT_NEUTRAL_PALETTE_INDEX, }, - getPaletteFn, - isDarkMode + palettes ); }; } export function getGradientColorScale( colorMode: GradientColorMode, - getPaletteFn: ReturnType, + palettes: KbnPalettes, isDarkMode: boolean ): (value: number) => string { const steps = colorMode.steps.length === 1 ? [ - getColor(colorMode.steps[0], getPaletteFn, isDarkMode), + getColor(colorMode.steps[0], palettes), combineColors( - changeAlpha(getColor(colorMode.steps[0], getPaletteFn, isDarkMode), 0.3), + changeAlpha(getColor(colorMode.steps[0], palettes), 0.3), isDarkMode ? 'black' : 'white' ), ] - : colorMode.steps.map((d) => getColor(d, getPaletteFn, isDarkMode)); + : colorMode.steps.map((d) => getColor(d, palettes)); steps.sort(() => (colorMode.sort === 'asc' ? -1 : 1)); const scale = chroma.scale(steps).mode('lab'); return (value: number) => scale(value).hex(); diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/assignment.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/assignment.tsx index 0606aa94e6aa8..5a629a18cf959 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/assignment.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/assignment.tsx @@ -13,6 +13,7 @@ import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; +import { IKbnPalette, KbnPalettes } from '@kbn/palettes'; import { removeAssignment, updateAssignmentColor, @@ -21,7 +22,6 @@ import { import { ColorMapping } from '../../config'; import { Range } from './range'; import { Match } from './match'; -import { getPalette } from '../../palettes'; import { ColorMappingInputData } from '../../categorical_color_mapping'; import { ColorSwatch } from '../color_picker/color_swatch'; @@ -33,8 +33,8 @@ export function Assignment({ index, total, palette, + palettes, colorMode, - getPaletteFn, isDarkMode, specialTokens, assignmentValuesCounter, @@ -45,8 +45,8 @@ export function Assignment({ colorMode: ColorMapping.Config['colorMode']; assignment: ColorMapping.Config['assignments'][number]; disableDelete: boolean; - palette: ColorMapping.CategoricalPalette; - getPaletteFn: ReturnType; + palette: IKbnPalette; + palettes: KbnPalettes; isDarkMode: boolean; specialTokens: Map; assignmentValuesCounter: Map; @@ -62,9 +62,9 @@ export function Assignment({ swatchShape="square" colorMode={colorMode} assignmentColor={assignment.color} - getPaletteFn={getPaletteFn} index={index} palette={palette} + palettes={palettes} total={total} onColorChange={(color) => { dispatch(updateAssignmentColor({ assignmentIndex: index, color })); diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/special_assignment.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/special_assignment.tsx index 3bdab18cbf19e..4834ccc57d822 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/special_assignment.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/assignment/special_assignment.tsx @@ -9,8 +9,7 @@ import { useDispatch } from 'react-redux'; import React from 'react'; -import { ColorMapping } from '../../config'; -import { getPalette } from '../../palettes'; +import { IKbnPalette, KbnPalettes } from '@kbn/palettes'; import { ColorSwatch } from '../color_picker/color_swatch'; import { updateSpecialAssignmentColor } from '../../state/color_mapping'; import { ColorCode, CategoricalColor } from '../../config/types'; @@ -19,15 +18,15 @@ export function SpecialAssignment({ assignmentColor, index, palette, - getPaletteFn, + palettes, isDarkMode, total, }: { isDarkMode: boolean; index: number; assignmentColor: CategoricalColor | ColorCode; - palette: ColorMapping.CategoricalPalette; - getPaletteFn: ReturnType; + palette: IKbnPalette; + palettes: KbnPalettes; total: number; }) { const dispatch = useDispatch(); @@ -36,7 +35,7 @@ export function SpecialAssignment({ forType="specialAssignment" colorMode={{ type: 'categorical' }} assignmentColor={assignmentColor} - getPaletteFn={getPaletteFn} + palettes={palettes} index={index} palette={palette} total={total} diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_picker.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_picker.tsx index e4d42b9645698..eafa07793dd5c 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_picker.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_picker.tsx @@ -10,32 +10,29 @@ import React, { useState } from 'react'; import { EuiButtonEmpty, EuiPopoverTitle, EuiTab, EuiTabs, EuiHorizontalRule } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { IKbnPalette, KbnPalette, KbnPalettes } from '@kbn/palettes'; import { ColorMapping } from '../../config'; -import { getPalette } from '../../palettes'; import { PaletteColors } from './palette_colors'; import { RGBPicker } from './rgb_picker'; -import { NeutralPalette } from '../../palettes/neutral'; export function ColorPicker({ - palette, - getPaletteFn, color, + palette, + palettes, close, selectColor, - isDarkMode, deleteStep, }: { color: ColorMapping.CategoricalColor | ColorMapping.ColorCode; - getPaletteFn: ReturnType; - palette: ColorMapping.CategoricalPalette; - isDarkMode: boolean; + palette: IKbnPalette; + palettes: KbnPalettes; close: () => void; selectColor: (color: ColorMapping.CategoricalColor | ColorMapping.ColorCode) => void; deleteStep?: () => void; }) { const [tab, setTab] = useState( color.type === 'categorical' && - (color.paletteId === palette.id || color.paletteId === NeutralPalette.id) + (color.paletteId === palette.id || color.paletteId === KbnPalette.Neutral) ? 'palette' : 'custom' ); @@ -64,20 +61,12 @@ export function ColorPicker({ {tab === 'palette' ? ( ) : ( - + )} {deleteStep ? ( <> diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_swatch.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_swatch.tsx index 590d66018e803..b1af9d364efd4 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_swatch.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/color_swatch.tsx @@ -18,10 +18,10 @@ import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; +import { IKbnPalette, KbnPalettes } from '@kbn/palettes'; import { ColorPicker } from './color_picker'; import { getAssignmentColor } from '../../color/color_handling'; import { ColorMapping } from '../../config'; -import { getPalette } from '../../palettes'; import { removeGradientColorStep } from '../../state/color_mapping'; import { selectColorPickerVisibility } from '../../state/selectors'; @@ -31,22 +31,23 @@ import { getValidColor } from '../../color/color_math'; interface ColorPickerSwatchProps { colorMode: ColorMapping.Config['colorMode']; assignmentColor: ColorMapping.Config['assignments'][number]['color']; - getPaletteFn: ReturnType; index: number; total: number; - palette: ColorMapping.CategoricalPalette; + palette: IKbnPalette; + palettes: KbnPalettes; onColorChange: (color: ColorMapping.CategoricalColor | ColorMapping.ColorCode) => void; swatchShape: 'square' | 'round'; isDarkMode: boolean; forType: 'assignment' | 'specialAssignment' | 'gradient'; } + export const ColorSwatch = ({ colorMode, assignmentColor, - getPaletteFn, index, total, palette, + palettes, onColorChange, swatchShape, isDarkMode, @@ -61,7 +62,7 @@ export const ColorSwatch = ({ const colorHex = getAssignmentColor( colorMode, assignmentColor, - getPaletteFn, + palettes, isDarkMode, index, total @@ -147,11 +148,9 @@ export const ColorSwatch = ({ } color={assignmentColor} palette={palette} - getPaletteFn={getPaletteFn} + palettes={palettes} close={() => dispatch(hideColorPickerVisibility())} - isDarkMode={isDarkMode} selectColor={(color) => { - // dispatch update onColorChange(color); }} deleteStep={ diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/palette_colors.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/palette_colors.tsx index 3f58ed5d564e9..0ed0d8d68bb63 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/palette_colors.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/palette_colors.tsx @@ -19,35 +19,33 @@ import { EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { IKbnPalette, KbnPalette, KbnPalettes } from '@kbn/palettes'; import { ColorMapping } from '../../config'; -import { getPalette } from '../../palettes'; import { isSameColor } from '../../color/color_math'; -import { NeutralPalette } from '../../palettes/neutral'; export function PaletteColors({ palette, - isDarkMode, + palettes, color, - getPaletteFn, selectColor, }: { - palette: ColorMapping.CategoricalPalette; - isDarkMode: boolean; + palette: IKbnPalette; + palettes: KbnPalettes; color: ColorMapping.CategoricalColor | ColorMapping.ColorCode; - getPaletteFn: ReturnType; selectColor: (color: ColorMapping.CategoricalColor | ColorMapping.ColorCode) => void; }) { const colors = Array.from({ length: palette.colorCount }, (d, i) => { - return palette.getColor(i, isDarkMode, false); + return palette.getColor(i); }); - const neutralColors = Array.from({ length: NeutralPalette.colorCount }, (d, i) => { - return NeutralPalette.getColor(i, isDarkMode, false); + const neutralPalette = palettes.get(KbnPalette.Neutral); + const neutralColors = Array.from({ length: neutralPalette.colorCount }, (d, i) => { + return neutralPalette.getColor(i); }); const originalColor = color.type === 'categorical' - ? color.paletteId === NeutralPalette.id - ? NeutralPalette.getColor(color.colorIndex, isDarkMode, false) - : getPaletteFn(color.paletteId).getColor(color.colorIndex, isDarkMode, false) + ? color.paletteId === neutralPalette.id + ? neutralPalette.getColor(color.colorIndex) + : palettes.get(color.paletteId).getColor(color.colorIndex) : color.colorCode; return ( <> @@ -126,7 +124,7 @@ export function PaletteColors({ onClick={() => selectColor({ type: 'categorical', - paletteId: NeutralPalette.id, + paletteId: neutralPalette.id, colorIndex: index, }) } diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/rgb_picker.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/rgb_picker.tsx index 6c701fbfebacc..175d3ae36e71a 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/rgb_picker.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/color_picker/rgb_picker.tsx @@ -22,24 +22,19 @@ import chromajs from 'chroma-js'; import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; +import { KbnPalettes } from '@kbn/palettes'; import { ColorMapping } from '../../config'; import { hasEnoughContrast } from '../../color/color_math'; -import { getPalette } from '../../palettes'; export function RGBPicker({ - isDarkMode, color, - getPaletteFn, + palettes, selectColor, - close, }: { - palette: ColorMapping.CategoricalPalette; - isDarkMode: boolean; color: ColorMapping.CategoricalColor | ColorMapping.ColorCode; - getPaletteFn: ReturnType; + palettes: KbnPalettes; selectColor: (color: ColorMapping.CategoricalColor | ColorMapping.ColorCode) => void; - close: () => void; }) { const [customColorMappingColor, setCustomColorMappingColor] = useState< ColorMapping.CategoricalColor | ColorMapping.ColorCode @@ -47,11 +42,7 @@ export function RGBPicker({ const customColorHex = customColorMappingColor.type === 'categorical' - ? getPaletteFn(customColorMappingColor.paletteId).getColor( - customColorMappingColor.colorIndex, - isDarkMode, - false - ) + ? palettes.get(customColorMappingColor.paletteId).getColor(customColorMappingColor.colorIndex) : customColorMappingColor.colorCode; const [colorTextInput, setColorTextInput] = useState(customColorHex); diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/container/assigments.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/container/assigments.tsx index 1f9c37b1c60b6..6abe702ca8bc3 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/container/assigments.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/container/assigments.tsx @@ -29,6 +29,7 @@ import { euiThemeVars } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; import { useDispatch, useSelector } from 'react-redux'; import { findLast } from 'lodash'; +import { KbnPalettes } from '@kbn/palettes'; import { Assignment } from '../assignment/assignment'; import { addNewAssignment, @@ -38,7 +39,6 @@ import { import { selectColorMode, selectComputedAssignments, selectPalette } from '../../state/selectors'; import { ColorMappingInputData } from '../../categorical_color_mapping'; import { ColorMapping } from '../../config'; -import { getPalette, NeutralPalette } from '../../palettes'; import { ruleMatch } from '../../color/rule_matching'; export function AssignmentsConfig({ @@ -47,7 +47,7 @@ export function AssignmentsConfig({ isDarkMode, specialTokens, }: { - palettes: Map; + palettes: KbnPalettes; data: ColorMappingInputData; isDarkMode: boolean; /** map between original and formatted tokens used to handle special cases, like the Other bucket and the empty bucket */ @@ -56,8 +56,7 @@ export function AssignmentsConfig({ const [showOtherActions, setShowOtherActions] = useState(false); const dispatch = useDispatch(); - const getPaletteFn = getPalette(palettes, NeutralPalette); - const palette = useSelector(selectPalette(getPaletteFn)); + const palette = useSelector(selectPalette(palettes)); const colorMode = useSelector(selectColorMode); const assignments = useSelector(selectComputedAssignments); @@ -100,13 +99,13 @@ export function AssignmentsConfig({ ? { type: 'categorical', paletteId: palette.id, - colorIndex: nextCategoricalIndex % palette.colorCount, + colorIndex: nextCategoricalIndex % palette.colors().length, } : { type: 'gradient' }, touched: false, }) ); - }, [assignments, colorMode.type, data.type, dispatch, palette.colorCount, palette.id]); + }, [assignments, colorMode.type, data.type, dispatch, palette]); const onClickAddAllCurrentCategories = useCallback(() => { if (data.type === 'categories') { @@ -128,7 +127,7 @@ export function AssignmentsConfig({ ? { type: 'categorical', paletteId: palette.id, - colorIndex: (nextCategoricalIndex + i) % palette.colorCount, + colorIndex: (nextCategoricalIndex + i) % palette.colors().length, } : { type: 'gradient' }, touched: false, @@ -137,15 +136,7 @@ export function AssignmentsConfig({ ); dispatch(addNewAssignments(newAssignments)); } - }, [ - dispatch, - assignments, - colorMode.type, - data.type, - palette.colorCount, - palette.id, - unmatchingCategories, - ]); + }, [data.type, assignments, unmatchingCategories, dispatch, colorMode.type, palette]); return ( ; + palettes: KbnPalettes; data: ColorMappingInputData; isDarkMode: boolean; /** map between original and formatted tokens used to handle special cases, like the Other bucket and the empty bucket */ specialTokens: Map; }) { const dispatch = useDispatch(); - - const getPaletteFn = getPalette(palettes, NeutralPalette); - - const palette = useSelector(selectPalette(getPaletteFn)); + const palette = useSelector(selectPalette(palettes)); const colorMode = useSelector(selectColorMode); const assignments = useSelector(selectComputedAssignments); @@ -55,14 +50,10 @@ export function Container({ gutterSize="s" > - + - + @@ -105,7 +96,7 @@ export function Container({ > diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/container/unassigned_terms_config.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/container/unassigned_terms_config.tsx index 3a7469d120f10..4ebaadeeb7b82 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/container/unassigned_terms_config.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/container/unassigned_terms_config.tsx @@ -19,14 +19,13 @@ import { import { i18n } from '@kbn/i18n'; import { useDispatch, useSelector } from 'react-redux'; import { css } from '@emotion/react'; +import { KbnPalette, KbnPalettes } from '@kbn/palettes'; import { updateSpecialAssignmentColor } from '../../state/color_mapping'; -import { getPalette, NeutralPalette } from '../../palettes'; import { DEFAULT_NEUTRAL_PALETTE_INDEX, DEFAULT_OTHER_ASSIGNMENT_INDEX, } from '../../config/default_color_mapping'; import { SpecialAssignment } from '../assignment/special_assignment'; -import { ColorMapping } from '../../config'; import { selectColorMode, selectPalette, selectSpecialAssignments } from '../../state/selectors'; import { ColorMappingInputData } from '../../categorical_color_mapping'; @@ -35,15 +34,13 @@ export function UnassignedTermsConfig({ data, isDarkMode, }: { - palettes: Map; + palettes: KbnPalettes; data: ColorMappingInputData; isDarkMode: boolean; }) { const dispatch = useDispatch(); - - const getPaletteFn = getPalette(palettes, NeutralPalette); - - const palette = useSelector(selectPalette(getPaletteFn)); + const neutralPalette = palettes.get(KbnPalette.Neutral); + const palette = useSelector(selectPalette(palettes)); const colorMode = useSelector(selectColorMode); const specialAssignments = useSelector(selectSpecialAssignments); const otherAssignment = specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX]; @@ -99,7 +96,7 @@ export function UnassignedTermsConfig({ : { type: 'categorical', colorIndex: DEFAULT_NEUTRAL_PALETTE_INDEX, - paletteId: NeutralPalette.id, + paletteId: neutralPalette.id, }, }) ); @@ -122,7 +119,7 @@ export function UnassignedTermsConfig({ index={0} palette={palette} isDarkMode={isDarkMode} - getPaletteFn={getPaletteFn} + palettes={palettes} assignmentColor={otherAssignment.color} total={specialAssignments.length} /> diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient.tsx index c08834fdd384a..5fc9dc40f1589 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient.tsx @@ -11,9 +11,9 @@ import React from 'react'; import { euiThemeVars } from '@kbn/ui-theme'; import { css } from '@emotion/react'; import { useDispatch } from 'react-redux'; +import { KbnPalettes } from '@kbn/palettes'; import { changeAlpha } from '../../color/color_math'; import { ColorMapping } from '../../config'; -import { getPalette } from '../../palettes'; import { getGradientColorScale } from '../../color/color_handling'; import { AddStop } from './gradient_add_stop'; import { ColorSwatch } from '../color_picker/color_swatch'; @@ -22,21 +22,21 @@ import { updateGradientColorStep } from '../../state/color_mapping'; export function Gradient({ paletteId, colorMode, - getPaletteFn, isDarkMode, + palettes, }: { paletteId: string; isDarkMode: boolean; colorMode: ColorMapping.Config['colorMode']; - getPaletteFn: ReturnType; + palettes: KbnPalettes; }) { const dispatch = useDispatch(); if (colorMode.type === 'categorical') { return null; } - const currentPalette = getPaletteFn(paletteId); - const gradientColorScale = getGradientColorScale(colorMode, getPaletteFn, isDarkMode); + const currentPalette = palettes.get(paletteId); + const gradientColorScale = getGradientColorScale(colorMode, palettes, isDarkMode); const startStepColor = colorMode.sort === 'asc' @@ -104,7 +104,7 @@ export function Gradient({ forType="gradient" colorMode={colorMode} assignmentColor={startStepColor} - getPaletteFn={getPaletteFn} + palettes={palettes} index={startStepIndex} palette={currentPalette} total={colorMode.steps.length} @@ -133,7 +133,7 @@ export function Gradient({ forType="gradient" colorMode={colorMode} assignmentColor={middleStepColor} - getPaletteFn={getPaletteFn} + palettes={palettes} index={middleStepIndex} palette={currentPalette} total={colorMode.steps.length} @@ -161,7 +161,7 @@ export function Gradient({ forType="gradient" colorMode={colorMode} assignmentColor={endStepColor} - getPaletteFn={getPaletteFn} + palettes={palettes} index={endStepIndex} palette={currentPalette} total={colorMode.steps.length} diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient_add_stop.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient_add_stop.tsx index 6b89f8143fb8f..1c6736262e217 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient_add_stop.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/gradient_add_stop.tsx @@ -20,6 +20,7 @@ import { import { useDispatch } from 'react-redux'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; +import { IKbnPalette } from '@kbn/palettes'; import { ColorMapping } from '../../config'; import { addGradientColorStep } from '../../state/color_mapping'; import { colorPickerVisibility } from '../../state/ui'; @@ -30,7 +31,7 @@ export function AddStop({ at, }: { colorMode: ColorMapping.GradientColorMode; - currentPalette: ColorMapping.CategoricalPalette; + currentPalette: IKbnPalette; at: number; }) { const euiTheme = useEuiTheme(); diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/palette_selector.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/palette_selector.tsx index 1d909f000a417..54c6d05bbed18 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/palette_selector.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/palette_selector.tsx @@ -7,25 +7,16 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useState, useMemo } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { EuiColorPalettePicker, EuiConfirmModal, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { KbnPalettes } from '@kbn/palettes'; import { RootState, updatePalette } from '../../state/color_mapping'; -import { ColorMapping } from '../../config'; import { updateAssignmentsPalette, updateColorModePalette } from '../../config/assignments'; -import { getPalette } from '../../palettes'; -export function PaletteSelector({ - palettes, - getPaletteFn, - isDarkMode, -}: { - getPaletteFn: ReturnType; - palettes: Map; - isDarkMode: boolean; -}) { +export function PaletteSelector({ palettes }: { palettes: KbnPalettes }) { const dispatch = useDispatch(); const model = useSelector((state: RootState) => state.colorMapping); @@ -38,7 +29,7 @@ export function PaletteSelector({ model.assignments, model.colorMode, selectedPaletteId, - getPaletteFn, + palettes, preserveColorChanges ), colorMode: updateColorModePalette( @@ -49,7 +40,7 @@ export function PaletteSelector({ }) ); }, - [getPaletteFn, model, dispatch] + [dispatch, model.assignments, model.colorMode, palettes] ); const [preserveModalPaletteId, setPreserveModalPaletteId] = useState(null); @@ -85,6 +76,11 @@ export function PaletteSelector({ ) : null; + const currentPaletteId = useMemo( + () => palettes.get(model.paletteId).id, // need to resolve aliased id + [model.paletteId, palettes] + ); + return ( <> {preserveChangesModal} @@ -97,14 +93,15 @@ export function PaletteSelector({ d.name !== 'Neutral') + palettes={palettes + .getAll() + .filter((d) => d.type === 'categorical') .map((palette) => ({ 'data-test-subj': `kbnColoring_ColorMapping_Palette-${palette.id}`, value: palette.id, title: palette.name, palette: Array.from({ length: palette.colorCount }, (_, i) => { - return palette.getColor(i, isDarkMode, false); + return palette.getColor(i); }), type: 'fixed', }))} @@ -118,7 +115,7 @@ export function PaletteSelector({ switchPaletteFn(selectedPaletteId, false); } }} - valueOfSelected={model.paletteId} + valueOfSelected={currentPaletteId} selectionDisplay={'palette'} compressed={true} /> diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/scale.tsx b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/scale.tsx index f7249aa12d576..42fea54d6fdb7 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/scale.tsx +++ b/packages/kbn-coloring/src/shared_components/color_mapping/components/palette_selector/scale.tsx @@ -12,12 +12,12 @@ import { useSelector, useDispatch } from 'react-redux'; import { EuiButtonGroup, EuiConfirmModal, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { KbnPalettes } from '@kbn/palettes'; import { RootState, updatePalette } from '../../state/color_mapping'; import { ColorMapping } from '../../config'; import { updateAssignmentsPalette } from '../../config/assignments'; -import { getPalette } from '../../palettes'; -export function ScaleMode({ getPaletteFn }: { getPaletteFn: ReturnType }) { +export function ScaleMode({ palettes }: { palettes: KbnPalettes }) { const dispatch = useDispatch(); const colorMode = useSelector((state: RootState) => state.colorMapping.colorMode); const model = useSelector((state: RootState) => state.colorMapping); @@ -46,12 +46,12 @@ export function ScaleMode({ getPaletteFn }: { getPaletteFn: ReturnType( diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/config/assignments.ts b/packages/kbn-coloring/src/shared_components/color_mapping/config/assignments.ts index 3d30ce3c7f607..5f039c05074db 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/config/assignments.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/config/assignments.ts @@ -7,17 +7,17 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { KbnPalettes } from '@kbn/palettes'; import type { ColorMapping } from '.'; -import { getPalette } from '../palettes'; export function updateAssignmentsPalette( assignments: ColorMapping.Config['assignments'], colorMode: ColorMapping.Config['colorMode'], paletteId: string, - getPaletteFn: ReturnType, + palettes: KbnPalettes, preserveColorChanges: boolean ): ColorMapping.Config['assignments'] { - const palette = getPaletteFn(paletteId); + const palette = palettes.get(paletteId); return assignments.map(({ rule, color, touched }, index) => { if (preserveColorChanges && touched) { return { rule, color, touched }; @@ -27,7 +27,7 @@ export function updateAssignmentsPalette( ? { type: 'categorical', paletteId, - colorIndex: index % palette.colorCount, + colorIndex: index % palette.colors().length, } : { type: 'gradient' }; return { diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/config/default_color_mapping.ts b/packages/kbn-coloring/src/shared_components/color_mapping/config/default_color_mapping.ts index b613d0d76adb8..1005f5d89855a 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/config/default_color_mapping.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/config/default_color_mapping.ts @@ -7,11 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { KbnPalettes } from '@kbn/palettes'; import { ColorMapping } from '.'; -import { AVAILABLE_PALETTES, getPalette } from '../palettes'; -import { EUIAmsterdamColorBlindPalette } from '../palettes/eui_amsterdam'; -import { NeutralPalette } from '../palettes/neutral'; import { getColor, getGradientColorScale } from '../color/color_handling'; +import { DEFAULT_FALLBACK_PALETTE } from '../../../palettes'; export const DEFAULT_NEUTRAL_PALETTE_INDEX = 1; export const DEFAULT_OTHER_ASSIGNMENT_INDEX = 0; @@ -32,32 +31,31 @@ export const DEFAULT_COLOR_MAPPING_CONFIG: ColorMapping.Config = { touched: false, }, ], - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: DEFAULT_FALLBACK_PALETTE, colorMode: { type: 'categorical', }, }; export function getPaletteColors( - isDarkMode: boolean, + palettes: KbnPalettes, colorMappings?: ColorMapping.Config ): string[] { const colorMappingModel = colorMappings ?? { ...DEFAULT_COLOR_MAPPING_CONFIG }; - const palette = getPalette(AVAILABLE_PALETTES, NeutralPalette)(colorMappingModel.paletteId); - return getPaletteColorsFromPaletteId(isDarkMode, palette.id); + const palette = palettes.get(colorMappingModel.paletteId); + return getPaletteColorsFromPaletteId(palettes, palette.id); } export function getPaletteColorsFromPaletteId( - isDarkMode: boolean, + palettes: KbnPalettes, paletteId: ColorMapping.Config['paletteId'] ): string[] { - const palette = getPalette(AVAILABLE_PALETTES, NeutralPalette)(paletteId); - return Array.from({ length: palette.colorCount }, (d, i) => - palette.getColor(i, isDarkMode, true) - ); + const palette = palettes.get(paletteId); + return Array.from({ length: palette.colorCount }, (d, i) => palette.getColor(i)); } export function getColorsFromMapping( + palettes: KbnPalettes, isDarkMode: boolean, colorMappings?: ColorMapping.Config ): string[] { @@ -65,27 +63,18 @@ export function getColorsFromMapping( ...DEFAULT_COLOR_MAPPING_CONFIG, }; - const getPaletteFn = getPalette(AVAILABLE_PALETTES, NeutralPalette); if (colorMode.type === 'gradient') { - const colorScale = getGradientColorScale(colorMode, getPaletteFn, isDarkMode); + const colorScale = getGradientColorScale(colorMode, palettes, isDarkMode); return Array.from({ length: 6 }, (d, i) => colorScale(i / 6)); } else { - const palette = getPaletteFn(paletteId); + const palette = palettes.get(paletteId); const otherColors = specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX].color.type === 'loop' - ? Array.from({ length: palette.colorCount }, (d, i) => - palette.getColor(i, isDarkMode, true) - ) - : [ - getColor( - specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX].color, - getPaletteFn, - isDarkMode - ), - ]; + ? Array.from({ length: palette.colorCount }, (d, i) => palette.getColor(i)) + : [getColor(specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX].color, palettes)]; return [ ...assignments.map((a) => { - return a.color.type === 'gradient' ? '' : getColor(a.color, getPaletteFn, isDarkMode); + return a.color.type === 'gradient' ? '' : getColor(a.color, palettes); }), ...otherColors, ].filter((color) => color !== ''); diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/config/types.ts b/packages/kbn-coloring/src/shared_components/color_mapping/config/types.ts index 1c8b984dc52dd..79be2aa615c3c 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/config/types.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/config/types.ts @@ -150,11 +150,3 @@ export interface Config { >; specialAssignments: Array>; } - -export interface CategoricalPalette { - id: string; - name: string; - type: 'categorical'; - colorCount: number; - getColor: (valueInRange: number, isDarkMode: boolean, loop: boolean) => string; -} diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/index.ts b/packages/kbn-coloring/src/shared_components/color_mapping/index.ts index 6337447c1038b..5cba53f0eadcc 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/index.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/index.ts @@ -15,7 +15,6 @@ export { } from './categorical_color_mapping'; export type { ColorMappingInputData } from './categorical_color_mapping'; export type { ColorMapping } from './config'; -export * from './palettes'; export * from './color/color_handling'; export { SPECIAL_TOKENS_STRING_CONVERSION, getSpecialString } from './color/rule_matching'; export { diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts b/packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts deleted file mode 100644 index bd8492823b4db..0000000000000 --- a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/elastic_brand.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ColorMapping } from '../config'; - -export const ELASTIC_BRAND_PALETTE_COLORS = [ - '#20377d', - '#7de2d1', - '#ff957d', - '#f04e98', - '#0077cc', - '#fec514', -]; - -export const ElasticBrandPalette: ColorMapping.CategoricalPalette = { - id: 'elastic_brand_2023', - name: 'Elastic Brand', - colorCount: ELASTIC_BRAND_PALETTE_COLORS.length, - type: 'categorical', - getColor(indexInRange, isDarkMode, loop) { - return ELASTIC_BRAND_PALETTE_COLORS[ - loop ? indexInRange % ELASTIC_BRAND_PALETTE_COLORS.length : indexInRange - ]; - }, -}; diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts b/packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts deleted file mode 100644 index 7a29bc9f343e0..0000000000000 --- a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/eui_amsterdam.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ColorMapping } from '../config'; - -export const EUI_AMSTERDAM_PALETTE_COLORS = [ - '#54b399', - '#6092c0', - '#d36086', - '#9170b8', - '#ca8eae', - '#d6bf57', - '#b9a888', - '#da8b45', - '#aa6556', - '#e7664c', -]; - -export const EUIAmsterdamColorBlindPalette: ColorMapping.CategoricalPalette = { - id: 'eui_amsterdam_color_blind', - name: 'Default', - colorCount: EUI_AMSTERDAM_PALETTE_COLORS.length, - type: 'categorical', - getColor(indexInRange, isDarkMode, loop) { - return EUI_AMSTERDAM_PALETTE_COLORS[ - loop ? indexInRange % EUI_AMSTERDAM_PALETTE_COLORS.length : indexInRange - ]; - }, -}; diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts b/packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts deleted file mode 100644 index ca3d5b9503885..0000000000000 --- a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ColorMapping } from '../config'; -import { ElasticBrandPalette } from './elastic_brand'; -import { EUIAmsterdamColorBlindPalette } from './eui_amsterdam'; -import { KibanaV7LegacyPalette } from './kibana_legacy'; -import { NeutralPalette } from './neutral'; - -export const AVAILABLE_PALETTES = new Map([ - [EUIAmsterdamColorBlindPalette.id, EUIAmsterdamColorBlindPalette], - [ElasticBrandPalette.id, ElasticBrandPalette], - [KibanaV7LegacyPalette.id, KibanaV7LegacyPalette], - [NeutralPalette.id, NeutralPalette], -]); - -/** - * This function should be instanciated once at the root of the component with the available palettes and - * a choosed default one and shared across components to keep a single point of truth of the available palettes and the default - * one. - */ -export function getPalette( - palettes: Map, - defaultPalette: ColorMapping.CategoricalPalette -): (paletteId: string) => ColorMapping.CategoricalPalette { - return (paletteId) => palettes.get(paletteId) ?? defaultPalette; -} - -export * from './eui_amsterdam'; -export * from './elastic_brand'; -export * from './kibana_legacy'; -export * from './neutral'; diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts b/packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts deleted file mode 100644 index c0c25049700fe..0000000000000 --- a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/kibana_legacy.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ColorMapping } from '../config'; - -export const KIBANA_V7_LEGACY_PALETTE_COLORS = [ - '#00a69b', - '#57c17b', - '#6f87d8', - '#663db8', - '#bc52bc', - '#9e3533', - '#daa05d', -]; - -export const KibanaV7LegacyPalette: ColorMapping.CategoricalPalette = { - id: 'kibana_v7_legacy', - name: 'Kibana Legacy', - colorCount: KIBANA_V7_LEGACY_PALETTE_COLORS.length, - type: 'categorical', - getColor(indexInRange, isDarkMode, loop) { - return KIBANA_V7_LEGACY_PALETTE_COLORS[ - loop ? indexInRange % KIBANA_V7_LEGACY_PALETTE_COLORS.length : indexInRange - ]; - }, -}; diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts b/packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts deleted file mode 100644 index 5d41ab0fa3c94..0000000000000 --- a/packages/kbn-coloring/src/shared_components/color_mapping/palettes/neutral.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ColorMapping } from '../config'; - -const schemeGreys = ['#f2f4fb', '#d4d9e5', '#98a2b3', '#696f7d', '#353642']; -export const NEUTRAL_COLOR_LIGHT = schemeGreys.slice(); -export const NEUTRAL_COLOR_DARK = schemeGreys.slice().reverse(); - -export const NeutralPalette: ColorMapping.CategoricalPalette = { - id: 'neutral', - name: 'Neutral', - colorCount: NEUTRAL_COLOR_LIGHT.length, - type: 'categorical', - getColor(valueInRange, isDarkMode) { - return isDarkMode ? NEUTRAL_COLOR_DARK[valueInRange] : NEUTRAL_COLOR_LIGHT[valueInRange]; - }, -}; diff --git a/packages/kbn-coloring/src/shared_components/color_mapping/state/selectors.ts b/packages/kbn-coloring/src/shared_components/color_mapping/state/selectors.ts index 05454ead22a61..3f8053aa8e922 100644 --- a/packages/kbn-coloring/src/shared_components/color_mapping/state/selectors.ts +++ b/packages/kbn-coloring/src/shared_components/color_mapping/state/selectors.ts @@ -7,11 +7,11 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { getPalette } from '../palettes'; +import { KbnPalettes } from '@kbn/palettes'; import { RootState } from './color_mapping'; -export function selectPalette(getPaletteFn: ReturnType) { - return (state: RootState) => getPaletteFn(state.colorMapping.paletteId); +export function selectPalette(palettes: KbnPalettes) { + return (state: RootState) => palettes.get(state.colorMapping.paletteId); } export function selectColorMode(state: RootState) { return state.colorMapping.colorMode; diff --git a/packages/kbn-coloring/tsconfig.json b/packages/kbn-coloring/tsconfig.json index 3a97faa1b9d3a..c3be4a82e8baa 100644 --- a/packages/kbn-coloring/tsconfig.json +++ b/packages/kbn-coloring/tsconfig.json @@ -23,6 +23,7 @@ "@kbn/data-plugin", "@kbn/ui-theme", "@kbn/visualization-utils", + "@kbn/palettes", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-discover-utils/src/utils/get_log_document_overview.ts b/packages/kbn-discover-utils/src/utils/get_log_document_overview.ts index 33c8fdba68526..04c70a87aff45 100644 --- a/packages/kbn-discover-utils/src/utils/get_log_document_overview.ts +++ b/packages/kbn-discover-utils/src/utils/get_log_document_overview.ts @@ -30,8 +30,7 @@ export function getLogDocumentOverview( }; const levelArray = doc.flattened[fieldConstants.LOG_LEVEL_FIELD]; - const level = - Array.isArray(levelArray) && levelArray.length ? levelArray[0].toLowerCase() : levelArray; + const level = Array.isArray(levelArray) && levelArray.length > 0 ? levelArray[0] : levelArray; const message = formatField(fieldConstants.MESSAGE_FIELD); const errorMessage = formatField(fieldConstants.ERROR_MESSAGE_FIELD); const eventOriginal = formatField(fieldConstants.EVENT_ORIGINAL_FIELD); diff --git a/packages/kbn-es-types/index.ts b/packages/kbn-es-types/index.ts index 683fddb541baf..d4ba23840e2a6 100644 --- a/packages/kbn-es-types/index.ts +++ b/packages/kbn-es-types/index.ts @@ -13,6 +13,7 @@ export type { SearchHit, ESSearchResponse, ESSearchRequest, + ESSearchRequestWithoutBody, ESSourceOptions, InferSearchResponseOf, AggregationResultOf, diff --git a/packages/kbn-es-types/src/index.ts b/packages/kbn-es-types/src/index.ts index 2ec37ba474789..77d02320b6f2d 100644 --- a/packages/kbn-es-types/src/index.ts +++ b/packages/kbn-es-types/src/index.ts @@ -8,6 +8,7 @@ */ import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import * as estypesWithoutBody from '@elastic/elasticsearch/lib/api/types'; import type { Field, QueryDslFieldAndFormat, @@ -26,6 +27,7 @@ import { export type ESFilter = estypes.QueryDslQueryContainer; export type ESSearchRequest = estypes.SearchRequest; +export type ESSearchRequestWithoutBody = estypesWithoutBody.SearchRequest; export type AggregationOptionsByType = Required; // Typings for Elasticsearch queries and aggregations. These are intended to be diff --git a/packages/kbn-es-types/src/search.ts b/packages/kbn-es-types/src/search.ts index d3675e04c2663..1c9a9e16fd4a7 100644 --- a/packages/kbn-es-types/src/search.ts +++ b/packages/kbn-es-types/src/search.ts @@ -23,20 +23,15 @@ type InvalidAggregationRequest = unknown; // Union keys are not included in keyof, but extends iterates over the types in a union. type ValidAggregationKeysOf> = T extends T ? keyof T : never; -type KeyOfSource = Record< - keyof T, - (T extends Record ? null : never) | string | number ->; +type KeyOfSource = { + [key in keyof T]: + | (T[key] extends Record ? null : never) + | string + | number; +}; -type KeysOfSources = T extends [any] - ? KeyOfSource - : T extends [any, any] - ? KeyOfSource & KeyOfSource - : T extends [any, any, any] - ? KeyOfSource & KeyOfSource & KeyOfSource - : T extends [any, any, any, any] - ? KeyOfSource & KeyOfSource & KeyOfSource & KeyOfSource - : Record; +// convert to intersection to be able to get all the keys +type KeysOfSources = UnionToIntersection>>>; type CompositeKeysOf = TAggregationContainer extends { diff --git a/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx b/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx index de230ac617987..9053494071c03 100644 --- a/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx +++ b/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx @@ -11,7 +11,14 @@ import './index.scss'; import { isFieldLensCompatible } from '@kbn/visualization-ui-components'; import React, { useCallback, useEffect, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiFormRow, EuiSwitch, EuiSwitchEvent, EuiButtonGroup, EuiSpacer } from '@elastic/eui'; +import { + EuiFormRow, + EuiSwitch, + EuiSwitchEvent, + EuiButtonGroup, + EuiSpacer, + euiPaletteColorBlind, +} from '@elastic/eui'; import { IconSelectSetting, DimensionEditorSection, @@ -339,6 +346,7 @@ const AnnotationEditorControls = ({ label={i18n.translate('eventAnnotationComponents.xyChart.lineColor.label', { defaultMessage: 'Color', })} + swatches={euiPaletteColorBlind()} /> ['Fetch.failRequest', Protocol.Fetch.FailRequestRequest]; + fulfill: ( + responseOptions: Omit + ) => ['Fetch.fulfillRequest', Protocol.Fetch.FulfillRequestRequest]; +} class BrowserService extends FtrService { /** * Keyboard events @@ -837,6 +843,59 @@ class BrowserService extends FtrService { throw new Error(message); } } + + /** + * Intercept network requests using the Chrome DevTools Protocol (CDP). + * @param pattern - URL pattern to match intercepted requests. + * @param onIntercept - Callback defining how to handle intercepted requests. + * @param cb - Callback to trigger actions that make requests. + */ + + public async interceptRequest( + pattern: string, + onIntercept: (responseFactory: InterceptResponseFactory) => [string, Record], + cb: () => Promise + ): Promise { + const connection = await this.driver.createCDPConnection('page'); + + return new Promise((resolve, reject) => { + connection._wsConnection.on('message', async (data: Buffer) => { + try { + const parsed = JSON.parse(data.toString()); + this.log.debug(`CDP Event: ${parsed.method} ${parsed.params?.request?.url}`); + + if (parsed.method === 'Fetch.requestPaused') { + const requestId = parsed.params.requestId; + + const [method, params] = onIntercept({ + fail: () => ['Fetch.failRequest', { requestId, errorReason: 'Failed' }], + fulfill: (responseOptions) => [ + 'Fetch.fulfillRequest', + { requestId, ...responseOptions }, + ], + }); + + connection.execute(method, params, () => { + this.log.debug(`Executed command: ${method}`); + }); + } + } catch (error) { + this.log.error(`Error in Fetch.requestPaused handler: ${error.message}`); + } + }); + + connection.execute('Fetch.enable', { patterns: [{ urlPattern: pattern }] }, (result: any) => { + this.log.debug('Fetch.enable result:', result); + + cb() + .then(resolve) + .catch((error) => { + this.log.error(`Error in callback: ${error.message}`); + reject(error); + }); + }); + }); + } } export async function BrowserProvider(ctx: FtrProviderContext) { diff --git a/packages/kbn-investigation-shared/src/rest_specs/update.ts b/packages/kbn-investigation-shared/src/rest_specs/update.ts index cab773d9549a2..42cf1539d2b4d 100644 --- a/packages/kbn-investigation-shared/src/rest_specs/update.ts +++ b/packages/kbn-investigation-shared/src/rest_specs/update.ts @@ -24,6 +24,9 @@ const updateInvestigationParamsSchema = z.object({ }), tags: z.array(z.string()), externalIncidentUrl: z.string().nullable(), + rootCauseAnalysis: z.object({ + events: z.array(z.any()), + }), }) .partial(), }); diff --git a/packages/kbn-investigation-shared/src/schema/investigation.ts b/packages/kbn-investigation-shared/src/schema/investigation.ts index 751f1a20048a5..23806c23e94a6 100644 --- a/packages/kbn-investigation-shared/src/schema/investigation.ts +++ b/packages/kbn-investigation-shared/src/schema/investigation.ts @@ -35,6 +35,11 @@ const investigationSchema = z.object({ notes: z.array(investigationNoteSchema), items: z.array(investigationItemSchema), externalIncidentUrl: z.string().nullable(), + rootCauseAnalysis: z + .object({ + events: z.array(z.any()), + }) + .optional(), }); type Status = z.infer; diff --git a/packages/kbn-monaco/src/esql/lib/esql_theme.ts b/packages/kbn-monaco/src/esql/lib/esql_theme.ts index d8223df99bbd1..b10c924992f05 100644 --- a/packages/kbn-monaco/src/esql/lib/esql_theme.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_theme.ts @@ -45,7 +45,7 @@ export const buildESQLTheme = ({ // source commands ...buildRuleGroup( ['from', 'row', 'show'], - euiThemeVars.euiColorPrimaryText, + euiThemeVars.euiColorPrimary, true // isBold ), @@ -88,12 +88,12 @@ export const buildESQLTheme = ({ 'desc', 'nulls_order', ], - euiThemeVars.euiColorAccentText, + euiThemeVars.euiColorAccent, true // isBold ), // functions - ...buildRuleGroup(['functions'], euiThemeVars.euiColorPrimaryText), + ...buildRuleGroup(['functions'], euiThemeVars.euiColorPrimary), // operators ...buildRuleGroup( @@ -116,7 +116,7 @@ export const buildESQLTheme = ({ 'percent', // '%' 'cast_op', // '::' ], - euiThemeVars.euiColorPrimaryText + euiThemeVars.euiColorPrimary ), // comments @@ -156,7 +156,7 @@ export const buildESQLTheme = ({ 'closing_metrics_line_comment', 'closing_metrics_multiline_comment', ], - euiThemeVars.euiColorDisabledText + euiThemeVars.euiTextSubduedColor ), // values diff --git a/packages/kbn-palettes/README.md b/packages/kbn-palettes/README.md new file mode 100644 index 0000000000000..d4c3913e33d24 --- /dev/null +++ b/packages/kbn-palettes/README.md @@ -0,0 +1,3 @@ +# @kbn/palettes + +Package containing shared visualization palette definitions diff --git a/packages/kbn-palettes/classes/categorical_palette.ts b/packages/kbn-palettes/classes/categorical_palette.ts new file mode 100644 index 0000000000000..fc352e7b45b35 --- /dev/null +++ b/packages/kbn-palettes/classes/categorical_palette.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Optional } from 'utility-types'; +import { KbnBasePalette, KbnBasePaletteConfig } from './palette'; +import { IKbnPalette } from './types'; + +export interface KbnCategoricalPaletteConfig extends Optional { + colors: string[]; +} + +export class KbnCategoricalPalette extends KbnBasePalette implements IKbnPalette { + public readonly type = 'categorical' as const; + + #colors: string[]; + + constructor({ colors, colorCount = colors.length, ...rest }: KbnCategoricalPaletteConfig) { + super({ ...rest, colorCount }); + + this.#colors = colors; + } + + public colors = (n?: number) => { + const end = n === undefined ? n : Math.max(1, n); + return this.#colors.slice(0, end); + }; +} diff --git a/packages/kbn-palettes/classes/color_fn_palette.ts b/packages/kbn-palettes/classes/color_fn_palette.ts new file mode 100644 index 0000000000000..4be79355f110f --- /dev/null +++ b/packages/kbn-palettes/classes/color_fn_palette.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Optional } from 'utility-types'; +import { KbnBasePaletteConfig, KbnBasePalette } from './palette'; +import { IKbnPalette, KbnPaletteType } from './types'; + +const DEFAULT_COLOR_COUNT = 10; + +export interface KbnColorFnPaletteConfig extends Optional { + type: KbnPaletteType; + colorFn: (n: number) => string[]; + /** + * Default number of colors returned from `colors` method. + * + * @default `colorCount` + */ + defaultNumberOfColors?: number; +} + +export class KbnColorFnPalette extends KbnBasePalette implements IKbnPalette { + public readonly type: KbnPaletteType; + + #colorFn: (n: number) => string[]; + #defaultNumberOfColors: number; + + constructor({ + type, + colorFn, + defaultNumberOfColors, + colorCount = DEFAULT_COLOR_COUNT, + ...rest + }: KbnColorFnPaletteConfig) { + super({ ...rest, colorCount }); + + this.type = type; + + this.#colorFn = colorFn; + this.#defaultNumberOfColors = defaultNumberOfColors ?? colorCount; + } + + public colors = (n: number = this.#defaultNumberOfColors) => { + return this.#colorFn(n === undefined ? n : Math.max(1, n)); + }; +} diff --git a/packages/kbn-palettes/classes/index.ts b/packages/kbn-palettes/classes/index.ts new file mode 100644 index 0000000000000..6cc89dc1cc1fe --- /dev/null +++ b/packages/kbn-palettes/classes/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './types'; +export { KbnPalettes } from './palettes'; diff --git a/packages/kbn-palettes/classes/palette.ts b/packages/kbn-palettes/classes/palette.ts new file mode 100644 index 0000000000000..8c707b1c3b7da --- /dev/null +++ b/packages/kbn-palettes/classes/palette.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Optional } from 'utility-types'; +import { IKbnPalette, KbnPaletteType } from './types'; + +export type KbnBasePaletteConfig = Optional< + Pick, + 'legacy' | 'aliases' +>; + +export abstract class KbnBasePalette implements IKbnPalette { + public abstract type: KbnPaletteType; + + public readonly id: string; + public readonly name: string; + public readonly colorCount: number; + public readonly legacy: boolean; + public readonly standalone: boolean; + public readonly aliases: string[]; + + constructor({ + id, + name, + colorCount, + aliases = [], + legacy = false, + standalone = false, + }: KbnBasePaletteConfig) { + this.id = id; + this.name = name; + this.colorCount = colorCount; + this.legacy = legacy; + this.standalone = standalone; + this.aliases = aliases; + } + + public abstract colors: (n?: number | undefined) => string[]; + + public getColor = (colorIndex: number, numberOfColors?: number) => { + const colors = this.colors(numberOfColors); + return colors[colorIndex % colors.length]; // ensure color is always returned + }; +} diff --git a/packages/kbn-palettes/classes/palettes.ts b/packages/kbn-palettes/classes/palettes.ts new file mode 100644 index 0000000000000..8b0ea42dd0724 --- /dev/null +++ b/packages/kbn-palettes/classes/palettes.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { IKbnPalette } from './types'; + +export class KbnPalettes { + #palettes: Map; + #aliasMappings: Map; + #defaultPalette: IKbnPalette; + + constructor(palettes: IKbnPalette[], defaultPalette: IKbnPalette) { + this.#defaultPalette = defaultPalette; + this.#palettes = new Map(palettes.map((p) => [p.id, p])); + this.#aliasMappings = buildAliasMappings(palettes); + } + + query = (id: string) => { + const aliasedId = (this.#palettes.has(id) ? id : this.#aliasMappings.get(id)) ?? id; + return this.#palettes.get(aliasedId); + }; + + get = (id: string) => { + return this.query(id) ?? this.#defaultPalette; + }; + + getAll = () => { + return [...this.#palettes.values()].filter(({ standalone }) => !standalone); + }; +} + +function buildAliasMappings(palettes: IKbnPalette[]): Map { + return palettes.reduce((acc, { id, aliases }) => { + aliases.forEach((alias) => { + acc.set(alias, id); + }); + return acc; + }, new Map()); +} diff --git a/packages/kbn-palettes/classes/types.ts b/packages/kbn-palettes/classes/types.ts new file mode 100644 index 0000000000000..345978a409a51 --- /dev/null +++ b/packages/kbn-palettes/classes/types.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export type KbnPaletteType = 'categorical' | 'gradient'; + +/** + * Common palette definition used throughout kibana + */ +export interface IKbnPalette { + /** + * Unique identifier for the palette + */ + id: string; + /** + * Display name of this palette. + */ + name: string; + /** + * Type of pallette + */ + type: KbnPaletteType; + /** + * Number of colors to display + */ + colorCount: number; + /** + * Palette belongs to an outdated theme set + */ + legacy: boolean; + /** + * Alternate aliases/ids this palette matches + */ + aliases: string[]; + /** + * Excluded from `getAll` but can still query for palette with `get`/`query` + * + * An example would be `KbnPalette.Neutral` palette. I want to exclude it from the list of all available palettes, but I still want to `get`/`query` the palette. + */ + standalone?: boolean; + /** + * Returns array of colors, optionally provide desired number of colors (`n`) + */ + colors: (n?: number) => string[]; + /** + * Returns color provided index and optional total number of colors + */ + getColor: (colorIndex: number, numberOfColors?: number) => string; +} diff --git a/packages/kbn-palettes/constants.ts b/packages/kbn-palettes/constants.ts new file mode 100644 index 0000000000000..13ac550577e59 --- /dev/null +++ b/packages/kbn-palettes/constants.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export const DEFAULT_FALLBACK_PALETTE = 'default' as const; + +export const EUI_THEME_AMSTERDAM = 'EUI_THEME_AMSTERDAM'; +export const EUI_THEME_BOREALIS = 'EUI_THEME_BOREALIS'; + +const semantic = { + /** + * Log level palette + */ + LogLevel: 'log_level' as const, +}; + +const categorical = { + /** + * Default kibana theme + */ + Default: DEFAULT_FALLBACK_PALETTE, + /** + * Neutral palette + */ + Neutral: 'neutral' as const, + + // ---- Legacy Palettes ---- + /** + * Kibana legacy theme v7 to v9 + */ + Kibana7: 'eui_amsterdam' as const, + /** + * Kibana behind text legacy theme v7 to v9 + */ + Kibana7BehindText: 'behind_text' as const, + /** + * Kibana legacy theme v4 to v7 + */ + Kibana4: 'kibana_v7_legacy' as const, + /** + * Elastic classic color palette + */ + ElasticClassic: 'elastic_brand_2023' as const, +}; + +const gradient = { + Cool: 'cool' as const, + Gray: 'gray' as const, + Red: 'red' as const, + Green: 'green' as const, + Warm: 'warm' as const, + Temperature: 'temperature' as const, + Complementary: 'complementary' as const, + Status: 'status' as const, +}; + +/** + * Enum of all kbn palette ids, including by type + */ +export const KbnPalette = { + // Categorical palettes + ...categorical, + + // Gradient palettes + ...gradient, + + // Semantic palettes + ...semantic, + + // ---- Deprecated palettes ---- + /** + * Amsterdam theme + * @deprecated use `KbnPalette.kibana7` + */ + Amsterdam: 'eui_amsterdam_color_blind' as const, +}; diff --git a/packages/kbn-palettes/hooks/index.ts b/packages/kbn-palettes/hooks/index.ts new file mode 100644 index 0000000000000..b01c38728d15e --- /dev/null +++ b/packages/kbn-palettes/hooks/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './use_kbn_palettes'; diff --git a/packages/kbn-palettes/hooks/use_kbn_palettes.ts b/packages/kbn-palettes/hooks/use_kbn_palettes.ts new file mode 100644 index 0000000000000..f78c70ad2ba3e --- /dev/null +++ b/packages/kbn-palettes/hooks/use_kbn_palettes.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { useEuiTheme } from '@elastic/eui'; +import { getPalettes } from '../palettes'; +import { getLegacyKbnPalettes } from '../palettes/legacy'; + +export function useKbnPalettes() { + const { + euiTheme: { themeName }, + colorMode, + } = useEuiTheme(); + + if (themeName === 'EUI_THEME_BOREALIS') { + return getPalettes(colorMode === 'DARK'); + } + + return getLegacyKbnPalettes(colorMode === 'DARK'); +} diff --git a/packages/kbn-palettes/index.ts b/packages/kbn-palettes/index.ts new file mode 100644 index 0000000000000..361273837f9c9 --- /dev/null +++ b/packages/kbn-palettes/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './palettes'; +export * from './classes'; +export { DEFAULT_FALLBACK_PALETTE, KbnPalette } from './constants'; + +export * from './hooks'; diff --git a/packages/kbn-palettes/jest.config.js b/packages/kbn-palettes/jest.config.js new file mode 100644 index 0000000000000..ba851fd1d70fa --- /dev/null +++ b/packages/kbn-palettes/jest.config.js @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-palettes'], +}; diff --git a/packages/kbn-palettes/kibana.jsonc b/packages/kbn-palettes/kibana.jsonc new file mode 100644 index 0000000000000..940c34426c2bc --- /dev/null +++ b/packages/kbn-palettes/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/palettes", + "owner": "@elastic/kibana-visualizations" +} diff --git a/packages/kbn-palettes/package.json b/packages/kbn-palettes/package.json new file mode 100644 index 0000000000000..6400900ccfba1 --- /dev/null +++ b/packages/kbn-palettes/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/palettes", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} \ No newline at end of file diff --git a/packages/kbn-palettes/palettes/categorical/elastic.ts b/packages/kbn-palettes/palettes/categorical/elastic.ts new file mode 100644 index 0000000000000..239b1c009d5de --- /dev/null +++ b/packages/kbn-palettes/palettes/categorical/elastic.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteColorBlind } from '@elastic/eui'; +import { KbnPalette } from '../../constants'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; + +/** + * This is not correctly returning the updated vis colors from eui. + * All gradient function work correctly. + */ +export const elasticPalette = new KbnColorFnPalette({ + id: KbnPalette.Default, + type: 'categorical', + aliases: [ + 'elastic_borealis', // placeholder - not yet used + KbnPalette.Amsterdam, // to assign to existing default palettes + ], + colorCount: 10, + defaultNumberOfColors: 30, + name: i18n.translate('palettes.elastic.name', { + defaultMessage: 'Elastic (default)', + }), + // Return exact colors requested given enough rotations + colorFn: (n) => euiPaletteColorBlind({ rotations: Math.ceil(n / 10) }).slice(0, n), +}); diff --git a/packages/kbn-palettes/palettes/categorical/index.ts b/packages/kbn-palettes/palettes/categorical/index.ts new file mode 100644 index 0000000000000..63638c387f715 --- /dev/null +++ b/packages/kbn-palettes/palettes/categorical/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './neutral'; +export * from './elastic'; diff --git a/packages/kbn-palettes/palettes/categorical/neutral.ts b/packages/kbn-palettes/palettes/categorical/neutral.ts new file mode 100644 index 0000000000000..13de3a45cb94a --- /dev/null +++ b/packages/kbn-palettes/palettes/categorical/neutral.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { + KbnCategoricalPalette, + KbnCategoricalPaletteConfig, +} from '../../classes/categorical_palette'; +import { KbnPalette } from '../../constants'; + +const commonProps = { + id: KbnPalette.Neutral, + standalone: true, + name: i18n.translate('palettes.elastic.name', { + defaultMessage: 'Neutral', + }), +} satisfies Omit; + +const lightNeutralPalette = new KbnCategoricalPalette({ + ...commonProps, + colors: ['#F6F9FC', '#D0D4DA', '#989FAA', '#666D78', '#373D45'], +}); + +const darkNeutralPalette = new KbnCategoricalPalette({ + ...commonProps, + colors: ['#F6F9FC', '#C9D4E6', '#89A0C4', '#546D95', '#283C5C'], +}); + +export const getNeutralPalette = (darkMode: boolean) => + darkMode ? darkNeutralPalette : lightNeutralPalette; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_react.tsx b/packages/kbn-palettes/palettes/get_kbn_palettes.ts similarity index 56% rename from src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_react.tsx rename to packages/kbn-palettes/palettes/get_kbn_palettes.ts index e2cc363b6ec3a..0519a2d4bf9a9 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_react.tsx +++ b/packages/kbn-palettes/palettes/get_kbn_palettes.ts @@ -7,14 +7,14 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import React from 'react'; -import { ContactCardEmbeddableComponent } from './contact_card'; -import { ContactCardEmbeddable } from './contact_card_embeddable'; +import type { CoreTheme } from '@kbn/core-theme-browser'; +import { getPalettes } from '.'; +import { getLegacyKbnPalettes } from './legacy'; -export class ContactCardEmbeddableReact extends ContactCardEmbeddable { - public render() { - return ( - - ); +export function getKbnPalettes({ name, darkMode }: CoreTheme) { + if (name === 'amsterdam') { + return getLegacyKbnPalettes(darkMode); } + + return getPalettes(darkMode); } diff --git a/packages/kbn-palettes/palettes/gradient/complementary.ts b/packages/kbn-palettes/palettes/gradient/complementary.ts new file mode 100644 index 0000000000000..c61fc8d140d5d --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/complementary.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteComplementary } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const complementaryPalette = new KbnColorFnPalette({ + id: KbnPalette.Complementary, + type: 'gradient', + name: i18n.translate('palettes.complementary.name', { + defaultMessage: 'Complementary', + }), + colorFn: euiPaletteComplementary, +}); diff --git a/packages/kbn-palettes/palettes/gradient/cool.ts b/packages/kbn-palettes/palettes/gradient/cool.ts new file mode 100644 index 0000000000000..2982cba8a35dd --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/cool.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteCool } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const coolPalette = new KbnColorFnPalette({ + id: KbnPalette.Cool, + type: 'gradient', + name: i18n.translate('palettes.cool.name', { + defaultMessage: 'Cool', + }), + colorFn: euiPaletteCool, +}); diff --git a/packages/kbn-palettes/palettes/gradient/gray.ts b/packages/kbn-palettes/palettes/gradient/gray.ts new file mode 100644 index 0000000000000..24d6d2444ce57 --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/gray.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteGray } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const grayPalette = new KbnColorFnPalette({ + id: KbnPalette.Gray, + type: 'gradient', + name: i18n.translate('palettes.gray.name', { + defaultMessage: 'Gray', + }), + colorFn: euiPaletteGray, +}); diff --git a/packages/kbn-palettes/palettes/gradient/green.ts b/packages/kbn-palettes/palettes/gradient/green.ts new file mode 100644 index 0000000000000..bb6655d575ea5 --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/green.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteGreen } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const greenPalette = new KbnColorFnPalette({ + id: KbnPalette.Green, + type: 'gradient', + name: i18n.translate('palettes.green.name', { + defaultMessage: 'Positive', + }), + colorFn: euiPaletteGreen, +}); diff --git a/packages/kbn-palettes/palettes/gradient/index.ts b/packages/kbn-palettes/palettes/gradient/index.ts new file mode 100644 index 0000000000000..7781fdd5ec7a3 --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './cool'; +export * from './gray'; +export * from './red'; +export * from './green'; +export * from './warm'; +export * from './temperature'; +export * from './complementary'; +export * from './status'; diff --git a/packages/kbn-palettes/palettes/gradient/red.ts b/packages/kbn-palettes/palettes/gradient/red.ts new file mode 100644 index 0000000000000..e2cd76df1e454 --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/red.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteRed } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const redPalette = new KbnColorFnPalette({ + id: KbnPalette.Red, + type: 'gradient', + name: i18n.translate('palettes.red.name', { + defaultMessage: 'Negative', + }), + colorFn: euiPaletteRed, +}); diff --git a/packages/kbn-palettes/palettes/gradient/status.ts b/packages/kbn-palettes/palettes/gradient/status.ts new file mode 100644 index 0000000000000..db0c1931aae73 --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/status.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteForStatus } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const statusPalette = new KbnColorFnPalette({ + id: KbnPalette.Status, + type: 'gradient', + name: i18n.translate('palettes.status.name', { + defaultMessage: 'Status', + }), + colorFn: euiPaletteForStatus, +}); diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/index.ts b/packages/kbn-palettes/palettes/gradient/temperature.ts similarity index 51% rename from src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/index.ts rename to packages/kbn-palettes/palettes/gradient/temperature.ts index 5344e74647c2f..5cf802db6c1f2 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/index.ts +++ b/packages/kbn-palettes/palettes/gradient/temperature.ts @@ -7,12 +7,16 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export * from './contact_card'; -export * from './contact_card_embeddable'; -export * from './contact_card_embeddable_factory'; -export * from './contact_card_exportable_embeddable'; -export * from './contact_card_exportable_embeddable_factory'; -export * from './contact_card_embeddable_react'; -export * from './contact_card_embeddable_react_factory'; -export * from './contact_card_initializer'; -export * from './slow_contact_card_embeddable_factory'; +import { i18n } from '@kbn/i18n'; +import { euiPaletteForTemperature } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const temperaturePalette = new KbnColorFnPalette({ + id: KbnPalette.Temperature, + type: 'gradient', + name: i18n.translate('palettes.temperature.name', { + defaultMessage: 'Temperature', + }), + colorFn: euiPaletteForTemperature, +}); diff --git a/packages/kbn-palettes/palettes/gradient/warm.ts b/packages/kbn-palettes/palettes/gradient/warm.ts new file mode 100644 index 0000000000000..16ada3059903c --- /dev/null +++ b/packages/kbn-palettes/palettes/gradient/warm.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteWarm } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../classes/color_fn_palette'; +import { KbnPalette } from '../../constants'; + +export const warmPalette = new KbnColorFnPalette({ + id: KbnPalette.Warm, + type: 'gradient', + name: i18n.translate('palettes.warm.name', { + defaultMessage: 'Warm', + }), + colorFn: euiPaletteWarm, +}); diff --git a/packages/kbn-palettes/palettes/index.ts b/packages/kbn-palettes/palettes/index.ts new file mode 100644 index 0000000000000..5f70cafaa6b2c --- /dev/null +++ b/packages/kbn-palettes/palettes/index.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { KbnPalettes } from '../classes/palettes'; +import { elasticPalette, getNeutralPalette } from './categorical'; +import { elasticClassicPalette, kibana4Palette, kibana7Palette } from './legacy/categorical'; +import { + complementaryPalette, + coolPalette, + grayPalette, + greenPalette, + redPalette, + statusPalette, + temperaturePalette, + warmPalette, +} from './gradient'; +export { logLevelPalette } from './semantic'; + +const darkKbnPalettes = new KbnPalettes( + [ + elasticPalette, + kibana7Palette, + kibana4Palette, + getNeutralPalette(true), + complementaryPalette, + coolPalette, + grayPalette, + greenPalette, + redPalette, + statusPalette, + temperaturePalette, + warmPalette, + elasticClassicPalette, + ], + elasticPalette +); + +const lightKbnPalettes = new KbnPalettes( + [ + elasticPalette, + kibana7Palette, + kibana4Palette, + getNeutralPalette(true), + complementaryPalette, + coolPalette, + grayPalette, + greenPalette, + redPalette, + statusPalette, + temperaturePalette, + warmPalette, + elasticClassicPalette, + ], + elasticPalette +); + +export const getPalettes = (darkMode: boolean) => (darkMode ? darkKbnPalettes : lightKbnPalettes); + +export { elasticPalette } from './categorical'; +export * from './get_kbn_palettes'; diff --git a/packages/kbn-palettes/palettes/legacy/categorical/elastic_classic.ts b/packages/kbn-palettes/palettes/legacy/categorical/elastic_classic.ts new file mode 100644 index 0000000000000..5a4347b8b7cc2 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/categorical/elastic_classic.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { KbnCategoricalPalette } from '../../../classes/categorical_palette'; +import { KbnPalette } from '../../../constants'; + +export const elasticClassicPalette = new KbnCategoricalPalette({ + id: KbnPalette.ElasticClassic, + name: i18n.translate('palettes.classic.name', { + defaultMessage: 'Elastic classic', + }), + colors: ['#20377d', '#7de2d1', '#ff957d', '#f04e98', '#0077cc', '#fec514'], +}); diff --git a/packages/kbn-palettes/palettes/legacy/categorical/index.ts b/packages/kbn-palettes/palettes/legacy/categorical/index.ts new file mode 100644 index 0000000000000..52e244344f20e --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/categorical/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './kibana_7'; +export * from './kibana_7_behind_text'; +export * from './kibana_4'; +export * from './elastic_classic'; +export * from './neutral'; diff --git a/packages/kbn-palettes/palettes/legacy/categorical/kibana_4.ts b/packages/kbn-palettes/palettes/legacy/categorical/kibana_4.ts new file mode 100644 index 0000000000000..ff8019a8fb02f --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/categorical/kibana_4.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { KbnCategoricalPalette } from '../../../classes/categorical_palette'; +import { KbnPalette } from '../../../constants'; + +export const kibana4Palette = new KbnCategoricalPalette({ + id: KbnPalette.Kibana4, + name: i18n.translate('palettes.kibana4.name', { + defaultMessage: 'Kibana 4', + }), + colors: ['#00a69b', '#57c17b', '#6f87d8', '#663db8', '#bc52bc', '#9e3533', '#daa05d'], +}); diff --git a/packages/kbn-palettes/palettes/legacy/categorical/kibana_7.ts b/packages/kbn-palettes/palettes/legacy/categorical/kibana_7.ts new file mode 100644 index 0000000000000..75ec1c7073c6e --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/categorical/kibana_7.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { KbnCategoricalPalette } from '../../../classes/categorical_palette'; +import { KbnPalette } from '../../../constants'; + +export const kibana7Palette = new KbnCategoricalPalette({ + id: KbnPalette.Kibana7, + aliases: [ + KbnPalette.Default, // needed when switching between new and old themes + KbnPalette.Amsterdam, // to assign to existing default palettes + ], + name: i18n.translate('palettes.kibana7.name', { + defaultMessage: 'Kibana 7', + }), + colorCount: 10, + colors: [ + '#54b399', + '#6092c0', + '#d36086', + '#9170b8', + '#ca8eae', + '#d6bf57', + '#b9a888', + '#da8b45', + '#aa6556', + '#e7664c', + '#7fc6b3', + '#88aed0', + '#de88a5', + '#ad94ca', + '#d8abc3', + '#e1cf81', + '#cbbea6', + '#e4a874', + '#c08c81', + '#ed8d79', + '#aad9cc', + '#b0c9e0', + '#e9b0c3', + '#c8b8dc', + '#e5c7d7', + '#ebdfab', + '#dcd4c4', + '#edc5a2', + '#d5b2ab', + '#f3b3a6', + ], +}); diff --git a/packages/kbn-palettes/palettes/legacy/categorical/kibana_7_behind_text.ts b/packages/kbn-palettes/palettes/legacy/categorical/kibana_7_behind_text.ts new file mode 100644 index 0000000000000..578afcdff6284 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/categorical/kibana_7_behind_text.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { KbnCategoricalPalette } from '../../../classes/categorical_palette'; +import { KbnPalette } from '../../../constants'; + +export const kibana7BehindText = new KbnCategoricalPalette({ + id: KbnPalette.Kibana7BehindText, + name: i18n.translate('palettes.kibana7BehindText.name', { + defaultMessage: 'Kibana 7 (behind text)', + }), + standalone: true, + colorCount: 10, + colors: [ + '#6dccb1', + '#79aad9', + '#ee789d', + '#a987d1', + '#e4a6c7', + '#f1d86f', + '#d2c0a0', + '#f5a35c', + '#c47c6c', + '#ff7e62', + '#98dfcc', + '#a0c7e9', + '#f8a0bd', + '#c6ace3', + '#f2c4dc', + '#fbe899', + '#e4d7be', + '#ffc08b', + '#daa498', + '#ffa590', + '#c3f3e5', + '#c9e2fa', + '#ffc9dc', + '#e1d1f6', + '#ffe0f1', + '#fff9c4', + '#f6eddd', + '#ffdeba', + '#efcbc4', + '#ffccbe', + ], +}); diff --git a/packages/kbn-palettes/palettes/legacy/categorical/neutral.ts b/packages/kbn-palettes/palettes/legacy/categorical/neutral.ts new file mode 100644 index 0000000000000..99bb21e42f395 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/categorical/neutral.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { KbnCategoricalPalette } from '../../../classes/categorical_palette'; +import { KbnPalette } from '../../../constants'; + +const schemeGreys = ['#f2f4fb', '#d4d9e5', '#98a2b3', '#696f7d', '#353642']; +const NEUTRAL_COLOR_LIGHT = schemeGreys.slice(); +const NEUTRAL_COLOR_DARK = schemeGreys.slice().reverse(); + +export const getNeutralPalette = (darkMode: boolean) => + new KbnCategoricalPalette({ + id: KbnPalette.Neutral, + name: i18n.translate('palettes.elastic.name', { + defaultMessage: 'Neutral', + }), + standalone: true, + colors: darkMode ? NEUTRAL_COLOR_DARK : NEUTRAL_COLOR_LIGHT, + }); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/complementary.ts b/packages/kbn-palettes/palettes/legacy/gradient/complementary.ts new file mode 100644 index 0000000000000..be730d39e89b1 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/complementary.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteComplementary } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const complementaryPalette = new KbnColorFnPalette({ + id: KbnPalette.Complementary, + type: 'gradient', + name: i18n.translate('palettes.complementary.name', { + defaultMessage: 'Complementary', + }), + colorFn: euiPaletteComplementary, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/cool.ts b/packages/kbn-palettes/palettes/legacy/gradient/cool.ts new file mode 100644 index 0000000000000..178b7f2afeae2 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/cool.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteCool } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const coolPalette = new KbnColorFnPalette({ + id: KbnPalette.Cool, + type: 'gradient', + name: i18n.translate('palettes.cool.name', { + defaultMessage: 'Cool', + }), + colorFn: euiPaletteCool, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/gray.ts b/packages/kbn-palettes/palettes/legacy/gradient/gray.ts new file mode 100644 index 0000000000000..c0176eba2262f --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/gray.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteGray } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const grayPalette = new KbnColorFnPalette({ + id: KbnPalette.Gray, + type: 'gradient', + name: i18n.translate('palettes.gray.name', { + defaultMessage: 'Gray', + }), + colorFn: euiPaletteGray, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/green.ts b/packages/kbn-palettes/palettes/legacy/gradient/green.ts new file mode 100644 index 0000000000000..3e84be1c923ff --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/green.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteGreen } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const greenPalette = new KbnColorFnPalette({ + id: KbnPalette.Green, + type: 'gradient', + name: i18n.translate('palettes.green.name', { + defaultMessage: 'Positive', + }), + colorFn: euiPaletteGreen, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/index.ts b/packages/kbn-palettes/palettes/legacy/gradient/index.ts new file mode 100644 index 0000000000000..7781fdd5ec7a3 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './cool'; +export * from './gray'; +export * from './red'; +export * from './green'; +export * from './warm'; +export * from './temperature'; +export * from './complementary'; +export * from './status'; diff --git a/packages/kbn-palettes/palettes/legacy/gradient/red.ts b/packages/kbn-palettes/palettes/legacy/gradient/red.ts new file mode 100644 index 0000000000000..9c028502ce602 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/red.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteRed } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const redPalette = new KbnColorFnPalette({ + id: KbnPalette.Red, + type: 'gradient', + name: i18n.translate('palettes.red.name', { + defaultMessage: 'Negative', + }), + colorFn: euiPaletteRed, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/status.ts b/packages/kbn-palettes/palettes/legacy/gradient/status.ts new file mode 100644 index 0000000000000..d367efe4752ff --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/status.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteForStatus } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const statusPalette = new KbnColorFnPalette({ + id: KbnPalette.Status, + type: 'gradient', + name: i18n.translate('palettes.status.name', { + defaultMessage: 'Status', + }), + colorFn: euiPaletteForStatus, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/temperature.ts b/packages/kbn-palettes/palettes/legacy/gradient/temperature.ts new file mode 100644 index 0000000000000..2ff7a7fbf65db --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/temperature.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteForTemperature } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const temperaturePalette = new KbnColorFnPalette({ + id: KbnPalette.Temperature, + type: 'gradient', + name: i18n.translate('palettes.temperature.name', { + defaultMessage: 'Temperature', + }), + colorFn: euiPaletteForTemperature, +}); diff --git a/packages/kbn-palettes/palettes/legacy/gradient/warm.ts b/packages/kbn-palettes/palettes/legacy/gradient/warm.ts new file mode 100644 index 0000000000000..f19a8eb148db3 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/gradient/warm.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { euiPaletteWarm } from '@elastic/eui'; +import { KbnColorFnPalette } from '../../../classes/color_fn_palette'; +import { KbnPalette } from '../../../constants'; + +export const warmPalette = new KbnColorFnPalette({ + id: KbnPalette.Warm, + type: 'gradient', + name: i18n.translate('palettes.warm.name', { + defaultMessage: 'Warm', + }), + colorFn: euiPaletteWarm, +}); diff --git a/packages/kbn-palettes/palettes/legacy/index.ts b/packages/kbn-palettes/palettes/legacy/index.ts new file mode 100644 index 0000000000000..ced72336fc370 --- /dev/null +++ b/packages/kbn-palettes/palettes/legacy/index.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { KbnPalettes } from '../../classes/palettes'; + +import { + kibana7Palette, + kibana4Palette, + elasticClassicPalette, + getNeutralPalette, + kibana7BehindText, +} from './categorical'; +import { + complementaryPalette, + coolPalette, + grayPalette, + greenPalette, + redPalette, + statusPalette, + temperaturePalette, + warmPalette, +} from './gradient'; + +const darkLegacyKbnPalettes = new KbnPalettes( + [ + kibana7Palette, + kibana4Palette, + kibana7BehindText, + getNeutralPalette(true), + complementaryPalette, + coolPalette, + grayPalette, + greenPalette, + redPalette, + statusPalette, + temperaturePalette, + warmPalette, + elasticClassicPalette, + ], + kibana7Palette +); + +const lightLegacyKbnPalettes = new KbnPalettes( + [ + kibana7Palette, + kibana4Palette, + kibana7BehindText, + getNeutralPalette(true), + complementaryPalette, + coolPalette, + grayPalette, + greenPalette, + redPalette, + statusPalette, + temperaturePalette, + warmPalette, + elasticClassicPalette, + ], + kibana7Palette +); + +export const getLegacyKbnPalettes = (darkMode: boolean) => + darkMode ? darkLegacyKbnPalettes : lightLegacyKbnPalettes; diff --git a/src/plugins/embeddable/public/lib/test_samples/index.ts b/packages/kbn-palettes/palettes/semantic/index.ts similarity index 93% rename from src/plugins/embeddable/public/lib/test_samples/index.ts rename to packages/kbn-palettes/palettes/semantic/index.ts index b27497d8d8d23..cfc7c779dacf4 100644 --- a/src/plugins/embeddable/public/lib/test_samples/index.ts +++ b/packages/kbn-palettes/palettes/semantic/index.ts @@ -7,4 +7,4 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export * from './embeddables'; +export * from './log_level'; diff --git a/packages/kbn-palettes/palettes/semantic/log_level.ts b/packages/kbn-palettes/palettes/semantic/log_level.ts new file mode 100644 index 0000000000000..cbcbbdaee3def --- /dev/null +++ b/packages/kbn-palettes/palettes/semantic/log_level.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { $Keys } from 'utility-types'; +import { KbnPalette } from '../../constants'; + +// TODO: update colors to vis colors +const logLevelColors = { + Emerg: '#F66D64', + Alert: '#E78E76', + Crit: '#E7A584', + Error: '#E7BD91', + Warn: '#E8D297', + Notice: '#C7D59', + Info: '#9CB1D3', + Debug: '#718FBC', + Other: '#CED4DE', +}; +type LogLevelKeys = $Keys; + +/** + * Defines a palette to be used directly and does not fully implement IKbnPalette + */ +export const logLevelPalette = { + id: KbnPalette.LogLevel, + name: i18n.translate('palettes.logLevel.name', { + defaultMessage: 'Log Level', + }), + getColor: (key: LogLevelKeys) => { + return logLevelColors[key]; + }, + colors: logLevelColors, +}; diff --git a/packages/kbn-palettes/tsconfig.json b/packages/kbn-palettes/tsconfig.json new file mode 100644 index 0000000000000..546dace9495b5 --- /dev/null +++ b/packages/kbn-palettes/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/core-theme-browser" + ] +} diff --git a/packages/kbn-relocate/README.md b/packages/kbn-relocate/README.md new file mode 100644 index 0000000000000..3ceb2432c69d1 --- /dev/null +++ b/packages/kbn-relocate/README.md @@ -0,0 +1,66 @@ +# @kbn/relocate + +This package contains a CLI tool to help move modules (plugins and packages) into their intended folders, according to the _Sustainable Kibana Architecture. + +## Prerequisites + +You must have `gh` CLI tool installed. You can install it by running: + +```sh +brew install gh +``` + +You must also configure your "default" kibana repo in `gh`, so that it can find PRs.: + +```sh +gh repo set-default elastic/kibana +``` + +You must have `elastic/kibana` remote configured under the name `upstream`. + +You must have a remote named `origin` pointing to your fork of the Kibana repo. + +## Usage + +First of all, you need to decide whether you want to contribute to an existing PR or to create a new one. Use the `--pr` flag to specify the PR you are trying to update: + +```sh +node scripts/relocate --pr +``` + +Note that when specifying an existing PR, the logic will undo + rewrite history for that PR, by force-pushing changes. + +To relocate modules for a given team, identify the "team handle" (e.g. @elastic/kibana-core), and run the following command from the root of the Kibana repo: + +```sh +node scripts/relocate --pr --team +``` + +You can relocate modules by path, e.g. all modules that are under `x-pack/plugins/observability_solution/`: + +```sh +node scripts/relocate --pr --path "x-pack/plugins/observability_solution/" +``` + +You can specify indivual packages by ID: + +```sh +node scripts/relocate --pr --include "@kbn/data-forge" --include "@kbn/deeplinks-observability" +``` + +You can also specify combinations of the above filters, to include modules that match ANY of the criteria. +Excluding modules explictly is also supported: + +```sh +node scripts/relocate --pr --team "@elastic/obs-ux-management-team" --exclude "@kbn/data-forge" +``` + +## Details + +The script generates log / description files of the form `relocate_YYYYMMDDhhmmss_.out`. You can inspect them if you encounter any errors. + +In particular, the file `relocate_YYYYMMDDhhmmss_description.out` contains the auto-generated PR description. You can push it to the PR by running: + +```sh +gh pr edit -F relocate_YYYYMMDDhhmmss_description.out -R elastic/kibana +``` diff --git a/packages/kbn-relocate/constants.ts b/packages/kbn-relocate/constants.ts new file mode 100644 index 0000000000000..0ba7e9d50314b --- /dev/null +++ b/packages/kbn-relocate/constants.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import dedent from 'dedent'; + +export const BASE_FOLDER = process.cwd() + '/'; +export const BASE_FOLDER_DEPTH = process.cwd().split('/').length; +export const KIBANA_FOLDER = process.cwd().split('/').pop()!; +export const EXCLUDED_MODULES = ['@kbn/core']; +export const TARGET_FOLDERS = [ + 'src/platform/plugins/', + 'src/platform/packages/', + 'x-pack/platform/plugins/', + 'x-pack/platform/packages/', + 'x-pack/solutions/', +]; +export const EXTENSIONS = [ + 'eslintignore', + 'gitignore', + 'js', + 'mjs', + 'txt', + 'json', + 'lock', + 'bazel', + 'md', + 'mdz', + 'asciidoc', + 'sh', + 'ts', + 'jsonc', + 'yaml', + 'yml', +]; + +export const EXCLUDED_FOLDERS = [ + './api_docs', // autogenerated daily https://buildkite.com/elastic/kibana-api-docs-daily + './.chromium', + './.devcontainer', + './.es', + './.git', + // './.github', + './.native_modules', + './.node_binaries', + './.vscode', + './.yarn-local-mirror', + './build', + './core_http.codeql', + './data', + './node_modules', + './target', + './test.codeql', + './test2.codeql', + './trash', +]; + +export const NO_GREP = EXCLUDED_FOLDERS.map((f) => `--exclude-dir "${f}"`).join(' '); + +// These two constants are singletons, used and updated throughout the process +export const UPDATED_REFERENCES = new Set(); +export const UPDATED_RELATIVE_PATHS = new Set(); +export const SCRIPT_ERRORS: string[] = []; + +export const YMDMS = new Date() + .toISOString() + .replace(/[^0-9]/g, '') + .slice(0, -3); + +export const DESCRIPTION = `relocate_${YMDMS}_description.out`; +export const NEW_BRANCH = `kbn-team-1309-relocate-${YMDMS}`; + +export const GLOBAL_DESCRIPTION = dedent` +## Summary + +This PR aims at relocating some of the Kibana modules (plugins and packages) into a new folder structure, according to the _Sustainable Kibana Architecture_ initiative. + +> [!IMPORTANT] +> * We kindly ask you to: +> * Manually fix the errors in the error section below (if there are any). +> * Search for the \`packages[\/\\]\` and \`plugins[\/\\]\` patterns in the source code (Babel and Eslint config files), and update them appropriately. +> * Manually review \`.buildkite/scripts/pipelines/pull_request/pipeline.ts\` to ensure that any CI pipeline customizations continue to be correctly applied after the changed path names +> * Review all of the updated files, specially the \`.ts\` and \`.js\` files listed in the sections below, as some of them contain relative paths that have been updated. +> * Think of potential impact of the move, including tooling and configuration files that can be pointing to the relocated modules. E.g.: +> * customised eslint rules +> * docs pointing to source code + +> [!NOTE] +> * This PR has been auto-generated. +> * Any manual contributions will be lost if the 'relocate' script is re-run. +> * Try to obtain the missing reviews / approvals before applying manual fixes, and/or keep your changes in a .patch / git stash. +> * Please use [#sustainable_kibana_architecture](https://elastic.slack.com/archives/C07TCKTA22E) Slack channel for feedback. + +`; diff --git a/packages/kbn-relocate/index.ts b/packages/kbn-relocate/index.ts new file mode 100644 index 0000000000000..cddaa307ab7b6 --- /dev/null +++ b/packages/kbn-relocate/index.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { run } from '@kbn/dev-cli-runner'; +import { findAndRelocateModules, findAndMoveModule } from './relocate'; + +const toStringArray = (flag: string | boolean | string[] | undefined): string[] => { + if (typeof flag === 'string') { + return [flag].filter(Boolean); + } else if (typeof flag === 'boolean') { + return []; + } else if (Array.isArray(flag)) { + return flag.filter(Boolean); + } + return []; +}; + +const toOptString = ( + flagName: string, + flag: string | boolean | string[] | undefined, + defaultValue?: string +): string | undefined => { + if (typeof flag === 'boolean') { + throw Error(`You must specify a valid string for the --${flagName} flag`); + } else if (Array.isArray(flag)) { + throw Error(`Cannot specify multiple values for --${flagName} flag`); + } + return flag || defaultValue; +}; + +/** + * A CLI to move Kibana modules into the right folder structure, + * according to the Sustainable Kibana Architecture + */ +export const runKbnRelocateCli = () => { + run( + async ({ log, flags }) => { + if (typeof flags.moveOnly === 'string' && flags.moveOnly.length > 0) { + log.info('When using --moveOnly flag, the rest of flags are ignored.'); + await findAndMoveModule(flags.moveOnly, log); + } else { + const { pr, team, path, include, exclude, baseBranch } = flags; + await findAndRelocateModules({ + prNumber: toOptString('prNumber', pr), + baseBranch: toOptString('baseBranch', baseBranch, 'main')!, + teams: toStringArray(team), + paths: toStringArray(path), + included: toStringArray(include), + excluded: toStringArray(exclude), + log, + }); + } + }, + { + log: { + defaultLevel: 'info', + }, + flags: { + string: ['pr', 'team', 'path', 'include', 'exclude', 'baseBranch', 'moveOnly'], + help: ` + Usage: node scripts/relocate [options] + + --moveOnly Only move the specified module in the current branch (no cleanup, no branching, no commit) + --pr Use the given PR number instead of creating a new one + --team Include all modules (packages and plugins) belonging to the specified owner (can specify multiple teams) + --path Include all modules (packages and plugins) under the specified path (can specify multiple paths) + --include Include the specified module in the relocation (can specify multiple modules) + --exclude Exclude the specified module from the relocation (can use multiple times) + --baseBranch Use a branch different than 'main' (e.g. "8.x") + + E.g. relocate all modules owned by Core team and also modules owned by Operations team, excluding 'foo-module-id'. Force push into PR 239847: + node scripts/relocate --pr 239847 --team @elastic/kibana-core --team @elastic/kibana-operations --exclude @kbn/foo-module-id + `, + }, + } + ); +}; diff --git a/packages/kbn-relocate/jest.config.js b/packages/kbn-relocate/jest.config.js new file mode 100644 index 0000000000000..f63ccebc0ab46 --- /dev/null +++ b/packages/kbn-relocate/jest.config.js @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../..', + roots: ['/packages/kbn-relocate'], +}; diff --git a/packages/kbn-relocate/kibana.jsonc b/packages/kbn-relocate/kibana.jsonc new file mode 100644 index 0000000000000..bae4e5f6e9c60 --- /dev/null +++ b/packages/kbn-relocate/kibana.jsonc @@ -0,0 +1,6 @@ +{ + "type": "shared-server", + "id": "@kbn/relocate", + "owner": "@elastic/kibana-core", + "devOnly": true +} diff --git a/packages/kbn-relocate/package.json b/packages/kbn-relocate/package.json new file mode 100644 index 0000000000000..5091a883ce6a5 --- /dev/null +++ b/packages/kbn-relocate/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/relocate", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} diff --git a/packages/kbn-relocate/relocate.ts b/packages/kbn-relocate/relocate.ts new file mode 100644 index 0000000000000..646a3ba5bef0e --- /dev/null +++ b/packages/kbn-relocate/relocate.ts @@ -0,0 +1,222 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { join } from 'path'; +import { existsSync } from 'fs'; +import { rename, mkdir, rm } from 'fs/promises'; +import inquirer from 'inquirer'; +import { orderBy } from 'lodash'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { getPackages } from '@kbn/repo-packages'; +import { REPO_ROOT } from '@kbn/repo-info'; +import type { Package } from './types'; +import { + DESCRIPTION, + EXCLUDED_MODULES, + KIBANA_FOLDER, + NEW_BRANCH, + TARGET_FOLDERS, +} from './constants'; +import { + belongsTo, + calculateModuleTargetFolder, + replaceReferences, + replaceRelativePaths, +} from './utils.relocate'; +import { safeExec } from './utils.exec'; +import { relocatePlan, relocateSummary } from './utils.logging'; +import { checkoutBranch, checkoutResetPr } from './utils.git'; + +const moveModule = async (module: Package, log: ToolingLog) => { + const destination = calculateModuleTargetFolder(module); + log.info(`Moving ${module.directory} to ${destination}`); + const chunks = destination.split('/'); + chunks.pop(); // discard module folder + if (existsSync(destination)) { + await rm(destination, { recursive: true }); + } + await mkdir(join('/', ...chunks), { recursive: true }); + await rename(module.directory, destination); + await replaceReferences(module, destination, log); + await replaceRelativePaths(module, destination, log); +}; + +const relocateModules = async (toMove: Package[], log: ToolingLog): Promise => { + let relocated: number = 0; + for (let i = 0; i < toMove.length; ++i) { + const module = toMove[i]; + + if (TARGET_FOLDERS.some((folder) => module.directory.includes(folder))) { + log.warning(`The module ${module.id} is already in a "sustainable" folder. Skipping`); + // skip modules that are already moved + continue; + } + log.info(''); + log.info('--------------------------------------------------------------------------------'); + log.info(`\t${module.id} (${i + 1} of ${toMove.length})`); + log.info('--------------------------------------------------------------------------------'); + await moveModule(module, log); + + // after move operations + await safeExec('yarn kbn bootstrap'); + await safeExec('node scripts/build_plugin_list_docs'); + await safeExec('node scripts/generate codeowners'); + await safeExec('node scripts/lint_packages --fix'); + await safeExec('node scripts/eslint --no-cache --fix'); + await safeExec('node scripts/precommit_hook --fix'); + + // single commit per module now + await safeExec(`git add .`); + await safeExec(`git commit -m "Relocating module \\\`${module.id}\\\`"`); + ++relocated; + } + return relocated; +}; + +interface FindModulesParams { + teams: string[]; + paths: string[]; + included: string[]; + excluded: string[]; +} + +export interface RelocateModulesParams { + baseBranch: string; + prNumber?: string; + teams: string[]; + paths: string[]; + included: string[]; + excluded: string[]; + log: ToolingLog; +} + +const findModules = ({ teams, paths, included, excluded }: FindModulesParams) => { + // get all modules + const modules = getPackages(REPO_ROOT); + + // find modules selected by user filters + return orderBy( + modules + // exclude devOnly modules (they will remain in /packages) + .filter(({ manifest }) => !manifest.devOnly) + // exclude modules that do not specify a group + .filter(({ manifest }) => manifest.group) + // explicit exclusions + .filter(({ id }) => !EXCLUDED_MODULES.includes(id) && !excluded.includes(id)) + // we don't want to move test modules (just yet) + .filter( + ({ directory }) => + !directory.includes(`/${KIBANA_FOLDER}/test/`) && + !directory.includes(`/${KIBANA_FOLDER}/x-pack/test/`) + ) + // the module is under the umbrella specified by the user + .filter( + (module) => + included.includes(module.id) || + teams.some((team) => belongsTo(module, team)) || + paths.some((path) => module.directory.includes(path)) + ) + // the module is not explicitly excluded + .filter(({ id }) => !excluded.includes(id)), + 'id' + ); +}; + +export const findAndMoveModule = async (moduleId: string, log: ToolingLog) => { + const modules = findModules({ teams: [], paths: [], included: [moduleId], excluded: [] }); + if (!modules.length) { + log.warning(`Cannot move ${moduleId}, either not found or not allowed!`); + } else { + await moveModule(modules[0], log); + } +}; + +export const findAndRelocateModules = async (params: RelocateModulesParams) => { + const { prNumber, log, baseBranch, ...findParams } = params; + + const toMove = findModules(findParams); + if (!toMove.length) { + log.info( + `No packages match the specified filters. Please tune your '--path' and/or '--team' and/or '--include' flags` + ); + return; + } + + relocatePlan(toMove, log); + const res1 = await inquirer.prompt({ + type: 'confirm', + name: 'confirmPlan', + message: `The script will RESET CHANGES in this repository, relocate the modules above and update references. Proceed?`, + }); + + if (!res1.confirmPlan) { + log.info('Aborting'); + return; + } + + // start with a clean repo + await safeExec(`git restore --staged .`); + await safeExec(`git restore .`); + await safeExec(`git clean -f -d`); + await safeExec(`git checkout ${baseBranch} && git pull upstream ${baseBranch}`); + + if (prNumber) { + // checkout existing PR, reset all commits, rebase from baseBranch + try { + if (!(await checkoutResetPr(baseBranch, prNumber))) { + log.info('Aborting'); + return; + } + } catch (error) { + log.error(`Error checking out / resetting PR #${prNumber}:`); + log.error(error); + return; + } + } else { + // checkout [new] branch + await checkoutBranch(NEW_BRANCH); + } + + // relocate modules + await safeExec(`yarn kbn bootstrap`); + const movedCount = await relocateModules(toMove, log); + + if (movedCount === 0) { + log.warning( + 'No modules were relocated, aborting operation to prevent force-pushing empty changes (this would close the existing PR!)' + ); + return; + } + relocateSummary(log); + + // push changes in the branch + const res2 = await inquirer.prompt({ + type: 'confirm', + name: 'pushBranch', + message: `Relocation finished! You can commit extra changes at this point. Confirm to proceed pushing the current branch`, + }); + + const pushCmd = prNumber + ? `git push --force-with-lease` + : `git push --set-upstream origin ${NEW_BRANCH}`; + + if (!res2.pushBranch) { + log.info(`Remember to push changes with "${pushCmd}"`); + return; + } + await safeExec(pushCmd); + + if (prNumber) { + await safeExec(`gh pr edit ${prNumber} -F ${DESCRIPTION} -R elastic/kibana`); + log.info(`Access the PR at: https://github.com/elastic/kibana/pull/${prNumber}`); + } else { + log.info('TIP: Run the following command to quickly create a PR:'); + log.info(`$ gh pr create -d -t "" -F ${DESCRIPTION} -R elastic/kibana`); + } +}; diff --git a/packages/kbn-relocate/transforms.ts b/packages/kbn-relocate/transforms.ts new file mode 100644 index 0000000000000..72f57a24daa00 --- /dev/null +++ b/packages/kbn-relocate/transforms.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { Package } from './types'; + +type TransformFunction = (param: string) => string; +const TRANSFORMS: Record<string, string | TransformFunction> = { + 'x-pack/solutions/security/packages/security-solution/': 'x-pack/solutions/security/packages/', + 'x-pack/solutions/observability/plugins/observability_solution/': + 'x-pack/solutions/observability/plugins/', + 'x-pack/solutions/observability/packages/observability/': + 'x-pack/solutions/observability/packages/', + 'src/core/packages/core/': (path: string) => { + const relativePath = path.split('src/core/packages/')[1]; + const relativeChunks = relativePath.split('/'); + const packageName = relativeChunks.pop(); + const unneededPrefix = relativeChunks.join('-') + '-'; + + // strip the spare /core/ folder + path = path.replace('src/core/packages/core/', 'src/core/packages/'); + + if (packageName?.startsWith(unneededPrefix)) { + return path.replace(unneededPrefix, ''); + } else { + return path; + } + }, +}; +export const applyTransforms = (module: Package, path: string): string => { + const transform = Object.entries(TRANSFORMS).find(([what]) => path.includes(what)); + if (!transform) { + return path; + } else { + const [what, by] = transform; + if (typeof by === 'function') { + return by(path); + } else if (typeof by === 'string') { + return path.replace(what, by); + } else { + throw new Error('Invalid transform function', by); + } + } +}; diff --git a/packages/kbn-relocate/tsconfig.json b/packages/kbn-relocate/tsconfig.json new file mode 100644 index 0000000000000..cd11268486134 --- /dev/null +++ b/packages/kbn-relocate/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/dev-cli-runner", + "@kbn/repo-info", + "@kbn/repo-packages", + "@kbn/tooling-log", + ] +} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/empty_embeddable.tsx b/packages/kbn-relocate/types.ts similarity index 55% rename from src/plugins/embeddable/public/lib/test_samples/embeddables/empty_embeddable.tsx rename to packages/kbn-relocate/types.ts index f05f4f8153e8c..391cef336d639 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/empty_embeddable.tsx +++ b/packages/kbn-relocate/types.ts @@ -7,15 +7,19 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { Embeddable, EmbeddableInput, EmbeddableOutput } from '../..'; +export type { Package } from '@kbn/repo-packages'; -export const EMPTY_EMBEDDABLE = 'EMPTY_EMBEDDABLE'; +export interface CommitAuthor { + login: string; +} + +export interface Commit { + messageHeadline: string; + authors: CommitAuthor[]; +} -export class EmptyEmbeddable extends Embeddable<EmbeddableInput, EmbeddableOutput> { - public readonly type = EMPTY_EMBEDDABLE; - constructor(initialInput: EmbeddableInput) { - super(initialInput, {}); - } - public render() {} - public reload() {} +export interface PullRequest { + number: string; + commits: Commit[]; + headRefName: string; } diff --git a/packages/kbn-relocate/utils.exec.ts b/packages/kbn-relocate/utils.exec.ts new file mode 100644 index 0000000000000..afd9391dfcab5 --- /dev/null +++ b/packages/kbn-relocate/utils.exec.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import util from 'util'; +import { exec } from 'child_process'; + +export const execAsync = util.promisify(exec); + +export const safeExec = async (command: string, critical = true, log = true) => { + try { + if (log) { + // eslint-disable-next-line no-console + console.log(' >', command); + } + const result = await execAsync(command, { maxBuffer: 1024 * 1024 * 128 }); + return result; + } catch (err) { + const message = `Error executing ${command}: ${err}`; + + if (critical) { + throw err; + } + return { stdout: '', stderr: message }; + } +}; + +export const quietExec = async (command: string) => { + return await safeExec(command, false, false); +}; diff --git a/packages/kbn-relocate/utils.git.ts b/packages/kbn-relocate/utils.git.ts new file mode 100644 index 0000000000000..743e6522c585b --- /dev/null +++ b/packages/kbn-relocate/utils.git.ts @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import inquirer from 'inquirer'; +import type { Commit, PullRequest } from './types'; +import { safeExec } from './utils.exec'; + +export const findPr = async (number: string): Promise<PullRequest> => { + const res = await safeExec(`gh pr view ${number} --json commits,headRefName`); + return { ...JSON.parse(res.stdout), number }; +}; + +export function hasManualCommits(commits: Commit[]) { + const manualCommits = commits.filter( + (commit) => + !commit.messageHeadline.startsWith('Relocating module ') && + !commit.messageHeadline.startsWith('Moving modules owned by ') && + commit.authors.some((author) => author.login !== 'kibanamachine') + ); + + return manualCommits.length > 0; +} + +export async function getLastCommitMessage() { + return (await safeExec('git log -1 --pretty=%B')).stdout.split('\n')[0]; +} + +export async function resetAllCommits(numCommits: number) { + await safeExec(`git reset --hard HEAD~${numCommits}`); + + let msg = await getLastCommitMessage(); + while (msg.startsWith('Relocating module ')) { + await safeExec(`git reset --hard HEAD~1`); + msg = await getLastCommitMessage(); + } + await safeExec('git restore --staged .'); + await safeExec('git restore .'); + await safeExec('git clean -f -d'); +} + +export async function localBranchExists(branchName: string): Promise<boolean> { + const res = await safeExec('git branch -l'); + const branches = res.stdout + .split('\n') + .filter(Boolean) + .map((name) => name.trim()); + return branches.includes(branchName); +} + +async function deleteBranches(...branchNames: string[]) { + const res = await safeExec('git branch -l'); + const branches = res.stdout + .split('\n') + .filter(Boolean) + .map((branchName) => branchName.trim()); + + await Promise.all( + branchNames + .filter((toDelete) => branches.includes(toDelete)) + .map((toDelete) => safeExec(`git branch -D ${toDelete}`).catch(() => {})) + ); +} + +export const checkoutResetPr = async (baseBranch: string, prNumber: string): Promise<boolean> => { + const pr = await findPr(prNumber); + + if (hasManualCommits(pr.commits)) { + const res = await inquirer.prompt({ + type: 'confirm', + name: 'overrideManualCommits', + message: 'Detected manual commits in the PR, do you want to override them?', + }); + if (!res.overrideManualCommits) { + return false; + } + } + + // previous cleanup on current branch + await safeExec(`git restore --staged .`); + await safeExec(`git restore .`); + await safeExec(`git clean -f -d`); + + // delete existing branch + await deleteBranches(pr.headRefName); + + // checkout the PR branch + await safeExec(`gh pr checkout ${prNumber}`); + await resetAllCommits(pr.commits.length); + await safeExec(`git rebase ${baseBranch}`); + return true; +}; + +export const checkoutBranch = async (branch: string) => { + // create a new branch / PR + if (await localBranchExists(branch)) { + throw new Error('The local branch already exists, aborting!'); + } else { + await safeExec(`git checkout -b ${branch}`); + } +}; diff --git a/packages/kbn-relocate/utils.logging.ts b/packages/kbn-relocate/utils.logging.ts new file mode 100644 index 0000000000000..5b290292dd75e --- /dev/null +++ b/packages/kbn-relocate/utils.logging.ts @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { ToolingLog } from '@kbn/tooling-log'; +import { appendFileSync, writeFileSync } from 'fs'; +import dedent from 'dedent'; +import type { Package } from './types'; +import { calculateModuleTargetFolder } from './utils.relocate'; +import { + BASE_FOLDER, + DESCRIPTION, + GLOBAL_DESCRIPTION, + SCRIPT_ERRORS, + UPDATED_REFERENCES, + UPDATED_RELATIVE_PATHS, +} from './constants'; + +export const relocatePlan = (modules: Package[], log: ToolingLog) => { + const plugins = modules.filter((module) => module.manifest.type === 'plugin'); + const packages = modules.filter((module) => module.manifest.type !== 'plugin'); + + const target = (module: Package) => calculateModuleTargetFolder(module).replace(BASE_FOLDER, ''); + writeFileSync(DESCRIPTION, GLOBAL_DESCRIPTION); + + if (plugins.length) { + const pluginList = dedent` + \n\n#### ${plugins.length} plugin(s) are going to be relocated:\n + | Id | Target folder | + | -- | ------------- | + ${plugins.map((plg) => `| \`${plg.id}\` | \`${target(plg)}\` |`).join('\n')} + \n\n`; + + appendFileSync(DESCRIPTION, pluginList); + log.info( + `${plugins.length} plugin(s) are going to be relocated:\n${plugins + .map((plg) => `${plg.id} => ${target(plg)}`) + .join('\n')}` + ); + } + + if (packages.length) { + const packageList = dedent` + \n\n#### ${packages.length} packages(s) are going to be relocated:\n + | Id | Target folder | + | -- | ------------- | + ${packages.map((pkg) => `| \`${pkg.id}\` | \`${target(pkg)}\` |`).join('\n')} + \n\n`; + + appendFileSync(DESCRIPTION, packageList); + log.info( + `${packages.length} packages(s) are going to be relocated:\n${packages + .map((plg) => `${plg.id} => ${target(plg)}`) + .join('\n')}` + ); + } +}; + +export const appendCollapsible = ( + fileName: string, + title: string, + contents: string, + open = false +) => { + appendFileSync( + fileName, + dedent` + <details ${open ? 'open' : ''}> + <summary>${title}</summary> + + \`\`\` + ${contents} + \`\`\` + + </details>` + ); +}; + +export const relocateSummary = (log: ToolingLog) => { + if (SCRIPT_ERRORS.length > 0) { + const contents = SCRIPT_ERRORS.sort().join('\n'); + appendCollapsible(DESCRIPTION, 'Script errors', contents, true); + log.warning(`Please address the following errors:\n${contents}`); + } + + if (UPDATED_REFERENCES.size > 0) { + const contents = Array.from(UPDATED_REFERENCES).sort().join('\n'); + appendCollapsible(DESCRIPTION, 'Updated references', contents); + log.info( + `The following files have been updated to replace references to modules:\n${contents}` + ); + } + + if (UPDATED_RELATIVE_PATHS.size > 0) { + const contents = Array.from(UPDATED_RELATIVE_PATHS) + .sort() + .map((ref) => ref.replace(BASE_FOLDER, '')) + .join('\n'); + appendCollapsible(DESCRIPTION, 'Updated relative paths', contents); + log.info(`The following files contain relative paths that have been updated:\n${contents}`); + } +}; diff --git a/packages/kbn-relocate/utils.relocate.ts b/packages/kbn-relocate/utils.relocate.ts new file mode 100644 index 0000000000000..c76c1f48790ba --- /dev/null +++ b/packages/kbn-relocate/utils.relocate.ts @@ -0,0 +1,210 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { join } from 'path'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { orderBy } from 'lodash'; +import type { Package } from './types'; +import { applyTransforms } from './transforms'; +import { + BASE_FOLDER, + BASE_FOLDER_DEPTH, + EXTENSIONS, + KIBANA_FOLDER, + NO_GREP, + SCRIPT_ERRORS, + TARGET_FOLDERS, + UPDATED_REFERENCES, + UPDATED_RELATIVE_PATHS, +} from './constants'; +import { quietExec, safeExec } from './utils.exec'; + +export const belongsTo = (module: Package, owner: string): boolean => { + return Array.from(module.manifest.owner)[0] === owner; +}; + +export const stripFirstChunk = (path: string): string => { + const chunks = path.split('/'); + chunks.shift(); + return chunks.join('/'); +}; + +export const calculateModuleTargetFolder = (module: Package): string => { + const group = module.manifest.group!; + const isPlugin = module.manifest.type === 'plugin'; + const fullPath = join(BASE_FOLDER, module.directory); + let moduleDelimiter = isPlugin ? '/plugins/' : '/packages/'; + if (TARGET_FOLDERS.some((folder) => module.directory.includes(folder)) && group === 'platform') { + // if a platform module has already been relocated, strip the /private/ or /shared/ part too + moduleDelimiter += `${module.visibility}/`; + } + const moduleFolder = fullPath.split(moduleDelimiter).pop()!; + let path: string; + + if (group === 'platform') { + if (fullPath.includes(`/${KIBANA_FOLDER}/packages/core/`)) { + // packages/core/* => src/core/packages/* + path = join(BASE_FOLDER, 'src', 'core', 'packages', moduleFolder); + } else { + const isXpack = fullPath.includes(`/${KIBANA_FOLDER}/x-pack/`); + const visibility = module.manifest.visibility!; + + path = join( + BASE_FOLDER, + isXpack ? 'x-pack' : 'src', + group, + isPlugin ? 'plugins' : 'packages', + visibility, + moduleFolder + ); + } + } else { + path = join( + BASE_FOLDER, + 'x-pack', // all solution modules are 'x-pack' + 'solutions', + group, + isPlugin ? 'plugins' : 'packages', + moduleFolder + ); + } + + // after-creation transforms + return applyTransforms(module, path); +}; + +export const replaceReferences = async (module: Package, destination: string, log: ToolingLog) => { + const dir = module.directory; + const source = + dir.startsWith(KIBANA_FOLDER) || dir.startsWith(`/${KIBANA_FOLDER}`) + ? join(BASE_FOLDER, dir) + : dir; + const relativeSource = source.replace(BASE_FOLDER, ''); + const relativeDestination = destination.replace(BASE_FOLDER, ''); + + if ( + (relativeSource.startsWith('src') && relativeDestination.startsWith('src')) || + (relativeSource.startsWith('x-pack') && relativeDestination.startsWith('x-pack')) + ) { + await replaceReferencesInternal( + stripFirstChunk(relativeSource), + stripFirstChunk(relativeDestination), + log + ); + } else { + await replaceReferencesInternal(relativeSource, relativeDestination, log); + } +}; + +const replaceReferencesInternal = async ( + relativeSource: string, + relativeDestination: string, + log: ToolingLog +) => { + log.info(`Finding and replacing "${relativeSource}" by "${relativeDestination}"`); + + const src = relativeSource.replaceAll('/', '\\/'); + const dst = relativeDestination.replaceAll('/', '\\/'); + + const result = await safeExec( + `grep -I -s -R -l ${EXTENSIONS.map((ext) => `--include="*.${ext}"`).join(' ')} \ + ${NO_GREP} "${relativeSource}"`, + false + ); + + const matchingFiles = result.stdout.split('\n').filter(Boolean); + + for (let i = 0; i < matchingFiles.length; ++i) { + const file = matchingFiles[i]; + if (file.includes('/target/types/') || file.includes('/target/public/')) { + continue; + } + + const md5Before = (await quietExec(`md5 ${file} --quiet`)).stdout.trim(); + // if we are updating packages/cloud references, we must pay attention to not update packages/cloud_defend too + await safeExec(`sed -i '' -E "/${src}[\-_a-zA-Z0-9]/! s/${src}/${dst}/g" ${file}`, false); + const md5After = (await quietExec(`md5 ${file} --quiet`)).stdout.trim(); + + if (md5Before !== md5After) { + UPDATED_REFERENCES.add(file); + } + } + + // plugins\/pluginName special treatment (.buildkite/scripts/pipelines/pull_request/pipeline.ts) + const backFwdSrc = relativeSource.replaceAll('/', `\\\\\\/`); + const backFwdDst = relativeDestination.replaceAll('/', `\\\\\\/`); + await safeExec( + `sed -i '' -E '/${src}[\-_a-zA-Z0-9]/! s/${backFwdSrc}/${backFwdDst}/g' .buildkite/scripts/pipelines/pull_request/pipeline.ts`, + false + ); +}; + +const getRelativeDepth = (directory: string): number => { + const fullPath = directory.startsWith(BASE_FOLDER) ? directory : join(BASE_FOLDER, directory); + return fullPath.split('/').length - BASE_FOLDER_DEPTH; +}; + +export const replaceRelativePaths = async ( + module: Package, + destination: string, + log: ToolingLog +) => { + log.info('Updating relative paths at fault'); + + const relativeDepthBefore = getRelativeDepth(module.directory); + const relativeDepthAfter = getRelativeDepth(destination); + const relativeDepthDiff = relativeDepthAfter - relativeDepthBefore; + + const result = await safeExec( + `grep -I -s -R -n -o ${NO_GREP} -E "\\.\\.(/\\.\\.)+/?" ${destination}`, + false + ); + const matches = result.stdout.split('\n').filter(Boolean); + + const brokenReferences = orderBy( + matches + .map((line) => line.split(':')) + .map(([path, line, match]) => { + if (match.endsWith('/')) { + match = match.substring(0, match.length - 1); + } + let moduleRelativePath = path.replace(destination, ''); + if (moduleRelativePath.startsWith('/')) { + moduleRelativePath = moduleRelativePath.substring(1); + } + const moduleRelativeDepth = moduleRelativePath.split('/').length - 1; // do not count filename + const matchDepth = match.split('/').length; + + return { path, line, moduleRelativeDepth, match, matchDepth }; + }) + .filter(({ matchDepth, moduleRelativeDepth }) => matchDepth > moduleRelativeDepth), + 'matchDepth', + 'desc' + ); + + for (let i = 0; i < brokenReferences.length; ++i) { + const { path, line, match, matchDepth } = brokenReferences[i]; + + if (path.includes('/target/types/') || path.includes('/target/public/')) { + continue; + } + const pathLine = `${path}:${line}`; + + if (UPDATED_RELATIVE_PATHS.has(pathLine)) { + const message = `Cannot replace multiple occurrences of "${match}" in the same line, please fix manually:\t${pathLine}`; + SCRIPT_ERRORS.push(message); + } else { + const escapedMatch = match.replaceAll('/', '\\/').replaceAll('.', '\\.'); // escape '.' too (regexp any char) + const escapedReplacement = new Array(matchDepth + relativeDepthDiff).fill('..').join('\\/'); + + await safeExec(`sed -i '' "${line}s/${escapedMatch}/${escapedReplacement}/" ${path}`, false); + UPDATED_RELATIVE_PATHS.add(pathLine); + } + } +}; diff --git a/packages/kbn-scout/index.ts b/packages/kbn-scout/index.ts index 5cb95662f4228..733d0bae1ecd1 100644 --- a/packages/kbn-scout/index.ts +++ b/packages/kbn-scout/index.ts @@ -8,7 +8,7 @@ */ export * as cli from './src/cli'; -export { expect, test, createPlaywrightConfig, createLazyPageObject } from './src/playwright'; +export { expect, test, tags, createPlaywrightConfig, createLazyPageObject } from './src/playwright'; export type { ScoutPage, ScoutPlaywrightOptions, diff --git a/packages/kbn-scout/src/config/serverless/es.serverless.config.ts b/packages/kbn-scout/src/config/serverless/es.serverless.config.ts index 89e27b4e877e0..0ae2c7e6f0b3f 100644 --- a/packages/kbn-scout/src/config/serverless/es.serverless.config.ts +++ b/packages/kbn-scout/src/config/serverless/es.serverless.config.ts @@ -17,6 +17,7 @@ export const servers: ScoutLoaderConfig = { serverArgs: [...defaultConfig.esTestCluster.serverArgs], }, kbnTestServer: { + ...defaultConfig.kbnTestServer, serverArgs: [ ...defaultConfig.kbnTestServer.serverArgs, '--serverless=es', diff --git a/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts b/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts index 3f283f140479e..08eb4d9d7cf55 100644 --- a/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts +++ b/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts @@ -22,6 +22,7 @@ export const servers: ScoutLoaderConfig = { ], }, kbnTestServer: { + ...defaultConfig.kbnTestServer, serverArgs: [ ...defaultConfig.kbnTestServer.serverArgs, '--serverless=oblt', diff --git a/packages/kbn-scout/src/config/serverless/security.serverless.config.ts b/packages/kbn-scout/src/config/serverless/security.serverless.config.ts index f1fa4f53f8988..289790a9ffeb1 100644 --- a/packages/kbn-scout/src/config/serverless/security.serverless.config.ts +++ b/packages/kbn-scout/src/config/serverless/security.serverless.config.ts @@ -20,6 +20,7 @@ export const servers: ScoutLoaderConfig = { ], }, kbnTestServer: { + ...defaultConfig.kbnTestServer, serverArgs: [ ...defaultConfig.kbnTestServer.serverArgs, '--serverless=security', diff --git a/packages/kbn-scout/src/config/serverless/serverless.base.config.ts b/packages/kbn-scout/src/config/serverless/serverless.base.config.ts index 8b4852f9c9e62..a20a0c3bbe7a7 100644 --- a/packages/kbn-scout/src/config/serverless/serverless.base.config.ts +++ b/packages/kbn-scout/src/config/serverless/serverless.base.config.ts @@ -80,6 +80,11 @@ export const defaultConfig: ScoutLoaderConfig = { 'xpack.security.authc.realms.jwt.jwt1.order=-98', `xpack.security.authc.realms.jwt.jwt1.pkc_jwkset_path=${getDockerFileMountPath(JWKS_PATH)}`, `xpack.security.authc.realms.jwt.jwt1.token_type=access_token`, + 'serverless.indices.validate_dot_prefixes=true', + // controller cluster-settings + `cluster.service.slow_task_logging_threshold=15s`, + `cluster.service.slow_task_thread_dump_timeout=5s`, + `serverless.search.enable_replicas_for_instant_failover=true`, ], ssl: true, // SSL is required for SAML realm }, @@ -136,7 +141,15 @@ export const defaultConfig: ScoutLoaderConfig = { // This ensures that we register the Security SAML API endpoints. // In the real world the SAML config is injected by control plane. `--plugin-path=${SAML_IDP_PLUGIN_PATH}`, + '--xpack.cloud.base_url=https://fake-cloud.elastic.co', + '--xpack.cloud.billing_url=/billing/overview/', + '--xpack.cloud.deployments_url=/deployments', '--xpack.cloud.id=ftr_fake_cloud_id', + '--xpack.cloud.organization_url=/account/', + '--xpack.cloud.profile_url=/user/settings/', + '--xpack.cloud.projects_url=/projects/', + '--xpack.cloud.serverless.project_id=fakeprojectid', + '--xpack.cloud.users_and_roles_url=/account/members/', // Ensure that SAML is used as the default authentication method whenever a user navigates to Kibana. In other // words, Kibana should attempt to authenticate the user using the provider with the lowest order if the Login // Selector is disabled (which is how Serverless Kibana is configured). By declaring `cloud-basic` with a higher diff --git a/packages/kbn-scout/src/playwright/fixtures/test/index.ts b/packages/kbn-scout/src/playwright/fixtures/test/index.ts index 41bfedcf39dc7..3e2ea85b90bc3 100644 --- a/packages/kbn-scout/src/playwright/fixtures/test/index.ts +++ b/packages/kbn-scout/src/playwright/fixtures/test/index.ts @@ -11,9 +11,11 @@ import { mergeTests } from '@playwright/test'; import { browserAuthFixture } from './browser_auth'; import { scoutPageFixture } from './page'; import { pageObjectsFixture } from './page_objects'; +import { validateTagsFixture } from './validate_tags'; export const scoutTestFixtures = mergeTests( browserAuthFixture, scoutPageFixture, - pageObjectsFixture + pageObjectsFixture, + validateTagsFixture ); diff --git a/packages/kbn-scout/src/playwright/fixtures/test/validate_tags.ts b/packages/kbn-scout/src/playwright/fixtures/test/validate_tags.ts new file mode 100644 index 0000000000000..1866935440e1a --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/test/validate_tags.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { test as base } from '@playwright/test'; +import { tags } from '../../tags'; + +const supportedTags = tags.DEPLOYMENT_AGNOSTIC; + +export const validateTagsFixture = base.extend<{ validateTags: void }>({ + validateTags: [ + async ({}, use, testInfo) => { + if (testInfo.tags.length === 0) { + throw new Error(`At least one tag is required: ${supportedTags.join(', ')}`); + } + + const invalidTags = testInfo.tags.filter((tag: string) => !supportedTags.includes(tag)); + if (invalidTags.length > 0) { + throw new Error( + `Unsupported tag(s) found in test suite "${testInfo.title}": ${invalidTags.join( + ', ' + )}. ` + `Supported tags are: ${supportedTags.join(', ')}.` + ); + } + + await use(); + }, + { auto: true }, + ], +}); diff --git a/packages/kbn-scout/src/playwright/index.ts b/packages/kbn-scout/src/playwright/index.ts index 5294274c41bc5..0a82bc0468fce 100644 --- a/packages/kbn-scout/src/playwright/index.ts +++ b/packages/kbn-scout/src/playwright/index.ts @@ -25,3 +25,6 @@ export type { ScoutPage, EsArchiverFixture, } from './fixtures'; + +// use to tag tests +export { tags } from './tags'; diff --git a/packages/kbn-scout/src/playwright/runner/run_tests.ts b/packages/kbn-scout/src/playwright/runner/run_tests.ts index a5d8aa137dbfd..766209f169963 100644 --- a/packages/kbn-scout/src/playwright/runner/run_tests.ts +++ b/packages/kbn-scout/src/playwright/runner/run_tests.ts @@ -18,12 +18,14 @@ import { loadServersConfig } from '../../config'; import { silence } from '../../common'; import { RunTestsOptions } from './flags'; import { getExtraKbnOpts } from '../../servers/run_kibana_server'; +import { getPlaywrightGrepTag } from '../utils'; export async function runTests(log: ToolingLog, options: RunTestsOptions) { const runStartTime = Date.now(); - const reportTime = getTimeReporter(log, 'scripts/scout_test'); + const reportTime = getTimeReporter(log, 'scripts/scout run-tests'); const config = await loadServersConfig(options.mode, log); + const playwrightGrepTag = getPlaywrightGrepTag(config); const playwrightConfigPath = options.configPath; await withProcRunner(log, async (procs) => { @@ -59,7 +61,12 @@ export async function runTests(log: ToolingLog, options: RunTestsOptions) { // Running 'npx playwright test --config=${playwrightConfigPath}' await procs.run(`playwright`, { cmd: resolve(REPO_ROOT, './node_modules/.bin/playwright'), - args: ['test', `--config=${playwrightConfigPath}`, ...(options.headed ? ['--headed'] : [])], + args: [ + 'test', + `--config=${playwrightConfigPath}`, + `--grep=${playwrightGrepTag}`, + ...(options.headed ? ['--headed'] : []), + ], cwd: resolve(REPO_ROOT), env: { ...process.env, diff --git a/packages/kbn-scout/src/playwright/tags.ts b/packages/kbn-scout/src/playwright/tags.ts new file mode 100644 index 0000000000000..a022b6afd3430 --- /dev/null +++ b/packages/kbn-scout/src/playwright/tags.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +const SERVERLESS_ONLY = ['@svlSecurity', '@svlOblt', '@svlSearch']; +const ESS_ONLY = ['@ess']; +const DEPLOYMENT_AGNOSTIC = SERVERLESS_ONLY.concat(ESS_ONLY); + +export const tags = { + ESS_ONLY, + SERVERLESS_ONLY, + DEPLOYMENT_AGNOSTIC, +}; + +export const tagsByMode = { + stateful: '@ess', + serverless: { + es: '@svlSearch', + oblt: '@svlOblt', + security: '@svlSecurity', + }, +}; diff --git a/packages/kbn-scout/src/playwright/utils/index.ts b/packages/kbn-scout/src/playwright/utils/index.ts index 4b6fcafcbcfa8..8956c6d7cc18f 100644 --- a/packages/kbn-scout/src/playwright/utils/index.ts +++ b/packages/kbn-scout/src/playwright/utils/index.ts @@ -8,6 +8,8 @@ */ import moment from 'moment'; +import { Config } from '../../config'; +import { tagsByMode } from '../tags'; export const serviceLoadedMsg = (name: string) => `scout service loaded: ${name}`; @@ -18,3 +20,10 @@ export const isValidUTCDate = (date: string): boolean => { export function formatTime(date: string, fmt: string = 'MMM D, YYYY @ HH:mm:ss.SSS') { return moment.utc(date, fmt).format(); } + +export const getPlaywrightGrepTag = (config: Config): string => { + const serversConfig = config.getTestServersConfig(); + return serversConfig.serverless + ? tagsByMode.serverless[serversConfig.projectType!] + : tagsByMode.stateful; +}; diff --git a/packages/kbn-scout/src/types/config.d.ts b/packages/kbn-scout/src/types/config.d.ts index 2f0c3a764d65f..08c4bc5f3f9b0 100644 --- a/packages/kbn-scout/src/types/config.d.ts +++ b/packages/kbn-scout/src/types/config.d.ts @@ -25,9 +25,9 @@ export interface ScoutLoaderConfig { ssl: boolean; }; kbnTestServer: { - env?: any; - buildArgs?: string[]; - sourceArgs?: string[]; + env: any; + buildArgs: string[]; + sourceArgs: string[]; serverArgs: string[]; useDedicatedTestRunner?: boolean; }; diff --git a/packages/kbn-securitysolution-autocomplete/src/es_field_selector/__tests__/use_es_field.test.ts b/packages/kbn-securitysolution-autocomplete/src/es_field_selector/__tests__/use_es_field.test.ts index 49a4b0d5eb40f..942ccbc29c38e 100644 --- a/packages/kbn-securitysolution-autocomplete/src/es_field_selector/__tests__/use_es_field.test.ts +++ b/packages/kbn-securitysolution-autocomplete/src/es_field_selector/__tests__/use_es_field.test.ts @@ -9,11 +9,7 @@ import { DataViewFieldBase } from '@kbn/es-query'; import { ReactElement } from 'react'; -import { act } from '@testing-library/react'; - -import { renderHook } from '@testing-library/react-hooks'; -import TestRenderer from 'react-test-renderer'; -const { act: actTestRenderer } = TestRenderer; +import { act, renderHook } from '@testing-library/react'; import { fields } from '../../fields/index.mock'; import { useEsField } from '../use_es_field'; @@ -480,7 +476,7 @@ describe('useField', () => { useEsField({ indexPattern, onChange: onChangeMock, isRequired: true }) ); - actTestRenderer(() => { + act(() => { result.current.handleTouch(); }); expect(result.current.isInvalid).toBeTruthy(); @@ -490,7 +486,7 @@ describe('useField', () => { useEsField({ indexPattern, onChange: onChangeMock, isRequired: true, selectedField }) ); - actTestRenderer(() => { + act(() => { result.current.handleTouch(); }); expect(result.current.isInvalid).toBeFalsy(); @@ -498,7 +494,7 @@ describe('useField', () => { it('should return isInvalid equals false when isRequired is false', () => { const { result } = renderHook(() => useEsField({ indexPattern, onChange: onChangeMock })); - actTestRenderer(() => { + act(() => { result.current.handleTouch(); }); expect(result.current.isInvalid).toBeFalsy(); diff --git a/packages/kbn-securitysolution-autocomplete/src/hooks/use_field_value_autocomplete/index.test.ts b/packages/kbn-securitysolution-autocomplete/src/hooks/use_field_value_autocomplete/index.test.ts index aae858aa63087..836744f3ede28 100644 --- a/packages/kbn-securitysolution-autocomplete/src/hooks/use_field_value_autocomplete/index.test.ts +++ b/packages/kbn-securitysolution-autocomplete/src/hooks/use_field_value_autocomplete/index.test.ts @@ -7,14 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { ListOperatorTypeEnum as OperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; -import { - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn, - useFieldValueAutocomplete, -} from '.'; +import { UseFieldValueAutocompleteReturn, useFieldValueAutocomplete } from '.'; import { getField } from '../../fields/index.mock'; import { autocompleteStartMock } from '../../autocomplete/index.mock'; import { DataViewFieldBase } from '@kbn/es-query'; @@ -46,140 +42,115 @@ describe('use_field_value_autocomplete', () => { }); test('initializes hook', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: undefined, - operatorType: OperatorTypeEnum.MATCH, - query: '', - selectedField: undefined, - }) - ); - await waitForNextUpdate(); - - expect(result.current).toEqual([false, true, [], result.current[3]]); - }); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: undefined, + operatorType: OperatorTypeEnum.MATCH, + query: '', + selectedField: undefined, + }) + ); + await waitFor(() => expect(result.current).toEqual([false, true, [], result.current[3]])); }); test('does not call autocomplete service if "operatorType" is "exists"', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.EXISTS, - query: '', - selectedField: getField('machine.os'), - }) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.EXISTS, + query: '', + selectedField: getField('machine.os'), + }) + ); + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [false, true, [], result.current[3]]; - expect(getValueSuggestionsMock).not.toHaveBeenCalled(); expect(result.current).toEqual(expectedResult); + expect(getValueSuggestionsMock).not.toHaveBeenCalled(); }); }); test('does not call autocomplete service if "selectedField" is undefined', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.EXISTS, - query: '', - selectedField: undefined, - }) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.EXISTS, + query: '', + selectedField: undefined, + }) + ); + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [false, true, [], result.current[3]]; - expect(getValueSuggestionsMock).not.toHaveBeenCalled(); expect(result.current).toEqual(expectedResult); + expect(getValueSuggestionsMock).not.toHaveBeenCalled(); }); }); test('does not call autocomplete service if "indexPattern" is undefined', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: undefined, - operatorType: OperatorTypeEnum.EXISTS, - query: '', - selectedField: getField('machine.os'), - }) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: undefined, + operatorType: OperatorTypeEnum.EXISTS, + query: '', + selectedField: getField('machine.os'), + }) + ); + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [false, true, [], result.current[3]]; - expect(getValueSuggestionsMock).not.toHaveBeenCalled(); expect(result.current).toEqual(expectedResult); + expect(getValueSuggestionsMock).not.toHaveBeenCalled(); }); }); test('it uses full path name for nested fields to fetch suggestions', async () => { const suggestionsMock = jest.fn().mockResolvedValue([]); - await act(async () => { - const selectedField: DataViewFieldBase | undefined = getField('nestedField.child'); - if (selectedField == null) { - throw new TypeError('selectedField for this test should always be defined'); - } - - const { signal } = new AbortController(); - const { waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: suggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.MATCH, - query: '', - selectedField: { ...selectedField, name: 'child' }, - }) - ); - // Note: initial `waitForNextUpdate` is hook initialization - await waitForNextUpdate(); - await waitForNextUpdate(); + const selectedField: DataViewFieldBase | undefined = getField('nestedField.child'); + if (selectedField == null) { + throw new TypeError('selectedField for this test should always be defined'); + } + + const { signal } = new AbortController(); + renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: suggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.MATCH, + query: '', + selectedField: { ...selectedField, name: 'child' }, + }) + ); + await waitFor(() => expect(suggestionsMock).toHaveBeenCalledWith({ field: { ...getField('nestedField.child'), name: 'nestedField.child' }, indexPattern: { @@ -199,63 +170,51 @@ describe('use_field_value_autocomplete', () => { query: '', signal, useTimeRange: false, - }); - }); + }) + ); }); test('returns "isSuggestingValues" of false if field type is boolean', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.MATCH, - query: '', - selectedField: getField('ssl'), - }) - ); - // Note: initial `waitForNextUpdate` is hook initialization - await waitForNextUpdate(); - await waitForNextUpdate(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.MATCH, + query: '', + selectedField: getField('ssl'), + }) + ); + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [false, false, [], result.current[3]]; - expect(getValueSuggestionsMock).not.toHaveBeenCalled(); expect(result.current).toEqual(expectedResult); + expect(getValueSuggestionsMock).not.toHaveBeenCalled(); }); }); test('returns "isSuggestingValues" of false to note that autocomplete service is not in use if no autocomplete suggestions available', async () => { const suggestionsMock = jest.fn().mockResolvedValue([]); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: suggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.MATCH, - query: '', - selectedField: getField('bytes'), - }) - ); - // Note: initial `waitForNextUpdate` is hook initialization - await waitForNextUpdate(); - await waitForNextUpdate(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: suggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.MATCH, + query: '', + selectedField: getField('bytes'), + }) + ); + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [false, false, [], result.current[3]]; expect(suggestionsMock).toHaveBeenCalled(); @@ -264,28 +223,22 @@ describe('use_field_value_autocomplete', () => { }); test('returns suggestions', async () => { - await act(async () => { - const { signal } = new AbortController(); - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.MATCH, - query: '', - selectedField: getField('@tags'), - }) - ); - // Note: initial `waitForNextUpdate` is hook initialization - await waitForNextUpdate(); - await waitForNextUpdate(); + const { signal } = new AbortController(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.MATCH, + query: '', + selectedField: getField('@tags'), + }) + ); + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [ false, true, @@ -305,42 +258,34 @@ describe('use_field_value_autocomplete', () => { }); test('returns new suggestions on subsequent calls', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseFieldValueAutocompleteProps, - UseFieldValueAutocompleteReturn - >(() => - useFieldValueAutocomplete({ - autocompleteService: { - ...autocompleteStartMock, - getValueSuggestions: getValueSuggestionsMock, - }, - fieldValue: '', - indexPattern: stubIndexPatternWithFields, - operatorType: OperatorTypeEnum.MATCH, - query: '', - selectedField: getField('@tags'), - }) - ); - // Note: initial `waitForNextUpdate` is hook initialization - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current[3]).not.toBeNull(); - - // Added check for typescripts sake, if null, - // would not reach below logic as test would stop above - if (result.current[3] != null) { - result.current[3]({ - fieldSelected: getField('@tags'), - patterns: stubIndexPatternWithFields, - searchQuery: '', - value: 'hello', - }); - } - - await waitForNextUpdate(); + const { result } = renderHook(() => + useFieldValueAutocomplete({ + autocompleteService: { + ...autocompleteStartMock, + getValueSuggestions: getValueSuggestionsMock, + }, + fieldValue: '', + indexPattern: stubIndexPatternWithFields, + operatorType: OperatorTypeEnum.MATCH, + query: '', + selectedField: getField('@tags'), + }) + ); + + await waitFor(() => expect(result.current[3]).not.toBeNull()); + + // Added check for typescripts sake, if null, + // would not reach below logic as test would stop above + if (result.current[3] != null) { + result.current[3]({ + fieldSelected: getField('@tags'), + patterns: stubIndexPatternWithFields, + searchQuery: '', + value: 'hello', + }); + } + await waitFor(() => { const expectedResult: UseFieldValueAutocompleteReturn = [ false, true, diff --git a/packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts b/packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts index 99c6ffc3d05b7..29e526350be6c 100644 --- a/packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts +++ b/packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts @@ -20,26 +20,30 @@ interface IndexAlias { * * @param esClient An {@link ElasticsearchClient} * @param alias alias name used to filter results + * @param index index name used to filter results * * @returns an array of {@link IndexAlias} objects */ export const getIndexAliases = async ({ esClient, alias, + index, }: { esClient: ElasticsearchClient; alias: string; + index?: string; }): Promise<IndexAlias[]> => { const response = await esClient.indices.getAlias( { name: alias, + ...(index ? { index } : {}), }, { meta: true } ); - return Object.keys(response.body).map((index) => ({ + return Object.keys(response.body).map((indexName) => ({ alias, - index, - isWriteIndex: response.body[index].aliases[alias]?.is_write_index === true, + index: indexName, + isWriteIndex: response.body[indexName].aliases[alias]?.is_write_index === true, })); }; diff --git a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/use_exception_item_card.test.ts b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/use_exception_item_card.test.ts index cd3e9d8ab5817..5c04c87727147 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/use_exception_item_card.test.ts +++ b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/use_exception_item_card.test.ts @@ -8,7 +8,7 @@ */ import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { getExceptionListItemSchemaMock } from '../mocks/exception_list_item_schema.mock'; import { useExceptionItemCard } from './use_exception_item_card'; import * as i18n from './translations'; diff --git a/packages/kbn-securitysolution-exception-list-components/src/list_header/edit_modal/use_edit_modal.test.ts b/packages/kbn-securitysolution-exception-list-components/src/list_header/edit_modal/use_edit_modal.test.ts index e982637791200..65b532a55c834 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/list_header/edit_modal/use_edit_modal.test.ts +++ b/packages/kbn-securitysolution-exception-list-components/src/list_header/edit_modal/use_edit_modal.test.ts @@ -8,7 +8,7 @@ */ import { ChangeEvent, SyntheticEvent } from 'react'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useEditModal } from './use_edit_modal'; const listDetails = { name: 'test-name', description: 'test-description' }; diff --git a/packages/kbn-securitysolution-exception-list-components/src/list_header/use_list_header.test.ts b/packages/kbn-securitysolution-exception-list-components/src/list_header/use_list_header.test.ts index d3c17a4aefc48..e16681d2b184b 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/list_header/use_list_header.test.ts +++ b/packages/kbn-securitysolution-exception-list-components/src/list_header/use_list_header.test.ts @@ -7,8 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { waitFor } from '@testing-library/react'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { useExceptionListHeader } from './use_list_header'; describe('useExceptionListHeader', () => { diff --git a/packages/kbn-securitysolution-exception-list-components/src/pagination/use_pagination.test.ts b/packages/kbn-securitysolution-exception-list-components/src/pagination/use_pagination.test.ts index f05066bb61499..e90408f1e161b 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/pagination/use_pagination.test.ts +++ b/packages/kbn-securitysolution-exception-list-components/src/pagination/use_pagination.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { usePagination } from './use_pagination'; const onPaginationChange = jest.fn(); diff --git a/packages/kbn-securitysolution-exception-list-components/src/value_with_space_warning/use_value_with_space_warning.test.ts b/packages/kbn-securitysolution-exception-list-components/src/value_with_space_warning/use_value_with_space_warning.test.ts index ab0c87c110dfb..51954c0140e61 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/value_with_space_warning/use_value_with_space_warning.test.ts +++ b/packages/kbn-securitysolution-exception-list-components/src/value_with_space_warning/use_value_with_space_warning.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useValueWithSpaceWarning } from './use_value_with_space_warning'; describe('useValueWithSpaceWarning', () => { diff --git a/packages/kbn-securitysolution-hook-utils/src/use_async/index.test.ts b/packages/kbn-securitysolution-hook-utils/src/use_async/index.test.ts index a9f02622df306..99417c1fe3292 100644 --- a/packages/kbn-securitysolution-hook-utils/src/use_async/index.test.ts +++ b/packages/kbn-securitysolution-hook-utils/src/use_async/index.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { useAsync } from '.'; @@ -20,8 +20,8 @@ type TestReturn = Promise<unknown>; describe('useAsync', () => { /** - * Timeout for both jest tests and for the waitForNextUpdate. - * jest tests default to 5 seconds and waitForNextUpdate defaults to 1 second. + * Timeout for both jest tests and for the waitFor. + * jest tests default to 5 seconds and waitFor defaults to 1 second. * 20_0000 = 20,000 milliseconds = 20 seconds */ const timeout = 20_000; @@ -42,43 +42,42 @@ describe('useAsync', () => { it( 'invokes the function when start is called', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsync(fn)); + const { result } = renderHook(() => useAsync(fn)); act(() => { result.current.start(args); }); - await waitForNextUpdate({ timeout }); - - expect(fn).toHaveBeenCalled(); + await waitFor(() => expect(fn).toHaveBeenCalled(), { timeout }); }, timeout ); it('invokes the function with start args', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsync(fn)); + const { result } = renderHook(() => useAsync(fn)); const expectedArgs = { ...args }; act(() => { result.current.start(args); }); - await waitForNextUpdate({ timeout }); - - expect(fn).toHaveBeenCalledWith(expectedArgs); + await waitFor(() => expect(fn).toHaveBeenCalledWith(expectedArgs), { timeout }); }); it( 'populates result with the resolved value of the fn', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsync(fn)); + const { result } = renderHook(() => useAsync(fn)); fn.mockResolvedValue({ resolved: 'value' }); act(() => { result.current.start(args); }); - await waitForNextUpdate({ timeout }); - - expect(result.current.result).toEqual({ resolved: 'value' }); - expect(result.current.error).toBeUndefined(); + await waitFor( + () => { + expect(result.current.result).toEqual({ resolved: 'value' }); + expect(result.current.error).toBeUndefined(); + }, + { timeout } + ); }, timeout ); @@ -87,15 +86,19 @@ describe('useAsync', () => { 'populates error if function rejects', async () => { fn.mockRejectedValue(new Error('whoops')); - const { result, waitForNextUpdate } = renderHook(() => useAsync(fn)); + const { result } = renderHook(() => useAsync(fn)); act(() => { result.current.start(args); }); - await waitForNextUpdate({ timeout }); - expect(result.current.result).toBeUndefined(); - expect(result.current.error).toEqual(new Error('whoops')); + await waitFor( + () => { + expect(result.current.result).toBeUndefined(); + expect(result.current.error).toEqual(new Error('whoops')); + }, + { timeout } + ); }, timeout ); @@ -106,7 +109,7 @@ describe('useAsync', () => { let resolve: () => void; fn.mockImplementation(() => new Promise<void>((_resolve) => (resolve = _resolve))); - const { result, waitForNextUpdate } = renderHook(() => useAsync(fn)); + const { result } = renderHook(() => useAsync(fn)); act(() => { result.current.start(args); @@ -115,9 +118,7 @@ describe('useAsync', () => { expect(result.current.loading).toBe(true); act(() => resolve()); - await waitForNextUpdate({ timeout }); - - expect(result.current.loading).toBe(false); + await waitFor(() => expect(result.current.loading).toBe(false), { timeout }); }, timeout ); @@ -128,7 +129,7 @@ describe('useAsync', () => { let resolve: (result: string) => void; fn.mockImplementation(() => new Promise((_resolve) => (resolve = _resolve))); - const { result, waitForNextUpdate } = renderHook(() => useAsync(fn)); + const { result } = renderHook(() => useAsync(fn)); act(() => { result.current.start(args); @@ -137,10 +138,13 @@ describe('useAsync', () => { expect(result.current.loading).toBe(true); act(() => resolve('result')); - await waitForNextUpdate({ timeout }); - - expect(result.current.loading).toBe(false); - expect(result.current.result).toBe('result'); + await waitFor( + () => { + expect(result.current.loading).toBe(false); + expect(result.current.result).toBe('result'); + }, + { timeout } + ); act(() => { result.current.start(args); @@ -149,10 +153,13 @@ describe('useAsync', () => { expect(result.current.loading).toBe(true); expect(result.current.result).toBe(undefined); act(() => resolve('result')); - await waitForNextUpdate({ timeout }); - - expect(result.current.loading).toBe(false); - expect(result.current.result).toBe('result'); + await waitFor( + () => { + expect(result.current.loading).toBe(false); + expect(result.current.result).toBe('result'); + }, + { timeout } + ); }, timeout ); diff --git a/packages/kbn-securitysolution-hook-utils/src/use_is_mounted/index.test.ts b/packages/kbn-securitysolution-hook-utils/src/use_is_mounted/index.test.ts index 3435fc838382b..a8013a65441c9 100644 --- a/packages/kbn-securitysolution-hook-utils/src/use_is_mounted/index.test.ts +++ b/packages/kbn-securitysolution-hook-utils/src/use_is_mounted/index.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useIsMounted } from '.'; diff --git a/packages/kbn-securitysolution-hook-utils/src/use_observable/index.test.ts b/packages/kbn-securitysolution-hook-utils/src/use_observable/index.test.ts index d0608c5d10174..8d90bffeb3ee2 100644 --- a/packages/kbn-securitysolution-hook-utils/src/use_observable/index.test.ts +++ b/packages/kbn-securitysolution-hook-utils/src/use_observable/index.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { Subject, throwError } from 'rxjs'; import { useObservable } from '.'; diff --git a/packages/kbn-securitysolution-list-hooks/src/use_cursor/index.test.ts b/packages/kbn-securitysolution-list-hooks/src/use_cursor/index.test.ts index c4464704b7cd1..ca94eda81f950 100644 --- a/packages/kbn-securitysolution-list-hooks/src/use_cursor/index.test.ts +++ b/packages/kbn-securitysolution-list-hooks/src/use_cursor/index.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { UseCursorProps, useCursor } from '.'; diff --git a/packages/kbn-securitysolution-list-hooks/src/use_find_lists/index.test.ts b/packages/kbn-securitysolution-list-hooks/src/use_find_lists/index.test.ts index fa68009be9d9b..fcce54ac3be32 100644 --- a/packages/kbn-securitysolution-list-hooks/src/use_find_lists/index.test.ts +++ b/packages/kbn-securitysolution-list-hooks/src/use_find_lists/index.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { useFindLists } from '.'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; @@ -26,14 +26,14 @@ describe('useFindLists', () => { }); it('invokes Api.findLists', async () => { - const { result, waitForNextUpdate } = renderHook(() => useFindLists()); + const { result } = renderHook(() => useFindLists()); act(() => { result.current.start({ http: httpMock, pageIndex: 1, pageSize: 10 }); }); - await waitForNextUpdate(); - - expect(Api.findLists).toHaveBeenCalledWith( - expect.objectContaining({ http: httpMock, pageIndex: 1, pageSize: 10 }) + await waitFor(() => + expect(Api.findLists).toHaveBeenCalledWith( + expect.objectContaining({ http: httpMock, pageIndex: 1, pageSize: 10 }) + ) ); }); }); diff --git a/packages/kbn-securitysolution-list-hooks/src/use_persist_exception_item/index.ts b/packages/kbn-securitysolution-list-hooks/src/use_persist_exception_item/index.ts index e5166dc3f0f91..79f8748345fdf 100644 --- a/packages/kbn-securitysolution-list-hooks/src/use_persist_exception_item/index.ts +++ b/packages/kbn-securitysolution-list-hooks/src/use_persist_exception_item/index.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { Dispatch, useEffect, useState } from 'react'; +import { Dispatch, useEffect, useRef, useState } from 'react'; import type { CreateExceptionListItemSchema, PersistHookProps, @@ -47,57 +47,63 @@ export const usePersistExceptionItem = ({ const [isLoading, setIsLoading] = useState(false); const isUpdateExceptionItem = (item: unknown): item is UpdateExceptionListItemSchema => Boolean(item && (item as UpdateExceptionListItemSchema).id != null); + const isSubscribed = useRef(false); useEffect(() => { - let isSubscribed = true; - const abortCtrl = new AbortController(); + let abortCtrl: AbortController | null = null; + isSubscribed.current = true; setIsSaved(false); const saveExceptionItem = async (): Promise<void> => { - if (exceptionListItem != null) { - try { - setIsLoading(true); - - if (isUpdateExceptionItem(exceptionListItem)) { - // Please see `x-pack/plugins/lists/public/exceptions/transforms.ts` doc notes - // for context around the temporary `id` - const transformedList = transformOutput(exceptionListItem); - - await updateExceptionListItem({ - http, - listItem: transformedList, - signal: abortCtrl.signal, - }); - } else { - // Please see `x-pack/plugins/lists/public/exceptions/transforms.ts` doc notes - // for context around the temporary `id` - const transformedList = transformNewItemOutput(exceptionListItem); - - await addExceptionListItem({ - http, - listItem: transformedList, - signal: abortCtrl.signal, - }); - } - - if (isSubscribed) { - setIsSaved(true); - } - } catch (error) { - if (isSubscribed) { - onError(error); - } + if (exceptionListItem === null) { + return; + } + + try { + abortCtrl = new AbortController(); + setIsLoading(true); + + if (isUpdateExceptionItem(exceptionListItem)) { + // Please see `x-pack/plugins/lists/public/exceptions/transforms.ts` doc notes + // for context around the temporary `id` + const transformedList = transformOutput(exceptionListItem); + + await updateExceptionListItem({ + http, + listItem: transformedList, + signal: abortCtrl.signal, + }); + } else { + // Please see `x-pack/plugins/lists/public/exceptions/transforms.ts` doc notes + // for context around the temporary `id` + const transformedList = transformNewItemOutput(exceptionListItem); + + await addExceptionListItem({ + http, + listItem: transformedList, + signal: abortCtrl.signal, + }); } - if (isSubscribed) { + + if (isSubscribed.current) { + setIsSaved(true); + } + } catch (error) { + if (isSubscribed.current) { + onError(error); + } + } finally { + if (isSubscribed.current) { setIsLoading(false); } } }; saveExceptionItem(); + return (): void => { - isSubscribed = false; - abortCtrl.abort(); + isSubscribed.current = false; + abortCtrl?.abort(); }; }, [http, exceptionListItem, onError]); diff --git a/packages/kbn-server-route-repository/src/register_routes.ts b/packages/kbn-server-route-repository/src/register_routes.ts index 6201ffcd869ea..90c4f42b9ce44 100644 --- a/packages/kbn-server-route-repository/src/register_routes.ts +++ b/packages/kbn-server-route-repository/src/register_routes.ts @@ -98,8 +98,15 @@ export function registerRoutes<TDependencies extends Record<string, any>>({ if (isKibanaResponse(result)) { return result; } else if (isObservable(result)) { + const controller = new AbortController(); + request.events.aborted$.subscribe(() => { + controller.abort(); + }); return response.ok({ - body: observableIntoEventSourceStream(result as Observable<ServerSentEvent>), + body: observableIntoEventSourceStream(result as Observable<ServerSentEvent>, { + logger, + signal: controller.signal, + }), }); } else { const body = result || {}; diff --git a/packages/kbn-sse-utils-server/kibana.jsonc b/packages/kbn-sse-utils-server/kibana.jsonc index 8c533af1953e9..c4778482e4561 100644 --- a/packages/kbn-sse-utils-server/kibana.jsonc +++ b/packages/kbn-sse-utils-server/kibana.jsonc @@ -5,5 +5,5 @@ "@elastic/obs-knowledge-team" ], "group": "platform", - "visibility": "private" -} \ No newline at end of file + "visibility": "shared" +} diff --git a/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.test.ts b/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.test.ts new file mode 100644 index 0000000000000..9f4f8ffa84284 --- /dev/null +++ b/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.test.ts @@ -0,0 +1,198 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Logger } from '@kbn/logging'; +import { observableIntoEventSourceStream } from './observable_into_event_source_stream'; +import { PassThrough } from 'node:stream'; +import { Subject } from 'rxjs'; +import { ServerSentEvent, ServerSentEventType } from '@kbn/sse-utils/src/events'; +import { + ServerSentEventErrorCode, + createSSEInternalError, + createSSERequestError, +} from '@kbn/sse-utils/src/errors'; + +describe('observableIntoEventSourceStream', () => { + let logger: jest.Mocked<Logger>; + + let controller: AbortController; + + let stream: PassThrough; + let source$: Subject<ServerSentEvent>; + + let data: string[]; + + beforeEach(() => { + jest.useFakeTimers(); + logger = { + debug: jest.fn(), + error: jest.fn(), + } as unknown as jest.Mocked<Logger>; + + controller = new AbortController(); + source$ = new Subject(); + data = []; + + stream = observableIntoEventSourceStream(source$, { logger, signal: controller.signal }); + stream.on('data', (chunk) => { + data.push(chunk.toString()); + }); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + it('writes events into the stream in SSE format', () => { + source$.next({ type: ServerSentEventType.data, data: { foo: 'bar' } }); + source$.complete(); + + jest.runAllTimers(); + + expect(data).toEqual(['event: data\ndata: {"data":{"foo":"bar"}}\n\n']); + }); + + it('handles SSE errors', () => { + const sseError = createSSEInternalError('Invalid input'); + + source$.error(sseError); + + jest.runAllTimers(); + + expect(logger.error).toHaveBeenCalledWith(sseError); + expect(logger.debug).toHaveBeenCalled(); + const debugFn = logger.debug.mock.calls[0][0] as () => string; + const loggedError = JSON.parse(debugFn()); + expect(loggedError).toEqual({ + type: 'error', + error: { + code: ServerSentEventErrorCode.internalError, + message: 'Invalid input', + meta: {}, + }, + }); + + expect(data).toEqual([ + `event: error\ndata: ${JSON.stringify({ + error: { + code: ServerSentEventErrorCode.internalError, + message: 'Invalid input', + meta: {}, + }, + })}\n\n`, + ]); + }); + + it('handles SSE errors with metadata', () => { + const sseError = createSSERequestError('Invalid request', 400); + + source$.error(sseError); + + jest.runAllTimers(); + + expect(logger.error).toHaveBeenCalledWith(sseError); + expect(logger.debug).toHaveBeenCalled(); + const debugFn = logger.debug.mock.calls[0][0] as () => string; + const loggedError = JSON.parse(debugFn()); + expect(loggedError).toEqual({ + type: 'error', + error: { + code: ServerSentEventErrorCode.requestError, + message: 'Invalid request', + meta: { + status: 400, + }, + }, + }); + + expect(data).toEqual([ + `event: error\ndata: ${JSON.stringify({ + error: { + code: ServerSentEventErrorCode.requestError, + message: 'Invalid request', + meta: { + status: 400, + }, + }, + })}\n\n`, + ]); + }); + + it('handles non-SSE errors', () => { + const error = new Error('Non-SSE Error'); + + source$.error(error); + + jest.runAllTimers(); + + expect(logger.error).toHaveBeenCalledWith(error); + expect(data).toEqual([ + `event: error\ndata: ${JSON.stringify({ + error: { + code: ServerSentEventErrorCode.internalError, + message: 'Non-SSE Error', + }, + })}\n\n`, + ]); + }); + + it('should send keep-alive comments every 10 seconds', () => { + jest.advanceTimersByTime(10000); + expect(data).toContain(': keep-alive'); + + jest.advanceTimersByTime(10000); + expect(data.filter((d) => d === ': keep-alive')).toHaveLength(2); + }); + + describe('without fake timers', () => { + beforeEach(() => { + jest.useFakeTimers({ doNotFake: ['nextTick'] }); + }); + + it('should end the stream when the observable completes', async () => { + jest.useFakeTimers({ doNotFake: ['nextTick'] }); + + const endSpy = jest.fn(); + stream.on('end', endSpy); + + source$.complete(); + + await new Promise((resolve) => process.nextTick(resolve)); + + expect(endSpy).toHaveBeenCalled(); + }); + + it('should end stream when signal is aborted', async () => { + const endSpy = jest.fn(); + stream.on('end', endSpy); + + // Emit some data + source$.next({ type: ServerSentEventType.data, data: { initial: 'data' } }); + + // Abort the signal + controller.abort(); + + // Emit more data after abort + source$.next({ type: ServerSentEventType.data, data: { after: 'abort' } }); + + await new Promise((resolve) => process.nextTick(resolve)); + + expect(endSpy).toHaveBeenCalled(); + + // Data after abort should not be received + expect(data).toEqual([ + `event: data\ndata: ${JSON.stringify({ data: { initial: 'data' } })}\n\n`, + ]); + }); + + afterEach(() => { + jest.useFakeTimers(); + }); + }); +}); diff --git a/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts b/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts index e0d653e44dabc..0a71cd60192e6 100644 --- a/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts +++ b/packages/kbn-sse-utils-server/src/observable_into_event_source_stream.ts @@ -7,12 +7,51 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { map, Observable } from 'rxjs'; +import { Logger } from '@kbn/logging'; +import { + isSSEError, + ServerSentErrorEvent, + ServerSentEventErrorCode, +} from '@kbn/sse-utils/src/errors'; +import { ServerSentEvent, ServerSentEventType } from '@kbn/sse-utils/src/events'; +import { catchError, map, Observable, of } from 'rxjs'; import { PassThrough } from 'stream'; -import { ServerSentEvent } from '@kbn/sse-utils'; -export function observableIntoEventSourceStream(source$: Observable<ServerSentEvent>): PassThrough { - const withSerializedEvents$ = source$.pipe( +export function observableIntoEventSourceStream( + source$: Observable<ServerSentEvent>, + { + logger, + signal, + }: { + logger: Pick<Logger, 'debug' | 'error'>; + signal: AbortSignal; + } +) { + const withSerializedErrors$ = source$.pipe( + catchError((error): Observable<ServerSentErrorEvent> => { + if (isSSEError(error)) { + logger.error(error); + logger.debug(() => JSON.stringify(error)); + return of({ + type: ServerSentEventType.error, + error: { + code: error.code, + message: error.message, + meta: error.meta, + }, + }); + } + + logger.error(error); + + return of({ + type: ServerSentEventType.error, + error: { + code: ServerSentEventErrorCode.internalError, + message: error.message as string, + }, + }); + }), map((event) => { const { type, ...rest } = event; return `event: ${type}\ndata: ${JSON.stringify(rest)}\n\n`; @@ -21,18 +60,38 @@ export function observableIntoEventSourceStream(source$: Observable<ServerSentEv const stream = new PassThrough(); - withSerializedEvents$.subscribe({ + const intervalId = setInterval(() => { + // `:` denotes a comment - this is to keep the connection open + // it will be ignored by the SSE parser on the client + stream.write(': keep-alive'); + }, 10000); + + const subscription = withSerializedErrors$.subscribe({ next: (line) => { stream.write(line); }, complete: () => { stream.end(); + clearTimeout(intervalId); }, error: (error) => { - stream.write(`event: error\ndata: ${JSON.stringify(error)}\n\n`); + clearTimeout(intervalId); + stream.write( + `event:error\ndata: ${JSON.stringify({ + error: { + code: ServerSentEventErrorCode.internalError, + message: error.message, + }, + })}\n\n` + ); stream.end(); }, }); + signal.addEventListener('abort', () => { + subscription.unsubscribe(); + stream.end(); + }); + return stream; } diff --git a/packages/kbn-sse-utils-server/tsconfig.json b/packages/kbn-sse-utils-server/tsconfig.json index 9053749c5898b..7f9b7b7e8f52f 100644 --- a/packages/kbn-sse-utils-server/tsconfig.json +++ b/packages/kbn-sse-utils-server/tsconfig.json @@ -15,5 +15,6 @@ ], "kbn_references": [ "@kbn/sse-utils", + "@kbn/logging", ] } diff --git a/packages/kbn-sse-utils/README.md b/packages/kbn-sse-utils/README.md index ad6dbf8b67c00..948376fb7e4e5 100644 --- a/packages/kbn-sse-utils/README.md +++ b/packages/kbn-sse-utils/README.md @@ -21,7 +21,8 @@ function myRequestHandler( data: { anyData: {}, }, - }) + }), + logger ), }); } diff --git a/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx b/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx index 58ff36069dd8c..74c85662754fe 100755 --- a/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx +++ b/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx @@ -19,7 +19,14 @@ import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { ChartsPluginSetup } from '@kbn/charts-plugin/public'; import DateMath from '@kbn/datemath'; -import { EuiButtonGroup, EuiLoadingSpinner, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; +import { + EuiButtonGroup, + EuiLoadingSpinner, + EuiSpacer, + EuiText, + EuiTitle, + useEuiTheme, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { Axis, @@ -120,7 +127,7 @@ const FieldStatsComponent: React.FC<FieldStatsProps> = ({ toDate, dataViewOrDataViewId, field, - color = getDefaultColor(), + color: originalColor, 'data-test-subj': dataTestSubject = 'fieldStats', overrideMissingContent, overrideFooter, @@ -128,6 +135,9 @@ const FieldStatsComponent: React.FC<FieldStatsProps> = ({ overrideFieldTopValueBar, onStateChange, }) => { + const { euiTheme } = useEuiTheme(); + const color = originalColor ?? getDefaultColor(euiTheme.themeName); + const { fieldFormats, uiSettings, charts, dataViews, data } = services; const [state, changeState] = useState<FieldStatsState>({ isLoading: false, diff --git a/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.test.tsx b/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.test.tsx index 7817fd0278901..edb38d4610864 100644 --- a/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.test.tsx +++ b/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.test.tsx @@ -59,6 +59,7 @@ describe('UnifiedFieldList <FieldTopValues />', () => { key: 'sourceB', }, ], + color: '#000', 'data-test-subj': 'testing', }; }); diff --git a/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.tsx b/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.tsx index a2f57d03bf515..31ee1479bb081 100755 --- a/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.tsx +++ b/packages/kbn-unified-field-list/src/components/field_stats/field_top_values.tsx @@ -20,7 +20,7 @@ export interface FieldTopValuesProps { dataView: DataView; field: DataViewField; sampledValuesCount: number; - color?: string; + color: string; 'data-test-subj': string; onAddFilter?: AddFieldFilterHandler; overrideFieldTopValueBar?: OverrideFieldTopValueBarCallback; @@ -32,7 +32,7 @@ export const FieldTopValues: React.FC<FieldTopValuesProps> = ({ dataView, field, sampledValuesCount, - color = getDefaultColor(), + color, 'data-test-subj': dataTestSubject, onAddFilter, overrideFieldTopValueBar, @@ -106,7 +106,10 @@ export const FieldTopValues: React.FC<FieldTopValuesProps> = ({ ); }; -export const getDefaultColor = () => euiPaletteColorBlind()[1]; +export const getDefaultColor = (euiThemeName: string) => + euiThemeName?.toLowerCase().includes('borealis') + ? euiPaletteColorBlind()[2] + : euiPaletteColorBlind()[1]; // FIXME: remove in 9.x when Borealis becomes the default theme export const getFormattedPercentageValue = ( currentValue: number, diff --git a/packages/kbn-unified-field-list/src/components/field_stats/field_top_values_bucket.tsx b/packages/kbn-unified-field-list/src/components/field_stats/field_top_values_bucket.tsx index 77266edc2de07..a53bbcdebc468 100755 --- a/packages/kbn-unified-field-list/src/components/field_stats/field_top_values_bucket.tsx +++ b/packages/kbn-unified-field-list/src/components/field_stats/field_top_values_bucket.tsx @@ -15,7 +15,10 @@ import { EuiProgress, EuiText, EuiTextBlockTruncate, + EuiThemeComputed, EuiToolTip, + makeHighContrastColor, + useEuiTheme, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; @@ -53,6 +56,7 @@ const FieldTopValuesBucket: React.FC<FieldTopValuesBucketProps> = ({ overrideFieldTopValueBar, ...fieldTopValuesBucketOverridableProps }) => { + const { euiTheme } = useEuiTheme(); const overrides = overrideFieldTopValueBar ? overrideFieldTopValueBar(fieldTopValuesBucketOverridableProps) : ({} as FieldTopValuesBucketParams); @@ -141,7 +145,7 @@ const FieldTopValuesBucket: React.FC<FieldTopValuesBucketProps> = ({ })} delay="long" > - <EuiText size="xs" textAlign="left" color={color}> + <EuiText size="xs" textAlign="left" color={getPercentageColor(euiTheme, color)}> {formattedPercentage} </EuiText> </EuiToolTip> @@ -207,6 +211,11 @@ const FieldTopValuesBucket: React.FC<FieldTopValuesBucketProps> = ({ ); }; +const getPercentageColor = (euiTheme: EuiThemeComputed, color: string) => + euiTheme.themeName?.toLowerCase().includes('borealis') + ? makeHighContrastColor(color)(euiTheme) + : color; // FIXME: remove in 9.x when Borealis becomes the default theme + // Necessary for React.lazy // eslint-disable-next-line import/no-default-export export default FieldTopValuesBucket; diff --git a/packages/kbn-visualization-ui-components/components/color_picker.tsx b/packages/kbn-visualization-ui-components/components/color_picker.tsx index 589066726300e..e3ca47e63e65f 100644 --- a/packages/kbn-visualization-ui-components/components/color_picker.tsx +++ b/packages/kbn-visualization-ui-components/components/color_picker.tsx @@ -10,14 +10,7 @@ import React, { useEffect, useRef, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { TooltipWrapper } from '@kbn/visualization-utils'; -import { - EuiFormRow, - EuiColorPicker, - EuiColorPickerProps, - EuiToolTip, - EuiIcon, - euiPaletteColorBlind, -} from '@elastic/eui'; +import { EuiFormRow, EuiColorPicker, EuiColorPickerProps, EuiToolTip, EuiIcon } from '@elastic/eui'; import { getColorAlpha, makeColorWithAlpha } from '@kbn/coloring'; const tooltipContent = { @@ -38,6 +31,7 @@ export interface ColorPickerProps { disableHelpTooltip?: boolean; disabledMessage?: string; showAlpha?: boolean; + swatches: string[]; } export const ColorPicker = ({ @@ -49,6 +43,7 @@ export const ColorPicker = ({ disableHelpTooltip, disabledMessage, showAlpha, + swatches, }: ColorPickerProps) => { const [colorText, setColorText] = useState(overwriteColor || defaultColor); const [validatedColor, setValidatedColor] = useState(overwriteColor || defaultColor); @@ -112,8 +107,8 @@ export const ColorPicker = ({ showAlpha={showAlpha} swatches={ currentColorAlpha === 1 - ? euiPaletteColorBlind() - : euiPaletteColorBlind().map((c) => makeColorWithAlpha(c, currentColorAlpha).hex()) + ? swatches + : swatches.map((c) => makeColorWithAlpha(c, currentColorAlpha).hex()) } /> ); 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 aec8c33715c0f..08a21f16ca5e9 100644 --- a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts +++ b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts @@ -7,7 +7,15 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; +import { + AggregateQuery, + COMPARE_ALL_OPTIONS, + Filter, + Query, + TimeRange, + onlyDisabledFiltersChanged, +} from '@kbn/es-query'; +import fastIsEqual from 'fast-deep-equal'; import { useEffect, useMemo } from 'react'; import { BehaviorSubject } from 'rxjs'; import { PublishingSubject } from '../../publishing_subject'; @@ -113,15 +121,27 @@ export function useSearchApi({ }, []); useEffect(() => { - searchApi.filters$.next(filters); + if ( + !onlyDisabledFiltersChanged(searchApi.filters$.getValue(), filters, { + ...COMPARE_ALL_OPTIONS, + // do not compare $state to avoid refreshing when filter is pinned/unpinned (which does not impact results) + state: false, + }) + ) { + searchApi.filters$.next(filters); + } }, [filters, searchApi.filters$]); useEffect(() => { - searchApi.query$.next(query); + if (!fastIsEqual(searchApi.query$.getValue(), query)) { + searchApi.query$.next(query); + } }, [query, searchApi.query$]); useEffect(() => { - searchApi.timeRange$.next(timeRange); + if (!fastIsEqual(searchApi.timeRange$.getValue(), timeRange)) { + searchApi.timeRange$.next(timeRange); + } }, [timeRange, searchApi.timeRange$]); return searchApi; diff --git a/packages/react/kibana_context/common/tsconfig.json b/packages/react/kibana_context/common/tsconfig.json index 0d78dace105e1..994137ade7df2 100644 --- a/packages/react/kibana_context/common/tsconfig.json +++ b/packages/react/kibana_context/common/tsconfig.json @@ -13,5 +13,6 @@ "exclude": [ "target/**/*" ], - "kbn_references": [] + "kbn_references": [ + ] } diff --git a/packages/react/kibana_context/common/types.ts b/packages/react/kibana_context/common/types.ts index 05e7ab7a0c7d5..e6c15e3cb391f 100644 --- a/packages/react/kibana_context/common/types.ts +++ b/packages/react/kibana_context/common/types.ts @@ -35,4 +35,5 @@ export interface KibanaTheme { */ export interface ThemeServiceStart { theme$: Observable<KibanaTheme>; + getTheme?(): KibanaTheme; } diff --git a/packages/react/kibana_context/root/eui_provider.tsx b/packages/react/kibana_context/root/eui_provider.tsx index fa1d92e897800..9b089829a347b 100644 --- a/packages/react/kibana_context/root/eui_provider.tsx +++ b/packages/react/kibana_context/root/eui_provider.tsx @@ -65,16 +65,22 @@ const cache = { default: emotionCache, global: globalCache, utility: utilitiesCa * should not be used. Instead, refer to `KibanaRootContextProvider` to set up the root of Kibana. */ export const KibanaEuiProvider: FC<PropsWithChildren<KibanaEuiProviderProps>> = ({ - theme: { theme$ }, + theme, globalStyles: globalStylesProp, colorMode: colorModeProp, modify, children, }) => { - const kibanaTheme = useObservable(theme$, defaultTheme); + const { theme$ } = theme; + + // use the selected theme if available before using the defaultTheme; this ensures that + // Kibana loads with the currently selected theme without additional updates from default to selected + const initialTheme = theme.getTheme?.() ?? defaultTheme; + + const kibanaTheme = useObservable(theme$, initialTheme); const themeColorMode = useMemo(() => getColorMode(kibanaTheme), [kibanaTheme]); - const theme = useMemo(() => { + const _theme = useMemo(() => { const config = getThemeConfigByName(kibanaTheme.name) || DEFAULT_THEME_CONFIG; return config.euiTheme; }, [kibanaTheme.name]); @@ -95,7 +101,7 @@ export const KibanaEuiProvider: FC<PropsWithChildren<KibanaEuiProviderProps>> = colorMode, globalStyles, utilityClasses: globalStyles, - theme, + theme: _theme, }} > {children} diff --git a/scripts/relocate.js b/scripts/relocate.js new file mode 100644 index 0000000000000..1a8c71373c673 --- /dev/null +++ b/scripts/relocate.js @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +require('../src/setup_node_env'); +require('@kbn/relocate').runKbnRelocateCli(); 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 b2d9693cfcc22..a9c62e1595ab6 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 @@ -57,8 +57,8 @@ describe('checking migration metadata changes on all registered SO types', () => expect(hashMap).toMatchInlineSnapshot(` Object { "action": "0e6fc0b74c7312a8c11ff6b14437b93a997358b8", - "action_task_params": "b50cb5c8a493881474918e8d4985e61374ca4c30", - "ad_hoc_run_params": "d4e3c5c794151d0a4f5c71e886b2aa638da73ad2", + "action_task_params": "2e475d8b62e2de50b77f58cda309efb537e1d543", + "ad_hoc_run_params": "c7419760e878207231c3c8a25ec4d78360e07bf7", "alert": "556a03378f5ee1c31593c3a37c66b54555ee14ff", "api_key_pending_invalidation": "8f5554d1984854011b8392d9a6f7ef985bcac03c", "apm-custom-dashboards": "b67128f78160c288bd7efe25b2da6e2afd5e82fc", @@ -170,7 +170,7 @@ describe('checking migration metadata changes on all registered SO types', () => "synthetics-private-location": "8cecc9e4f39637d2f8244eb7985c0690ceab24be", "synthetics-privates-locations": "f53d799d5c9bc8454aaa32c6abc99a899b025d5c", "tag": "e2544392fe6563e215bb677abc8b01c2601ef2dc", - "task": "3c89a7c918d5b896a5f8800f06e9114ad7e7aea3", + "task": "ca8020259e46f713965a754ffae286c02d3cf05d", "telemetry": "7b00bcf1c7b4f6db1192bb7405a6a63e78b699fd", "threshold-explorer-view": "175306806f9fc8e13fcc1c8953ec4ba89bda1b70", "ui-metric": "d227284528fd19904e9d972aea0a13716fc5fe24", diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index 94d604d726562..e868cb73cb8db 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -134,7 +134,7 @@ RUN for iter in {1..10}; do \ (exit $exit_code) {{/ubuntu}} {{#wolfi}} -RUN apk --no-cache add bash curl fontconfig libstdc++ libnss findutils shadow +RUN apk --no-cache add bash curl fontconfig libstdc++ libnss findutils shadow ca-certificates {{/wolfi}} # Bring in Kibana from the initial stage. diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts index 1d3ec990948a9..e70d2e703048e 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -53,9 +53,9 @@ export const storybookAliases = { management: 'packages/kbn-management/storybook/config', observability: 'x-pack/plugins/observability_solution/observability/.storybook', observability_ai_assistant: - 'x-pack/plugins/observability_solution/observability_ai_assistant/.storybook', + 'x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook', observability_ai_assistant_app: - 'x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook', + 'x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook', observability_inventory: 'x-pack/plugins/observability_solution/inventory/.storybook', observability_shared: 'x-pack/plugins/observability_solution/observability_shared/.storybook', observability_slo: 'x-pack/plugins/observability_solution/slo/.storybook', @@ -63,7 +63,7 @@ export const storybookAliases = { random_sampling: 'x-pack/packages/kbn-random-sampling/.storybook', esql_editor: 'src/platform/packages/private/kbn-esql-editor/.storybook', security_solution: 'x-pack/plugins/security_solution/.storybook', - security_solution_packages: 'x-pack/packages/security-solution/storybook/config', + security_solution_packages: 'x-pack/solutions/security/packages/storybook/config', serverless: 'packages/serverless/storybook/config', shared_ux: 'packages/shared-ux/storybook/config', slo: 'x-pack/plugins/observability_solution/slo/.storybook', diff --git a/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx b/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx index eb3da01abd505..628bab839bdb9 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx +++ b/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx @@ -169,25 +169,25 @@ export const ESQLEditor = memo(function ESQLEditor({ const currentSelection = editor1?.current?.getSelection(); const startLineNumber = currentSelection?.startLineNumber; const endLineNumber = currentSelection?.endLineNumber; + const edits = []; if (startLineNumber && endLineNumber) { for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { const lineContent = editorModel.current?.getLineContent(lineNumber) ?? ''; const hasComment = lineContent?.startsWith('//'); const commentedLine = hasComment ? lineContent?.replace('//', '') : `//${lineContent}`; - // executeEdits allows to keep edit in history - editor1.current?.executeEdits('comment', [ - { - range: { - startLineNumber: lineNumber, - startColumn: 0, - endLineNumber: lineNumber, - endColumn: (lineContent?.length ?? 0) + 1, - }, - text: commentedLine, + edits.push({ + range: { + startLineNumber: lineNumber, + startColumn: 0, + endLineNumber: lineNumber, + endColumn: (lineContent?.length ?? 0) + 1, }, - ]); + text: commentedLine, + }); } + // executeEdits allows to keep edit in history + editor1.current?.executeEdits('comment', edits); } }, []); diff --git a/src/platform/packages/shared/kbn-esql-ast/src/parser/__tests__/commands.test.ts b/src/platform/packages/shared/kbn-esql-ast/src/parser/__tests__/commands.test.ts index 6fb176c9624f7..865d8ef64e272 100644 --- a/src/platform/packages/shared/kbn-esql-ast/src/parser/__tests__/commands.test.ts +++ b/src/platform/packages/shared/kbn-esql-ast/src/parser/__tests__/commands.test.ts @@ -141,6 +141,35 @@ describe('commands', () => { ]); }); + it('KEEP (with param)', () => { + const query = 'FROM index | KEEP abc, ?param'; + const { ast } = parse(query); + + expect(ast).toMatchObject([ + {}, + { + type: 'command', + name: 'keep', + args: [ + { + type: 'column', + name: 'abc', + }, + { + type: 'column', + args: [ + { + type: 'literal', + literalType: 'param', + value: 'param', + }, + ], + }, + ], + }, + ]); + }); + it('SORT', () => { const query = 'FROM index | SORT 1'; const { ast } = parse(query); diff --git a/src/platform/packages/shared/kbn-esql-ast/src/parser/factories.ts b/src/platform/packages/shared/kbn-esql-ast/src/parser/factories.ts index 388469e82ab99..feada64c3cf9a 100644 --- a/src/platform/packages/shared/kbn-esql-ast/src/parser/factories.ts +++ b/src/platform/packages/shared/kbn-esql-ast/src/parser/factories.ts @@ -526,11 +526,21 @@ export function createColumn(ctx: ParserRuleContext): ESQLColumn { if (ctx instanceof QualifiedNamePatternContext) { const list = ctx.identifierPattern_list(); - for (const identifier of list) { - const name = parseIdentifier(identifier.getText()); - const node = Builder.identifier({ name }, createParserFields(identifier)); + for (const identifierPattern of list) { + const ID_PATTERN = identifierPattern.ID_PATTERN(); - args.push(node); + if (ID_PATTERN) { + const name = parseIdentifier(ID_PATTERN.getText()); + const node = Builder.identifier({ name }, createParserFields(identifierPattern)); + + args.push(node); + } else { + const parameter = createParam(identifierPattern.parameter()); + + if (parameter) { + args.push(parameter); + } + } } } else if (ctx instanceof QualifiedNameContext) { const list = ctx.identifierOrParameter_list(); diff --git a/src/plugins/ai_assistant_management/selection/README.md b/src/platform/plugins/shared/ai_assistant_management/selection/README.md similarity index 100% rename from src/plugins/ai_assistant_management/selection/README.md rename to src/platform/plugins/shared/ai_assistant_management/selection/README.md diff --git a/src/plugins/ai_assistant_management/selection/common/ai_assistant_type.ts b/src/platform/plugins/shared/ai_assistant_management/selection/common/ai_assistant_type.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/common/ai_assistant_type.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/common/ai_assistant_type.ts diff --git a/src/plugins/ai_assistant_management/selection/common/ui_setting_keys.ts b/src/platform/plugins/shared/ai_assistant_management/selection/common/ui_setting_keys.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/common/ui_setting_keys.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/common/ui_setting_keys.ts diff --git a/src/plugins/ai_assistant_management/selection/jest.config.js b/src/platform/plugins/shared/ai_assistant_management/selection/jest.config.js similarity index 63% rename from src/plugins/ai_assistant_management/selection/jest.config.js rename to src/platform/plugins/shared/ai_assistant_management/selection/jest.config.js index 9106de820a29d..7082a96250d33 100644 --- a/src/plugins/ai_assistant_management/selection/jest.config.js +++ b/src/platform/plugins/shared/ai_assistant_management/selection/jest.config.js @@ -9,12 +9,12 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/src/plugins/ai_assistant_management/selection'], + rootDir: '../../../../../..', + roots: ['<rootDir>/src/platform/plugins/shared/ai_assistant_management/selection'], coverageDirectory: - '<rootDir>/target/kibana-coverage/jest/src/plugins/ai_assistant_management/selection', + '<rootDir>/target/kibana-coverage/jest/src/platform/plugins/shared/ai_assistant_management/selection', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '<rootDir>/src/plugins/ai_assistant_management/selection/{common,public,server}/**/*.{ts,tsx}', + '<rootDir>/src/platform/plugins/shared/ai_assistant_management/selection/{common,public,server}/**/*.{ts,tsx}', ], }; diff --git a/src/plugins/ai_assistant_management/selection/kibana.jsonc b/src/platform/plugins/shared/ai_assistant_management/selection/kibana.jsonc similarity index 100% rename from src/plugins/ai_assistant_management/selection/kibana.jsonc rename to src/platform/plugins/shared/ai_assistant_management/selection/kibana.jsonc diff --git a/src/plugins/ai_assistant_management/selection/public/app_context.tsx b/src/platform/plugins/shared/ai_assistant_management/selection/public/app_context.tsx similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/app_context.tsx rename to src/platform/plugins/shared/ai_assistant_management/selection/public/app_context.tsx diff --git a/src/plugins/ai_assistant_management/selection/public/index.ts b/src/platform/plugins/shared/ai_assistant_management/selection/public/index.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/index.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/public/index.ts diff --git a/src/plugins/ai_assistant_management/selection/public/management_section/mount_section.tsx b/src/platform/plugins/shared/ai_assistant_management/selection/public/management_section/mount_section.tsx similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/management_section/mount_section.tsx rename to src/platform/plugins/shared/ai_assistant_management/selection/public/management_section/mount_section.tsx diff --git a/src/plugins/ai_assistant_management/selection/public/plugin.ts b/src/platform/plugins/shared/ai_assistant_management/selection/public/plugin.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/plugin.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/public/plugin.ts diff --git a/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.test.tsx b/src/platform/plugins/shared/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.test.tsx similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.test.tsx rename to src/platform/plugins/shared/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.test.tsx diff --git a/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx b/src/platform/plugins/shared/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx rename to src/platform/plugins/shared/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx diff --git a/src/plugins/ai_assistant_management/selection/public/routes/components/redirect_to_home_if_unauthorized.tsx b/src/platform/plugins/shared/ai_assistant_management/selection/public/routes/components/redirect_to_home_if_unauthorized.tsx similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/routes/components/redirect_to_home_if_unauthorized.tsx rename to src/platform/plugins/shared/ai_assistant_management/selection/public/routes/components/redirect_to_home_if_unauthorized.tsx diff --git a/src/plugins/ai_assistant_management/selection/public/routes/config.tsx b/src/platform/plugins/shared/ai_assistant_management/selection/public/routes/config.tsx similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/routes/config.tsx rename to src/platform/plugins/shared/ai_assistant_management/selection/public/routes/config.tsx diff --git a/src/plugins/ai_assistant_management/selection/public/types.ts b/src/platform/plugins/shared/ai_assistant_management/selection/public/types.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/public/types.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/public/types.ts diff --git a/src/plugins/ai_assistant_management/selection/server/config.ts b/src/platform/plugins/shared/ai_assistant_management/selection/server/config.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/server/config.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/server/config.ts diff --git a/src/plugins/ai_assistant_management/selection/server/index.ts b/src/platform/plugins/shared/ai_assistant_management/selection/server/index.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/server/index.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/server/index.ts diff --git a/src/plugins/ai_assistant_management/selection/server/plugin.ts b/src/platform/plugins/shared/ai_assistant_management/selection/server/plugin.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/server/plugin.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/server/plugin.ts diff --git a/src/plugins/ai_assistant_management/selection/server/types.ts b/src/platform/plugins/shared/ai_assistant_management/selection/server/types.ts similarity index 100% rename from src/plugins/ai_assistant_management/selection/server/types.ts rename to src/platform/plugins/shared/ai_assistant_management/selection/server/types.ts diff --git a/src/plugins/ai_assistant_management/selection/tsconfig.json b/src/platform/plugins/shared/ai_assistant_management/selection/tsconfig.json similarity index 91% rename from src/plugins/ai_assistant_management/selection/tsconfig.json rename to src/platform/plugins/shared/ai_assistant_management/selection/tsconfig.json index 6bd8efe0e80b8..0fc6cec454817 100644 --- a/src/plugins/ai_assistant_management/selection/tsconfig.json +++ b/src/platform/plugins/shared/ai_assistant_management/selection/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, diff --git a/src/plugins/chart_expressions/expression_metric/common/expression_functions/metric_vis_function.ts b/src/plugins/chart_expressions/expression_metric/common/expression_functions/metric_vis_function.ts index 5e4bd45c03f5d..0a00a0cbf73d0 100644 --- a/src/plugins/chart_expressions/expression_metric/common/expression_functions/metric_vis_function.ts +++ b/src/plugins/chart_expressions/expression_metric/common/expression_functions/metric_vis_function.ts @@ -212,7 +212,7 @@ export const metricVisFunction = (): MetricVisExpressionFunctionDefinition => ({ secondaryPrefix: args.secondaryPrefix, color: args.color, icon: args.icon, - palette: args.palette?.params, + palette: args.palette, progressDirection: args.progressDirection, titlesTextAlign: args.titlesTextAlign, valuesTextAlign: args.valuesTextAlign, diff --git a/src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts b/src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts index 2eae93f88c020..f07a8297540ed 100644 --- a/src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts +++ b/src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts @@ -10,6 +10,7 @@ import { ExpressionValueVisDimension } from '@kbn/visualizations-plugin/common'; import { CustomPaletteState } from '@kbn/charts-plugin/common'; import { LayoutDirection, MetricStyle } from '@elastic/charts'; +import { PaletteOutput } from '@kbn/coloring'; import { TrendlineResult } from './expression_functions'; export const visType = 'metric'; @@ -26,7 +27,7 @@ export interface MetricVisParam { secondaryPrefix?: string; color?: string; icon?: string; - palette?: CustomPaletteState; + palette?: PaletteOutput<CustomPaletteState>; progressDirection?: LayoutDirection; titlesTextAlign: MetricStyle['titlesTextAlign']; valuesTextAlign: MetricStyle['valuesTextAlign']; diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx index 38d8e4d695c8d..db0a85f1f9f3a 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx @@ -27,6 +27,7 @@ import { CustomPaletteState } from '@kbn/charts-plugin/common/expressions/palett import { DimensionsVisParam, MetricVisParam } from '../../common'; import { euiThemeVars } from '@kbn/ui-theme'; import { DEFAULT_TRENDLINE_NAME } from '../../common/constants'; +import { PaletteOutput } from '@kbn/coloring'; import { faker } from '@faker-js/faker'; const mockDeserialize = jest.fn(({ id }: { id: string }) => { @@ -1160,12 +1161,16 @@ describe('MetricVisComponent', function () { // should be overridden color: 'static-color', palette: { - colors: [], - gradient: true, - stops: [], - range: 'number', - rangeMin: 2, - rangeMax: 10, + type: 'palette', + name: 'default', + params: { + colors: [], + gradient: true, + stops: [], + range: 'number', + rangeMin: 2, + rangeMax: 10, + }, }, }, }} @@ -1200,7 +1205,7 @@ describe('MetricVisComponent', function () { describe('percent-based', () => { const renderWithPalette = ( - palette: CustomPaletteState, + palette: PaletteOutput<CustomPaletteState>, dimensions: MetricVisComponentProps['config']['dimensions'] ) => shallow( @@ -1238,13 +1243,17 @@ describe('MetricVisComponent', function () { renderWithPalette( { - range: 'percent', - // the rest of these params don't matter - colors: [], - gradient: false, - stops: [], - rangeMin: 2, - rangeMax: 10, + type: 'palette', + name: 'default', + params: { + range: 'percent', + // the rest of these params don't matter + colors: [], + gradient: false, + stops: [], + rangeMin: 2, + rangeMax: 10, + }, }, dimensions as DimensionsVisParam ); diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx index 4a75f5cdf7b00..00fe4ac948f05 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx @@ -36,7 +36,7 @@ import { FieldFormatConvertFunction, SerializedFieldFormat, } from '@kbn/field-formats-plugin/common'; -import { CUSTOM_PALETTE } from '@kbn/coloring'; +import { CUSTOM_PALETTE, PaletteOutput } from '@kbn/coloring'; import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; import { useResizeObserver, useEuiScrollBar, EuiIcon } from '@elastic/eui'; @@ -100,14 +100,14 @@ const getMetricFormatter = ( const getColor = ( value: number, - paletteParams: CustomPaletteState, + palette: PaletteOutput<CustomPaletteState>, accessors: { metric: string; max?: string; breakdownBy?: string }, data: Datatable, rowNumber: number ) => { const { min, max } = getDataBoundsForPalette(accessors, data, rowNumber); - return getPaletteService().get(CUSTOM_PALETTE)?.getColorForValue?.(value, paletteParams, { + return getPaletteService().get(CUSTOM_PALETTE)?.getColorForValue?.(value, palette.params, { min, max, }); @@ -236,7 +236,7 @@ export const MetricVis = ({ icon: config.metric?.icon ? getIcon(config.metric?.icon) : undefined, extra: renderSecondaryMetric(data.columns, row, config), color: - config.metric.palette && value != null + config.metric.palette?.params && value != null ? getColor( value, config.metric.palette, diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx b/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx index 816a10509b425..549742b7e3401 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx @@ -41,6 +41,7 @@ import { } from '@kbn/expressions-plugin/public'; import type { FieldFormat } from '@kbn/field-formats-plugin/common'; import { getOverridesFor } from '@kbn/chart-expressions-common'; +import { useKbnPalettes } from '@kbn/palettes'; import { useAppFixedViewport } from '@kbn/core-rendering-browser'; import { consolidateMetricColumns } from '../../common/utils'; import { DEFAULT_PERCENT_DECIMALS } from '../../common/constants'; @@ -117,6 +118,7 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { } = props; const visParams = useMemo(() => filterOutConfig(visType, preVisParams), [preVisParams, visType]); const chartBaseTheme = props.chartsThemeService.useChartsBaseTheme(); + const palettes = useKbnPalettes(); const { table: visData, @@ -312,6 +314,7 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { { ...props.uiState?.get('vis.colors', {}), ...props.visParams.labels.colorOverrides }, visData.rows, props.palettesRegistry, + palettes, formatters, services.fieldFormats, syncColors, @@ -325,6 +328,7 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { props.uiState, props.visParams.labels.colorOverrides, props.palettesRegistry, + palettes, formatters, services.fieldFormats, syncColors, diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/utils/colors/color_mapping_accessors.ts b/src/plugins/chart_expressions/expression_partition_vis/public/utils/colors/color_mapping_accessors.ts index dcfcccaa3b53e..8368e98b83715 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/utils/colors/color_mapping_accessors.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/utils/colors/color_mapping_accessors.ts @@ -8,7 +8,7 @@ */ import { NodeColorAccessor, PATH_KEY } from '@elastic/charts'; -import { lightenColor } from '@kbn/charts-plugin/public'; +import { decreaseOpacity } from '@kbn/charts-plugin/public'; import { MultiFieldKey } from '@kbn/data-plugin/common'; import { getColorFactory } from '@kbn/coloring'; import { isMultiFieldKey } from '@kbn/data-plugin/common'; @@ -34,8 +34,8 @@ const getPieFillColor = // first two are: small multiple and pie whole center. const category = getCategoryKeys(path[2].value); const color = getColorFn(category); - // increase the lightness of the color on each layer. - return lightenColor(color, layerIndex + 1, numOfLayers); + // progressively decrease opacity of base color on each layer. + return decreaseOpacity(color, layerIndex + 1, numOfLayers); }; /** diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts index b6de7fc728ede..6bd8d188f78c5 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts @@ -75,7 +75,7 @@ const getDistinctColor = ( isSplitChart: boolean, overwriteColors: { [key: string]: string } = {}, visParams: PartitionVisParams, - palettes: PaletteRegistry | null, + paletteService: PaletteRegistry | null, syncColors: boolean, { parentSeries, allSeries }: DistinctSeries, formattedCategoricalKey: string @@ -93,7 +93,7 @@ const getDistinctColor = ( const index = allSeries.findIndex((d) => isEqual(d, categoricalKey)); const isSplitParentLayer = isSplitChart && parentSeries.includes(categoricalKey); - return palettes?.get(visParams.palette.name).getCategoricalColor( + return paletteService?.get(visParams.palette.name).getCategoricalColor( [ { name: categoricalKey, @@ -207,7 +207,7 @@ export const getColor = ( distinctSeries: DistinctSeries, { columnsLength, rowsLength }: { columnsLength: number; rowsLength: number }, visParams: PartitionVisParams, - palettes: PaletteRegistry | null, + paletteService: PaletteRegistry | null, byDataPalette: ReturnType<typeof byDataColorPaletteMap> | undefined, syncColors: boolean, isDarkMode: boolean, @@ -230,7 +230,7 @@ export const getColor = ( isSplitChart, overwriteColors, visParams, - palettes, + paletteService, syncColors, distinctSeries, name @@ -271,7 +271,7 @@ export const getColor = ( } } - const outputColor = palettes?.get(visParams.palette.name).getCategoricalColor( + const outputColor = paletteService?.get(visParams.palette.name).getCategoricalColor( seriesLayers, { behindText: visParams.labels.show || isTreemapOrMosaicChart(chartType), diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.test.ts b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.test.ts index d6c6e7d315924..eb211ad481899 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.test.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.test.ts @@ -13,8 +13,11 @@ import { BucketColumns, ChartTypes } from '../../../common/types'; import { createMockPieParams, createMockVisData } from '../../mocks'; import { getPaletteRegistry } from '../../__mocks__/palettes'; import { getLayers } from './get_layers'; +import { getKbnPalettes } from '@kbn/palettes'; describe('getLayers', () => { + const palettes = getKbnPalettes({ name: 'amsterdam', darkMode: false }); + it('preserves slice order for multi-metric layer', () => { const visData = createMockVisData(); const columns: BucketColumns[] = [ @@ -43,6 +46,7 @@ describe('getLayers', () => { {}, [], getPaletteRegistry(), + palettes, {}, fieldFormatsMock, false, @@ -153,6 +157,7 @@ describe('getLayers', () => { {}, [], getPaletteRegistry(), + palettes, {}, fieldFormatsMock, false, diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.ts b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.ts index c83353d4d8396..4346dd6ae4928 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_layers.ts @@ -8,19 +8,14 @@ */ import { Datum, PartitionLayer } from '@elastic/charts'; -import { - PaletteRegistry, - getColorFactory, - getPalette, - AVAILABLE_PALETTES, - NeutralPalette, -} from '@kbn/coloring'; +import { PaletteRegistry, getColorFactory } from '@kbn/coloring'; import { i18n } from '@kbn/i18n'; import { FieldFormat } from '@kbn/field-formats-plugin/common'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { Datatable, DatatableRow } from '@kbn/expressions-plugin/public'; import { getColorCategories } from '@kbn/chart-expressions-common'; +import { KbnPalettes } from '@kbn/palettes'; import { getDistinctSeries } from '..'; import { BucketColumns, ChartTypes, PartitionVisParams } from '../../../common/types'; import { sortPredicateByType, sortPredicateSaveSourceOrder } from './sort_predicate'; @@ -41,7 +36,8 @@ export const getLayers = ( visData: Datatable, overwriteColors: { [key: string]: string } = {}, rows: DatatableRow[], - palettes: PaletteRegistry | null, + paletteService: PaletteRegistry | null, + palettes: KbnPalettes, formatters: Record<string, FieldFormat | undefined>, formatter: FieldFormatsStart, syncColors: boolean, @@ -59,11 +55,11 @@ export const getLayers = ( const isSplitChart = Boolean(visParams.dimensions.splitColumn || visParams.dimensions.splitRow); let byDataPalette: ReturnType<typeof byDataColorPaletteMap>; - if (!syncColors && columns[1]?.id && palettes && visParams.palette) { + if (!syncColors && columns[1]?.id && paletteService && visParams.palette) { byDataPalette = byDataColorPaletteMap( rows, columns[1], - palettes?.get(visParams.palette.name), + paletteService?.get(visParams.palette.name), visParams.palette, formatters, formatter @@ -79,8 +75,9 @@ export const getLayers = ( chartType, columns, rows, - isDarkMode, - visParams + palettes, + visParams, + isDarkMode ); return columns.map((col, layerIndex) => { @@ -110,7 +107,7 @@ export const getLayers = ( distinctSeries, { columnsLength: columns.length, rowsLength: rows.length }, visParams, - palettes, + paletteService, byDataPalette, syncColors, isDarkMode, @@ -131,8 +128,9 @@ function getColorFromMappingFactory( chartType: ChartTypes, columns: Array<Partial<BucketColumns>>, rows: DatatableRow[], - isDarkMode: boolean, - visParams: PartitionVisParams + palettes: KbnPalettes, + visParams: PartitionVisParams, + isDarkMode: boolean ): undefined | ((category: string | string[]) => string) { const { colorMapping, dimensions } = visParams; @@ -151,19 +149,14 @@ function getColorFromMappingFactory( } // the mosaic configures the main categories in the second column, instead of the first // as it happens in all the other partition types. - // Independentely from the bucket aggregation used, the categories will always be casted + // Independently from the bucket aggregation used, the categories will always be casted // as string to make it nicely working with a text input field, avoiding a field const categories = chartType === ChartTypes.MOSAIC && columns.length === 2 ? getColorCategories(rows, columns[1]?.id) : getColorCategories(rows, columns[0]?.id); - return getColorFactory( - JSON.parse(colorMapping), - getPalette(AVAILABLE_PALETTES, NeutralPalette), - isDarkMode, - { - type: 'categories', - categories, - } - ); + return getColorFactory(JSON.parse(colorMapping), palettes, isDarkMode, { + type: 'categories', + categories, + }); } diff --git a/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json b/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json index 1d8c4c4098728..ec1ac8ee94edc 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json +++ b/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json @@ -31,6 +31,7 @@ "@kbn/cell-actions", "@kbn/react-kibana-context-render", "@kbn/core-rendering-browser", + "@kbn/palettes", ], "exclude": [ "target/**/*", diff --git a/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx b/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx index 12a7991a68adf..46064ebd6b6e2 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx +++ b/src/plugins/chart_expressions/expression_tagcloud/public/components/tagcloud_component.tsx @@ -23,19 +23,13 @@ import { WordCloudElementEvent, } from '@elastic/charts'; import { EmptyPlaceholder } from '@kbn/charts-plugin/public'; -import { - PaletteRegistry, - PaletteOutput, - getColorFactory, - getPalette, - AVAILABLE_PALETTES, - NeutralPalette, -} from '@kbn/coloring'; +import { PaletteRegistry, PaletteOutput, getColorFactory } from '@kbn/coloring'; import { IInterpreterRenderHandlers, DatatableRow } from '@kbn/expressions-plugin/public'; import { getColorCategories, getOverridesFor } from '@kbn/chart-expressions-common'; import type { AllowedSettingsOverrides, AllowedChartOverrides } from '@kbn/charts-plugin/common'; import { getColumnByAccessor, getFormatByAccessor } from '@kbn/visualizations-plugin/common/utils'; import { isMultiFieldKey } from '@kbn/data-plugin/common'; +import { KbnPalettes, useKbnPalettes } from '@kbn/palettes'; import { getFormatService } from '../format_service'; import { TagcloudRendererConfig } from '../../common/types'; import { ScaleOptions, Orientation } from '../../common/constants'; @@ -56,13 +50,13 @@ const calculateWeight = (value: number, x1: number, y1: number, x2: number, y2: ((value - x1) * (y2 - x2)) / (y1 - x1) + x2; const getColor = ( - palettes: PaletteRegistry, + paletteService: PaletteRegistry, activePalette: PaletteOutput, text: string, values: string[], syncColors: boolean ) => { - return palettes?.get(activePalette?.name)?.getCategoricalColor( + return paletteService?.get(activePalette?.name)?.getCategoricalColor( [ { name: text, @@ -106,6 +100,7 @@ export const TagCloudChart = ({ isDarkMode, }: TagCloudChartProps) => { const [warning, setWarning] = useState(false); + const palettes = useKbnPalettes(); const { bucket, metric, scale, palette, showLabel, orientation, colorMapping } = visParams; const bucketFormatter = useMemo(() => { @@ -128,6 +123,7 @@ export const TagCloudChart = ({ const colorFromMappingFn = getColorFromMappingFactory( tagColumn, visData.rows, + palettes, isDarkMode, colorMapping ); @@ -149,15 +145,16 @@ export const TagCloudChart = ({ }); }, [ bucket, - bucketFormatter, - metric, - palette, - palettesRegistry, - syncColors, visData.columns, visData.rows, - colorMapping, + metric, + palettes, isDarkMode, + colorMapping, + bucketFormatter, + palettesRegistry, + palette, + syncColors, ]); useEffect(() => { @@ -320,6 +317,7 @@ export { TagCloudChart as default }; function getColorFromMappingFactory( tagColumn: string | undefined, rows: DatatableRow[], + palettes: KbnPalettes, isDarkMode: boolean, colorMapping?: string ): undefined | ((category: string | string[]) => string) { @@ -327,13 +325,8 @@ function getColorFromMappingFactory( // return undefined, we will use the legacy color mapping instead return undefined; } - return getColorFactory( - JSON.parse(colorMapping), - getPalette(AVAILABLE_PALETTES, NeutralPalette), - isDarkMode, - { - type: 'categories', - categories: getColorCategories(rows, tagColumn), - } - ); + return getColorFactory(JSON.parse(colorMapping), palettes, isDarkMode, { + type: 'categories', + categories: getColorCategories(rows, tagColumn), + }); } diff --git a/src/plugins/chart_expressions/expression_tagcloud/tsconfig.json b/src/plugins/chart_expressions/expression_tagcloud/tsconfig.json index 40caf4e3b00f0..485c561bda281 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/tsconfig.json +++ b/src/plugins/chart_expressions/expression_tagcloud/tsconfig.json @@ -28,6 +28,7 @@ "@kbn/chart-icons", "@kbn/data-plugin", "@kbn/react-kibana-context-render", + "@kbn/palettes", ], "exclude": [ "target/**/*", diff --git a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap index 5cfd34c6c8b5a..c01267bf3acd7 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap @@ -1751,6 +1751,13 @@ exports[`XYChart component it renders area 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -3306,6 +3313,13 @@ exports[`XYChart component it renders bar 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -4861,6 +4875,13 @@ exports[`XYChart component it renders horizontal bar 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -6416,6 +6437,13 @@ exports[`XYChart component it renders line 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -7971,6 +7999,13 @@ exports[`XYChart component it renders stacked area 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -9526,6 +9561,13 @@ exports[`XYChart component it renders stacked bar 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -11081,6 +11123,13 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -12862,6 +12911,13 @@ exports[`XYChart component split chart should render split chart if both, splitR "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -14650,6 +14706,13 @@ exports[`XYChart component split chart should render split chart if splitColumnA "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" @@ -16436,6 +16499,13 @@ exports[`XYChart component split chart should render split chart if splitRowAcce "getAll": [MockFunction], } } + palettes={ + KbnPalettes { + "get": [Function], + "getAll": [Function], + "query": [Function], + } + } shouldShowValueLabels={true} syncColors={false} timeZone="UTC" diff --git a/src/plugins/chart_expressions/expression_xy/public/components/data_layers.tsx b/src/plugins/chart_expressions/expression_xy/public/components/data_layers.tsx index 3335f29029904..df51a0869ecea 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/data_layers.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/components/data_layers.tsx @@ -20,6 +20,7 @@ import { PaletteRegistry } from '@kbn/coloring'; import { FormatFactory } from '@kbn/field-formats-plugin/common'; import { getAccessorByDimension } from '@kbn/visualizations-plugin/common/utils'; import { PersistedState } from '@kbn/visualizations-plugin/public'; +import { KbnPalettes } from '@kbn/palettes'; import { CommonXYDataLayerConfig, EndValue, @@ -49,6 +50,7 @@ interface Props { fittingFunction?: FittingFunction; endValue?: EndValue | undefined; paletteService: PaletteRegistry; + palettes: KbnPalettes; formattedDatatables: DatatablesWithFormatInfo; syncColors: boolean; timeZone: string; @@ -75,6 +77,7 @@ export const DataLayers: FC<Props> = ({ minBarHeight, formatFactory, paletteService, + palettes, fittingFunction, emphasizeFitting, yAxesConfiguration, @@ -163,6 +166,7 @@ export const DataLayers: FC<Props> = ({ formatFactory, columnToLabelMap, paletteService, + palettes, formattedDatatableInfo, syncColors, yAxis, diff --git a/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.tsx b/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.tsx index 349af46eb101a..3ebc9efcd6c0a 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.tsx @@ -38,6 +38,7 @@ import { IconType } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { PaletteRegistry } from '@kbn/coloring'; import { RenderMode } from '@kbn/expressions-plugin/common'; +import { useKbnPalettes } from '@kbn/palettes'; import { ESQL_TABLE_TYPE } from '@kbn/data-plugin/common'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { EmptyPlaceholder, LegendToggle } from '@kbn/charts-plugin/public'; @@ -233,6 +234,7 @@ export function XYChart({ const chartRef = useRef<Chart>(null); const chartBaseTheme = chartsThemeService.useChartsBaseTheme(); const darkMode = chartsThemeService.useDarkMode(); + const palettes = useKbnPalettes(); const appFixedViewport = useAppFixedViewport(); const filteredLayers = getFilteredLayers(layers); const layersById = filteredLayers.reduce<Record<string, CommonXYLayerConfig>>( @@ -989,6 +991,7 @@ export function XYChart({ minBarHeight={args.minBarHeight} formatFactory={formatFactory} paletteService={paletteService} + palettes={palettes} fittingFunction={fittingFunction} emphasizeFitting={emphasizeFitting} yAxesConfiguration={yAxesConfiguration} diff --git a/src/plugins/chart_expressions/expression_xy/public/expression_renderers/index.ts b/src/plugins/chart_expressions/expression_xy/public/expression_renderers/index.ts index 650b8fba2a6d9..71b8bb35ac222 100644 --- a/src/plugins/chart_expressions/expression_xy/public/expression_renderers/index.ts +++ b/src/plugins/chart_expressions/expression_xy/public/expression_renderers/index.ts @@ -8,4 +8,4 @@ */ export { getXyChartRenderer } from './xy_chart_renderer'; -export type { GetStartDepsFn } from './xy_chart_renderer'; +export type { GetStartDeps } from './xy_chart_renderer'; diff --git a/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx b/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx index 57387a46388af..cb7a75fcdf691 100644 --- a/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx @@ -32,6 +32,7 @@ import { extractVisualizationType, } from '@kbn/chart-expressions-common'; +import { ThemeServiceSetup } from '@kbn/core/public'; import type { getDataLayers } from '../helpers'; import { LayerTypes, SeriesTypes } from '../../common/constants'; import type { CommonXYDataLayerConfig, XYChartProps } from '../../common'; @@ -43,10 +44,11 @@ import type { StartServices, } from '../types'; -export type GetStartDepsFn = () => Promise<{ +export interface GetStartDeps { data: DataPublicPluginStart; formatFactory: FormatFactory; theme: ChartsPluginStart['theme']; + kibanaTheme: ThemeServiceSetup; activeCursor: ChartsPluginStart['activeCursor']; paletteService: PaletteRegistry; timeZone: string; @@ -55,10 +57,10 @@ export type GetStartDepsFn = () => Promise<{ usageCollection?: UsageCollectionStart; timeFormat: string; startServices: StartServices; -}>; +} interface XyChartRendererDeps { - getStartDeps: GetStartDepsFn; + getStartDeps: () => Promise<GetStartDeps>; } export const extractCounterEvents = ( diff --git a/src/plugins/chart_expressions/expression_xy/public/helpers/color/color_mapping_accessor.ts b/src/plugins/chart_expressions/expression_xy/public/helpers/color/color_mapping_accessor.ts index 6923a9a2f5409..93b498f5b57e1 100644 --- a/src/plugins/chart_expressions/expression_xy/public/helpers/color/color_mapping_accessor.ts +++ b/src/plugins/chart_expressions/expression_xy/public/helpers/color/color_mapping_accessor.ts @@ -10,13 +10,14 @@ import { SeriesColorAccessorFn } from '@elastic/charts'; import { getColorFactory, type ColorMapping, type ColorMappingInputData } from '@kbn/coloring'; import { MULTI_FIELD_KEY_SEPARATOR } from '@kbn/data-plugin/common'; +import { KbnPalettes } from '@kbn/palettes'; /** * Return a color accessor function for XY charts depending on the split accessors received. */ export function getColorSeriesAccessorFn( config: ColorMapping.Config, - getPaletteFn: (paletteId: string) => ColorMapping.CategoricalPalette, + palettes: KbnPalettes, isDarkMode: boolean, mappingData: ColorMappingInputData, fieldId: string, @@ -28,7 +29,7 @@ export function getColorSeriesAccessorFn( [...specialTokens.entries()].map((d) => [d[1], d[0]]) ); - const getColor = getColorFactory(config, getPaletteFn, isDarkMode, mappingData); + const getColor = getColorFactory(config, palettes, isDarkMode, mappingData); return ({ splitAccessors }) => { const splitValue = splitAccessors.get(fieldId); diff --git a/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx b/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx index 942909880f301..11cd6b05fc16b 100644 --- a/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx @@ -25,13 +25,9 @@ import { Datatable } from '@kbn/expressions-plugin/common'; import { getAccessorByDimension } from '@kbn/visualizations-plugin/common/utils'; import type { ExpressionValueVisDimension } from '@kbn/visualizations-plugin/common/expression_functions'; import { PaletteRegistry, SeriesLayer } from '@kbn/coloring'; -import { - getPalette, - AVAILABLE_PALETTES, - NeutralPalette, - SPECIAL_TOKENS_STRING_CONVERSION, -} from '@kbn/coloring'; +import { SPECIAL_TOKENS_STRING_CONVERSION } from '@kbn/coloring'; import { getColorCategories } from '@kbn/chart-expressions-common'; +import { KbnPalettes } from '@kbn/palettes'; import { isDataLayer } from '../../common/utils/layer_types_guards'; import { CommonXYDataLayerConfig, CommonXYLayerConfig, XScaleType } from '../../common'; import { AxisModes, SeriesTypes } from '../../common/constants'; @@ -54,6 +50,7 @@ type GetSeriesPropsFn = (config: { colorAssignments: ColorAssignments; columnToLabelMap: Record<string, string>; paletteService: PaletteRegistry; + palettes: KbnPalettes; yAxis?: GroupsConfiguration[number]; xAxis?: GroupsConfiguration[number]; syncColors: boolean; @@ -392,6 +389,7 @@ export const getSeriesProps: GetSeriesPropsFn = ({ formatFactory, columnToLabelMap, paletteService, + palettes, syncColors, yAxis, xAxis, @@ -490,7 +488,7 @@ export const getSeriesProps: GetSeriesPropsFn = ({ layer.colorMapping && splitColumnIds.length > 0 ? getColorSeriesAccessorFn( JSON.parse(layer.colorMapping), // the color mapping is at this point just a stringified JSON - getPalette(AVAILABLE_PALETTES, NeutralPalette), + palettes, isDarkMode, { type: 'categories', diff --git a/src/plugins/chart_expressions/expression_xy/public/plugin.ts b/src/plugins/chart_expressions/expression_xy/public/plugin.ts index 04ba0ac2b3bc2..8415e2bc7d04c 100755 --- a/src/plugins/chart_expressions/expression_xy/public/plugin.ts +++ b/src/plugins/chart_expressions/expression_xy/public/plugin.ts @@ -31,7 +31,7 @@ import { extendedAnnotationLayerFunction, referenceLineDecorationConfigFunction, } from '../common/expression_functions'; -import { GetStartDepsFn, getXyChartRenderer } from './expression_renderers'; +import { GetStartDeps, getXyChartRenderer } from './expression_renderers'; import { eventAnnotationsResult } from '../common/expression_functions/event_annotations_result'; export interface XYPluginStartDependencies { @@ -71,7 +71,7 @@ export class ExpressionXyPlugin { expressions.registerFunction(xyVisFunction); expressions.registerFunction(layeredXyVisFunction); - const getStartDeps: GetStartDepsFn = async () => { + const getStartDeps = async () => { const [coreStart, deps] = await core.getStartServices(); const { data, @@ -100,7 +100,7 @@ export class ExpressionXyPlugin { timeZone: getTimeZone(core.uiSettings), timeFormat: core.uiSettings.get('dateFormat'), startServices: coreStart, - }; + } satisfies GetStartDeps; }; expressions.registerRenderer(getXyChartRenderer({ getStartDeps })); diff --git a/src/plugins/chart_expressions/expression_xy/tsconfig.json b/src/plugins/chart_expressions/expression_xy/tsconfig.json index cd8bd4db90b89..5ffa2904e04b4 100644 --- a/src/plugins/chart_expressions/expression_xy/tsconfig.json +++ b/src/plugins/chart_expressions/expression_xy/tsconfig.json @@ -36,6 +36,7 @@ "@kbn/cell-actions", "@kbn/react-kibana-context-render", "@kbn/core-rendering-browser", + "@kbn/palettes", ], "exclude": [ "target/**/*", diff --git a/src/plugins/charts/public/index.ts b/src/plugins/charts/public/index.ts index 6b70018ac5901..711f38b7d92f7 100644 --- a/src/plugins/charts/public/index.ts +++ b/src/plugins/charts/public/index.ts @@ -22,7 +22,8 @@ export const plugin = () => new ChartsPlugin(); export type { ChartsPluginSetup, ChartsPluginStart } from './plugin'; export * from './static'; -export { lightenColor } from './services/palettes/lighten_color'; +export * from './services/palettes/lighten_color'; +export * from './services/palettes/decrease_opacity'; export { useActiveCursor } from './services/active_cursor'; export interface ClickTriggerEvent { diff --git a/src/plugins/charts/public/mocks.ts b/src/plugins/charts/public/mocks.ts index aa7518d1df9f1..db6bd2bab4212 100644 --- a/src/plugins/charts/public/mocks.ts +++ b/src/plugins/charts/public/mocks.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { createCoreSetupMock } from '@kbn/core-lifecycle-browser-mocks/src/core_setup.mock'; import { ChartsPlugin } from './plugin'; import { themeServiceMock } from './services/theme/mock'; import { activeCursorMock } from './services/active_cursor/mock'; @@ -19,13 +20,13 @@ export type Start = jest.Mocked<ReturnType<ChartsPlugin['start']>>; const createSetupContract = (): Setup => ({ theme: themeServiceMock, - palettes: paletteServiceMock.setup(), + palettes: paletteServiceMock.setup(createCoreSetupMock().theme.getTheme()), }); const createStartContract = (): Start => ({ theme: themeServiceMock, activeCursor: activeCursorMock, - palettes: paletteServiceMock.setup(), + palettes: paletteServiceMock.setup(createCoreSetupMock().theme.getTheme()), }); export const chartPluginMock = { diff --git a/src/plugins/charts/public/plugin.ts b/src/plugins/charts/public/plugin.ts index 4d058c3beea32..06a7236545aba 100644 --- a/src/plugins/charts/public/plugin.ts +++ b/src/plugins/charts/public/plugin.ts @@ -42,8 +42,8 @@ export class ChartsPlugin implements Plugin<ChartsPluginSetup, ChartsPluginStart dependencies.expressions.registerFunction(palette); dependencies.expressions.registerFunction(systemPalette); this.themeService.init(core.theme); - this.palettes = this.paletteService.setup(); - + // TODO: make this reactive to changes in $theme + this.palettes = this.paletteService.setup(core.theme.getTheme()); this.activeCursor.setup(); return { diff --git a/src/plugins/charts/public/services/palettes/decrease_opacity.test.ts b/src/plugins/charts/public/services/palettes/decrease_opacity.test.ts new file mode 100644 index 0000000000000..845021e768755 --- /dev/null +++ b/src/plugins/charts/public/services/palettes/decrease_opacity.test.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import chroma from 'chroma-js'; +import { decreaseOpacity } from './decrease_opacity'; + +describe('decrease_opacity', () => { + it('should keep existing color if there is a single color step', () => { + expect(decreaseOpacity('#FF0000', 1, 1)).toEqual('#FF0000'); + }); + + it('should keep existing color for the first step', () => { + expect(decreaseOpacity('#FF0000', 1, 10)).toEqual('#FF0000'); + }); + + it('should decrease color opacity', () => { + const baseColor = '#FF0000'; + + const color1 = chroma(decreaseOpacity(baseColor, 2, 4)); + const color2 = chroma(decreaseOpacity(baseColor, 3, 4)); + + expect(chroma(baseColor).luminance()).toBeLessThan(color1.luminance()); + expect(color1.luminance()).toBeLessThan(color2.luminance()); + }); + + it('should not exceed top luminance', () => { + const result = decreaseOpacity('#000', 12, 10); + + expect(chroma(result).luminance()).toBeLessThan(0.8); + }); +}); diff --git a/src/plugins/charts/public/services/palettes/decrease_opacity.ts b/src/plugins/charts/public/services/palettes/decrease_opacity.ts new file mode 100644 index 0000000000000..bd49ba66b1707 --- /dev/null +++ b/src/plugins/charts/public/services/palettes/decrease_opacity.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import chroma from 'chroma-js'; +import { euiThemeVars } from '@kbn/ui-theme'; + +const MIN_OPACITY = 0.2; + +/** + * Reduces color opacity, by mixing color with background color. + * + * This is used when the resulting color needs to be opaque (i.e. alpha of 1). + */ +export function decreaseOpacity(baseColor: string, step: number, totalSteps: number) { + if (totalSteps === 1) { + return baseColor; + } + + const backgroundColor = euiThemeVars.euiColorEmptyShade; + const ratio = Math.min(0.2 * (step - 1), 1 - MIN_OPACITY); + const color = chroma(baseColor).mix(backgroundColor, ratio, 'lch'); + + return color.hex().toUpperCase(); +} diff --git a/src/plugins/charts/public/services/palettes/lighten_color.ts b/src/plugins/charts/public/services/palettes/lighten_color.ts index 80298f5c8b531..b7c1908375ebd 100644 --- a/src/plugins/charts/public/services/palettes/lighten_color.ts +++ b/src/plugins/charts/public/services/palettes/lighten_color.ts @@ -23,5 +23,6 @@ export function lightenColor(baseColor: string, step: number, totalSteps: number const currentLevelTargetLightness = outputColorLightness + lightnessSpace * ((step - 1) / (totalSteps - 1)); const lightenedColor = hslColor.lightness(currentLevelTargetLightness); + return lightenedColor.hex(); } diff --git a/src/plugins/charts/public/services/palettes/palettes.test.tsx b/src/plugins/charts/public/services/palettes/palettes.test.tsx index a9567b0c12179..a962da6776c4e 100644 --- a/src/plugins/charts/public/services/palettes/palettes.test.tsx +++ b/src/plugins/charts/public/services/palettes/palettes.test.tsx @@ -11,7 +11,7 @@ import { buildPalettes } from './palettes'; import { euiPaletteColorBlind, euiPaletteColorBlindBehindText } from '@elastic/eui'; describe('palettes', () => { - const palettes = buildPalettes(); + const palettes = buildPalettes({ name: 'amsterdam', darkMode: false }); describe('default palette', () => { describe('syncColors: false', () => { diff --git a/src/plugins/charts/public/services/palettes/palettes.tsx b/src/plugins/charts/public/services/palettes/palettes.tsx index fc9d2370694bf..4858bf0547d46 100644 --- a/src/plugins/charts/public/services/palettes/palettes.tsx +++ b/src/plugins/charts/public/services/palettes/palettes.tsx @@ -9,29 +9,19 @@ import chroma from 'chroma-js'; import { i18n } from '@kbn/i18n'; -import { - euiPaletteColorBlind, - euiPaletteCool, - euiPaletteGray, - euiPaletteRed, - euiPaletteGreen, - euiPaletteWarm, - euiPaletteForStatus, - euiPaletteForTemperature, - euiPaletteComplementary, - euiPaletteColorBlindBehindText, -} from '@elastic/eui'; +import { getKbnPalettes, KbnPalette, type IKbnPalette } from '@kbn/palettes'; import type { ChartColorConfiguration, PaletteDefinition, SeriesLayer } from '@kbn/coloring'; import { flatten, zip } from 'lodash'; +import { CoreTheme } from '@kbn/core/public'; import { createColorPalette as createLegacyColorPalette } from '../..'; -import { lightenColor } from './lighten_color'; import { MappedColors } from '../mapped_colors'; import { workoutColorForValue } from './helpers'; +import { decreaseOpacity } from './decrease_opacity'; function buildRoundRobinCategoricalWithMappedColors( - id = 'default', - colors = euiPaletteColorBlind({ rotations: 2 }), - behindTextColors = euiPaletteColorBlindBehindText({ rotations: 2 }) + id: string, + colors: string[], + behindTextColors?: string[] ): Omit<PaletteDefinition, 'title'> { const behindTextColorMap: Record<string, string> = Object.fromEntries( zip(colors, behindTextColors) @@ -50,21 +40,22 @@ function buildRoundRobinCategoricalWithMappedColors( const mappedColor = mappedColors.get(colorKey); outputColor = chartConfiguration.behindText ? behindTextColorMap[mappedColor] : mappedColor; } else { - outputColor = chartConfiguration.behindText - ? behindTextColors[series[0].rankAtDepth % behindTextColors.length] - : colors[series[0].rankAtDepth % colors.length]; + outputColor = + chartConfiguration.behindText && behindTextColors + ? behindTextColors[series[0].rankAtDepth % behindTextColors.length] + : colors[series[0].rankAtDepth % colors.length]; } if (!chartConfiguration.maxDepth || chartConfiguration.maxDepth === 1) { return outputColor; } - return lightenColor(outputColor, series.length, chartConfiguration.maxDepth); + return decreaseOpacity(outputColor, series.length, chartConfiguration.maxDepth); } return { id, getCategoricalColor: getColor, - getCategoricalColors: () => colors.slice(0, 10), + getCategoricalColors: (size: number) => colors.slice(0, size), toExpression: () => ({ type: 'expression', chain: [ @@ -80,29 +71,27 @@ function buildRoundRobinCategoricalWithMappedColors( }; } -function buildGradient( - id: string, - colors: (n: number) => string[] -): Omit<PaletteDefinition, 'title'> { +function buildGradient(id: string, palette: IKbnPalette): PaletteDefinition { function getColor( series: SeriesLayer[], chartConfiguration: ChartColorConfiguration = { behindText: false } ) { const totalSeriesAtDepth = series[0].totalSeriesAtDepth; const rankAtDepth = series[0].rankAtDepth; - const actualColors = colors(totalSeriesAtDepth); + const actualColors = palette.colors(totalSeriesAtDepth); const outputColor = actualColors[rankAtDepth]; if (!chartConfiguration.maxDepth || chartConfiguration.maxDepth === 1) { return outputColor; } - return lightenColor(outputColor, series.length, chartConfiguration.maxDepth); + return decreaseOpacity(outputColor, series.length, chartConfiguration.maxDepth); } return { id, + title: palette.name, getCategoricalColor: getColor, - getCategoricalColors: colors, + getCategoricalColors: palette.colors, canDynamicColoring: true, toExpression: () => ({ type: 'expression', @@ -153,7 +142,7 @@ function buildCustomPalette(): PaletteDefinition { return outputColor; } - return lightenColor(outputColor, series.length, chartConfiguration.maxDepth); + return decreaseOpacity(outputColor, series.length, chartConfiguration.maxDepth); }, internal: true, title: i18n.translate('charts.palettes.customLabel', { defaultMessage: 'Custom' }), @@ -220,50 +209,32 @@ function buildCustomPalette(): PaletteDefinition { } as PaletteDefinition<unknown>; } -export const buildPalettes = (): Record<string, PaletteDefinition> => ({ - default: { - title: i18n.translate('charts.palettes.defaultPaletteLabel', { defaultMessage: 'Default' }), - ...buildRoundRobinCategoricalWithMappedColors(), - }, - status: { - title: i18n.translate('charts.palettes.statusLabel', { defaultMessage: 'Status' }), - ...buildGradient('status', euiPaletteForStatus), - }, - temperature: { - title: i18n.translate('charts.palettes.temperatureLabel', { defaultMessage: 'Temperature' }), - ...buildGradient('temperature', euiPaletteForTemperature), - }, - complementary: { - title: i18n.translate('charts.palettes.complementaryLabel', { - defaultMessage: 'Complementary', - }), - ...buildGradient('complementary', euiPaletteComplementary), - }, - negative: { - title: i18n.translate('charts.palettes.negativeLabel', { defaultMessage: 'Negative' }), - ...buildGradient('negative', euiPaletteRed), - }, - positive: { - title: i18n.translate('charts.palettes.positiveLabel', { defaultMessage: 'Positive' }), - ...buildGradient('positive', euiPaletteGreen), - }, - cool: { - title: i18n.translate('charts.palettes.coolLabel', { defaultMessage: 'Cool' }), - ...buildGradient('cool', euiPaletteCool), - }, - warm: { - title: i18n.translate('charts.palettes.warmLabel', { defaultMessage: 'Warm' }), - ...buildGradient('warm', euiPaletteWarm), - }, - gray: { - title: i18n.translate('charts.palettes.grayLabel', { defaultMessage: 'Gray' }), - ...buildGradient('gray', euiPaletteGray), - }, - kibana_palette: { - title: i18n.translate('charts.palettes.kibanaPaletteLabel', { - defaultMessage: 'Compatibility', - }), - ...buildRoundRobinCategoricalWithMappedColors('kibana_palette', createLegacyColorPalette(20)), - }, - custom: buildCustomPalette() as PaletteDefinition<unknown>, -}); +export const buildPalettes = (theme: CoreTheme): Record<string, PaletteDefinition> => { + const kbnPalettes = getKbnPalettes(theme); + const defaultPalette = kbnPalettes.get(KbnPalette.Default); + return { + default: { + title: defaultPalette.name, + ...buildRoundRobinCategoricalWithMappedColors( + 'default', // needs to match key of palette definition + defaultPalette.colors(), + kbnPalettes.query(KbnPalette.Kibana7BehindText)?.colors() + ), + }, + status: buildGradient('status', kbnPalettes.get('status')), + temperature: buildGradient('temperature', kbnPalettes.get('temperature')), + complementary: buildGradient('complementary', kbnPalettes.get('complementary')), + negative: buildGradient('negative', kbnPalettes.get('red')), + positive: buildGradient('positive', kbnPalettes.get('green')), + cool: buildGradient('cool', kbnPalettes.get('cool')), + warm: buildGradient('warm', kbnPalettes.get('warm')), + gray: buildGradient('gray', kbnPalettes.get('gray')), + kibana_palette: { + title: i18n.translate('charts.palettes.kibanaPaletteLabel', { + defaultMessage: 'Compatibility', + }), + ...buildRoundRobinCategoricalWithMappedColors('kibana_palette', createLegacyColorPalette(20)), + }, + custom: buildCustomPalette(), + }; +}; diff --git a/src/plugins/charts/public/services/palettes/service.ts b/src/plugins/charts/public/services/palettes/service.ts index 30c58172ad429..5e66a5d9e650a 100644 --- a/src/plugins/charts/public/services/palettes/service.ts +++ b/src/plugins/charts/public/services/palettes/service.ts @@ -10,6 +10,7 @@ import type { PaletteRegistry, PaletteDefinition } from '@kbn/coloring'; import { getActivePaletteName } from '@kbn/coloring'; import type { ExpressionsSetup } from '@kbn/expressions-plugin/public'; +import { CoreTheme } from '@kbn/core/public'; import type { ChartsPluginSetup } from '../..'; export interface PaletteSetupPlugins { @@ -21,12 +22,12 @@ export class PaletteService { private palettes: Record<string, PaletteDefinition<unknown>> | undefined = undefined; constructor() {} - public setup() { + public setup(theme: CoreTheme) { return { getPalettes: async (): Promise<PaletteRegistry> => { if (!this.palettes) { const { buildPalettes } = await import('./palettes'); - this.palettes = buildPalettes(); + this.palettes = buildPalettes(theme); } return { get: (name: string) => { diff --git a/src/plugins/charts/public/services/theme/theme.test.tsx b/src/plugins/charts/public/services/theme/theme.test.tsx index da89ec475d577..df0acfbede1cf 100644 --- a/src/plugins/charts/public/services/theme/theme.test.tsx +++ b/src/plugins/charts/public/services/theme/theme.test.tsx @@ -82,19 +82,19 @@ describe('ThemeService', () => { const { useChartsBaseTheme } = themeService; const { result } = renderHook(() => useChartsBaseTheme()); - expect(result.current).toBe(LIGHT_THEME); + expect(result.current).toStrictEqual(LIGHT_THEME); act(() => { setUpMockTheme.theme$ = createTheme$Mock(true); themeService.init(setUpMockTheme); }); - expect(result.current).toBe(DARK_THEME); + expect(result.current).toStrictEqual(DARK_THEME); act(() => { setUpMockTheme.theme$ = createTheme$Mock(false); themeService.init(setUpMockTheme); }); // act(() => darkMode$.next(false)); - expect(result.current).toBe(LIGHT_THEME); + expect(result.current).toStrictEqual(LIGHT_THEME); }); it('should not rerender when emitting the same value', () => { diff --git a/src/plugins/charts/public/services/theme/theme.ts b/src/plugins/charts/public/services/theme/theme.ts index d7ec8c03e506c..765daf957e74d 100644 --- a/src/plugins/charts/public/services/theme/theme.ts +++ b/src/plugins/charts/public/services/theme/theme.ts @@ -12,6 +12,7 @@ import { Observable, BehaviorSubject } from 'rxjs'; import { CoreSetup, CoreTheme } from '@kbn/core/public'; import { DARK_THEME, LIGHT_THEME, PartialTheme, Theme } from '@elastic/charts'; +import { euiThemeVars } from '@kbn/ui-theme'; export class ThemeService { /** Returns default charts theme */ @@ -102,8 +103,21 @@ export class ThemeService { */ public init(theme: CoreSetup['theme']) { this.theme$ = theme.theme$; - this.theme$.subscribe(({ darkMode }) => { - this._chartsBaseTheme$.next(darkMode ? DARK_THEME : LIGHT_THEME); + this.theme$.subscribe((newTheme) => { + this._chartsBaseTheme$.next(getChartTheme(newTheme)); }); } } + +// TODO: define these overrides in elastic/charts when Borealis becomes default +function getChartTheme(theme: CoreTheme): Theme { + const chartTheme = theme.darkMode ? DARK_THEME : LIGHT_THEME; + + if (theme.name !== 'amsterdam') { + const backgroundColor = euiThemeVars.euiColorEmptyShade; + chartTheme.background.color = backgroundColor; + chartTheme.background.fallbackColor = backgroundColor; + } + + return chartTheme; +} diff --git a/src/plugins/charts/tsconfig.json b/src/plugins/charts/tsconfig.json index 8ad33a8517031..0bd9814e55579 100644 --- a/src/plugins/charts/tsconfig.json +++ b/src/plugins/charts/tsconfig.json @@ -16,6 +16,8 @@ "@kbn/shared-ux-utility", "@kbn/config-schema", "@kbn/data-plugin", + "@kbn/core-lifecycle-browser-mocks", + "@kbn/palettes", ], "exclude": [ "target/**/*", diff --git a/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts b/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts index 072da4d2fab30..45fc421e4b900 100644 --- a/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts +++ b/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts @@ -130,6 +130,22 @@ export const shareModalStrings = { defaultMessage: 'One or more panels on this dashboard have changed. Before you generate a snapshot, save the dashboard.', }), + getDraftSharePanelChangesWarning: () => + i18n.translate('dashboard.snapshotShare.panelChangesWarning', { + defaultMessage: + 'You are about to share a dashboard with unsaved changes, and the link may not work properly. Save the dashboard first to create a permanent link.', + }), + getEmbedSharePanelChangesWarning: () => + i18n.translate('dashboard.embedShare.draftWarning', { + defaultMessage: + 'You are about to create an embedded dashboard with unsaved changes, and the embed code may not work properly. Save the dashboard first to create a permanent embedded dashboard.', + }), + getDraftShareWarning: (shareType: 'embed' | 'link') => + i18n.translate('dashboard.snapshotShare.draftWarning', { + defaultMessage: + 'This dashboard has unsaved changes. Consider saving your dashboard before generating the {shareType}.', + values: { shareType: shareType === 'embed' ? 'embed code' : 'link' }, + }), }; /* diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx index 2e3690e40d4ee..41a290844328a 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx @@ -11,7 +11,7 @@ import { omit } from 'lodash'; import moment from 'moment'; import React, { ReactElement, useState } from 'react'; -import { EuiCheckboxGroup } from '@elastic/eui'; +import { EuiCallOut, EuiCheckboxGroup } from '@elastic/eui'; import type { Capabilities } from '@kbn/core/public'; import { QueryState } from '@kbn/data-plugin/common'; import { DASHBOARD_APP_LOCATOR } from '@kbn/deeplinks-analytics'; @@ -19,6 +19,7 @@ import { ViewMode } from '@kbn/embeddable-plugin/public'; import { i18n } from '@kbn/i18n'; import { getStateFromKbnUrl, setStateToKbnUrl, unhashUrl } from '@kbn/kibana-utils-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; import { convertPanelMapToPanelsArray, DashboardPanelMap } from '../../../../common'; import { DashboardLocatorParams } from '../../../dashboard_container'; import { @@ -122,7 +123,7 @@ export function ShowShareModal({ const allUnsavedPanels = (() => { if ( Object.keys(unsavedDashboardState?.panels ?? {}).length === 0 && - Object.keys(panelModifications ?? {}).length === 0 + Object.keys(omit(panelModifications ?? {}, PANELS_CONTROL_GROUP_KEY)).length === 0 ) { // if this dashboard has no modifications or unsaved panels return early. No overrides needed. return; @@ -195,11 +196,13 @@ export function ShowShareModal({ unhashUrl(baseUrl) ); + const allowShortUrl = getDashboardCapabilities().createShortUrl; + shareService.toggleShareContextMenu({ isDirty, anchorElement, allowEmbed: true, - allowShortUrl: getDashboardCapabilities().createShortUrl, + allowShortUrl, shareableUrl, objectId: savedObjectId, objectType: 'dashboard', @@ -207,6 +210,44 @@ export function ShowShareModal({ title: i18n.translate('dashboard.share.shareModal.title', { defaultMessage: 'Share this dashboard', }), + config: { + link: { + draftModeCallOut: ( + <EuiCallOut + color="warning" + data-test-subj="DashboardDraftModeCopyLinkCallOut" + title={ + <FormattedMessage + id="dashboard.share.shareModal.draftModeCallout.title" + defaultMessage="Unsaved changes" + /> + } + > + {Boolean(unsavedDashboardState?.panels) + ? shareModalStrings.getDraftSharePanelChangesWarning() + : shareModalStrings.getDraftShareWarning('link')} + </EuiCallOut> + ), + }, + embed: { + draftModeCallOut: ( + <EuiCallOut + color="warning" + data-test-subj="DashboardDraftModeEmbedCallOut" + title={ + <FormattedMessage + id="dashboard.share.shareModal.draftModeCallout.title" + defaultMessage="Unsaved changes" + /> + } + > + {Boolean(unsavedDashboardState?.panels) + ? shareModalStrings.getEmbedSharePanelChangesWarning() + : shareModalStrings.getDraftShareWarning('embed')} + </EuiCallOut> + ), + }, + }, }, sharingData: { title: diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx index 8700161711e17..543d6b7456270 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx @@ -10,7 +10,6 @@ import React from 'react'; import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { CONTACT_CARD_EMBEDDABLE } from '@kbn/embeddable-plugin/public/lib/test_samples/embeddables'; import { DashboardGrid } from './dashboard_grid'; import { buildMockDashboardApi } from '../../../mocks'; @@ -50,12 +49,12 @@ jest.mock('./dashboard_grid_item', () => { const PANELS = { '1': { gridData: { x: 0, y: 0, w: 6, h: 6, i: '1' }, - type: CONTACT_CARD_EMBEDDABLE, + type: 'lens', explicitInput: { id: '1' }, }, '2': { gridData: { x: 6, y: 6, w: 6, h: 6, i: '2' }, - type: CONTACT_CARD_EMBEDDABLE, + type: 'lens', explicitInput: { id: '2' }, }, }; diff --git a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/__snapshots__/color.test.tsx.snap b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/__snapshots__/color.test.tsx.snap index 1e97b4a59ed0f..c0caa836b45c7 100644 --- a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/__snapshots__/color.test.tsx.snap +++ b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/__snapshots__/color.test.tsx.snap @@ -1,5 +1,99 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`ColorFormatEditor should render boolean type normally 1`] = ` +<Fragment> + <EuiBasicTable + columns={ + Array [ + Object { + "field": "boolean", + "name": <Memo(MemoizedFormattedMessage) + defaultMessage="Boolean" + id="indexPatternFieldEditor.color.booleanLabel" + />, + "render": [Function], + }, + Object { + "field": "text", + "name": <Memo(MemoizedFormattedMessage) + defaultMessage="Text color" + id="indexPatternFieldEditor.color.textColorLabel" + />, + "render": [Function], + }, + Object { + "field": "background", + "name": <Memo(MemoizedFormattedMessage) + defaultMessage="Background color" + id="indexPatternFieldEditor.color.backgroundLabel" + />, + "render": [Function], + }, + Object { + "name": <Memo(MemoizedFormattedMessage) + defaultMessage="Example" + id="indexPatternFieldEditor.color.exampleLabel" + />, + "render": [Function], + }, + Object { + "actions": Array [ + Object { + "available": [Function], + "color": "danger", + "data-test-subj": "colorEditorRemoveColor", + "description": "Delete color format", + "icon": "trash", + "name": "Delete", + "onClick": [Function], + "type": "icon", + }, + ], + "field": "actions", + "name": "Actions", + }, + ] + } + items={ + Array [ + Object { + "background": "#ffffff", + "boolean": "true", + "index": 0, + "range": "-Infinity:Infinity", + "regex": "<insert regex>", + "text": "#000000", + }, + ] + } + noItemsMessage={ + <EuiI18n + default="No items found" + token="euiBasicTable.noItemsMessage" + /> + } + tableLayout="fixed" + /> + <EuiSpacer + size="m" + /> + <EuiButton + data-test-subj="colorEditorAddColor" + iconType="plusInCircle" + onClick={[Function]} + size="s" + > + <MemoizedFormattedMessage + defaultMessage="Add color" + id="indexPatternFieldEditor.color.addColorButton" + /> + </EuiButton> + <EuiSpacer + size="l" + /> +</Fragment> +`; + exports[`ColorFormatEditor should render multiple colors 1`] = ` <Fragment> <EuiBasicTable @@ -58,6 +152,7 @@ exports[`ColorFormatEditor should render multiple colors 1`] = ` Array [ Object { "background": "#ffffff", + "boolean": "true", "index": 0, "range": "-Infinity:Infinity", "regex": "<insert regex>", @@ -65,6 +160,7 @@ exports[`ColorFormatEditor should render multiple colors 1`] = ` }, Object { "background": "#ffffff", + "boolean": "true", "index": 1, "range": "-Infinity:Infinity", "regex": "<insert regex>", @@ -158,6 +254,7 @@ exports[`ColorFormatEditor should render other type normally (range field) 1`] = Array [ Object { "background": "#ffffff", + "boolean": "true", "index": 0, "range": "-Infinity:Infinity", "regex": "<insert regex>", @@ -251,6 +348,7 @@ exports[`ColorFormatEditor should render string type normally (regex field) 1`] Array [ Object { "background": "#ffffff", + "boolean": "true", "index": 0, "range": "-Infinity:Infinity", "regex": "<insert regex>", diff --git a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.test.tsx b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.test.tsx index a44845ad93f06..7b75c38aa02aa 100644 --- a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.test.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.test.tsx @@ -57,6 +57,20 @@ describe('ColorFormatEditor', () => { expect(component).toMatchSnapshot(); }); + it('should render boolean type normally', async () => { + const component = shallowWithI18nProvider( + <ColorFormatEditor + fieldType={'boolean'} + format={format as unknown as FieldFormat} + formatParams={formatParams} + onChange={onChange} + onError={onError} + /> + ); + + expect(component).toMatchSnapshot(); + }); + it('should render other type normally (range field)', async () => { const component = shallowWithI18nProvider( <ColorFormatEditor diff --git a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.tsx b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.tsx index 9ed18eb7f8bdc..85343826a58f3 100644 --- a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/color/color.tsx @@ -15,6 +15,7 @@ import { EuiColorPicker, EuiIcon, EuiFieldText, + EuiSelect, EuiSpacer, } from '@elastic/eui'; @@ -29,6 +30,7 @@ import { FormatEditorProps } from '../types'; interface Color { range?: string; regex?: string; + boolean?: string; text: string; background: string; } @@ -76,6 +78,90 @@ export class ColorFormatEditor extends DefaultFormatEditor<ColorFormatEditorForm }); }; + getFirstColumn = (fieldType: string) => { + if (fieldType === 'boolean') + return { + field: 'boolean', + name: ( + <FormattedMessage + id="indexPatternFieldEditor.color.booleanLabel" + defaultMessage="Boolean" + /> + ), + render: (value: string, item: IndexedColor) => { + return ( + <EuiSelect + options={[ + { value: 'true', text: 'true' }, + { value: 'false', text: 'false' }, + ]} + value={value} + data-test-subj={`colorEditorKeyBoolean ${item.index}`} + onChange={(e) => { + this.onColorChange( + { + boolean: e.target.value, + }, + item.index + ); + }} + /> + ); + }, + }; + if (fieldType === 'string') + return { + field: 'regex', + name: ( + <FormattedMessage + id="indexPatternFieldEditor.color.patternLabel" + defaultMessage="Pattern (regular expression)" + /> + ), + render: (value: string, item: IndexedColor) => { + return ( + <EuiFieldText + value={value} + data-test-subj={`colorEditorKeyPattern ${item.index}`} + onChange={(e) => { + this.onColorChange( + { + regex: e.target.value, + }, + item.index + ); + }} + /> + ); + }, + }; + return { + field: 'range', + name: ( + <FormattedMessage + id="indexPatternFieldEditor.color.rangeLabel" + defaultMessage="Range (min:max)" + /> + ), + render: (value: string, item: IndexedColor) => { + return ( + <EuiFieldText + value={value} + data-test-subj={`colorEditorKeyRange ${item.index}`} + onChange={(e) => { + this.onColorChange( + { + range: e.target.value, + }, + item.index + ); + }} + /> + ); + }, + }; + }; + render() { const { formatParams, fieldType } = this.props; @@ -91,57 +177,7 @@ export class ColorFormatEditor extends DefaultFormatEditor<ColorFormatEditorForm []; const columns = [ - fieldType === 'string' - ? { - field: 'regex', - name: ( - <FormattedMessage - id="indexPatternFieldEditor.color.patternLabel" - defaultMessage="Pattern (regular expression)" - /> - ), - render: (value: string, item: IndexedColor) => { - return ( - <EuiFieldText - value={value} - data-test-subj={`colorEditorKeyPattern ${item.index}`} - onChange={(e) => { - this.onColorChange( - { - regex: e.target.value, - }, - item.index - ); - }} - /> - ); - }, - } - : { - field: 'range', - name: ( - <FormattedMessage - id="indexPatternFieldEditor.color.rangeLabel" - defaultMessage="Range (min:max)" - /> - ), - render: (value: string, item: IndexedColor) => { - return ( - <EuiFieldText - value={value} - data-test-subj={`colorEditorKeyRange ${item.index}`} - onChange={(e) => { - this.onColorChange( - { - range: e.target.value, - }, - item.index - ); - }} - /> - ); - }, - }, + this.getFirstColumn(fieldType), { field: 'text', name: ( diff --git a/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/consts.ts b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/consts.ts new file mode 100644 index 0000000000000..1e6e0b1b2e9db --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/consts.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export const DEPRECATION_LOGS_PROFILE_ID = 'deprecation-logs-profile'; +export const DEPRECATION_LOGS_PATTERN_PREFIX = '.logs-deprecation'; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/index.ts b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/index.ts new file mode 100644 index 0000000000000..8110f3371ce81 --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { createDeprecationLogsDataSourceProfileProvider } from './profile'; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/profile.test.ts b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/profile.test.ts new file mode 100644 index 0000000000000..c961f310f6e5a --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/profile.test.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { createStubIndexPattern } from '@kbn/data-views-plugin/common/data_view.stub'; +import { createDataViewDataSource } from '../../../../../common/data_sources'; +import { DataSourceCategory, RootContext, SolutionType } from '../../../profiles'; +import { createDeprecationLogsDataSourceProfileProvider } from './profile'; +import type { ContextWithProfileId } from '../../../profile_service'; +import { DEPRECATION_LOGS_PROFILE_ID } from './consts'; + +describe('deprecationLogsProfileProvider', () => { + const deprecationLogsProfileProvider = createDeprecationLogsDataSourceProfileProvider(); + const VALID_INDEX_PATTERN = '.logs-deprecation.elasticsearch-default'; + const VALID_MIXED_INDEX_PATTERN = + '.logs-deprecation.elasticsearch-default,.logs-deprecation.abc,.logs-deprecation.def'; + const INVALID_MIXED_INDEX_PATTERN = '.logs-deprecation.elasticsearch-default,metrics-*'; + const INVALID_INDEX_PATTERN = 'my_source-access-*'; + const ROOT_CONTEXT: ContextWithProfileId<RootContext> = { + profileId: DEPRECATION_LOGS_PROFILE_ID, + solutionType: SolutionType.Default, + }; + const RESOLUTION_MATCH = { + isMatch: true, + context: { + category: DataSourceCategory.Logs, + }, + }; + const RESOLUTION_MISMATCH = { + isMatch: false, + }; + + it('should match data view sources with an allowed index pattern', () => { + const result = deprecationLogsProfileProvider.resolve({ + rootContext: ROOT_CONTEXT, + dataSource: createDataViewDataSource({ dataViewId: VALID_INDEX_PATTERN }), + dataView: createStubIndexPattern({ spec: { title: VALID_INDEX_PATTERN } }), + }); + expect(result).toEqual(RESOLUTION_MATCH); + }); + + it('should match data view sources with a mixed pattern containing allowed index patterns', () => { + const result = deprecationLogsProfileProvider.resolve({ + rootContext: ROOT_CONTEXT, + dataSource: createDataViewDataSource({ dataViewId: VALID_MIXED_INDEX_PATTERN }), + dataView: createStubIndexPattern({ spec: { title: VALID_MIXED_INDEX_PATTERN } }), + }); + expect(result).toEqual(RESOLUTION_MATCH); + }); + + it('should NOT match data view sources with not allowed index pattern', () => { + const result = deprecationLogsProfileProvider.resolve({ + rootContext: ROOT_CONTEXT, + dataSource: createDataViewDataSource({ dataViewId: INVALID_INDEX_PATTERN }), + dataView: createStubIndexPattern({ spec: { title: INVALID_INDEX_PATTERN } }), + }); + expect(result).toEqual(RESOLUTION_MISMATCH); + }); + + it('should NOT match data view sources with a mixed pattern containing not allowed index patterns', () => { + const result = deprecationLogsProfileProvider.resolve({ + rootContext: ROOT_CONTEXT, + dataSource: createDataViewDataSource({ dataViewId: INVALID_MIXED_INDEX_PATTERN }), + dataView: createStubIndexPattern({ spec: { title: INVALID_MIXED_INDEX_PATTERN } }), + }); + expect(result).toEqual(RESOLUTION_MISMATCH); + }); +}); diff --git a/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/profile.ts b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/profile.ts new file mode 100644 index 0000000000000..4d220892aea29 --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/common/deprecation_logs/profile.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { DataSourceCategory } from '../../../profiles'; +import { type DataSourceProfileProvider } from '../../../profiles'; +import { DEPRECATION_LOGS_PATTERN_PREFIX, DEPRECATION_LOGS_PROFILE_ID } from './consts'; +import { extractIndexPatternFrom } from '../../extract_index_pattern_from'; + +export const createDeprecationLogsDataSourceProfileProvider = + (): DataSourceProfileProvider<{}> => ({ + profileId: DEPRECATION_LOGS_PROFILE_ID, + profile: { + getDefaultAppState: () => () => ({ + columns: [ + { name: 'log.level', width: 150 }, + { name: 'message' }, + { name: 'elasticsearch.http.request.x_opaque_id', width: 250 }, + { name: 'elasticsearch.cluster.name', width: 250 }, + { name: 'elasticsearch.event.category', width: 250 }, + ], + }), + }, + resolve: (params) => { + const indexPattern = extractIndexPatternFrom(params); + + if (!checkAllIndicesInPatternAreDeprecationLogs(indexPattern)) { + return { isMatch: false }; + } + + return { + isMatch: true, + context: { + category: DataSourceCategory.Logs, + }, + }; + }, + }); + +/* + This function returns true if the index pattern belongs to deprecation logs. + It also considers multiple patterns separated by commas. +*/ +const checkAllIndicesInPatternAreDeprecationLogs = (indexPattern: string | null): boolean => { + if (!indexPattern) { + return false; + } + const indexPatternArray = indexPattern.split(','); + const result = indexPatternArray.reduce( + (acc, val) => acc && val.startsWith(DEPRECATION_LOGS_PATTERN_PREFIX), + true + ); + return result; +}; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.ts b/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.ts index b0ee4318dde2e..88c7628e9273a 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.ts @@ -28,6 +28,7 @@ import { } from './profile_provider_services'; import type { DiscoverServices } from '../../build_services'; import { createObservabilityRootProfileProvider } from './observability/observability_root_profile'; +import { createDeprecationLogsDataSourceProfileProvider } from './common/deprecation_logs'; /** * Register profile providers for root, data source, and document contexts to the profile profile services @@ -133,6 +134,7 @@ const createRootProfileProviders = (providerServices: ProfileProviderServices) = */ const createDataSourceProfileProviders = (providerServices: ProfileProviderServices) => [ createExampleDataSourceProfileProvider(), + createDeprecationLogsDataSourceProfileProvider(), ...createObservabilityLogsDataSourceProfileProviders(providerServices), ]; diff --git a/src/plugins/embeddable/public/lib/containers/container.ts b/src/plugins/embeddable/public/lib/containers/container.ts index 8e7487323cf44..a160c469f05c3 100644 --- a/src/plugins/embeddable/public/lib/containers/container.ts +++ b/src/plugins/embeddable/public/lib/containers/container.ts @@ -44,7 +44,6 @@ import { IContainer, PanelState, } from './i_container'; -import { reactEmbeddableRegistryHasKey } from '../../react_embeddable_system'; const getKeys = <T extends {}>(o: T): Array<keyof T> => Object.keys(o) as Array<keyof T>; @@ -548,17 +547,6 @@ export abstract class Container< } private async onPanelAdded(panel: PanelState) { - // do nothing if this panel's type is in the new Embeddable registry. - if (reactEmbeddableRegistryHasKey(panel.type)) { - this.updateOutput({ - embeddableLoaded: { - ...this.output.embeddableLoaded, - [panel.explicitInput.id]: true, - }, - } as Partial<TContainerOutput>); - return; - } - this.updateOutput({ embeddableLoaded: { ...this.output.embeddableLoaded, diff --git a/src/plugins/embeddable/public/lib/embeddable_placement/embeddable_placement_registry.ts b/src/plugins/embeddable/public/lib/embeddable_placement/embeddable_placement_registry.ts deleted file mode 100644 index de54efd2db6fb..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddable_placement/embeddable_placement_registry.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -type GetPanelPlacementSettings<StateType> = (serializedState: StateType) => { - width?: number; - height?: number; - strategy?: string; -}; - -const registry: Map<string, GetPanelPlacementSettings<any>> = new Map(); - -export const registerEmbeddablePlacementStrategy = <StateType>( - panelType: string, - getPanelPlacementSettings: GetPanelPlacementSettings<StateType> -) => { - if (registry.has(panelType)) { - throw new Error(`Embeddable placement for embeddable type ${panelType} already exists`); - } - - registry.set(panelType, getPanelPlacementSettings); -}; - -export const getEmbeddablePlacementStrategy = (panelType: string) => { - return registry.get(panelType); -}; diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/edit_legacy_embeddable.test.tsx b/src/plugins/embeddable/public/lib/embeddables/compatibility/edit_legacy_embeddable.test.tsx deleted file mode 100644 index 4def23c8801c6..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/edit_legacy_embeddable.test.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { of } from 'rxjs'; - -import { embeddablePluginMock } from '../../../mocks'; -import { applicationServiceMock } from '@kbn/core/public/mocks'; -import { Embeddable, EmbeddableInput, ViewMode } from '../..'; -import { canEditEmbeddable, editLegacyEmbeddable } from './edit_legacy_embeddable'; -import { ContactCardEmbeddable } from '../../test_samples'; -import { core, embeddableStart } from '../../../kibana_services'; - -const applicationMock = applicationServiceMock.createStartContract(); -const stateTransferMock = embeddablePluginMock.createStartContract().getStateTransfer(); - -// mock app id -core.application.currentAppId$ = of('superCoolCurrentApp'); - -class EditableEmbeddable extends Embeddable { - public readonly type = 'EDITABLE_EMBEDDABLE'; - - constructor(input: EmbeddableInput, editable: boolean) { - super(input, { - editUrl: 'www.google.com', - editable, - }); - } - - public reload() {} -} - -test('canEditEmbeddable returns true when edit url is available, in edit mode and editable', () => { - expect( - canEditEmbeddable(new EditableEmbeddable({ id: '123', viewMode: ViewMode.EDIT }, true)) - ).toBe(true); -}); - -test('canEditEmbeddable returns false when edit url is not available', async () => { - const embeddable = new ContactCardEmbeddable( - { - id: '123', - firstName: 'sue', - viewMode: ViewMode.EDIT, - }, - { - execAction: () => Promise.resolve(undefined), - } - ); - expect(canEditEmbeddable(embeddable)).toBe(false); -}); - -test('canEditEmbeddable returns false when edit url is available but in view mode', async () => { - expect( - canEditEmbeddable( - new EditableEmbeddable( - { - id: '123', - viewMode: ViewMode.VIEW, - }, - true - ) - ) - ).toBe(false); -}); - -test('canEditEmbeddable returns false when edit url is available, in edit mode, but not editable', async () => { - expect( - canEditEmbeddable( - new EditableEmbeddable( - { - id: '123', - viewMode: ViewMode.EDIT, - }, - false - ) - ) - ).toBe(false); -}); - -test('getEditHref returns the edit url', async () => { - const embeddable = new EditableEmbeddable({ id: '123', viewMode: ViewMode.EDIT }, true); - expect(await embeddable.getEditHref()).toBe(embeddable.getOutput().editUrl); -}); - -test('redirects to app using state transfer', async () => { - embeddableStart.getStateTransfer = jest.fn().mockReturnValue(stateTransferMock); - - applicationMock.currentAppId$ = of('superCoolCurrentApp'); - const testPath = '/test-path'; - const embeddable = new EditableEmbeddable( - { - id: '123', - viewMode: ViewMode.EDIT, - coolInput1: 1, - coolInput2: 2, - } as unknown as EmbeddableInput, - true - ); - embeddable.getOutput = jest.fn(() => ({ editApp: 'ultraVisualize', editPath: '/123' })); - embeddable.getAppContext = jest.fn().mockReturnValue({ - getCurrentPath: () => testPath, - }); - await editLegacyEmbeddable(embeddable); - expect(stateTransferMock.navigateToEditor).toHaveBeenCalledWith('ultraVisualize', { - path: '/123', - state: { - originatingApp: 'superCoolCurrentApp', - embeddableId: '123', - valueInput: { - id: '123', - viewMode: ViewMode.EDIT, - coolInput1: 1, - coolInput2: 2, - }, - originatingPath: testPath, - searchSessionId: undefined, - }, - }); -}); diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/edit_legacy_embeddable.tsx b/src/plugins/embeddable/public/lib/embeddables/compatibility/edit_legacy_embeddable.tsx deleted file mode 100644 index e99bbcfca22ef..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/edit_legacy_embeddable.tsx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { firstValueFrom } from 'rxjs'; -import { LegacyCompatibleEmbeddable } from '../../../embeddable_panel/types'; -import { core, embeddableStart } from '../../../kibana_services'; -import { Container } from '../../containers'; -import { EmbeddableFactoryNotFoundError } from '../../errors'; -import { EmbeddableEditorState } from '../../state_transfer'; -import { isExplicitInputWithAttributes } from '../embeddable_factory'; -import { EmbeddableInput } from '../i_embeddable'; - -const getExplicitInput = (embeddable: LegacyCompatibleEmbeddable) => - (embeddable.getRoot() as Container)?.getInput()?.panels?.[embeddable.id]?.explicitInput ?? - embeddable.getInput(); - -const getAppTarget = async (embeddable: LegacyCompatibleEmbeddable) => { - const app = embeddable ? embeddable.getOutput().editApp : undefined; - const path = embeddable ? embeddable.getOutput().editPath : undefined; - if (!app || !path) return; - - const currentAppId = await firstValueFrom(core.application.currentAppId$); - if (!currentAppId) return { app, path }; - - const state: EmbeddableEditorState = { - originatingApp: currentAppId, - valueInput: getExplicitInput(embeddable), - embeddableId: embeddable.id, - searchSessionId: embeddable.getInput().searchSessionId, - originatingPath: embeddable.getAppContext()?.getCurrentPath?.(), - }; - return { app, path, state }; -}; - -export const editLegacyEmbeddable = async (embeddable: LegacyCompatibleEmbeddable) => { - const { editableWithExplicitInput } = embeddable.getOutput(); - - if (editableWithExplicitInput) { - const factory = embeddableStart.getEmbeddableFactory(embeddable.type); - if (!factory) { - throw new EmbeddableFactoryNotFoundError(embeddable.type); - } - - const oldExplicitInput = embeddable.getExplicitInput(); - let newExplicitInput: Partial<EmbeddableInput>; - try { - const explicitInputReturn = await factory.getExplicitInput( - oldExplicitInput, - embeddable.parent - ); - newExplicitInput = isExplicitInputWithAttributes(explicitInputReturn) - ? explicitInputReturn.newInput - : explicitInputReturn; - } catch (e) { - // error likely means user canceled editing - return; - } - embeddable.parent?.replaceEmbeddable(embeddable.id, newExplicitInput); - return; - } - - const appTarget = await getAppTarget(embeddable); - const stateTransfer = embeddableStart.getStateTransfer(); - if (appTarget) { - if (stateTransfer && appTarget.state) { - await stateTransfer.navigateToEditor(appTarget.app, { - path: appTarget.path, - state: appTarget.state, - }); - } else { - await core.application.navigateToApp(appTarget.app, { path: appTarget.path }); - } - return; - } - - const href = embeddable.getOutput().editUrl; - if (href) { - window.location.href = href; - return; - } -}; - -export const canEditEmbeddable = (embeddable: LegacyCompatibleEmbeddable) => { - return Boolean( - embeddable && - embeddable.getInput().viewMode === 'edit' && - embeddable.getOutput().editable && - !embeddable.getOutput().inlineEditable && - (embeddable.getOutput().editUrl || - (embeddable.getOutput().editApp && embeddable.getOutput().editPath) || - embeddable.getOutput().editableWithExplicitInput) - ); -}; diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts index daab774d7f35d..63c1a6593478b 100644 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts +++ b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts @@ -37,14 +37,11 @@ import { IEmbeddable, LegacyEmbeddableAPI, } from '../i_embeddable'; -import { canEditEmbeddable, editLegacyEmbeddable } from './edit_legacy_embeddable'; import { embeddableInputToSubject, embeddableOutputToSubject, viewModeToSubject, } from './embeddable_compatibility_utils'; -import { canLinkLegacyEmbeddable, linkLegacyEmbeddable } from './link_legacy_embeddable'; -import { canUnlinkLegacyEmbeddable, unlinkLegacyEmbeddable } from './unlink_legacy_embeddable'; export type CommonLegacyInput = EmbeddableInput & { savedObjectId?: string; timeRange: TimeRange }; export type CommonLegacyOutput = EmbeddableOutput & { indexPatterns: DataView[] }; @@ -93,13 +90,15 @@ export const legacyEmbeddableToApi = ( /** * Support editing of legacy embeddables */ - const onEdit = () => editLegacyEmbeddable(embeddable); + const onEdit = () => { + throw new Error('Edit legacy embeddable not supported'); + }; const getTypeDisplayName = () => embeddableStart.getEmbeddableFactory(embeddable.type)?.getDisplayName() ?? i18n.translate('embeddableApi.compatibility.defaultTypeDisplayName', { defaultMessage: 'chart', }); - const isEditingEnabled = () => canEditEmbeddable(embeddable); + const isEditingEnabled = () => false; /** * Performance tracking @@ -286,11 +285,15 @@ export const legacyEmbeddableToApi = ( panelDescription, defaultPanelDescription, - canLinkToLibrary: () => canLinkLegacyEmbeddable(embeddable), - linkToLibrary: () => linkLegacyEmbeddable(embeddable), + canLinkToLibrary: async () => false, + linkToLibrary: () => { + throw new Error('Link to library not supported for legacy embeddable'); + }, - canUnlinkFromLibrary: () => canUnlinkLegacyEmbeddable(embeddable), - unlinkFromLibrary: () => unlinkLegacyEmbeddable(embeddable), + canUnlinkFromLibrary: async () => false, + unlinkFromLibrary: () => { + throw new Error('Unlink from library not supported for legacy embeddable'); + }, savedObjectId, }, diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/link_legacy_embeddable.test.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/link_legacy_embeddable.test.ts deleted file mode 100644 index e0a546a18969d..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/link_legacy_embeddable.test.ts +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { EmbeddableInput, ErrorEmbeddable, IContainer, SavedObjectEmbeddableInput } from '../..'; -import { core } from '../../../kibana_services'; -import { embeddablePluginMock } from '../../../mocks'; -import { createHelloWorldContainerAndEmbeddable } from '../../../tests/helpers'; -import { ReferenceOrValueEmbeddable } from '../../reference_or_value_embeddable'; -import { - ContactCardEmbeddable, - ContactCardEmbeddableFactory, - ContactCardEmbeddableInput, -} from '../../test_samples'; -import { ViewMode } from '../../types'; -import { CommonLegacyEmbeddable } from './legacy_embeddable_to_api'; -import { canLinkLegacyEmbeddable, linkLegacyEmbeddable } from './link_legacy_embeddable'; - -let container: IContainer; -let embeddable: ContactCardEmbeddable & ReferenceOrValueEmbeddable; -const embeddableFactory = new ContactCardEmbeddableFactory((() => null) as any, {} as any); - -const defaultCapabilities = { - advancedSettings: {}, - visualize: { save: true }, - maps: { save: true }, - navLinks: {}, -}; - -beforeEach(async () => { - const result = await createHelloWorldContainerAndEmbeddable(); - container = result.container; - embeddable = embeddablePluginMock.mockRefOrValEmbeddable< - ContactCardEmbeddable, - ContactCardEmbeddableInput - >(result.embeddable, { - mockedByReferenceInput: { savedObjectId: 'testSavedObjectId', id: result.embeddable.id }, - mockedByValueInput: { firstName: 'Kibanana', id: result.embeddable.id }, - }); - embeddable.updateInput({ viewMode: ViewMode.EDIT }); -}); - -const assignDefaultCapabilities = () => { - Object.defineProperty(core.application, 'capabilities', { - value: defaultCapabilities, - }); -}; - -test('Cannot link an Error Embeddable to the library', async () => { - assignDefaultCapabilities(); - const errorEmbeddable = new ErrorEmbeddable( - 'Wow what an awful error', - { id: ' 404' }, - embeddable.getRoot() as IContainer - ); - expect(await canLinkLegacyEmbeddable(errorEmbeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Cannot link an ES|QL Embeddable to the library', async () => { - assignDefaultCapabilities(); - const filterableEmbeddable = embeddablePluginMock.mockFilterableEmbeddable(embeddable, { - getFilters: () => [], - getQuery: () => ({ - esql: 'from logstash-* | limit 10', - }), - }); - expect( - await canLinkLegacyEmbeddable(filterableEmbeddable as unknown as CommonLegacyEmbeddable) - ).toBe(false); -}); - -test('Cannot link a visualize embeddable to the library without visualize save permissions', async () => { - Object.defineProperty(core.application, 'capabilities', { - value: { ...defaultCapabilities, visualize: { save: false } }, - }); - expect(await canLinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Can link an embeddable to the library when it has value type input', async () => { - assignDefaultCapabilities(); - embeddable.updateInput(await embeddable.getInputAsValueType()); - expect(await canLinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe(true); -}); - -test('Cannot link an embedable when its input is by reference', async () => { - assignDefaultCapabilities(); - embeddable.updateInput(await embeddable.getInputAsRefType()); - expect(await canLinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Cannot link an embedable when view mode is set to view', async () => { - assignDefaultCapabilities(); - embeddable.updateInput(await embeddable.getInputAsRefType()); - embeddable.updateInput({ viewMode: ViewMode.VIEW }); - expect(await canLinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Cannot link an embedable when it is not a child of a Dashboard container', async () => { - assignDefaultCapabilities(); - let orphanContactCard = await embeddableFactory.create({ - id: 'orphanContact', - firstName: 'Orphan', - }); - - orphanContactCard = embeddablePluginMock.mockRefOrValEmbeddable< - ContactCardEmbeddable, - ContactCardEmbeddableInput - >(orphanContactCard, { - mockedByReferenceInput: { savedObjectId: 'test', id: orphanContactCard.id }, - mockedByValueInput: { firstName: 'Kibanana', id: orphanContactCard.id }, - }); - expect( - await canLinkLegacyEmbeddable(orphanContactCard as unknown as CommonLegacyEmbeddable) - ).toBe(false); -}); - -test('Linking an embeddable replaces embeddableId and retains panel count', async () => { - assignDefaultCapabilities(); - const dashboard = embeddable.getRoot() as IContainer; - const originalPanelCount = Object.keys(dashboard.getInput().panels).length; - const originalPanelKeySet = new Set(Object.keys(dashboard.getInput().panels)); - - await linkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable); - expect(Object.keys(container.getInput().panels).length).toEqual(originalPanelCount); - - const newPanelId = Object.keys(container.getInput().panels).find( - (key) => !originalPanelKeySet.has(key) - ); - expect(newPanelId).toBeDefined(); - const newPanel = container.getInput().panels[newPanelId!]; - expect(newPanel.type).toEqual(embeddable.type); -}); - -test('Link legacy embeddable returns reference type input', async () => { - assignDefaultCapabilities(); - const complicatedAttributes = { - attribute1: 'The best attribute', - attribute2: 22, - attribute3: ['array', 'of', 'strings'], - attribute4: { nestedattribute: 'hello from the nest' }, - }; - - embeddable = embeddablePluginMock.mockRefOrValEmbeddable<ContactCardEmbeddable>(embeddable, { - mockedByReferenceInput: { savedObjectId: 'testSavedObjectId', id: embeddable.id }, - mockedByValueInput: { attributes: complicatedAttributes, id: embeddable.id } as EmbeddableInput, - }); - const dashboard = embeddable.getRoot() as IContainer; - const originalPanelKeySet = new Set(Object.keys(dashboard.getInput().panels)); - await linkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable); - const newPanelId = Object.keys(container.getInput().panels).find( - (key) => !originalPanelKeySet.has(key) - ); - expect(newPanelId).toBeDefined(); - const newPanel = container.getInput().panels[newPanelId!]; - expect(newPanel.type).toEqual(embeddable.type); - expect((newPanel.explicitInput as unknown as { attributes: unknown }).attributes).toBeUndefined(); - expect((newPanel.explicitInput as SavedObjectEmbeddableInput).savedObjectId).toBe( - 'testSavedObjectId' - ); -}); diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/link_legacy_embeddable.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/link_legacy_embeddable.ts deleted file mode 100644 index 2126d1eff764e..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/link_legacy_embeddable.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import type { AggregateQuery } from '@kbn/es-query'; -import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; -import { apiIsPresentationContainer } from '@kbn/presentation-containers'; -import { core } from '../../../kibana_services'; -import { PanelNotFoundError } from '../../errors'; -import { isFilterableEmbeddable } from '../../filterable_embeddable'; -import { isReferenceOrValueEmbeddable } from '../../reference_or_value_embeddable'; -import { isErrorEmbeddable } from '../is_error_embeddable'; -import { CommonLegacyEmbeddable } from './legacy_embeddable_to_api'; -import { IContainer } from '../../containers'; - -export const canLinkLegacyEmbeddable = async (embeddable: CommonLegacyEmbeddable) => { - // linking and unlinking legacy embeddables is only supported on Dashboard - if ( - isErrorEmbeddable(embeddable) || - !(embeddable.getRoot() && embeddable.getRoot().isContainer) || - !isReferenceOrValueEmbeddable(embeddable) - ) { - return false; - } - - const { visualize } = core.application.capabilities; - const canSave = visualize.save; - - const { isOfAggregateQueryType } = await import('@kbn/es-query'); - const query = isFilterableEmbeddable(embeddable) && embeddable.getQuery(); - - // Textbased panels (i.e. ES|QL) should not save to library - const isTextBasedEmbeddable = isOfAggregateQueryType(query as AggregateQuery); - - return Boolean( - canSave && - isReferenceOrValueEmbeddable(embeddable) && - !embeddable.inputIsRefType(embeddable.getInput()) && - !isTextBasedEmbeddable - ); -}; - -export const linkLegacyEmbeddable = async (embeddable: CommonLegacyEmbeddable) => { - const root = embeddable.getRoot() as IContainer; - if (!isReferenceOrValueEmbeddable(embeddable) || !apiIsPresentationContainer(root)) { - throw new IncompatibleActionError(); - } - - // Link to library - const newInput = await embeddable.getInputAsRefType(); - embeddable.updateInput(newInput); - - // Replace panel in parent. - const panelToReplace = root.getInput().panels[embeddable.id]; - if (!panelToReplace) { - throw new PanelNotFoundError(); - } - await root.replacePanel(panelToReplace.explicitInput.id, { - panelType: embeddable.type, - initialState: { ...newInput }, - }); -}; diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/unlink_legacy_embeddable.test.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/unlink_legacy_embeddable.test.ts deleted file mode 100644 index 50c44f2c1b253..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/unlink_legacy_embeddable.test.ts +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ErrorEmbeddable, IContainer, PanelState, SavedObjectEmbeddableInput } from '../..'; -import { embeddablePluginMock } from '../../../mocks'; -import { createHelloWorldContainerAndEmbeddable } from '../../../tests/helpers'; -import { ReferenceOrValueEmbeddable } from '../../reference_or_value_embeddable'; -import { - ContactCardEmbeddable, - ContactCardEmbeddableFactory, - ContactCardEmbeddableInput, -} from '../../test_samples'; -import { ViewMode } from '../../types'; -import { CommonLegacyEmbeddable } from './legacy_embeddable_to_api'; -import { canLinkLegacyEmbeddable } from './link_legacy_embeddable'; -import { canUnlinkLegacyEmbeddable, unlinkLegacyEmbeddable } from './unlink_legacy_embeddable'; - -let container: IContainer; -let embeddable: ContactCardEmbeddable & ReferenceOrValueEmbeddable; - -const embeddableFactory = new ContactCardEmbeddableFactory((() => null) as any, {} as any); - -beforeEach(async () => { - const result = await createHelloWorldContainerAndEmbeddable(); - container = result.container; - embeddable = embeddablePluginMock.mockRefOrValEmbeddable< - ContactCardEmbeddable, - ContactCardEmbeddableInput - >(result.embeddable, { - mockedByReferenceInput: { savedObjectId: 'testSavedObjectId', id: result.embeddable.id }, - mockedByValueInput: { firstName: 'Kibanana', id: result.embeddable.id }, - }); - embeddable.updateInput({ viewMode: ViewMode.EDIT }); -}); - -test('Can unlink returns false when given an Error Embeddable', async () => { - const errorEmbeddable = new ErrorEmbeddable( - 'Wow what an awful error', - { id: ' 404' }, - embeddable.getRoot() as IContainer - ); - expect( - await canUnlinkLegacyEmbeddable(errorEmbeddable as unknown as CommonLegacyEmbeddable) - ).toBe(false); -}); - -test('Can unlink returns true when embeddable on dashboard has reference type input', async () => { - embeddable.updateInput(await embeddable.getInputAsRefType()); - expect(await canUnlinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - true - ); -}); - -test('Can unlink returns false when embeddable input is by value', async () => { - embeddable.updateInput(await embeddable.getInputAsValueType()); - expect(await canUnlinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Can unlink returns false when view mode is set to view', async () => { - embeddable.updateInput(await embeddable.getInputAsRefType()); - embeddable.updateInput({ viewMode: ViewMode.VIEW }); - expect(await canUnlinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Can unlink returns false when embeddable is not in a dashboard container', async () => { - let orphanContactCard = await embeddableFactory.create({ - id: 'orphanContact', - firstName: 'Orphan', - }); - - orphanContactCard = embeddablePluginMock.mockRefOrValEmbeddable< - ContactCardEmbeddable, - ContactCardEmbeddableInput - >(orphanContactCard, { - mockedByReferenceInput: { savedObjectId: 'test', id: orphanContactCard.id }, - mockedByValueInput: { firstName: 'Kibanana', id: orphanContactCard.id }, - }); - expect( - await canLinkLegacyEmbeddable(orphanContactCard as unknown as CommonLegacyEmbeddable) - ).toBe(false); - expect(await canUnlinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable)).toBe( - false - ); -}); - -test('Unlink replaces embeddableId and retains panel count', async () => { - const dashboard = embeddable.getRoot() as IContainer; - const originalPanelCount = Object.keys(dashboard.getInput().panels).length; - const originalPanelKeySet = new Set(Object.keys(dashboard.getInput().panels)); - await unlinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable); - expect(Object.keys(container.getInput().panels).length).toEqual(originalPanelCount); - - const newPanelId = Object.keys(container.getInput().panels).find( - (key) => !originalPanelKeySet.has(key) - ); - expect(newPanelId).toBeDefined(); - const newPanel = container.getInput().panels[newPanelId!]; - expect(newPanel.type).toEqual(embeddable.type); -}); - -test('Unlink unwraps all attributes from savedObject', async () => { - const complicatedAttributes = { - attribute1: 'The best attribute', - attribute2: 22, - attribute3: ['array', 'of', 'strings'], - attribute4: { nestedattribute: 'hello from the nest' }, - }; - - embeddable = embeddablePluginMock.mockRefOrValEmbeddable< - ContactCardEmbeddable, - { attributes: unknown; id: string }, - SavedObjectEmbeddableInput - >(embeddable, { - mockedByReferenceInput: { savedObjectId: 'testSavedObjectId', id: embeddable.id }, - mockedByValueInput: { attributes: complicatedAttributes, id: embeddable.id }, - }); - const dashboard = embeddable.getRoot() as IContainer; - const originalPanelKeySet = new Set(Object.keys(dashboard.getInput().panels)); - await unlinkLegacyEmbeddable(embeddable as unknown as CommonLegacyEmbeddable); - const newPanelId = Object.keys(container.getInput().panels).find( - (key) => !originalPanelKeySet.has(key) - ); - expect(newPanelId).toBeDefined(); - const newPanel = container.getInput().panels[newPanelId!] as PanelState & { - explicitInput: { attributes: unknown }; - }; - expect(newPanel.type).toEqual(embeddable.type); - expect((newPanel.explicitInput as { attributes: unknown }).attributes).toEqual( - complicatedAttributes - ); -}); diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/unlink_legacy_embeddable.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/unlink_legacy_embeddable.ts deleted file mode 100644 index f4d0a3e0ac08a..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/unlink_legacy_embeddable.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; -import { apiIsPresentationContainer } from '@kbn/presentation-containers'; -import { IContainer, PanelState } from '../../containers'; -import { PanelNotFoundError } from '../../errors'; -import { isReferenceOrValueEmbeddable } from '../../reference_or_value_embeddable'; -import { ViewMode } from '../../types'; -import { isErrorEmbeddable } from '../is_error_embeddable'; -import { EmbeddableInput } from '../i_embeddable'; -import { CommonLegacyEmbeddable } from './legacy_embeddable_to_api'; - -export const canUnlinkLegacyEmbeddable = async (embeddable: CommonLegacyEmbeddable) => { - return Boolean( - isReferenceOrValueEmbeddable(embeddable) && - !isErrorEmbeddable(embeddable) && - embeddable.getInput()?.viewMode !== ViewMode.VIEW && - embeddable.getRoot() && - embeddable.getRoot().isContainer && - embeddable.inputIsRefType(embeddable.getInput()) - ); -}; - -export const unlinkLegacyEmbeddable = async (embeddable: CommonLegacyEmbeddable) => { - const root = embeddable.getRoot() as IContainer; - if (!isReferenceOrValueEmbeddable(embeddable) || !apiIsPresentationContainer(root)) { - throw new IncompatibleActionError(); - } - - // unlink and update input. - const newInput = await embeddable.getInputAsValueType(); - embeddable.updateInput(newInput); - - // replace panel in parent. - const panelToReplace = root.getInput().panels[embeddable.id] as PanelState<EmbeddableInput>; - if (!panelToReplace) { - throw new PanelNotFoundError(); - } - await root.replacePanel(panelToReplace.explicitInput.id, { - panelType: embeddable.type, - initialState: { ...newInput, title: embeddable.getTitle() }, - }); -}; diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx deleted file mode 100644 index 84160c9b391aa..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -/* eslint-disable max-classes-per-file */ - -import { skip, take } from 'rxjs'; -import { Embeddable } from './embeddable'; -import { EmbeddableOutput, EmbeddableInput } from './i_embeddable'; -import { ViewMode } from '../types'; -import { ContactCardEmbeddable } from '../test_samples/embeddables/contact_card/contact_card_embeddable'; -import { - MockFilter, - FilterableEmbeddable, -} from '../test_samples/embeddables/filterable_embeddable'; - -class TestClass { - constructor() {} -} - -interface Output extends EmbeddableOutput { - testClass: TestClass; - inputUpdatedTimes: number; -} - -class OutputTestEmbeddable extends Embeddable<EmbeddableInput, Output> { - public readonly type = 'test'; - constructor() { - super( - { id: 'test', viewMode: ViewMode.VIEW }, - { testClass: new TestClass(), inputUpdatedTimes: 0 } - ); - - this.getInput$().subscribe(() => { - this.updateOutput({ inputUpdatedTimes: this.getOutput().inputUpdatedTimes + 1 }); - }); - } - - reload() {} -} - -class PhaseTestEmbeddable extends Embeddable<EmbeddableInput, EmbeddableOutput> { - public readonly type = 'phaseTest'; - constructor() { - super({ id: 'phaseTest', viewMode: ViewMode.VIEW }, {}); - } - public reportsEmbeddableLoad(): boolean { - return true; - } - reload() {} -} - -test('Embeddable calls input subscribers when changed', (done) => { - const hello = new ContactCardEmbeddable( - { id: '123', firstName: 'Brienne', lastName: 'Tarth' }, - { execAction: (() => null) as any } - ); - - const subscription = hello - .getInput$() - .pipe(skip(1)) - .subscribe((input) => { - expect(input.nameTitle).toEqual('Sir'); - done(); - subscription.unsubscribe(); - }); - - hello.updateInput({ nameTitle: 'Sir' }); -}); - -test('Embeddable reload is called if lastReloadRequest input time changes', async () => { - const hello = new FilterableEmbeddable({ id: '123', filters: [], lastReloadRequestTime: 0 }); - - hello.reload = jest.fn(); - - hello.updateInput({ lastReloadRequestTime: 1 }); - - expect(hello.reload).toBeCalledTimes(1); -}); - -test('Embeddable reload is called if lastReloadRequest input time changed and new input is used', async () => { - const hello = new FilterableEmbeddable({ id: '123', filters: [], lastReloadRequestTime: 0 }); - - const aFilter = {} as unknown as MockFilter; - hello.reload = jest.fn(() => { - // when reload is called embeddable already has new input - expect(hello.getInput().filters).toEqual([aFilter]); - }); - - hello.updateInput({ lastReloadRequestTime: 1, filters: [aFilter] }); - - expect(hello.reload).toBeCalledTimes(1); -}); - -test('Embeddable reload is not called if lastReloadRequest input time does not change', async () => { - const hello = new FilterableEmbeddable({ id: '123', filters: [], lastReloadRequestTime: 1 }); - - hello.reload = jest.fn(); - - hello.updateInput({ lastReloadRequestTime: 1 }); - - expect(hello.reload).toBeCalledTimes(0); -}); - -test('updating output state retains instance information', async () => { - const outputTest = new OutputTestEmbeddable(); - expect(outputTest.getOutput().testClass).toBeInstanceOf(TestClass); - expect(outputTest.getOutput().inputUpdatedTimes).toBe(1); - outputTest.updateInput({ viewMode: ViewMode.EDIT }); - expect(outputTest.getOutput().inputUpdatedTimes).toBe(2); - expect(outputTest.getOutput().testClass).toBeInstanceOf(TestClass); -}); - -test('fires phase events when output changes', async () => { - const phaseEventTest = new PhaseTestEmbeddable(); - let phaseEventCount = 0; - phaseEventTest.phase$.subscribe((event) => { - if (event) { - phaseEventCount++; - } - }); - expect(phaseEventCount).toBe(1); // loading is true by default which fires an event. - phaseEventTest.updateOutput({ loading: false }); - expect(phaseEventCount).toBe(2); - phaseEventTest.updateOutput({ rendered: true }); - expect(phaseEventCount).toBe(3); -}); - -test('updated$ called after reload and batches input/output changes', async () => { - const hello = new ContactCardEmbeddable( - { id: '123', firstName: 'Brienne', lastName: 'Tarth' }, - { execAction: (() => null) as any } - ); - - const reloadSpy = jest.spyOn(hello, 'reload'); - - const input$ = hello.getInput$().pipe(skip(1)); - let inputEmittedTimes = 0; - input$.subscribe(() => { - inputEmittedTimes++; - }); - - const updated$ = hello.getUpdated$(); - let updatedEmittedTimes = 0; - updated$.subscribe(() => { - updatedEmittedTimes++; - }); - const updatedPromise = updated$.pipe(take(1)).toPromise(); - - hello.updateInput({ nameTitle: 'Sir', lastReloadRequestTime: Date.now() }); - expect(reloadSpy).toHaveBeenCalledTimes(1); - expect(inputEmittedTimes).toBe(1); - expect(updatedEmittedTimes).toBe(0); - - await updatedPromise; - - expect(updatedEmittedTimes).toBe(1); -}); diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx deleted file mode 100644 index 2f725881a6a4b..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { EuiCard, EuiFlexItem, EuiFlexGroup, EuiFormRow } from '@elastic/eui'; - -import { Subscription } from 'rxjs'; -import { EuiButton } from '@elastic/eui'; -import * as Rx from 'rxjs'; -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { ContactCardEmbeddable, CONTACT_USER_TRIGGER } from './contact_card_embeddable'; - -interface Props { - embeddable: ContactCardEmbeddable; - execTrigger: UiActionsStart['executeTriggerActions']; -} - -interface State { - fullName: string; - firstName: string; -} - -export class ContactCardEmbeddableComponent extends React.Component<Props, State> { - private subscription?: Subscription; - private mounted: boolean = false; - - constructor(props: Props) { - super(props); - this.state = { - fullName: this.props.embeddable.getOutput().fullName, - firstName: this.props.embeddable.getInput().firstName, - }; - } - - componentDidMount() { - this.mounted = true; - this.subscription = Rx.merge( - this.props.embeddable.getOutput$(), - this.props.embeddable.getInput$() - ).subscribe(() => { - if (this.mounted) { - this.setState({ - fullName: this.props.embeddable.getOutput().fullName, - firstName: this.props.embeddable.getInput().firstName, - }); - } - }); - } - - componentWillUnmount() { - if (this.subscription) { - this.subscription.unsubscribe(); - } - this.mounted = false; - } - - emitContactTrigger = () => { - this.props.execTrigger(CONTACT_USER_TRIGGER, { - embeddable: this.props.embeddable, - }); - }; - - getCardFooterContent = () => ( - <EuiFlexGroup justifyContent="flexEnd"> - <EuiFlexItem grow={false}> - <EuiFormRow label=""> - <EuiButton - onClick={this.emitContactTrigger} - >{`Contact ${this.state.firstName}`}</EuiButton> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - ); - - render() { - return ( - <EuiCard - textAlign="left" - title={this.state.fullName} - footer={this.getCardFooterContent()} - description="" - /> - ); - } -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx deleted file mode 100644 index bb3dff9631fb6..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import ReactDom from 'react-dom'; -import { Subscription } from 'rxjs'; -import type { ErrorLike } from '@kbn/expressions-plugin/common'; -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { Container } from '../../../containers'; -import { EmbeddableOutput, Embeddable, EmbeddableInput } from '../../../embeddables'; -import { CONTACT_CARD_EMBEDDABLE } from './contact_card_embeddable_factory'; -import { ContactCardEmbeddableComponent } from './contact_card'; - -export interface ContactCardEmbeddableInput extends EmbeddableInput { - firstName: string; - lastName?: string; - nameTitle?: string; -} - -export interface ContactCardEmbeddableOutput extends EmbeddableOutput { - fullName: string; - originalLastName?: string; -} - -export interface ContactCardEmbeddableOptions { - execAction: UiActionsStart['executeTriggerActions']; - outputOverrides?: Partial<ContactCardEmbeddableOutput>; -} - -function getFullName(input: ContactCardEmbeddableInput) { - const { nameTitle, firstName, lastName } = input; - const nameParts = [nameTitle, firstName, lastName].filter((name) => name !== undefined); - return nameParts.join(' '); -} - -export class ContactCardEmbeddable extends Embeddable< - ContactCardEmbeddableInput, - ContactCardEmbeddableOutput -> { - private subscription: Subscription; - private node?: Element; - public readonly type: string = CONTACT_CARD_EMBEDDABLE; - - constructor( - initialInput: ContactCardEmbeddableInput, - protected readonly options: ContactCardEmbeddableOptions, - parent?: Container - ) { - super( - initialInput, - { - fullName: getFullName(initialInput), - originalLastName: initialInput.lastName, - defaultTitle: `Hello ${getFullName(initialInput)}`, - ...options.outputOverrides, - }, - parent - ); - - this.subscription = this.getInput$().subscribe(() => { - const fullName = getFullName(this.input); - this.updateOutput({ - fullName, - defaultTitle: `Hello ${fullName}`, - }); - }); - } - - public render(node: HTMLElement) { - this.node = node; - ReactDom.render( - <ContactCardEmbeddableComponent embeddable={this} execTrigger={this.options.execAction} />, - node - ); - } - - public catchError?(error: ErrorLike, node: HTMLElement) { - ReactDom.render(<div data-test-subj="error">{error.message}</div>, node); - - return () => ReactDom.unmountComponentAtNode(node); - } - - public destroy() { - super.destroy(); - this.subscription.unsubscribe(); - if (this.node) { - ReactDom.unmountComponentAtNode(this.node); - } - } - - public reload() {} - - public triggerError(error: ErrorLike, fatal = false) { - if (fatal) { - this.onFatalError(error); - } else { - this.updateOutput({ error }); - } - } -} - -export const CONTACT_USER_TRIGGER = 'CONTACT_USER_TRIGGER'; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx deleted file mode 100644 index 79e0824b0275f..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; - -import { CoreStart } from '@kbn/core/public'; -import { toMountPoint } from '@kbn/react-kibana-mount'; -import { EmbeddableFactoryDefinition } from '../../../embeddables'; -import { Container } from '../../../containers'; -import { ContactCardEmbeddable, ContactCardEmbeddableInput } from './contact_card_embeddable'; -import { ContactCardInitializer } from './contact_card_initializer'; - -export const CONTACT_CARD_EMBEDDABLE = 'CONTACT_CARD_EMBEDDABLE'; - -export class ContactCardEmbeddableFactory - implements EmbeddableFactoryDefinition<ContactCardEmbeddableInput> -{ - public readonly type = CONTACT_CARD_EMBEDDABLE; - savedObjectMetaData = { - name: 'Contact card', - type: CONTACT_CARD_EMBEDDABLE, - getIconForSavedObject: () => 'document', - }; - - constructor( - protected readonly execTrigger: UiActionsStart['executeTriggerActions'], - private readonly core: CoreStart - ) {} - - public async isEditable() { - return true; - } - - public getDisplayName() { - return i18n.translate('embeddableApi.samples.contactCard.displayName', { - defaultMessage: 'contact card', - }); - } - - public getDefaultInput() { - return {}; - } - - public getExplicitInput = (): Promise<Partial<ContactCardEmbeddableInput>> => { - return new Promise((resolve) => { - const modalSession = this.core.overlays.openModal( - toMountPoint( - <ContactCardInitializer - onCancel={() => { - modalSession.close(); - // @ts-expect-error - resolve(undefined); - }} - onCreate={(input: { firstName: string; lastName?: string }) => { - modalSession.close(); - resolve(input); - }} - />, - this.core - ), - { - 'data-test-subj': 'createContactCardEmbeddable', - } - ); - }); - }; - - public create = async (initialInput: ContactCardEmbeddableInput, parent?: Container) => { - return new ContactCardEmbeddable( - initialInput, - { - execAction: this.execTrigger, - }, - parent - ); - }; -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_react_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_react_factory.ts deleted file mode 100644 index 28e651cd14d02..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_react_factory.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { Container } from '../../../containers'; -import { ContactCardEmbeddableInput } from './contact_card_embeddable'; -import { ContactCardEmbeddableFactory } from './contact_card_embeddable_factory'; -import { ContactCardEmbeddableReact } from './contact_card_embeddable_react'; - -export const CONTACT_CARD_EMBEDDABLE_REACT = 'CONTACT_CARD_EMBEDDABLE_REACT'; - -export class ContactCardEmbeddableReactFactory extends ContactCardEmbeddableFactory { - public readonly type = CONTACT_CARD_EMBEDDABLE_REACT as ContactCardEmbeddableFactory['type']; - - public create = async (initialInput: ContactCardEmbeddableInput, parent?: Container) => { - return new ContactCardEmbeddableReact( - initialInput, - { - execAction: this.execTrigger, - }, - parent - ); - }; -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable.tsx deleted file mode 100644 index eaeeb592d9eb3..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ContactCardEmbeddable } from './contact_card_embeddable'; - -export class ContactCardExportableEmbeddable extends ContactCardEmbeddable { - public getInspectorAdapters = () => { - return { - tables: { - allowCsvExport: true, - tables: { - layer1: { - type: 'datatable', - columns: [ - { id: 'firstName', name: 'First Name' }, - { id: 'originalLastName', name: 'Last Name' }, - ], - rows: [ - { - firstName: this.getInput().firstName, - orignialLastName: this.getInput().lastName, - }, - ], - }, - }, - }, - }; - }; -} - -export const CONTACT_EXPORTABLE_USER_TRIGGER = 'CONTACT_EXPORTABLE_USER_TRIGGER'; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx deleted file mode 100644 index 7ddf5f1711b61..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; - -import { CoreStart } from '@kbn/core/public'; -import { toMountPoint } from '@kbn/react-kibana-mount'; -import { EmbeddableFactoryDefinition } from '../../../embeddables'; -import { Container } from '../../../containers'; -import { ContactCardEmbeddableInput } from './contact_card_embeddable'; -import { ContactCardExportableEmbeddable } from './contact_card_exportable_embeddable'; -import { ContactCardInitializer } from './contact_card_initializer'; - -export const CONTACT_CARD_EXPORTABLE_EMBEDDABLE = 'CONTACT_CARD_EXPORTABLE_EMBEDDABLE'; - -export class ContactCardExportableEmbeddableFactory - implements EmbeddableFactoryDefinition<ContactCardEmbeddableInput> -{ - public readonly type = CONTACT_CARD_EXPORTABLE_EMBEDDABLE; - - constructor( - private readonly execTrigger: UiActionsStart['executeTriggerActions'], - private readonly core: CoreStart - ) {} - - public async isEditable() { - return true; - } - - public getDefaultInput() { - return {}; - } - - public getDisplayName() { - return i18n.translate('embeddableApi.samples.contactCard.displayName', { - defaultMessage: 'contact card', - }); - } - - public getExplicitInput = (): Promise<Partial<ContactCardEmbeddableInput>> => { - return new Promise((resolve) => { - const modalSession = this.core.overlays.openModal( - toMountPoint( - <ContactCardInitializer - onCancel={() => { - modalSession.close(); - // @ts-expect-error - resolve(undefined); - }} - onCreate={(input: { firstName: string; lastName?: string }) => { - modalSession.close(); - resolve(input); - }} - />, - this.core - ), - { - 'data-test-subj': 'createContactCardEmbeddable', - } - ); - }); - }; - - public create = async (initialInput: ContactCardEmbeddableInput, parent?: Container) => { - return new ContactCardExportableEmbeddable( - initialInput, - { - execAction: this.execTrigger, - }, - parent - ); - }; -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_initializer.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_initializer.tsx deleted file mode 100644 index 10c07ef5d5aad..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_initializer.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { - EuiForm, - EuiFormRow, - EuiFieldText, - EuiModalHeader, - EuiModalHeaderTitle, - EuiModalBody, - EuiButton, - EuiModalFooter, - EuiButtonEmpty, -} from '@elastic/eui'; -import React, { Component } from 'react'; - -export interface ContactCardInitializerProps { - onCreate: (name: { lastName?: string; firstName: string }) => void; - onCancel: () => void; -} - -interface State { - firstName?: string; - lastName?: string; -} - -export class ContactCardInitializer extends Component<ContactCardInitializerProps, State> { - constructor(props: ContactCardInitializerProps) { - super(props); - this.state = {}; - } - - render() { - return ( - <div> - <EuiModalHeader> - <EuiModalHeaderTitle>Create a new greeting card</EuiModalHeaderTitle> - </EuiModalHeader> - - <EuiModalBody> - <EuiForm> - <EuiFormRow label="First name"> - <EuiFieldText - name="popfirst" - value={this.state.firstName} - onChange={(e) => this.setState({ firstName: e.target.value })} - /> - </EuiFormRow> - - <EuiFormRow label="Last name"> - <EuiFieldText - name="popfirst" - value={this.state.lastName} - placeholder="optional" - onChange={(e) => this.setState({ lastName: e.target.value })} - /> - </EuiFormRow> - </EuiForm> - </EuiModalBody> - - <EuiModalFooter> - <EuiButtonEmpty onClick={this.props.onCancel}>Cancel</EuiButtonEmpty> - - <EuiButton - isDisabled={!this.state.firstName} - onClick={() => { - if (this.state.firstName) { - this.props.onCreate({ - firstName: this.state.firstName, - ...(this.state.lastName ? { lastName: this.state.lastName } : {}), - }); - } - }} - fill - > - Create - </EuiButton> - </EuiModalFooter> - </div> - ); - } -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/descriptive_contact_card_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/descriptive_contact_card_embeddable_factory.ts deleted file mode 100644 index fa251fc7cdb04..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/descriptive_contact_card_embeddable_factory.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; - -import { Container, EmbeddableFactoryDefinition } from '../../..'; -import { ContactCardEmbeddable, ContactCardEmbeddableInput } from './contact_card_embeddable'; - -export const DESCRIPTIVE_CONTACT_CARD_EMBEDDABLE = 'DESCRIPTIVE_CONTACT_CARD_EMBEDDABLE'; - -export class DescriptiveContactCardEmbeddableFactory - implements EmbeddableFactoryDefinition<ContactCardEmbeddableInput> -{ - public readonly type = DESCRIPTIVE_CONTACT_CARD_EMBEDDABLE; - - constructor(protected readonly execTrigger: UiActionsStart['executeTriggerActions']) {} - - public async isEditable() { - return true; - } - - public getDisplayName() { - return 'descriptive contact card'; - } - - public create = async (initialInput: ContactCardEmbeddableInput, parent?: Container) => { - return new ContactCardEmbeddable( - initialInput, - { - execAction: this.execTrigger, - outputOverrides: { - defaultDescription: 'This is a family friend', - }, - }, - parent - ); - }; -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts deleted file mode 100644 index aeb8714332521..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { Container, EmbeddableFactoryDefinition } from '../../..'; -import { ContactCardEmbeddable, ContactCardEmbeddableInput } from './contact_card_embeddable'; -import { CONTACT_CARD_EMBEDDABLE } from './contact_card_embeddable_factory'; - -interface SlowContactCardEmbeddableFactoryOptions { - execAction: UiActionsStart['executeTriggerActions']; - loadTickCount?: number; -} - -export class SlowContactCardEmbeddableFactory - implements EmbeddableFactoryDefinition<ContactCardEmbeddableInput> -{ - private loadTickCount = 0; - public readonly type = CONTACT_CARD_EMBEDDABLE; - - constructor(private readonly options: SlowContactCardEmbeddableFactoryOptions) { - if (options.loadTickCount) { - this.loadTickCount = options.loadTickCount; - } - } - - public async isEditable() { - return true; - } - - public getDisplayName() { - return 'slow to load contact card'; - } - - public create = async (initialInput: ContactCardEmbeddableInput, parent?: Container) => { - for (let i = 0; i < this.loadTickCount; i++) { - await Promise.resolve(); - } - return new ContactCardEmbeddable(initialInput, { execAction: this.options.execAction }, parent); - }; -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container.tsx deleted file mode 100644 index 3dc9952d6da42..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container.tsx +++ /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", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { Container, ContainerInput } from '../../containers'; -import { EmbeddableStart } from '../../../plugin'; -import { MockFilter } from './filterable_embeddable'; - -export const FILTERABLE_CONTAINER = 'FILTERABLE_CONTAINER'; - -export interface FilterableContainerInput extends ContainerInput { - filters: MockFilter[]; -} - -/** - * interfaces are not allowed to specify a sub-set of the required types until - * https://github.com/microsoft/TypeScript/issues/15300 is fixed so we use a type - * here instead - */ -type InheritedChildrenInput = { - filters: MockFilter[]; - id?: string; -}; - -export class FilterableContainer extends Container< - InheritedChildrenInput, - FilterableContainerInput -> { - public readonly type = FILTERABLE_CONTAINER; - - constructor( - initialInput: FilterableContainerInput, - getFactory: EmbeddableStart['getEmbeddableFactory'], - parent?: Container - ) { - super(initialInput, { embeddableLoaded: {} }, getFactory, parent); - } - - public getInheritedInput() { - return { - filters: this.input.filters, - viewMode: this.input.viewMode, - }; - } - - public render() {} -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts deleted file mode 100644 index b394f905d3378..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { i18n } from '@kbn/i18n'; -import { Container, EmbeddableFactoryDefinition } from '../..'; -import { - FilterableContainer, - FilterableContainerInput, - FILTERABLE_CONTAINER, -} from './filterable_container'; -import { EmbeddableStart } from '../../../plugin'; - -export class FilterableContainerFactory - implements EmbeddableFactoryDefinition<FilterableContainerInput> -{ - public readonly type = FILTERABLE_CONTAINER; - - constructor( - private readonly getFactory: () => Promise<EmbeddableStart['getEmbeddableFactory']> - ) {} - - public getDisplayName() { - return i18n.translate('embeddableApi.samples.filterableContainer.displayName', { - defaultMessage: 'filterable dashboard', - }); - } - - public async isEditable() { - return true; - } - - public create = async (initialInput: FilterableContainerInput, parent?: Container) => { - const getEmbeddableFactory = await this.getFactory(); - return new FilterableContainer(initialInput, getEmbeddableFactory, parent); - }; -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable.tsx deleted file mode 100644 index ee32fa6e2642f..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable.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", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { IContainer } from '../../containers'; -import { EmbeddableOutput, EmbeddableInput, Embeddable } from '../../embeddables'; - -/** @internal */ -export interface MockFilter { - $state?: {}; - meta: {}; - query?: {}; -} - -export const FILTERABLE_EMBEDDABLE = 'FILTERABLE_EMBEDDABLE'; - -export interface FilterableEmbeddableInput extends EmbeddableInput { - filters: MockFilter[]; -} - -export class FilterableEmbeddable extends Embeddable<FilterableEmbeddableInput, EmbeddableOutput> { - public readonly type = FILTERABLE_EMBEDDABLE; - constructor(initialInput: FilterableEmbeddableInput, parent?: IContainer) { - super(initialInput, {}, parent); - } - - public getInspectorAdapters(): Record<string, string> { - const inspectorAdapters: Record<string, string> = { - filters: `My filters are ${JSON.stringify(this.input.filters)}`, - }; - return inspectorAdapters; - } - - public render() {} - - public reload() {} -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts deleted file mode 100644 index cba773effb9ed..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { i18n } from '@kbn/i18n'; -import { - FilterableEmbeddable, - FilterableEmbeddableInput, - FILTERABLE_EMBEDDABLE, -} from './filterable_embeddable'; -import { EmbeddableFactoryDefinition } from '../../embeddables'; -import { IContainer } from '../../containers'; - -export class FilterableEmbeddableFactory - implements EmbeddableFactoryDefinition<FilterableEmbeddableInput> -{ - public readonly type = FILTERABLE_EMBEDDABLE; - - public async isEditable() { - return true; - } - - public getDisplayName() { - return i18n.translate('embeddableApi.samples.filterableEmbeddable.displayName', { - defaultMessage: 'filterable', - }); - } - - public async create(initialInput: FilterableEmbeddableInput, parent?: IContainer) { - return new FilterableEmbeddable(initialInput, parent); - } -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx deleted file mode 100644 index fe772a1f9a007..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { I18nProvider } from '@kbn/i18n-react'; -import { Container, ViewMode, ContainerInput } from '../..'; -import { HelloWorldContainerComponent } from './hello_world_container_component'; -import { EmbeddableStart } from '../../../plugin'; -import { EmbeddableContainerSettings } from '../../containers/i_container'; - -export const HELLO_WORLD_CONTAINER = 'HELLO_WORLD_CONTAINER'; - -/** - * interfaces are not allowed to specify a sub-set of the required types until - * https://github.com/microsoft/TypeScript/issues/15300 is fixed so we use a type - * here instead - */ -type InheritedInput = { - id: string; - viewMode: ViewMode; - lastName: string; -}; - -interface HelloWorldContainerInput extends ContainerInput { - lastName?: string; -} - -interface HelloWorldContainerOptions { - getEmbeddableFactory?: EmbeddableStart['getEmbeddableFactory']; -} - -export class HelloWorldContainer extends Container<InheritedInput, HelloWorldContainerInput> { - public readonly type = HELLO_WORLD_CONTAINER; - - constructor( - input: ContainerInput<{ firstName: string; lastName: string }>, - options: HelloWorldContainerOptions, - initializeSettings?: EmbeddableContainerSettings - ) { - super( - input, - { embeddableLoaded: {} }, - options.getEmbeddableFactory || (() => undefined), - undefined, - initializeSettings - ); - } - - public getInheritedInput(id: string) { - return { - id, - viewMode: this.input.viewMode || ViewMode.EDIT, - lastName: this.input.lastName || 'foo', - }; - } - - public render(node: HTMLElement) { - ReactDOM.render( - <I18nProvider> - <HelloWorldContainerComponent container={this} /> - </I18nProvider>, - node - ); - } -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx deleted file mode 100644 index 7bc322c3a1dde..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React, { Component, RefObject } from 'react'; -import { Subscription } from 'rxjs'; - -import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; - -import { IContainer, PanelState } from '../..'; -import { EmbeddablePanel } from '../../../embeddable_panel'; - -interface Props { - container: IContainer; -} - -interface State { - panels: { [key: string]: PanelState }; - loaded: { [key: string]: boolean }; -} - -export class HelloWorldContainerComponent extends Component<Props, State> { - private roots: { [key: string]: RefObject<HTMLDivElement> } = {}; - private mounted: boolean = false; - private inputSubscription?: Subscription; - private outputSubscription?: Subscription; - - constructor(props: Props) { - super(props); - - Object.values(this.props.container.getInput().panels).forEach((panelState) => { - this.roots[panelState.explicitInput.id] = React.createRef(); - }); - - this.state = { - loaded: this.props.container.getOutput().embeddableLoaded, - panels: this.props.container.getInput().panels, - }; - } - - public async componentDidMount() { - this.mounted = true; - - this.inputSubscription = this.props.container.getInput$().subscribe(() => { - if (this.mounted) { - this.setState({ panels: this.props.container.getInput().panels }); - } - }); - - this.outputSubscription = this.props.container.getOutput$().subscribe(() => { - if (this.mounted) { - this.setState({ loaded: this.props.container.getOutput().embeddableLoaded }); - } - }); - } - - public componentWillUnmount() { - this.mounted = false; - this.props.container.destroy(); - - if (this.inputSubscription) { - this.inputSubscription.unsubscribe(); - } - - if (this.outputSubscription) { - this.outputSubscription.unsubscribe(); - } - } - - public render() { - return ( - <div> - <h2>HELLO WORLD! These are my precious embeddable children:</h2> - <EuiSpacer size="l" /> - <EuiFlexGroup>{this.renderList()}</EuiFlexGroup> - </div> - ); - } - - private renderList() { - const list = Object.values(this.state.panels).map((panelState) => { - const item = ( - <EuiFlexItem key={panelState.explicitInput.id}> - <EmbeddablePanel - embeddable={() => - this.props.container.untilEmbeddableLoaded(panelState.explicitInput.id) - } - /> - </EuiFlexItem> - ); - return item; - }); - return list; - } -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/index.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/index.ts deleted file mode 100644 index 97f6d31622283..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/index.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", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -export * from './contact_card'; -export * from './empty_embeddable'; -export * from './filterable_container'; -export * from './filterable_container_factory'; -export * from './filterable_embeddable'; -export * from './filterable_embeddable_factory'; -export * from './hello_world_container'; -export * from './hello_world_container_component'; -export * from './time_range_container'; -export * from './time_range_embeddable_factory'; -export * from './time_range_embeddable'; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_container.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_container.ts deleted file mode 100644 index a7d306c86ed8c..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_container.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import type { TimeRange } from '@kbn/es-query'; -import { ContainerInput, Container, ContainerOutput, EmbeddableStart } from '../../..'; - -/** - * interfaces are not allowed to specify a sub-set of the required types until - * https://github.com/microsoft/TypeScript/issues/15300 is fixed so we use a type - * here instead - */ -type InheritedChildrenInput = { - timeRange: TimeRange; - id?: string; -}; - -interface ContainerTimeRangeInput extends ContainerInput<InheritedChildrenInput> { - timeRange: TimeRange; -} - -const TIME_RANGE_CONTAINER = 'TIME_RANGE_CONTAINER'; - -export class TimeRangeContainer extends Container< - InheritedChildrenInput, - ContainerTimeRangeInput, - ContainerOutput -> { - public readonly type = TIME_RANGE_CONTAINER; - constructor( - initialInput: ContainerTimeRangeInput, - getFactory: EmbeddableStart['getEmbeddableFactory'], - parent?: Container - ) { - super(initialInput, { embeddableLoaded: {} }, getFactory, parent); - } - - public getAllDataViews() { - return []; - } - - public getInheritedInput() { - return { timeRange: this.input.timeRange }; - } - - public render() {} - - public reload() {} -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_embeddable.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_embeddable.ts deleted file mode 100644 index fa9dca4071bbb..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_embeddable.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import type { TimeRange } from '@kbn/es-query'; -import { EmbeddableOutput, Embeddable, EmbeddableInput, IContainer } from '../../..'; - -export interface EmbeddableTimeRangeInput extends EmbeddableInput { - timeRange: TimeRange; -} - -export const TIME_RANGE_EMBEDDABLE = 'TIME_RANGE_EMBEDDABLE'; - -export class TimeRangeEmbeddable extends Embeddable<EmbeddableTimeRangeInput, EmbeddableOutput> { - public readonly type = TIME_RANGE_EMBEDDABLE; - - constructor(initialInput: EmbeddableTimeRangeInput, parent?: IContainer) { - const { title: defaultTitle, description: defaultDescription } = initialInput; - super( - initialInput, - { - defaultTitle, - defaultDescription, - }, - parent - ); - } - - public render() {} - - public reload() {} -} diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_embeddable_factory.ts deleted file mode 100644 index fefbfd5df95d1..0000000000000 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/time_range_embeddable_factory.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { IContainer, EmbeddableFactoryDefinition } from '../../..'; -import { - TIME_RANGE_EMBEDDABLE, - TimeRangeEmbeddable, - EmbeddableTimeRangeInput, -} from './time_range_embeddable'; - -export class TimeRangeEmbeddableFactory - implements EmbeddableFactoryDefinition<EmbeddableTimeRangeInput> -{ - public readonly type = TIME_RANGE_EMBEDDABLE; - - public async isEditable() { - return true; - } - - public async create(initialInput: EmbeddableTimeRangeInput, parent?: IContainer) { - return new TimeRangeEmbeddable(initialInput, parent); - } - - public getDisplayName() { - return 'time range'; - } -} diff --git a/src/plugins/embeddable/public/mocks.tsx b/src/plugins/embeddable/public/mocks.tsx index fcabaa7cdb6c7..cdfaa8e0ce01b 100644 --- a/src/plugins/embeddable/public/mocks.tsx +++ b/src/plugins/embeddable/public/mocks.tsx @@ -35,10 +35,7 @@ import { import { setKibanaServices } from './kibana_services'; import { SelfStyledOptions } from './lib/self_styled_embeddable/types'; import { EmbeddablePublicPlugin } from './plugin'; -import { - reactEmbeddableRegistryHasKey, - registerReactEmbeddableFactory, -} from './react_embeddable_system'; +import { registerReactEmbeddableFactory } from './react_embeddable_system'; import { registerAddFromLibraryType } from './add_from_library/registry'; export { mockAttributeService } from './lib/attribute_service/attribute_service.mock'; @@ -110,7 +107,6 @@ const createSetupContract = (): Setup => { const createStartContract = (): Start => { const startContract: Start = { - reactEmbeddableRegistryHasKey: jest.fn().mockImplementation(reactEmbeddableRegistryHasKey), getEmbeddableFactories: jest.fn(), getEmbeddableFactory: jest.fn(), telemetry: jest.fn(), diff --git a/src/plugins/embeddable/public/plugin.tsx b/src/plugins/embeddable/public/plugin.tsx index 801b518a0bd01..18af7eda372ec 100644 --- a/src/plugins/embeddable/public/plugin.tsx +++ b/src/plugins/embeddable/public/plugin.tsx @@ -54,10 +54,7 @@ import { } from '../common/lib'; import { getAllMigrations } from '../common/lib/get_all_migrations'; import { setKibanaServices } from './kibana_services'; -import { - reactEmbeddableRegistryHasKey, - registerReactEmbeddableFactory, -} from './react_embeddable_system'; +import { registerReactEmbeddableFactory } from './react_embeddable_system'; import { registerAddFromLibraryType } from './add_from_library/registry'; export interface EmbeddableSetupDependencies { @@ -121,11 +118,6 @@ export interface EmbeddableSetup { } export interface EmbeddableStart extends PersistableStateService<EmbeddableStateWithType> { - /** - * Checks if a {@link ReactEmbeddableFactory} has been registered using {@link registerReactEmbeddableFactory} - */ - reactEmbeddableRegistryHasKey: (type: string) => boolean; - /** * @deprecated use {@link registerReactEmbeddableFactory} instead. */ @@ -224,8 +216,6 @@ export class EmbeddablePublicPlugin implements Plugin<EmbeddableSetup, Embeddabl ); const embeddableStart: EmbeddableStart = { - reactEmbeddableRegistryHasKey, - getEmbeddableFactory: this.getEmbeddableFactory, getEmbeddableFactories: this.getEmbeddableFactories, getAttributeService: (type: string, options) => diff --git a/src/plugins/embeddable/public/react_embeddable_system/index.ts b/src/plugins/embeddable/public/react_embeddable_system/index.ts index d0bd95e32e10e..8b1b59da6767b 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/index.ts +++ b/src/plugins/embeddable/public/react_embeddable_system/index.ts @@ -7,9 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export { - reactEmbeddableRegistryHasKey, - registerReactEmbeddableFactory, -} from './react_embeddable_registry'; +export { registerReactEmbeddableFactory } from './react_embeddable_registry'; export { ReactEmbeddableRenderer } from './react_embeddable_renderer'; export type { DefaultEmbeddableApi, ReactEmbeddableFactory } from './types'; diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.test.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.test.tsx index aa3e9b0e99675..43f8541fbab7f 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.test.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.test.tsx @@ -9,7 +9,6 @@ import { registerReactEmbeddableFactory, - reactEmbeddableRegistryHasKey, getReactEmbeddableFactory, } from './react_embeddable_registry'; import { ReactEmbeddableFactory } from './types'; @@ -33,9 +32,4 @@ describe('react embeddable registry', () => { registerReactEmbeddableFactory('test', getTestEmbeddableFactory); expect(getReactEmbeddableFactory('test')).toEqual(returnedFactory); }); - - it('can check if a factory is registered', () => { - expect(reactEmbeddableRegistryHasKey('test')).toBe(true); - expect(reactEmbeddableRegistryHasKey('notRegistered')).toBe(false); - }); }); diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts index 0d007f85f7977..046b63d5531ab 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_registry.ts @@ -40,8 +40,6 @@ export const registerReactEmbeddableFactory = < registry[type] = getFactory; }; -export const reactEmbeddableRegistryHasKey = (key: string) => registry[key] !== undefined; - export const getReactEmbeddableFactory = async < SerializedState extends object = object, RuntimeState extends object = SerializedState, diff --git a/src/plugins/embeddable/public/tests/container.test.ts b/src/plugins/embeddable/public/tests/container.test.ts deleted file mode 100644 index 1209f54fb8866..0000000000000 --- a/src/plugins/embeddable/public/tests/container.test.ts +++ /dev/null @@ -1,817 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { coreMock } from '@kbn/core/public/mocks'; -import * as Rx from 'rxjs'; -import { skip } from 'rxjs'; -import { EmbeddableOutput, isErrorEmbeddable, SavedObjectEmbeddableInput, ViewMode } from '../lib'; -import { ERROR_EMBEDDABLE_TYPE } from '../lib/embeddables/error_embeddable'; -import { - ContactCardEmbeddable, - ContactCardEmbeddableInput, - ContactCardEmbeddableOutput, -} from '../lib/test_samples/embeddables/contact_card/contact_card_embeddable'; -import { CONTACT_CARD_EMBEDDABLE } from '../lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory'; -import { SlowContactCardEmbeddableFactory } from '../lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory'; -import { - FilterableContainer, - FilterableContainerInput, -} from '../lib/test_samples/embeddables/filterable_container'; -import { - FilterableEmbeddable, - FilterableEmbeddableInput, - FILTERABLE_EMBEDDABLE, - MockFilter, -} from '../lib/test_samples/embeddables/filterable_embeddable'; -import { HelloWorldContainer } from '../lib/test_samples/embeddables/hello_world_container'; -import { HelloWorldEmbeddableFactoryDefinition, HELLO_WORLD_EMBEDDABLE } from './fixtures'; -import { createHelloWorldContainerAndEmbeddable, of } from './helpers'; -import { testPlugin } from './test_plugin'; - -describe('container initialization', () => { - const panels = { - '123': { - explicitInput: { id: '123' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - '456': { - explicitInput: { id: '456' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - '789': { - explicitInput: { id: '789' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - }; - - const expectEmbeddableLoaded = (container: HelloWorldContainer, id: string) => { - expect(container.getOutput().embeddableLoaded['123']).toBe(true); - const embeddable = container.getChild<ContactCardEmbeddable>('123'); - expect(embeddable).toBeDefined(); - expect(embeddable.id).toBe('123'); - }; - - it('initializes embeddables', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels, - }); - - expectEmbeddableLoaded(container, '123'); - expectEmbeddableLoaded(container, '456'); - expectEmbeddableLoaded(container, '789'); - }); - - it('initializes embeddables once and only once with multiple input updates', async () => { - const { container, contactCardCreateSpy } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels, - }); - container.updateInput({ lastReloadRequestTime: 1 }); - container.updateInput({ lastReloadRequestTime: 2 }); - expect(contactCardCreateSpy).toHaveBeenCalledTimes(4); - }); - - it('initializes embeddables in order', async () => { - const childIdInitializeOrder = ['456', '123', '789']; - const { contactCardCreateSpy } = await createHelloWorldContainerAndEmbeddable( - { - id: 'hello', - panels, - }, - {}, - { childIdInitializeOrder } - ); - - await new Promise((r) => setTimeout(r, 1)); - for (const [index, orderedId] of childIdInitializeOrder.entries()) { - expect(contactCardCreateSpy).toHaveBeenNthCalledWith( - index + 1, - expect.objectContaining({ id: orderedId }), - expect.anything() // parent passed into create method - ); - } - }); - - it('initializes embeddables in order with partial order arg', async () => { - const childIdInitializeOrder = ['789', 'idontexist']; - const { contactCardCreateSpy } = await createHelloWorldContainerAndEmbeddable( - { - id: 'hello', - panels, - }, - {}, - { childIdInitializeOrder } - ); - const expectedInitializeOrder = ['789', '123', '456']; - - await new Promise((r) => setTimeout(r, 1)); - for (const [index, orderedId] of expectedInitializeOrder.entries()) { - expect(contactCardCreateSpy).toHaveBeenNthCalledWith( - index + 1, - expect.objectContaining({ id: orderedId }), - expect.anything() // parent passed into create method - ); - } - }); - - it('initializes embeddables in order, awaiting each', async () => { - const childIdInitializeOrder = ['456', '123', '789']; - const { container, contactCardCreateSpy } = await createHelloWorldContainerAndEmbeddable( - { - id: 'hello', - panels, - }, - {}, - { childIdInitializeOrder, initializeSequentially: true } - ); - - const untilEmbeddableLoadedMock = jest.spyOn(container, 'untilEmbeddableLoaded'); - - await new Promise((r) => setTimeout(r, 10)); - - for (const [index, orderedId] of childIdInitializeOrder.entries()) { - await container.untilEmbeddableLoaded(orderedId); - expect(contactCardCreateSpy).toHaveBeenNthCalledWith( - index + 1, - expect.objectContaining({ id: orderedId }), - expect.anything() // parent passed into create method - ); - expect(untilEmbeddableLoadedMock).toHaveBeenCalledWith(orderedId); - } - }); -}); - -test('Container.addNewEmbeddable', async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {} }, - { - firstName: 'Susy', - } - ); - expect(embeddable).toBeDefined(); - - if (!isErrorEmbeddable(embeddable)) { - expect(embeddable.getInput().firstName).toBe('Susy'); - } else { - expect(false).toBe(true); - } - - const embeddableInContainer = container.getChild<ContactCardEmbeddable>(embeddable.id); - expect(embeddableInContainer).toBeDefined(); - expect(embeddableInContainer.id).toBe(embeddable.id); -}); - -test('Container.removeEmbeddable removes and cleans up', async () => { - const { start } = await createHelloWorldContainerAndEmbeddable(); - - const container = new HelloWorldContainer( - { - id: 'hello', - panels: { - '123': { - explicitInput: { id: '123', firstName: 'Sam', lastName: 'Tarley' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - }, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - const embeddable = await container.addNewEmbeddable< - ContactCardEmbeddableInput, - ContactCardEmbeddableOutput, - ContactCardEmbeddable - >(CONTACT_CARD_EMBEDDABLE, { - firstName: 'Susy', - lastName: 'Q', - }); - - if (isErrorEmbeddable(embeddable)) { - expect(false).toBe(true); - return; - } - - embeddable.updateInput({ lastName: 'Z' }); - - container - .getOutput$() - .pipe(skip(1)) - .subscribe(() => { - const noFind = container.getChild<ContactCardEmbeddable>(embeddable.id); - expect(noFind).toBeUndefined(); - - expect(container.getInput().panels[embeddable.id]).toBeUndefined(); - if (isErrorEmbeddable(embeddable)) { - expect(false).toBe(true); - } - - expect(() => embeddable.updateInput({ nameTitle: 'Sir' })).toThrowError(); - expect(container.getOutput().embeddableLoaded[embeddable.id]).toBeUndefined(); - }); - - container.removeEmbeddable(embeddable.id); -}); - -test('Container.input$ is notified when child embeddable input is updated', async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {} }, - { - firstName: 'Susy', - lastName: 'Q', - } - ); - - expect(isErrorEmbeddable(embeddable)).toBe(false); - - const changes = jest.fn(); - - expect(changes).toHaveBeenCalledTimes(0); - - const subscription = container.getInput$().subscribe(changes); - - expect(changes).toHaveBeenCalledTimes(1); - - embeddable.updateInput({ lastName: 'Z' }); - - expect(changes).toHaveBeenCalledTimes(2); - - expect(embeddable.getInput().lastName === 'Z'); - - embeddable.updateInput({ lastName: embeddable.getOutput().originalLastName }); - - expect(embeddable.getInput().lastName === 'Q'); - - expect(changes).toBeCalledTimes(3); - - subscription.unsubscribe(); - - embeddable.updateInput({ nameTitle: 'Dr.' }); - - expect(changes).toBeCalledTimes(3); -}); - -test('Container.input$', async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {} }, - { - firstName: 'Susy', - id: 'Susy', - } - ); - - expect(isErrorEmbeddable(embeddable)).toBe(false); - - const changes = jest.fn(); - const input = container.getInput(); - expect(input.panels[embeddable.id].explicitInput).toEqual({ firstName: 'Susy', id: 'Susy' }); - - const subscription = container.getInput$().subscribe(changes); - embeddable.updateInput({ nameTitle: 'Dr.' }); - expect(container.getInput().panels[embeddable.id].explicitInput).toEqual({ - nameTitle: 'Dr.', - firstName: 'Susy', - id: 'Susy', - }); - subscription.unsubscribe(); -}); - -test('Container.getInput$ not triggered if state is the same', async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {} }, - { - firstName: 'Susy', - id: 'Susy', - } - ); - - expect(isErrorEmbeddable(embeddable)).toBe(false); - - const changes = jest.fn(); - const input = container.getInput(); - expect(input.panels[embeddable.id].explicitInput).toEqual({ - id: 'Susy', - firstName: 'Susy', - }); - const subscription = container.getInput$().subscribe(changes); - embeddable.updateInput({ nameTitle: 'Dr.' }); - expect(changes).toBeCalledTimes(2); - embeddable.updateInput({ nameTitle: 'Dr.' }); - expect(changes).toBeCalledTimes(2); - subscription.unsubscribe(); -}); - -test('Container view mode change propagates to children', async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {}, viewMode: ViewMode.VIEW }, - { - firstName: 'Susy', - id: 'Susy', - } - ); - - expect(embeddable.getInput().viewMode).toBe(ViewMode.VIEW); - - container.updateInput({ viewMode: ViewMode.EDIT }); - - expect(embeddable.getInput().viewMode).toBe(ViewMode.EDIT); -}); - -test(`Container updates its state when a child's input is updated`, async () => { - const { container, embeddable, start } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {}, viewMode: ViewMode.VIEW }, - { - id: '123', - firstName: 'Susy', - } - ); - - expect(isErrorEmbeddable(embeddable)).toBe(false); - - const containerSubscription = Rx.merge(container.getInput$(), container.getOutput$()).subscribe( - () => { - const child = container.getChild<ContactCardEmbeddable>(embeddable.id); - if ( - container.getOutput().embeddableLoaded[embeddable.id] && - child.getInput().nameTitle === 'Dr.' - ) { - containerSubscription.unsubscribe(); - - // Make sure a brand new container built off the output of container also creates an embeddable - // with "Dr.", not the default the embeddable was first added with. Makes sure changed input - // is preserved with the container. - const containerClone = new HelloWorldContainer(container.getInput(), { - getEmbeddableFactory: start.getEmbeddableFactory, - }); - const cloneSubscription = Rx.merge( - containerClone.getOutput$(), - containerClone.getInput$() - ).subscribe(() => { - const childClone = containerClone.getChild<ContactCardEmbeddable>(embeddable.id); - - if ( - containerClone.getOutput().embeddableLoaded[embeddable.id] && - childClone.getInput().nameTitle === 'Dr.' - ) { - cloneSubscription.unsubscribe(); - } - }); - } - } - ); - - embeddable.updateInput({ nameTitle: 'Dr.' }); -}); - -test(`Derived container state passed to children`, async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {}, viewMode: ViewMode.VIEW }, - { - firstName: 'Susy', - } - ); - - let subscription = embeddable - .getInput$() - .pipe(skip(1)) - .subscribe((changes: Partial<ContactCardEmbeddableInput>) => { - expect(changes.viewMode).toBe(ViewMode.EDIT); - }); - container.updateInput({ viewMode: ViewMode.EDIT }); - - subscription.unsubscribe(); - subscription = embeddable - .getInput$() - .pipe(skip(1)) - .subscribe((changes: Partial<ContactCardEmbeddableInput>) => { - expect(changes.viewMode).toBe(ViewMode.VIEW); - }); - container.updateInput({ viewMode: ViewMode.VIEW }); - subscription.unsubscribe(); -}); - -test(`Can subscribe to children embeddable updates`, async () => { - const { embeddable } = await createHelloWorldContainerAndEmbeddable( - { - id: 'hello container', - panels: {}, - viewMode: ViewMode.VIEW, - }, - { - firstName: 'Susy', - } - ); - - expect(isErrorEmbeddable(embeddable)).toBe(false); - - const subscription = embeddable.getInput$().subscribe((input: ContactCardEmbeddableInput) => { - if (input.nameTitle === 'Dr.') { - subscription.unsubscribe(); - } - }); - embeddable.updateInput({ nameTitle: 'Dr.' }); -}); - -test('Test nested reactions', async () => { - const { container, embeddable } = await createHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {}, viewMode: ViewMode.VIEW }, - { - firstName: 'Susy', - } - ); - - expect(isErrorEmbeddable(embeddable)).toBe(false); - - const containerSubscription = container.getInput$().subscribe((input: any) => { - const embeddableNameTitle = embeddable.getInput().nameTitle; - const viewMode = input.viewMode; - const nameTitleFromContainer = container.getInputForChild<ContactCardEmbeddableInput>( - embeddable.id - ).nameTitle; - if ( - embeddableNameTitle === 'Dr.' && - nameTitleFromContainer === 'Dr.' && - viewMode === ViewMode.EDIT - ) { - containerSubscription.unsubscribe(); - embeddableSubscription.unsubscribe(); - } - }); - - const embeddableSubscription = embeddable.getInput$().subscribe(() => { - if (embeddable.getInput().nameTitle === 'Dr.') { - container.updateInput({ viewMode: ViewMode.EDIT }); - } - }); - - embeddable.updateInput({ nameTitle: 'Dr.' }); -}); - -test('Explicit embeddable input mapped to undefined will default to inherited', async () => { - const { start } = await createHelloWorldContainerAndEmbeddable(); - const derivedFilter: MockFilter = { - $state: { store: 'appState' }, - meta: { disabled: false, alias: 'name', negate: false }, - query: { match: {} }, - }; - const container = new FilterableContainer( - { id: 'hello', panels: {}, filters: [derivedFilter] }, - start.getEmbeddableFactory - ); - const embeddable = await container.addNewEmbeddable< - FilterableEmbeddableInput, - EmbeddableOutput, - FilterableEmbeddable - >(FILTERABLE_EMBEDDABLE, {}); - - if (isErrorEmbeddable(embeddable)) { - throw new Error('Error adding embeddable'); - } - - embeddable.updateInput({ filters: [] }); - - expect(container.getInputForChild<FilterableEmbeddableInput>(embeddable.id).filters).toEqual([]); - - embeddable.updateInput({ filters: undefined }); - - expect(container.getInputForChild<FilterableEmbeddableInput>(embeddable.id).filters).toEqual([ - derivedFilter, - ]); -}); - -test('Explicit embeddable input mapped to undefined with no inherited value will get passed to embeddable', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ id: 'hello', panels: {} }); - - const embeddable = await container.addNewEmbeddable< - FilterableEmbeddableInput, - EmbeddableOutput, - FilterableEmbeddable - >(FILTERABLE_EMBEDDABLE, {}); - - if (isErrorEmbeddable(embeddable)) { - throw new Error('Error adding embeddable'); - } - - embeddable.updateInput({ filters: [] }); - - expect(container.getInputForChild<FilterableEmbeddableInput>(embeddable.id).filters).toEqual([]); - - const subscription = embeddable - .getInput$() - .pipe(skip(1)) - .subscribe(() => { - if (embeddable.getInput().filters === undefined) { - subscription.unsubscribe(); - } - }); - - embeddable.updateInput({ filters: undefined }); -}); - -test('Panel removed from input state', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels: {}, - }); - - const embeddable = await container.addNewEmbeddable< - FilterableEmbeddableInput, - EmbeddableOutput, - FilterableEmbeddable - >(FILTERABLE_EMBEDDABLE, {}); - - const filteredPanels = { ...container.getInput().panels }; - delete filteredPanels[embeddable.id]; - const newInput: Partial<FilterableContainerInput> = { - ...container.getInput(), - panels: filteredPanels, - }; - - container.updateInput(newInput); - await new Promise((r) => setTimeout(r, 1)); - - expect(container.getChild(embeddable.id)).toBeUndefined(); - expect(container.getOutput().embeddableLoaded[embeddable.id]).toBeUndefined(); -}); - -test('Panel added to input state', async () => { - const { container, start } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels: {}, - }); - - const embeddable = await container.addNewEmbeddable< - FilterableEmbeddableInput, - EmbeddableOutput, - FilterableEmbeddable - >(FILTERABLE_EMBEDDABLE, {}); - - const embeddable2 = await container.addNewEmbeddable< - FilterableEmbeddableInput, - EmbeddableOutput, - FilterableEmbeddable - >(FILTERABLE_EMBEDDABLE, {}); - - const container2 = new FilterableContainer( - { id: 'hello', panels: {}, filters: [] }, - start.getEmbeddableFactory - ); - - container2.updateInput(container.getInput()); - await new Promise((r) => setTimeout(r, 1)); - - expect(container.getChild(embeddable.id)).toBeDefined(); - expect(container.getOutput().embeddableLoaded[embeddable.id]).toBe(true); - expect(container.getChild(embeddable2.id)).toBeDefined(); - expect(container.getOutput().embeddableLoaded[embeddable2.id]).toBe(true); -}); - -test('Container changes made directly after adding a new embeddable are propagated', async () => { - const coreSetup = coreMock.createSetup(); - const coreStart = coreMock.createStart(); - const { setup, doStart, uiActions } = testPlugin(coreSetup, coreStart); - - const factory = new SlowContactCardEmbeddableFactory({ - loadTickCount: 3, - execAction: uiActions.executeTriggerActions, - }); - setup.registerEmbeddableFactory(factory.type, factory); - - const start = doStart(); - - const container = new HelloWorldContainer( - { - id: 'hello', - panels: {}, - viewMode: ViewMode.EDIT, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - const subscription = Rx.merge(container.getOutput$(), container.getInput$()) - .pipe(skip(2)) - .subscribe(() => { - expect(Object.keys(container.getOutput().embeddableLoaded).length).toBe(1); - if (Object.keys(container.getOutput().embeddableLoaded).length > 0) { - const embeddableId = Object.keys(container.getOutput().embeddableLoaded)[0]; - - if (container.getOutput().embeddableLoaded[embeddableId] === true) { - const embeddable = container.getChild(embeddableId); - if (embeddable.getInput().viewMode === ViewMode.VIEW) { - subscription.unsubscribe(); - } - } - } - }); - - container.addNewEmbeddable<ContactCardEmbeddableInput>(CONTACT_CARD_EMBEDDABLE, { - firstName: 'A girl', - lastName: 'has no name', - }); - - container.updateInput({ viewMode: ViewMode.VIEW }); -}); - -test('container stores ErrorEmbeddables when a factory for a child cannot be found (so the panel can be removed)', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels: { - '123': { - type: 'IDontExist', - explicitInput: { id: '123' }, - }, - }, - viewMode: ViewMode.EDIT, - }); - - container.getOutput$().subscribe(() => { - if (container.getOutput().embeddableLoaded['123']) { - const child = container.getChild('123'); - expect(child.type).toBe(ERROR_EMBEDDABLE_TYPE); - } - }); -}); - -test('container stores ErrorEmbeddables when a saved object cannot be found', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels: { - '123': { - type: 'vis', - explicitInput: { id: '123', savedObjectId: '456' } as SavedObjectEmbeddableInput, - }, - }, - viewMode: ViewMode.EDIT, - }); - - container.getOutput$().subscribe(() => { - if (container.getOutput().embeddableLoaded['123']) { - const child = container.getChild('123'); - expect(child.type).toBe(ERROR_EMBEDDABLE_TYPE); - } - }); -}); - -test('ErrorEmbeddables get updated when parent does', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels: { - '123': { - type: 'vis', - explicitInput: { id: '123', savedObjectId: '456' } as SavedObjectEmbeddableInput, - }, - }, - viewMode: ViewMode.EDIT, - }); - - container.getOutput$().subscribe(() => { - if (container.getOutput().embeddableLoaded['123']) { - const embeddable = container.getChild('123'); - - expect(embeddable.getInput().viewMode).toBe(ViewMode.EDIT); - - container.updateInput({ viewMode: ViewMode.VIEW }); - - expect(embeddable.getInput().viewMode).toBe(ViewMode.VIEW); - } - }); -}); - -test('untilEmbeddableLoaded() throws an error if there is no such child panel in the container', async () => { - const { container } = await createHelloWorldContainerAndEmbeddable({ - id: 'hello', - panels: {}, - }); - - expect(container.untilEmbeddableLoaded('idontexist')).rejects.toThrowError(); -}); - -test('untilEmbeddableLoaded() throws an error if there is no such child panel in the container - 2', async () => { - const { doStart } = testPlugin(coreMock.createSetup(), coreMock.createStart()); - const start = doStart(); - const container = new HelloWorldContainer( - { - id: 'hello', - panels: {}, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - const [, error] = await of(container.untilEmbeddableLoaded('123')); - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toMatchInlineSnapshot(`"Panel not found"`); -}); - -test('untilEmbeddableLoaded() resolves if child is loaded in the container', async () => { - const { setup, doStart } = testPlugin(coreMock.createSetup(), coreMock.createStart()); - const factory = new HelloWorldEmbeddableFactoryDefinition(); - setup.registerEmbeddableFactory(factory.type, factory); - const start = doStart(); - const container = new HelloWorldContainer( - { - id: 'hello', - panels: { - '123': { - type: HELLO_WORLD_EMBEDDABLE, - explicitInput: { id: '123' }, - }, - }, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - const child = await container.untilEmbeddableLoaded('123'); - expect(child).toBeDefined(); - expect(child.type).toBe(HELLO_WORLD_EMBEDDABLE); -}); - -test('untilEmbeddableLoaded resolves with undefined if child is subsequently removed', async () => { - const { doStart, setup, uiActions } = testPlugin(coreMock.createSetup(), coreMock.createStart()); - const factory = new SlowContactCardEmbeddableFactory({ - loadTickCount: 3, - execAction: uiActions.executeTriggerActions, - }); - setup.registerEmbeddableFactory(factory.type, factory); - - const start = doStart(); - const container = new HelloWorldContainer( - { - id: 'hello', - panels: { - '123': { - explicitInput: { id: '123', firstName: 'Sam', lastName: 'Tarley' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - }, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - container.untilEmbeddableLoaded('123').then((embed) => { - expect(embed).toBeUndefined(); - }); - - container.updateInput({ panels: {} }); -}); - -test('adding a panel then subsequently removing it before its loaded removes the panel', (done) => { - const { doStart, uiActions, setup } = testPlugin(coreMock.createSetup(), coreMock.createStart()); - const factory = new SlowContactCardEmbeddableFactory({ - loadTickCount: 1, - execAction: uiActions.executeTriggerActions, - }); - setup.registerEmbeddableFactory(factory.type, factory); - const start = doStart(); - const container = new HelloWorldContainer( - { - id: 'hello', - panels: { - '123': { - explicitInput: { id: '123', firstName: 'Sam', lastName: 'Tarley' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - }, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - // Final state should be that the panel is removed. - Rx.merge(container.getInput$(), container.getOutput$()).subscribe(() => { - if ( - container.getInput().panels['123'] === undefined && - container.getOutput().embeddableLoaded['123'] === undefined && - container.getInput().panels['456'] !== undefined && - container.getOutput().embeddableLoaded['456'] === true - ) { - done(); - } - }); - - container.updateInput({ panels: {} }); - - container.updateInput({ - panels: { - '456': { - explicitInput: { id: '456' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - }, - }); -}); diff --git a/src/plugins/embeddable/public/tests/explicit_input.test.ts b/src/plugins/embeddable/public/tests/explicit_input.test.ts deleted file mode 100644 index 60ed8378b4f8f..0000000000000 --- a/src/plugins/embeddable/public/tests/explicit_input.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { skip } from 'rxjs'; -import { testPlugin } from './test_plugin'; -import { - MockFilter, - FILTERABLE_EMBEDDABLE, - FilterableEmbeddableInput, -} from '../lib/test_samples/embeddables/filterable_embeddable'; -import { FilterableEmbeddableFactory } from '../lib/test_samples/embeddables/filterable_embeddable_factory'; -import { CONTACT_CARD_EMBEDDABLE } from '../lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory'; -import { SlowContactCardEmbeddableFactory } from '../lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory'; -import { HELLO_WORLD_EMBEDDABLE, HelloWorldEmbeddableFactoryDefinition } from './fixtures'; -import { FilterableContainer } from '../lib/test_samples/embeddables/filterable_container'; -import { isErrorEmbeddable } from '../lib'; -import { HelloWorldContainer } from '../lib/test_samples/embeddables/hello_world_container'; -import { coreMock } from '@kbn/core/public/mocks'; - -const { setup, doStart, uiActions } = testPlugin(coreMock.createSetup(), coreMock.createStart()); - -setup.registerEmbeddableFactory(FILTERABLE_EMBEDDABLE, new FilterableEmbeddableFactory()); -const factory = new SlowContactCardEmbeddableFactory({ - loadTickCount: 2, - execAction: uiActions.executeTriggerActions, -}); -setup.registerEmbeddableFactory(CONTACT_CARD_EMBEDDABLE, factory); -setup.registerEmbeddableFactory( - HELLO_WORLD_EMBEDDABLE, - new HelloWorldEmbeddableFactoryDefinition() -); - -const start = doStart(); - -test('Explicit embeddable input mapped to undefined will default to inherited', async () => { - const derivedFilter: MockFilter = { - $state: { store: 'appState' }, - meta: { disabled: false, alias: 'name', negate: false }, - query: { match: {} }, - }; - const container = new FilterableContainer( - { id: 'hello', panels: {}, filters: [derivedFilter] }, - start.getEmbeddableFactory - ); - const embeddable = await container.addNewEmbeddable<any, any, any>(FILTERABLE_EMBEDDABLE, {}); - - if (isErrorEmbeddable(embeddable)) { - throw new Error('Error adding embeddable'); - } - - embeddable.updateInput({ filters: [] }); - - expect(container.getInputForChild<FilterableEmbeddableInput>(embeddable.id).filters).toEqual([]); - - embeddable.updateInput({ filters: undefined }); - - expect(container.getInputForChild<FilterableEmbeddableInput>(embeddable.id).filters).toEqual([ - derivedFilter, - ]); -}); - -test('Explicit embeddable input mapped to undefined with no inherited value will get passed to embeddable', async () => { - const container = new HelloWorldContainer( - { id: 'hello', panels: {} }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - const embeddable = await container.addNewEmbeddable<any, any, any>(FILTERABLE_EMBEDDABLE, {}); - - if (isErrorEmbeddable(embeddable)) { - throw new Error('Error adding embeddable'); - } - - embeddable.updateInput({ filters: [] }); - - expect(container.getInputForChild<FilterableEmbeddableInput>(embeddable.id).filters).toEqual([]); - - const subscription = await embeddable - .getInput$() - .pipe(skip(1)) - .subscribe(() => { - if (embeddable.getInput().filters === undefined) { - subscription.unsubscribe(); - } - }); - - embeddable.updateInput({ filters: undefined }); -}); - -// The goal is to make sure that if the container input changes after `onPanelAdded` is called -// but before the embeddable factory returns the embeddable, that the `inheritedChildInput` and -// embeddable input comparisons won't cause explicit input to be set when it shouldn't. -test('Explicit input tests in async situations', (done: () => void) => { - const container = new HelloWorldContainer( - { - id: 'hello', - panels: { - '123': { - explicitInput: { firstName: 'Sam', id: '123' }, - type: CONTACT_CARD_EMBEDDABLE, - }, - }, - }, - { - getEmbeddableFactory: start.getEmbeddableFactory, - } - ); - - container.updateInput({ lastName: 'lolol' }); - - const subscription = container.getOutput$().subscribe(() => { - if (container.getOutput().embeddableLoaded['123']) { - const embeddable = container.getChild<any>('123'); - expect(embeddable).toBeDefined(); - expect(embeddable.getInput().lastName).toBe('lolol'); - subscription.unsubscribe(); - done(); - } - }); -}); diff --git a/src/plugins/embeddable/public/tests/get_embeddable_factories.test.ts b/src/plugins/embeddable/public/tests/get_embeddable_factories.test.ts deleted file mode 100644 index 6b7794958ad54..0000000000000 --- a/src/plugins/embeddable/public/tests/get_embeddable_factories.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { testPlugin } from './test_plugin'; -import { FilterableContainerFactory } from '../lib/test_samples/embeddables/filterable_container_factory'; -import { ContactCardEmbeddableFactory } from '../lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory'; - -test('exports getEmbeddableFactories() function', () => { - const { doStart } = testPlugin(); - expect(typeof doStart().getEmbeddableFactories).toBe('function'); -}); - -test('returns empty list if there are no embeddable factories', () => { - const { doStart } = testPlugin(); - const start = doStart(); - const list = [...start.getEmbeddableFactories()]; - expect(list).toEqual([]); -}); - -test('returns existing embeddable factories', () => { - const { setup, doStart } = testPlugin(); - - const factory1 = new FilterableContainerFactory(async () => await start.getEmbeddableFactory); - const factory2 = new ContactCardEmbeddableFactory((() => null) as any, {} as any); - setup.registerEmbeddableFactory(factory1.type, factory1); - setup.registerEmbeddableFactory(factory2.type, factory2); - - const start = doStart(); - - const list = [...start.getEmbeddableFactories()]; - expect(list.length).toBe(2); - expect(!!list.find(({ type }) => factory1.type === type)).toBe(true); - expect(!!list.find(({ type }) => factory2.type === type)).toBe(true); -}); diff --git a/src/plugins/embeddable/public/tests/helpers.ts b/src/plugins/embeddable/public/tests/helpers.ts deleted file mode 100644 index d7fee9d13dec8..0000000000000 --- a/src/plugins/embeddable/public/tests/helpers.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { coreMock } from '@kbn/core/public/mocks'; -import { ContainerInput, EmbeddableContainerSettings, isErrorEmbeddable } from '../lib'; -import { - ContactCardEmbeddable, - ContactCardEmbeddableInput, - ContactCardEmbeddableOutput, - CONTACT_CARD_EMBEDDABLE, - FilterableEmbeddableFactory, - HelloWorldContainer, - SlowContactCardEmbeddableFactory, -} from '../lib/test_samples'; -import { HelloWorldEmbeddableFactoryDefinition } from './fixtures'; -import { testPlugin } from './test_plugin'; - -export async function createHelloWorldContainerAndEmbeddable( - containerInput: ContainerInput = { id: 'hello', panels: {} }, - embeddableInput = {}, - settings?: EmbeddableContainerSettings -) { - const coreSetup = coreMock.createSetup(); - const coreStart = coreMock.createStart(); - const { setup, doStart, uiActions } = testPlugin(coreSetup, coreStart); - const filterableFactory = new FilterableEmbeddableFactory(); - const slowContactCardFactory = new SlowContactCardEmbeddableFactory({ - execAction: uiActions.executeTriggerActions, - }); - const contactCardCreateSpy = jest.spyOn(slowContactCardFactory, 'create'); - - const helloWorldFactory = new HelloWorldEmbeddableFactoryDefinition(); - - setup.registerEmbeddableFactory(filterableFactory.type, filterableFactory); - setup.registerEmbeddableFactory(slowContactCardFactory.type, slowContactCardFactory); - setup.registerEmbeddableFactory(helloWorldFactory.type, helloWorldFactory); - - const start = doStart(); - - const container = new HelloWorldContainer( - containerInput, - { - getEmbeddableFactory: start.getEmbeddableFactory, - }, - settings - ); - - const embeddable = await container.addNewEmbeddable< - ContactCardEmbeddableInput, - ContactCardEmbeddableOutput, - ContactCardEmbeddable - >(CONTACT_CARD_EMBEDDABLE, embeddableInput); - - if (isErrorEmbeddable(embeddable)) { - throw new Error('Error adding embeddable'); - } - - return { - setup, - start, - coreSetup, - coreStart, - container, - uiActions, - embeddable, - contactCardCreateSpy, - }; -} - -export const expectErrorAsync = (fn: (...args: unknown[]) => Promise<unknown>): Promise<Error> => { - return fn() - .then(() => { - throw new Error('Expected an error throw.'); - }) - .catch((error) => { - if (error.message === 'Expected an error throw.') { - throw error; - } - return error; - }); -}; - -export const expectError = (fn: (...args: unknown[]) => unknown): Error => { - try { - fn(); - throw new Error('Expected an error throw.'); - } catch (error) { - if (error.message === 'Expected an error throw.') { - throw error; - } - return error; - } -}; - -export const of = async <T, P extends Promise<T>>( - promise: P -): Promise<[T | undefined, Error | unknown]> => { - try { - return [await promise, undefined]; - } catch (error) { - return [, error]; - } -}; diff --git a/src/plugins/embeddable/tsconfig.json b/src/plugins/embeddable/tsconfig.json index c3b5925e33233..58bd02e0493a8 100644 --- a/src/plugins/embeddable/tsconfig.json +++ b/src/plugins/embeddable/tsconfig.json @@ -10,7 +10,6 @@ "@kbn/saved-objects-plugin", "@kbn/kibana-utils-plugin", "@kbn/ui-actions-plugin", - "@kbn/i18n-react", "@kbn/utility-types", "@kbn/es-query", "@kbn/i18n", diff --git a/src/plugins/field_formats/common/constants/color_default.ts b/src/plugins/field_formats/common/constants/color_default.ts index 689791d3ae4c8..8133d4611d1f8 100644 --- a/src/plugins/field_formats/common/constants/color_default.ts +++ b/src/plugins/field_formats/common/constants/color_default.ts @@ -12,4 +12,5 @@ export const DEFAULT_CONVERTER_COLOR = { regex: '<insert regex>', text: '#000000', background: '#ffffff', + boolean: 'true', }; diff --git a/src/plugins/field_formats/common/converters/color.test.ts b/src/plugins/field_formats/common/converters/color.test.ts index 392e3d677e66a..bf1afb24fe18e 100644 --- a/src/plugins/field_formats/common/converters/color.test.ts +++ b/src/plugins/field_formats/common/converters/color.test.ts @@ -56,6 +56,29 @@ describe('Color Format', () => { }); }); + describe('field is a boolean', () => { + test('should add colors if the value is true or false', () => { + const colorer = new ColorFormat( + { + fieldType: 'boolean', + colors: [ + { + boolean: 'true', + text: 'blue', + background: 'yellow', + }, + ], + }, + jest.fn() + ); + + expect(colorer.convert(true, HTML_CONTEXT_TYPE)).toBe( + '<span style="color:blue;background-color:yellow">true</span>' + ); + expect(colorer.convert(false, HTML_CONTEXT_TYPE)).toBe('false'); + }); + }); + describe('field is a string', () => { test('should add colors if the regex matches', () => { const colorer = new ColorFormat( diff --git a/src/plugins/field_formats/common/converters/color.tsx b/src/plugins/field_formats/common/converters/color.tsx index c05003a01954d..e8a1d2b696644 100644 --- a/src/plugins/field_formats/common/converters/color.tsx +++ b/src/plugins/field_formats/common/converters/color.tsx @@ -23,7 +23,7 @@ export class ColorFormat extends FieldFormat { static title = i18n.translate('fieldFormats.color.title', { defaultMessage: 'Color', }); - static fieldType = [KBN_FIELD_TYPES.NUMBER, KBN_FIELD_TYPES.STRING]; + static fieldType = [KBN_FIELD_TYPES.NUMBER, KBN_FIELD_TYPES.STRING, KBN_FIELD_TYPES.BOOLEAN]; getParamDefaults() { return { @@ -32,7 +32,7 @@ export class ColorFormat extends FieldFormat { }; } - findColorRuleForVal(val: string | number) { + findColorRuleForVal(val: string | number | boolean) { switch (this.param('fieldType')) { case 'string': return findLast(this.param('colors'), (colorParam: typeof DEFAULT_CONVERTER_COLOR) => { @@ -50,6 +50,10 @@ export class ColorFormat extends FieldFormat { // @ts-expect-error upgrade typescript v5.1.6 return val >= Number(start) && val <= Number(end); }); + case 'boolean': + return findLast(this.param('colors'), ({ boolean }) => { + return boolean === val.toString(); + }); default: return null; diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts index 491664ef3fda7..6c53f7479789e 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts @@ -148,7 +148,7 @@ export const getSavedObjects = (): SavedObject[] => [ optionsJSON: '{"useMargins":true,"syncColors":false,"syncCursor":true,"syncTooltips":false,"hidePanelTitles":false}', panelsJSON: - '[{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":21,"w":24,"h":10,"i":"5"},"panelIndex":"5","embeddableConfig":{"attributes":{"title":"[eCommerce] Promotion Tracking (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-e3b3cb5c-e3b1-497f-a5d5-fddb0dabc94e"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-1d08a43c-8913-4692-a3e0-8d77902f6e46"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-9725cdbd-a9f3-479f-a349-0f11244e5239"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-2031d0f8-01fc-4009-b1ad-a7b7ca9266c0"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"xy-visualization-layer-192ad2e4-2bb7-44a9-b345-e96045fa6ccd"}],"state":{"visualization":{"legend":{"isVisible":true,"showSingleSeries":true,"position":"bottom","shouldTruncate":true,"maxLines":1},"valueLabels":"hide","fittingFunction":"None","fillOpacity":0,"yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"seriesType":"line","layerType":"data","layerId":"e3b3cb5c-e3b1-497f-a5d5-fddb0dabc94e","accessors":["a69956c9-43cd-4756-a3c0-e93cb1502a0b"],"yConfig":[{"forAccessor":"a69956c9-43cd-4756-a3c0-e93cb1502a0b","color":"rgba(211,96,134,1)","axisMode":"left"}],"xAccessor":"f3cc8168-6360-4727-a410-a57f5a325091","palette":{"name":"default","type":"palette"}},{"seriesType":"line","layerType":"data","layerId":"1d08a43c-8913-4692-a3e0-8d77902f6e46","accessors":["9a3d8abd-81a5-40ae-9616-020d5a5b2ee2"],"yConfig":[{"forAccessor":"9a3d8abd-81a5-40ae-9616-020d5a5b2ee2","color":"rgba(84,179,153,1)","axisMode":"left"}],"xAccessor":"644b06ea-73a3-47b1-9b40-3035844c4621","palette":{"name":"default","type":"palette"}},{"seriesType":"line","layerType":"data","layerId":"9725cdbd-a9f3-479f-a349-0f11244e5239","accessors":["b5588228-9c46-4a4b-92ee-d140c327bca0"],"yConfig":[{"forAccessor":"b5588228-9c46-4a4b-92ee-d140c327bca0","color":"rgba(96,146,192,1)","axisMode":"left"}],"xAccessor":"6749b404-4784-4fd6-8bf6-5712e84c7310","palette":{"name":"default","type":"palette"}},{"seriesType":"line","layerType":"data","layerId":"2031d0f8-01fc-4009-b1ad-a7b7ca9266c0","accessors":["985e05c0-3a0b-4e55-84bb-1f02128388a9"],"yConfig":[{"forAccessor":"985e05c0-3a0b-4e55-84bb-1f02128388a9","color":"rgba(202,142,174,1)","axisMode":"left"}],"xAccessor":"1b199cb1-b47f-48e6-b209-74eb81b303f5","palette":{"name":"default","type":"palette"}},{"layerId":"192ad2e4-2bb7-44a9-b345-e96045fa6ccd","layerType":"annotations","ignoreGlobalFilters":true,"annotations":[{"type":"query","id":"c8c30be0-b88f-11e8-a451-f37365e9f268","label":"Event","key":{"type":"point_in_time"},"color":"#194D33","timeField":"order_date","icon":"bell","filter":{"type":"kibana_query","query":"taxful_total_price:>250","language":"lucene"},"extraFields":["taxful_total_price"]}]}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"e3b3cb5c-e3b1-497f-a5d5-fddb0dabc94e":{"columns":{"f3cc8168-6360-4727-a410-a57f5a325091":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"a69956c9-43cd-4756-a3c0-e93cb1502a0b":{"label":"Revenue Trousers","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*trouser*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["f3cc8168-6360-4727-a410-a57f5a325091","a69956c9-43cd-4756-a3c0-e93cb1502a0b"],"incompleteColumns":{}},"1d08a43c-8913-4692-a3e0-8d77902f6e46":{"columns":{"644b06ea-73a3-47b1-9b40-3035844c4621":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"9a3d8abd-81a5-40ae-9616-020d5a5b2ee2":{"label":"Revenue Watches","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*watch*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["644b06ea-73a3-47b1-9b40-3035844c4621","9a3d8abd-81a5-40ae-9616-020d5a5b2ee2"],"incompleteColumns":{}},"9725cdbd-a9f3-479f-a349-0f11244e5239":{"columns":{"6749b404-4784-4fd6-8bf6-5712e84c7310":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"b5588228-9c46-4a4b-92ee-d140c327bca0":{"label":"Revenue Bags","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*bag*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["6749b404-4784-4fd6-8bf6-5712e84c7310","b5588228-9c46-4a4b-92ee-d140c327bca0"],"incompleteColumns":{}},"2031d0f8-01fc-4009-b1ad-a7b7ca9266c0":{"columns":{"1b199cb1-b47f-48e6-b209-74eb81b303f5":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"985e05c0-3a0b-4e55-84bb-1f02128388a9":{"label":"Revenue Cocktail Dresses","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*cocktail dress*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["1b199cb1-b47f-48e6-b209-74eb81b303f5","985e05c0-3a0b-4e55-84bb-1f02128388a9"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":false,"enhancements":{}},"title":"[eCommerce] Promotion Tracking"},{"version":"8.11.0","type":"lens","gridData":{"x":36,"y":7,"w":12,"h":7,"i":"7"},"panelIndex":"7","embeddableConfig":{"attributes":{"title":"Sold Products per Day","description":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-037375ae-9e23-4dd5-a4f0-5f117bb7dac1"}],"state":{"visualization":{"layerId":"037375ae-9e23-4dd5-a4f0-5f117bb7dac1","layerType":"data","metricAccessor":"c27bd77c-68e2-4d75-8fda-41c45d22f8d4","maxAccessor":"ce816876-e92d-4b1a-bbb0-ed7637fc0eea","showBar":true,"color":"#68BC00"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"037375ae-9e23-4dd5-a4f0-5f117bb7dac1":{"ignoreGlobalFilters":false,"columns":{"c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0":{"label":"Part of count() / (time_range() / 1000 / 60 / 60 / 24)","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":false},"customLabel":true},"c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1":{"label":"Part of count() / (time_range() / 1000 / 60 / 60 / 24)","dataType":"number","operationType":"time_range","isBucketed":false,"scale":"ratio","references":[],"customLabel":true},"c27bd77c-68e2-4d75-8fda-41c45d22f8d4X2":{"label":"Part of count() / (time_range() / 1000 / 60 / 60 / 24)","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0",{"type":"function","name":"divide","args":[{"type":"function","name":"divide","args":[{"type":"function","name":"divide","args":[{"type":"function","name":"divide","args":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1",1000]},60]},60]},24],"location":{"min":11,"max":45},"text":"time_range() / 1000 / 60 / 60 / 24"}],"location":{"min":0,"max":46},"text":"count() / (time_range() / 1000 / 60 / 60 / 24)"}},"references":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0","c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1"],"customLabel":true},"c27bd77c-68e2-4d75-8fda-41c45d22f8d4":{"label":"Trxns / day","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"format":{"id":"number"},"formula":"count() / (time_range() / 1000 / 60 / 60 / 24)","isFormulaBroken":false},"references":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X2"],"customLabel":true},"ce816876-e92d-4b1a-bbb0-ed7637fc0eea":{"label":"Static value: 300","dataType":"number","operationType":"static_value","isStaticValue":true,"isBucketed":false,"scale":"ratio","params":{"value":"300"},"references":[]}},"columnOrder":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0","c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1","c27bd77c-68e2-4d75-8fda-41c45d22f8d4X2","c27bd77c-68e2-4d75-8fda-41c45d22f8d4","ce816876-e92d-4b1a-bbb0-ed7637fc0eea"],"incompleteColumns":{}}}},"indexpattern":{"layers":{}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"timeRange":{"from":"now-7d","to":"now"},"enhancements":{}}},{"version":"8.11.0","type":"search","gridData":{"x":0,"y":54,"w":48,"h":18,"i":"10"},"panelIndex":"10","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_10"},{"version":"8.11.0","type":"map","gridData":{"x":0,"y":31,"w":24,"h":14,"i":"11"},"panelIndex":"11","embeddableConfig":{"isLayerTOCOpen":false,"hiddenLayers":[],"mapCenter":{"lat":45.88578,"lon":-15.07605,"zoom":2.11},"openTOCDetails":[],"enhancements":{}},"panelRefName":"panel_11"},{"version":"8.11.0","type":"visualization","gridData":{"x":0,"y":0,"w":24,"h":7,"i":"a71cf076-6895-491c-8878-63592e429ed5"},"panelIndex":"a71cf076-6895-491c-8878-63592e429ed5","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_a71cf076-6895-491c-8878-63592e429ed5"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":0,"w":12,"h":7,"i":"75283285-dffd-48a7-a0c2-2235184b5282"},"panelIndex":"75283285-dffd-48a7-a0c2-2235184b5282","embeddableConfig":{"enhancements":{},"attributes":{"visualizationType":"lnsMetric","state":{"visualization":{"layerId":"c7478794-6767-4286-9d65-1c0ecd909dd8","layerType":"data","metricAccessor":"041db33b-5c9c-47f3-a5d3-ef5e255d1663"},"query":{"language":"kuery","query":""},"filters":[],"datasourceStates":{"formBased":{"layers":{"c7478794-6767-4286-9d65-1c0ecd909dd8":{"columnOrder":["041db33b-5c9c-47f3-a5d3-ef5e255d1663"],"columns":{"041db33b-5c9c-47f3-a5d3-ef5e255d1663":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Sum of revenue","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price","params":{}}},"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}},"references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-c7478794-6767-4286-9d65-1c0ecd909dd8"}]},"hidePanelTitles":true},"title":"Sum of revenue"},{"version":"8.11.0","type":"lens","gridData":{"x":36,"y":0,"w":12,"h":7,"i":"58774330-b1b3-42dd-a04c-fbce9cc4d288"},"panelIndex":"58774330-b1b3-42dd-a04c-fbce9cc4d288","embeddableConfig":{"enhancements":{},"attributes":{"title":"Median spending","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-4fb42a8e-b133-43c8-805c-a38472053938"}],"state":{"visualization":{"layerId":"4fb42a8e-b133-43c8-805c-a38472053938","layerType":"data","metricAccessor":"020bbfdf-9ef8-4802-aa9e-342d2ea0bebf"},"query":{"language":"kuery","query":""},"filters":[],"datasourceStates":{"formBased":{"layers":{"4fb42a8e-b133-43c8-805c-a38472053938":{"columnOrder":["020bbfdf-9ef8-4802-aa9e-342d2ea0bebf"],"columns":{"020bbfdf-9ef8-4802-aa9e-342d2ea0bebf":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Median spending","operationType":"median","scale":"ratio","sourceField":"taxful_total_price","params":{}}},"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":true},"title":"Median spending"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":7,"w":12,"h":7,"i":"b63ec47d-aace-4980-b928-6be8adafa5a4"},"panelIndex":"b63ec47d-aace-4980-b928-6be8adafa5a4","embeddableConfig":{"enhancements":{},"attributes":{"visualizationType":"lnsMetric","state":{"visualization":{"layerId":"667067a2-7cdf-4f0e-a9fe-eb4f4f1f2f17","layerType":"data","metricAccessor":"c52c2003-ae58-4604-bae7-52ba0fb38a01"},"query":{"language":"kuery","query":""},"filters":[],"datasourceStates":{"formBased":{"layers":{"667067a2-7cdf-4f0e-a9fe-eb4f4f1f2f17":{"columnOrder":["c52c2003-ae58-4604-bae7-52ba0fb38a01"],"columns":{"c52c2003-ae58-4604-bae7-52ba0fb38a01":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Avg. items sold","operationType":"average","params":{"format":{"id":"number","params":{"decimals":1,"compact":true}}},"scale":"ratio","sourceField":"total_quantity"}},"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}},"references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-667067a2-7cdf-4f0e-a9fe-eb4f4f1f2f17"}]},"hidePanelTitles":true},"title":"Avg. items sold"},{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":14,"w":24,"h":7,"i":"d9495793-80ba-4a9a-b0e3-d1155ec99b09"},"panelIndex":"d9495793-80ba-4a9a-b0e3-d1155ec99b09","embeddableConfig":{"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"b6093a53-884f-42c2-9fcc-ba56cfb66c53":{"columnOrder":["15c45f89-a149-443a-a830-aa8c3a9317db","2b41b3d8-2f62-407a-a866-960f254c679d","eadae280-2da3-4d1d-a0e1-f9733f89c15b","ddc92e50-4d5c-413e-b91b-3e504889fa65","5e31e5d3-2aaa-4475-a130-3b69bf2f748a"],"columns":{"15c45f89-a149-443a-a830-aa8c3a9317db":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"},"2b41b3d8-2f62-407a-a866-960f254c679d":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Total items","operationType":"sum","scale":"ratio","sourceField":"products.quantity"},"5e31e5d3-2aaa-4475-a130-3b69bf2f748a":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Tx. last week","operationType":"count","scale":"ratio","sourceField":"___records___","timeShift":"1w"},"ddc92e50-4d5c-413e-b91b-3e504889fa65":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Transactions","operationType":"count","scale":"ratio","sourceField":"___records___"},"eadae280-2da3-4d1d-a0e1-f9733f89c15b":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Last week","operationType":"sum","scale":"ratio","sourceField":"products.quantity","timeShift":"1w"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"curveType":"LINEAR","fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["2b41b3d8-2f62-407a-a866-960f254c679d","eadae280-2da3-4d1d-a0e1-f9733f89c15b","5e31e5d3-2aaa-4475-a130-3b69bf2f748a","ddc92e50-4d5c-413e-b91b-3e504889fa65"],"layerId":"b6093a53-884f-42c2-9fcc-ba56cfb66c53","position":"top","seriesType":"line","showGridlines":false,"xAccessor":"15c45f89-a149-443a-a830-aa8c3a9317db","yConfig":[{"color":"#b6e0d5","forAccessor":"eadae280-2da3-4d1d-a0e1-f9733f89c15b"},{"color":"#edafc4","forAccessor":"5e31e5d3-2aaa-4475-a130-3b69bf2f748a"}],"layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"line","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-b6093a53-884f-42c2-9fcc-ba56cfb66c53","type":"index-pattern"}]}},"title":"Transactions per day"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":31,"w":24,"h":14,"i":"bda054f7-2d06-4936-b461-365d1be621fa"},"panelIndex":"bda054f7-2d06-4936-b461-365d1be621fa","embeddableConfig":{"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"0731ee8b-31c5-4be9-92d9-69ee760465d7":{"columnOrder":["7bf8f089-1542-40bd-b349-45fdfc309ac6","826b2f39-b616-40b2-a222-972fdc1d7596","cfd45c47-fc41-430c-9e7a-b71dc0c916b0","bf51c1af-443e-49f4-a21f-54c87bfc5677","bf51c1af-443e-49f4-a21f-54c87bfc5677X0","bf51c1af-443e-49f4-a21f-54c87bfc5677X1","bf51c1af-443e-49f4-a21f-54c87bfc5677X2"],"columns":{"7bf8f089-1542-40bd-b349-45fdfc309ac6":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"},"826b2f39-b616-40b2-a222-972fdc1d7596":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"This week","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price"},"bf51c1af-443e-49f4-a21f-54c87bfc5677":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Difference","operationType":"formula","params":{"format":{"id":"number","params":{"decimals":2}},"formula":"sum(taxful_total_price) - sum(taxful_total_price, shift=\'1w\')","isFormulaBroken":false},"references":["bf51c1af-443e-49f4-a21f-54c87bfc5677X2"],"scale":"ratio"},"bf51c1af-443e-49f4-a21f-54c87bfc5677X0":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Difference","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price"},"bf51c1af-443e-49f4-a21f-54c87bfc5677X1":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Difference","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price","timeShift":"1w"},"bf51c1af-443e-49f4-a21f-54c87bfc5677X2":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Difference","operationType":"math","params":{"tinymathAst":{"args":["bf51c1af-443e-49f4-a21f-54c87bfc5677X0","bf51c1af-443e-49f4-a21f-54c87bfc5677X1"],"location":{"max":61,"min":0},"name":"subtract","text":"sum(taxful_total_price) - sum(taxful_total_price, shift=\'1w\')","type":"function"}},"references":["bf51c1af-443e-49f4-a21f-54c87bfc5677X0","bf51c1af-443e-49f4-a21f-54c87bfc5677X1"],"scale":"ratio"},"cfd45c47-fc41-430c-9e7a-b71dc0c916b0":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"1 week ago","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price","timeShift":"1w"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"columns":[{"columnId":"7bf8f089-1542-40bd-b349-45fdfc309ac6"},{"alignment":"left","columnId":"826b2f39-b616-40b2-a222-972fdc1d7596"},{"columnId":"cfd45c47-fc41-430c-9e7a-b71dc0c916b0"},{"colorMode":"text","columnId":"bf51c1af-443e-49f4-a21f-54c87bfc5677","isTransposed":false,"palette":{"name":"custom","params":{"colorStops":[{"color":"#D36086","stop":-10000},{"color":"#209280","stop":0}],"continuity":"above","name":"custom","rangeMax":0,"rangeMin":-10000,"rangeType":"number","steps":5,"stops":[{"color":"#D36086","stop":0},{"color":"#209280","stop":2249.03125}]},"type":"palette"}}],"layerId":"0731ee8b-31c5-4be9-92d9-69ee760465d7","layerType":"data","rowHeight":"single","rowHeightLines":1}},"visualizationType":"lnsDatatable","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-0731ee8b-31c5-4be9-92d9-69ee760465d7","type":"index-pattern"}]}},"title":"Daily comparison"},{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":45,"w":24,"h":9,"i":"d68e91dd-1539-48b0-9279-b43bba2054fe"},"panelIndex":"d68e91dd-1539-48b0-9279-b43bba2054fe","embeddableConfig":{"hidePanelTitles":false,"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"5ed846c2-a70b-4d9c-a244-f254bef763b8":{"columnOrder":["d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","7ac31901-277a-46e2-8128-8d684b2c1127"],"columns":{"7ac31901-277a-46e2-8128-8d684b2c1127":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Items","operationType":"count","scale":"ratio","sourceField":"___records___"},"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46":{"customLabel":true,"dataType":"string","isBucketed":true,"label":"Product name","operationType":"terms","params":{"missingBucket":false,"orderBy":{"columnId":"7ac31901-277a-46e2-8128-8d684b2c1127","type":"column"},"orderDirection":"desc","otherBucket":false,"size":5,"parentFormat":{"id":"terms"}},"scale":"ordinal","sourceField":"products.product_name.keyword"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["7ac31901-277a-46e2-8128-8d684b2c1127"],"layerId":"5ed846c2-a70b-4d9c-a244-f254bef763b8","position":"top","seriesType":"bar_horizontal","showGridlines":false,"xAccessor":"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_horizontal","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"show","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-5ed846c2-a70b-4d9c-a244-f254bef763b8","type":"index-pattern"}]}},"title":"Top products this week"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":45,"w":24,"h":9,"i":"39d96714-152f-414b-992c-ce2492fc69f3"},"panelIndex":"39d96714-152f-414b-992c-ce2492fc69f3","embeddableConfig":{"timeRange":{"from":"now-2w","to":"now-1w"},"hidePanelTitles":false,"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"5ed846c2-a70b-4d9c-a244-f254bef763b8":{"columnOrder":["d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","7ac31901-277a-46e2-8128-8d684b2c1127"],"columns":{"7ac31901-277a-46e2-8128-8d684b2c1127":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Items","operationType":"count","scale":"ratio","sourceField":"___records___"},"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46":{"customLabel":true,"dataType":"string","isBucketed":true,"label":"Product name","operationType":"terms","params":{"missingBucket":false,"orderBy":{"columnId":"7ac31901-277a-46e2-8128-8d684b2c1127","type":"column"},"orderDirection":"desc","otherBucket":false,"size":5,"parentFormat":{"id":"terms"}},"scale":"ordinal","sourceField":"products.product_name.keyword"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["7ac31901-277a-46e2-8128-8d684b2c1127"],"layerId":"5ed846c2-a70b-4d9c-a244-f254bef763b8","position":"top","seriesType":"bar_horizontal","showGridlines":false,"xAccessor":"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_horizontal","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"show","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-5ed846c2-a70b-4d9c-a244-f254bef763b8","type":"index-pattern"}]}},"title":"Top products last week"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":14,"w":24,"h":17,"i":"cd47b7cb-0ac0-43e0-b8c6-53489648bdef"},"panelIndex":"cd47b7cb-0ac0-43e0-b8c6-53489648bdef","embeddableConfig":{"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"97c63ea6-9305-4755-97d1-0f26817c6f9a":{"columnOrder":["9f61a7df-198e-4754-b34c-81ed544136ba","ebcb19af-0900-4439-949f-d8cd9bccde19","5575214b-7f21-4b6c-8bc1-34433c6a0c58"],"columns":{"5575214b-7f21-4b6c-8bc1-34433c6a0c58":{"dataType":"number","isBucketed":false,"label":"Count of records","operationType":"count","scale":"ratio","sourceField":"___records___"},"9f61a7df-198e-4754-b34c-81ed544136ba":{"dataType":"string","isBucketed":true,"label":"Top values of category.keyword","operationType":"terms","params":{"missingBucket":false,"orderBy":{"columnId":"5575214b-7f21-4b6c-8bc1-34433c6a0c58","type":"column"},"orderDirection":"desc","otherBucket":true,"size":10,"parentFormat":{"id":"terms"}},"scale":"ordinal","sourceField":"category.keyword"},"ebcb19af-0900-4439-949f-d8cd9bccde19":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["5575214b-7f21-4b6c-8bc1-34433c6a0c58"],"layerId":"97c63ea6-9305-4755-97d1-0f26817c6f9a","position":"top","seriesType":"bar_percentage_stacked","showGridlines":false,"splitAccessor":"9f61a7df-198e-4754-b34c-81ed544136ba","xAccessor":"ebcb19af-0900-4439-949f-d8cd9bccde19","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_percentage_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"show","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-97c63ea6-9305-4755-97d1-0f26817c6f9a","type":"index-pattern"}]}},"title":"Breakdown by category"},{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":7,"w":24,"h":7,"i":"bdb525ab-270b-46f1-a847-dd29be19aadb"},"panelIndex":"bdb525ab-270b-46f1-a847-dd29be19aadb","embeddableConfig":{"enhancements":{},"hidePanelTitles":false,"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"c7478794-6767-4286-9d65-1c0ecd909dd8":{"columnOrder":["8289349e-6d1b-4abf-b164-0208183d2c34","041db33b-5c9c-47f3-a5d3-ef5e255d1663","041db33b-5c9c-47f3-a5d3-ef5e255d1663X0","041db33b-5c9c-47f3-a5d3-ef5e255d1663X1"],"columns":{"041db33b-5c9c-47f3-a5d3-ef5e255d1663":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"% of target ($10k)","operationType":"formula","params":{"format":{"id":"percent","params":{"decimals":0}},"formula":"sum(taxful_total_price) / 10000 - 1","isFormulaBroken":false},"references":["041db33b-5c9c-47f3-a5d3-ef5e255d1663X1"],"scale":"ratio"},"041db33b-5c9c-47f3-a5d3-ef5e255d1663X0":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Weekly revenue","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price"},"041db33b-5c9c-47f3-a5d3-ef5e255d1663X1":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Weekly revenue","operationType":"math","params":{"tinymathAst":{"args":[{"args":["041db33b-5c9c-47f3-a5d3-ef5e255d1663X0",10000],"location":{"max":32,"min":0},"name":"divide","text":"sum(taxful_total_price) / 10000 ","type":"function"},1],"location":{"max":35,"min":0},"name":"subtract","text":"sum(taxful_total_price) / 10000 - 1","type":"function"}},"references":["041db33b-5c9c-47f3-a5d3-ef5e255d1663X0"],"scale":"ratio"},"8289349e-6d1b-4abf-b164-0208183d2c34":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["041db33b-5c9c-47f3-a5d3-ef5e255d1663"],"layerId":"c7478794-6767-4286-9d65-1c0ecd909dd8","seriesType":"bar_stacked","xAccessor":"8289349e-6d1b-4abf-b164-0208183d2c34","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-c7478794-6767-4286-9d65-1c0ecd909dd8","type":"index-pattern"}]}},"title":"% of target revenue ($10k)"}]', + '[{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":21,"w":24,"h":10,"i":"5"},"panelIndex":"5","embeddableConfig":{"attributes":{"title":"[eCommerce] Promotion Tracking (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-e3b3cb5c-e3b1-497f-a5d5-fddb0dabc94e"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-1d08a43c-8913-4692-a3e0-8d77902f6e46"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-9725cdbd-a9f3-479f-a349-0f11244e5239"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-2031d0f8-01fc-4009-b1ad-a7b7ca9266c0"},{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"xy-visualization-layer-192ad2e4-2bb7-44a9-b345-e96045fa6ccd"}],"state":{"visualization":{"legend":{"isVisible":true,"showSingleSeries":true,"position":"bottom","shouldTruncate":true,"maxLines":1},"valueLabels":"hide","fittingFunction":"None","fillOpacity":0,"yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"seriesType":"line","layerType":"data","layerId":"e3b3cb5c-e3b1-497f-a5d5-fddb0dabc94e","accessors":["a69956c9-43cd-4756-a3c0-e93cb1502a0b"],"yConfig":[{"forAccessor":"a69956c9-43cd-4756-a3c0-e93cb1502a0b","axisMode":"left"}],"xAccessor":"f3cc8168-6360-4727-a410-a57f5a325091","palette":{"name":"default","type":"palette"}},{"seriesType":"line","layerType":"data","layerId":"1d08a43c-8913-4692-a3e0-8d77902f6e46","accessors":["9a3d8abd-81a5-40ae-9616-020d5a5b2ee2"],"yConfig":[{"forAccessor":"9a3d8abd-81a5-40ae-9616-020d5a5b2ee2","axisMode":"left"}],"xAccessor":"644b06ea-73a3-47b1-9b40-3035844c4621","palette":{"name":"default","type":"palette"}},{"seriesType":"line","layerType":"data","layerId":"9725cdbd-a9f3-479f-a349-0f11244e5239","accessors":["b5588228-9c46-4a4b-92ee-d140c327bca0"],"yConfig":[{"forAccessor":"b5588228-9c46-4a4b-92ee-d140c327bca0","axisMode":"left"}],"xAccessor":"6749b404-4784-4fd6-8bf6-5712e84c7310","palette":{"name":"default","type":"palette"}},{"seriesType":"line","layerType":"data","layerId":"2031d0f8-01fc-4009-b1ad-a7b7ca9266c0","accessors":["985e05c0-3a0b-4e55-84bb-1f02128388a9"],"yConfig":[{"forAccessor":"985e05c0-3a0b-4e55-84bb-1f02128388a9","axisMode":"left"}],"xAccessor":"1b199cb1-b47f-48e6-b209-74eb81b303f5","palette":{"name":"default","type":"palette"}},{"layerId":"192ad2e4-2bb7-44a9-b345-e96045fa6ccd","layerType":"annotations","ignoreGlobalFilters":true,"annotations":[{"type":"query","id":"c8c30be0-b88f-11e8-a451-f37365e9f268","label":"Event","key":{"type":"point_in_time"},"color":"#194D33","timeField":"order_date","icon":"bell","filter":{"type":"kibana_query","query":"taxful_total_price:>250","language":"lucene"},"extraFields":["taxful_total_price"]}]}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"e3b3cb5c-e3b1-497f-a5d5-fddb0dabc94e":{"columns":{"f3cc8168-6360-4727-a410-a57f5a325091":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"a69956c9-43cd-4756-a3c0-e93cb1502a0b":{"label":"Revenue Trousers","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*trouser*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["f3cc8168-6360-4727-a410-a57f5a325091","a69956c9-43cd-4756-a3c0-e93cb1502a0b"],"incompleteColumns":{}},"1d08a43c-8913-4692-a3e0-8d77902f6e46":{"columns":{"644b06ea-73a3-47b1-9b40-3035844c4621":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"9a3d8abd-81a5-40ae-9616-020d5a5b2ee2":{"label":"Revenue Watches","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*watch*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["644b06ea-73a3-47b1-9b40-3035844c4621","9a3d8abd-81a5-40ae-9616-020d5a5b2ee2"],"incompleteColumns":{}},"9725cdbd-a9f3-479f-a349-0f11244e5239":{"columns":{"6749b404-4784-4fd6-8bf6-5712e84c7310":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"b5588228-9c46-4a4b-92ee-d140c327bca0":{"label":"Revenue Bags","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*bag*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["6749b404-4784-4fd6-8bf6-5712e84c7310","b5588228-9c46-4a4b-92ee-d140c327bca0"],"incompleteColumns":{}},"2031d0f8-01fc-4009-b1ad-a7b7ca9266c0":{"columns":{"1b199cb1-b47f-48e6-b209-74eb81b303f5":{"label":"order_date","dataType":"date","operationType":"date_histogram","sourceField":"order_date","isBucketed":true,"scale":"interval","params":{"interval":"12h","includeEmptyRows":true,"dropPartials":false}},"985e05c0-3a0b-4e55-84bb-1f02128388a9":{"label":"Revenue Cocktail Dresses","dataType":"number","operationType":"sum","sourceField":"taxful_total_price","isBucketed":false,"scale":"ratio","filter":{"query":"products.product_name:*cocktail dress*","language":"lucene"},"params":{"format":{"id":"number"},"emptyAsNull":true},"customLabel":true}},"columnOrder":["1b199cb1-b47f-48e6-b209-74eb81b303f5","985e05c0-3a0b-4e55-84bb-1f02128388a9"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":false,"enhancements":{}},"title":"[eCommerce] Promotion Tracking"},{"version":"8.11.0","type":"lens","gridData":{"x":36,"y":7,"w":12,"h":7,"i":"7"},"panelIndex":"7","embeddableConfig":{"attributes":{"title":"Sold Products per Day","description":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-037375ae-9e23-4dd5-a4f0-5f117bb7dac1"}],"state":{"visualization":{"layerId":"037375ae-9e23-4dd5-a4f0-5f117bb7dac1","layerType":"data","metricAccessor":"c27bd77c-68e2-4d75-8fda-41c45d22f8d4","maxAccessor":"ce816876-e92d-4b1a-bbb0-ed7637fc0eea","showBar":true,"palette":{"type":"palette","name":"status","params":{"name":"status","reverse":true,"rangeType":"percent","rangeMin":0,"rangeMax":100,"progression":"fixed","stops":[{"color":"#23be8f","stop":33.33},{"color":"#fcd279","stop":66.66},{"color":"#f66d64","stop":100}],"steps":3,"colorStops":[],"continuity":"all","maxSteps":5}}},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"037375ae-9e23-4dd5-a4f0-5f117bb7dac1":{"ignoreGlobalFilters":false,"columns":{"c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0":{"label":"Part of count() / (time_range() / 1000 / 60 / 60 / 24)","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":false},"customLabel":true},"c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1":{"label":"Part of count() / (time_range() / 1000 / 60 / 60 / 24)","dataType":"number","operationType":"time_range","isBucketed":false,"scale":"ratio","references":[],"customLabel":true},"c27bd77c-68e2-4d75-8fda-41c45d22f8d4X2":{"label":"Part of count() / (time_range() / 1000 / 60 / 60 / 24)","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0",{"type":"function","name":"divide","args":[{"type":"function","name":"divide","args":[{"type":"function","name":"divide","args":[{"type":"function","name":"divide","args":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1",1000]},60]},60]},24],"location":{"min":11,"max":45},"text":"time_range() / 1000 / 60 / 60 / 24"}],"location":{"min":0,"max":46},"text":"count() / (time_range() / 1000 / 60 / 60 / 24)"}},"references":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0","c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1"],"customLabel":true},"c27bd77c-68e2-4d75-8fda-41c45d22f8d4":{"label":"Trxns / day","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"format":{"id":"number"},"formula":"count() / (time_range() / 1000 / 60 / 60 / 24)","isFormulaBroken":false},"references":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X2"],"customLabel":true},"ce816876-e92d-4b1a-bbb0-ed7637fc0eea":{"label":"Static value: 300","dataType":"number","operationType":"static_value","isStaticValue":true,"isBucketed":false,"scale":"ratio","params":{"value":"300"},"references":[]}},"columnOrder":["c27bd77c-68e2-4d75-8fda-41c45d22f8d4X0","c27bd77c-68e2-4d75-8fda-41c45d22f8d4X1","c27bd77c-68e2-4d75-8fda-41c45d22f8d4X2","c27bd77c-68e2-4d75-8fda-41c45d22f8d4","ce816876-e92d-4b1a-bbb0-ed7637fc0eea"],"incompleteColumns":{}}}},"indexpattern":{"layers":{}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"timeRange":{"from":"now-7d","to":"now"},"enhancements":{}}},{"version":"8.11.0","type":"search","gridData":{"x":0,"y":54,"w":48,"h":18,"i":"10"},"panelIndex":"10","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_10"},{"version":"8.11.0","type":"map","gridData":{"x":0,"y":31,"w":24,"h":14,"i":"11"},"panelIndex":"11","embeddableConfig":{"isLayerTOCOpen":false,"hiddenLayers":[],"mapCenter":{"lat":45.88578,"lon":-15.07605,"zoom":2.11},"openTOCDetails":[],"enhancements":{}},"panelRefName":"panel_11"},{"version":"8.11.0","type":"visualization","gridData":{"x":0,"y":0,"w":24,"h":7,"i":"a71cf076-6895-491c-8878-63592e429ed5"},"panelIndex":"a71cf076-6895-491c-8878-63592e429ed5","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_a71cf076-6895-491c-8878-63592e429ed5"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":0,"w":12,"h":7,"i":"75283285-dffd-48a7-a0c2-2235184b5282"},"panelIndex":"75283285-dffd-48a7-a0c2-2235184b5282","embeddableConfig":{"enhancements":{},"attributes":{"visualizationType":"lnsMetric","state":{"visualization":{"layerId":"c7478794-6767-4286-9d65-1c0ecd909dd8","layerType":"data","metricAccessor":"041db33b-5c9c-47f3-a5d3-ef5e255d1663"},"query":{"language":"kuery","query":""},"filters":[],"datasourceStates":{"formBased":{"layers":{"c7478794-6767-4286-9d65-1c0ecd909dd8":{"columnOrder":["041db33b-5c9c-47f3-a5d3-ef5e255d1663"],"columns":{"041db33b-5c9c-47f3-a5d3-ef5e255d1663":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Sum of revenue","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price","params":{}}},"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}},"references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-c7478794-6767-4286-9d65-1c0ecd909dd8"}]},"hidePanelTitles":true},"title":"Sum of revenue"},{"version":"8.11.0","type":"lens","gridData":{"x":36,"y":0,"w":12,"h":7,"i":"58774330-b1b3-42dd-a04c-fbce9cc4d288"},"panelIndex":"58774330-b1b3-42dd-a04c-fbce9cc4d288","embeddableConfig":{"enhancements":{},"attributes":{"title":"Median spending","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-4fb42a8e-b133-43c8-805c-a38472053938"}],"state":{"visualization":{"layerId":"4fb42a8e-b133-43c8-805c-a38472053938","layerType":"data","metricAccessor":"020bbfdf-9ef8-4802-aa9e-342d2ea0bebf"},"query":{"language":"kuery","query":""},"filters":[],"datasourceStates":{"formBased":{"layers":{"4fb42a8e-b133-43c8-805c-a38472053938":{"columnOrder":["020bbfdf-9ef8-4802-aa9e-342d2ea0bebf"],"columns":{"020bbfdf-9ef8-4802-aa9e-342d2ea0bebf":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Median spending","operationType":"median","scale":"ratio","sourceField":"taxful_total_price","params":{}}},"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":true},"title":"Median spending"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":7,"w":12,"h":7,"i":"b63ec47d-aace-4980-b928-6be8adafa5a4"},"panelIndex":"b63ec47d-aace-4980-b928-6be8adafa5a4","embeddableConfig":{"enhancements":{},"attributes":{"visualizationType":"lnsMetric","state":{"visualization":{"layerId":"667067a2-7cdf-4f0e-a9fe-eb4f4f1f2f17","layerType":"data","metricAccessor":"c52c2003-ae58-4604-bae7-52ba0fb38a01"},"query":{"language":"kuery","query":""},"filters":[],"datasourceStates":{"formBased":{"layers":{"667067a2-7cdf-4f0e-a9fe-eb4f4f1f2f17":{"columnOrder":["c52c2003-ae58-4604-bae7-52ba0fb38a01"],"columns":{"c52c2003-ae58-4604-bae7-52ba0fb38a01":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Avg. items sold","operationType":"average","params":{"format":{"id":"number","params":{"decimals":1,"compact":true}}},"scale":"ratio","sourceField":"total_quantity"}},"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}},"references":[{"type":"index-pattern","id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-667067a2-7cdf-4f0e-a9fe-eb4f4f1f2f17"}]},"hidePanelTitles":true},"title":"Avg. items sold"},{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":14,"w":24,"h":7,"i":"d9495793-80ba-4a9a-b0e3-d1155ec99b09"},"panelIndex":"d9495793-80ba-4a9a-b0e3-d1155ec99b09","embeddableConfig":{"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"b6093a53-884f-42c2-9fcc-ba56cfb66c53":{"columnOrder":["15c45f89-a149-443a-a830-aa8c3a9317db","2b41b3d8-2f62-407a-a866-960f254c679d","eadae280-2da3-4d1d-a0e1-f9733f89c15b","ddc92e50-4d5c-413e-b91b-3e504889fa65","5e31e5d3-2aaa-4475-a130-3b69bf2f748a"],"columns":{"15c45f89-a149-443a-a830-aa8c3a9317db":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"},"2b41b3d8-2f62-407a-a866-960f254c679d":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Total items","operationType":"sum","scale":"ratio","sourceField":"products.quantity"},"5e31e5d3-2aaa-4475-a130-3b69bf2f748a":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Tx. last week","operationType":"count","scale":"ratio","sourceField":"___records___","timeShift":"1w"},"ddc92e50-4d5c-413e-b91b-3e504889fa65":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Transactions","operationType":"count","scale":"ratio","sourceField":"___records___"},"eadae280-2da3-4d1d-a0e1-f9733f89c15b":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Last week","operationType":"sum","scale":"ratio","sourceField":"products.quantity","timeShift":"1w"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"curveType":"LINEAR","fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["2b41b3d8-2f62-407a-a866-960f254c679d","eadae280-2da3-4d1d-a0e1-f9733f89c15b","5e31e5d3-2aaa-4475-a130-3b69bf2f748a","ddc92e50-4d5c-413e-b91b-3e504889fa65"],"layerId":"b6093a53-884f-42c2-9fcc-ba56cfb66c53","position":"top","seriesType":"line","showGridlines":false,"xAccessor":"15c45f89-a149-443a-a830-aa8c3a9317db","yConfig":[],"layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"line","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-b6093a53-884f-42c2-9fcc-ba56cfb66c53","type":"index-pattern"}]}},"title":"Transactions per day"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":31,"w":24,"h":14,"i":"bda054f7-2d06-4936-b461-365d1be621fa"},"panelIndex":"bda054f7-2d06-4936-b461-365d1be621fa","embeddableConfig":{"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"0731ee8b-31c5-4be9-92d9-69ee760465d7":{"columnOrder":["7bf8f089-1542-40bd-b349-45fdfc309ac6","826b2f39-b616-40b2-a222-972fdc1d7596","cfd45c47-fc41-430c-9e7a-b71dc0c916b0","bf51c1af-443e-49f4-a21f-54c87bfc5677","bf51c1af-443e-49f4-a21f-54c87bfc5677X0","bf51c1af-443e-49f4-a21f-54c87bfc5677X1","bf51c1af-443e-49f4-a21f-54c87bfc5677X2"],"columns":{"7bf8f089-1542-40bd-b349-45fdfc309ac6":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"},"826b2f39-b616-40b2-a222-972fdc1d7596":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"This week","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price"},"bf51c1af-443e-49f4-a21f-54c87bfc5677":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Difference","operationType":"formula","params":{"format":{"id":"number","params":{"decimals":2}},"formula":"sum(taxful_total_price) - sum(taxful_total_price, shift=\'1w\')","isFormulaBroken":false},"references":["bf51c1af-443e-49f4-a21f-54c87bfc5677X2"],"scale":"ratio"},"bf51c1af-443e-49f4-a21f-54c87bfc5677X0":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Difference","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price"},"bf51c1af-443e-49f4-a21f-54c87bfc5677X1":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Difference","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price","timeShift":"1w"},"bf51c1af-443e-49f4-a21f-54c87bfc5677X2":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Difference","operationType":"math","params":{"tinymathAst":{"args":["bf51c1af-443e-49f4-a21f-54c87bfc5677X0","bf51c1af-443e-49f4-a21f-54c87bfc5677X1"],"location":{"max":61,"min":0},"name":"subtract","text":"sum(taxful_total_price) - sum(taxful_total_price, shift=\'1w\')","type":"function"}},"references":["bf51c1af-443e-49f4-a21f-54c87bfc5677X0","bf51c1af-443e-49f4-a21f-54c87bfc5677X1"],"scale":"ratio"},"cfd45c47-fc41-430c-9e7a-b71dc0c916b0":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"1 week ago","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price","timeShift":"1w"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"columns":[{"columnId":"7bf8f089-1542-40bd-b349-45fdfc309ac6"},{"alignment":"left","columnId":"826b2f39-b616-40b2-a222-972fdc1d7596"},{"columnId":"cfd45c47-fc41-430c-9e7a-b71dc0c916b0"},{"colorMode":"text","columnId":"bf51c1af-443e-49f4-a21f-54c87bfc5677","isTransposed":false,"palette":{"type":"palette","name":"status","params":{"continuity":"above","name":"status","rangeMax":null,"rangeMin":-2284.2265625,"rangeType":"percent","steps":5,"stops":[{"color":"#23be8f","stop":0},{"color":"#9dedce","stop":20},{"color":"#fcd279","stop":40},{"color":"#ffc0b8","stop":60},{"color":"#f66d64","stop":80}],"reverse":true}}}],"layerId":"0731ee8b-31c5-4be9-92d9-69ee760465d7","layerType":"data","rowHeight":"single","rowHeightLines":1}},"visualizationType":"lnsDatatable","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-0731ee8b-31c5-4be9-92d9-69ee760465d7","type":"index-pattern"}]}},"title":"Daily comparison"},{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":45,"w":24,"h":9,"i":"d68e91dd-1539-48b0-9279-b43bba2054fe"},"panelIndex":"d68e91dd-1539-48b0-9279-b43bba2054fe","embeddableConfig":{"hidePanelTitles":false,"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"5ed846c2-a70b-4d9c-a244-f254bef763b8":{"columnOrder":["d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","7ac31901-277a-46e2-8128-8d684b2c1127"],"columns":{"7ac31901-277a-46e2-8128-8d684b2c1127":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Items","operationType":"count","scale":"ratio","sourceField":"___records___"},"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46":{"customLabel":true,"dataType":"string","isBucketed":true,"label":"Product name","operationType":"terms","params":{"missingBucket":false,"orderBy":{"columnId":"7ac31901-277a-46e2-8128-8d684b2c1127","type":"column"},"orderDirection":"desc","otherBucket":false,"size":5,"parentFormat":{"id":"terms"}},"scale":"ordinal","sourceField":"products.product_name.keyword"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["7ac31901-277a-46e2-8128-8d684b2c1127"],"layerId":"5ed846c2-a70b-4d9c-a244-f254bef763b8","position":"top","seriesType":"bar_horizontal","showGridlines":false,"xAccessor":"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_horizontal","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"show","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-5ed846c2-a70b-4d9c-a244-f254bef763b8","type":"index-pattern"}]}},"title":"Top products this week"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":45,"w":24,"h":9,"i":"39d96714-152f-414b-992c-ce2492fc69f3"},"panelIndex":"39d96714-152f-414b-992c-ce2492fc69f3","embeddableConfig":{"timeRange":{"from":"now-2w","to":"now-1w"},"hidePanelTitles":false,"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"5ed846c2-a70b-4d9c-a244-f254bef763b8":{"columnOrder":["d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","7ac31901-277a-46e2-8128-8d684b2c1127"],"columns":{"7ac31901-277a-46e2-8128-8d684b2c1127":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Items","operationType":"count","scale":"ratio","sourceField":"___records___"},"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46":{"customLabel":true,"dataType":"string","isBucketed":true,"label":"Product name","operationType":"terms","params":{"missingBucket":false,"orderBy":{"columnId":"7ac31901-277a-46e2-8128-8d684b2c1127","type":"column"},"orderDirection":"desc","otherBucket":false,"size":5,"parentFormat":{"id":"terms"}},"scale":"ordinal","sourceField":"products.product_name.keyword"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["7ac31901-277a-46e2-8128-8d684b2c1127"],"layerId":"5ed846c2-a70b-4d9c-a244-f254bef763b8","position":"top","seriesType":"bar_horizontal","showGridlines":false,"xAccessor":"d77cdd24-dedc-48dd-9a4b-d34c6f1a6c46","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_horizontal","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"show","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-5ed846c2-a70b-4d9c-a244-f254bef763b8","type":"index-pattern"}]}},"title":"Top products last week"},{"version":"8.11.0","type":"lens","gridData":{"x":24,"y":14,"w":24,"h":17,"i":"cd47b7cb-0ac0-43e0-b8c6-53489648bdef"},"panelIndex":"cd47b7cb-0ac0-43e0-b8c6-53489648bdef","embeddableConfig":{"enhancements":{},"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"97c63ea6-9305-4755-97d1-0f26817c6f9a":{"columnOrder":["9f61a7df-198e-4754-b34c-81ed544136ba","ebcb19af-0900-4439-949f-d8cd9bccde19","5575214b-7f21-4b6c-8bc1-34433c6a0c58"],"columns":{"5575214b-7f21-4b6c-8bc1-34433c6a0c58":{"dataType":"number","isBucketed":false,"label":"Count of records","operationType":"count","scale":"ratio","sourceField":"___records___"},"9f61a7df-198e-4754-b34c-81ed544136ba":{"dataType":"string","isBucketed":true,"label":"Top values of category.keyword","operationType":"terms","params":{"missingBucket":false,"orderBy":{"columnId":"5575214b-7f21-4b6c-8bc1-34433c6a0c58","type":"column"},"orderDirection":"desc","otherBucket":true,"size":10,"parentFormat":{"id":"terms"}},"scale":"ordinal","sourceField":"category.keyword"},"ebcb19af-0900-4439-949f-d8cd9bccde19":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["5575214b-7f21-4b6c-8bc1-34433c6a0c58"],"layerId":"97c63ea6-9305-4755-97d1-0f26817c6f9a","position":"top","seriesType":"bar_percentage_stacked","showGridlines":false,"splitAccessor":"9f61a7df-198e-4754-b34c-81ed544136ba","xAccessor":"ebcb19af-0900-4439-949f-d8cd9bccde19","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_percentage_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"show","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-97c63ea6-9305-4755-97d1-0f26817c6f9a","type":"index-pattern"}]}},"title":"Breakdown by category"},{"version":"8.11.0","type":"lens","gridData":{"x":0,"y":7,"w":24,"h":7,"i":"bdb525ab-270b-46f1-a847-dd29be19aadb"},"panelIndex":"bdb525ab-270b-46f1-a847-dd29be19aadb","embeddableConfig":{"enhancements":{},"hidePanelTitles":false,"attributes":{"state":{"datasourceStates":{"formBased":{"layers":{"c7478794-6767-4286-9d65-1c0ecd909dd8":{"columnOrder":["8289349e-6d1b-4abf-b164-0208183d2c34","041db33b-5c9c-47f3-a5d3-ef5e255d1663","041db33b-5c9c-47f3-a5d3-ef5e255d1663X0","041db33b-5c9c-47f3-a5d3-ef5e255d1663X1"],"columns":{"041db33b-5c9c-47f3-a5d3-ef5e255d1663":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"% of target ($10k)","operationType":"formula","params":{"format":{"id":"percent","params":{"decimals":0}},"formula":"sum(taxful_total_price) / 10000 - 1","isFormulaBroken":false},"references":["041db33b-5c9c-47f3-a5d3-ef5e255d1663X1"],"scale":"ratio"},"041db33b-5c9c-47f3-a5d3-ef5e255d1663X0":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Weekly revenue","operationType":"sum","scale":"ratio","sourceField":"taxful_total_price"},"041db33b-5c9c-47f3-a5d3-ef5e255d1663X1":{"customLabel":true,"dataType":"number","isBucketed":false,"label":"Part of Weekly revenue","operationType":"math","params":{"tinymathAst":{"args":[{"args":["041db33b-5c9c-47f3-a5d3-ef5e255d1663X0",10000],"location":{"max":32,"min":0},"name":"divide","text":"sum(taxful_total_price) / 10000 ","type":"function"},1],"location":{"max":35,"min":0},"name":"subtract","text":"sum(taxful_total_price) / 10000 - 1","type":"function"}},"references":["041db33b-5c9c-47f3-a5d3-ef5e255d1663X0"],"scale":"ratio"},"8289349e-6d1b-4abf-b164-0208183d2c34":{"dataType":"date","isBucketed":true,"label":"order_date","operationType":"date_histogram","params":{"interval":"1d","includeEmptyRows":true},"scale":"interval","sourceField":"order_date"}},"incompleteColumns":{}}}}},"filters":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"layers":[{"accessors":["041db33b-5c9c-47f3-a5d3-ef5e255d1663"],"layerId":"c7478794-6767-4286-9d65-1c0ecd909dd8","seriesType":"bar_stacked","xAccessor":"8289349e-6d1b-4abf-b164-0208183d2c34","layerType":"data"}],"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"preferredSeriesType":"bar_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"}}},"visualizationType":"lnsXY","references":[{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"ff959d40-b880-11e8-a6d9-e546fe2bba5f","name":"indexpattern-datasource-layer-c7478794-6767-4286-9d65-1c0ecd909dd8","type":"index-pattern"}]}},"title":"% of target revenue ($10k)"}]', timeFrom: 'now-7d', title: '[eCommerce] Revenue Dashboard', timeTo: 'now', diff --git a/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts index 0b072bd1a4389..3f4d7e2bc6ada 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts @@ -148,7 +148,7 @@ export const getSavedObjects = (): SavedObject[] => [ optionsJSON: '{"useMargins":true,"syncColors":false,"syncCursor":true,"syncTooltips":false,"hidePanelTitles":false}', panelsJSON: - '[{"version":"8.8.0","type":"search","gridData":{"x":0,"y":69,"w":48,"h":15,"i":"4"},"panelIndex":"4","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_4"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":16,"w":24,"h":9,"i":"7"},"panelIndex":"7","embeddableConfig":{"attributes":{"title":"[Flights] Delays & Cancellations (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-dc8cf715-b56b-4dd7-a624-7c3ef9e2f2ce"},{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"xy-visualization-layer-10fed425-accd-411b-a773-ee825bc3945b"}],"state":{"visualization":{"legend":{"isVisible":false,"showSingleSeries":false,"position":"bottom","shouldTruncate":true,"maxLines":1},"valueLabels":"hide","fittingFunction":"None","fillOpacity":0.5,"yLeftExtent":{"upperBound":1,"mode":"custom"},"yRightExtent":{"mode":"full"},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"seriesType":"area","layerType":"data","layerId":"dc8cf715-b56b-4dd7-a624-7c3ef9e2f2ce","accessors":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4a"],"yConfig":[{"forAccessor":"b9d6187b-8a7e-4c49-bffd-7a60cc075a4a","color":"rgba(0,156,224,1)","axisMode":"left"}],"xAccessor":"6944431b-f90a-4dab-a282-0961cb97edd1","palette":{"name":"default","type":"palette"}},{"layerId":"10fed425-accd-411b-a773-ee825bc3945b","layerType":"annotations","ignoreGlobalFilters":true,"annotations":[{"type":"query","id":"53b7dff0-4c89-11e8-a66a-6989ad5a0a39","label":"Event","key":{"type":"point_in_time"},"timeField":"timestamp","color":"#0062B1","icon":"alert","filter":{"type":"kibana_query","query":"FlightDelay:true AND Cancelled:true","language":"lucene"},"extraFields":["FlightDelay","Cancelled","Carrier"]}]}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"dc8cf715-b56b-4dd7-a624-7c3ef9e2f2ce":{"columns":{"6944431b-f90a-4dab-a282-0961cb97edd1":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true,"dropPartials":false}},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0":{"label":"Part of count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"FlightDelay:true","language":"lucene"},"params":{"emptyAsNull":false},"customLabel":true},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1":{"label":"Part of count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"*","language":"kuery"},"params":{"emptyAsNull":false},"customLabel":true},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX2":{"label":"Part of count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1"],"location":{"min":0,"max":49},"text":"count(lucene=\'FlightDelay:true\') / count(kql=\'*\')"}},"references":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1"],"customLabel":true},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4a":{"label":"Percent Delays","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"format":{"id":"percent"},"formula":"count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","isFormulaBroken":false},"references":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX2"],"customLabel":true}},"columnOrder":["6944431b-f90a-4dab-a282-0961cb97edd1","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX2","b9d6187b-8a7e-4c49-bffd-7a60cc075a4a"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Delays & Cancellations"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":58,"w":24,"h":11,"i":"10"},"panelIndex":"10","embeddableConfig":{"attributes":{"title":"[Flights] Delay Buckets (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-247b176d-e81d-47dc-bbd1-4de85d098961"},{"type":"index-pattern","name":"c61f29fc-1ff3-4d46-a6c2-bde8a5b97f4a","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d"}],"state":{"visualization":{"legend":{"isVisible":false,"position":"right","legendSize":"auto","shouldTruncate":true,"maxLines":1,"showSingleSeries":true},"valueLabels":"hide","curveType":"LINEAR","yTitle":"Count","yLeftExtent":{"mode":"full","enforce":true},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":-90},"gridlinesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"layerId":"247b176d-e81d-47dc-bbd1-4de85d098961","accessors":["c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da"],"layerType":"data","seriesType":"bar_stacked","xAccessor":"c7936be7-e59b-424e-a912-69ba820d8e24","simpleView":false,"palette":{"type":"palette","name":"default"},"yConfig":[{"forAccessor":"c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da","axisMode":"left","color":"#1F78C1"}],"xScaleType":"linear","isHistogram":true}]},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"negate":true,"disabled":false,"alias":null,"type":"phrase","key":"FlightDelayMin","value":"0","params":{"query":0,"type":"phrase"},"index":"c61f29fc-1ff3-4d46-a6c2-bde8a5b97f4a"},"query":{"match":{"FlightDelayMin":{"query":0,"type":"phrase"}}},"$state":{"store":"appState"}}],"datasourceStates":{"formBased":{"layers":{"247b176d-e81d-47dc-bbd1-4de85d098961":{"columns":{"c7936be7-e59b-424e-a912-69ba820d8e24":{"label":"Flight Delay Minutes","dataType":"number","operationType":"range","sourceField":"FlightDelayMin","isBucketed":true,"scale":"interval","params":{"includeEmptyRows":false,"type":"histogram","ranges":[{"from":0,"to":1000,"label":""}],"maxBars":"auto"},"customLabel":true},"c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da":{"label":"Count","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":true},"customLabel":true}},"columnOrder":["c7936be7-e59b-424e-a912-69ba820d8e24","c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Delay Buckets"},{"version":"8.8.0","type":"map","gridData":{"x":0,"y":36,"w":24,"h":22,"i":"23"},"panelIndex":"23","embeddableConfig":{"isLayerTOCOpen":true,"hiddenLayers":[],"mapCenter":{"lat":48.72307,"lon":-115.18171,"zoom":4.28},"openTOCDetails":[],"enhancements":{}},"panelRefName":"panel_23"},{"version":"8.8.0","type":"visualization","gridData":{"x":24,"y":36,"w":24,"h":22,"i":"31"},"panelIndex":"31","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_31"},{"version":"8.8.0","type":"visualization","gridData":{"x":0,"y":0,"w":24,"h":8,"i":"6afc61f7-e2d5-45a3-9e7a-281160ad3eb9"},"panelIndex":"6afc61f7-e2d5-45a3-9e7a-281160ad3eb9","embeddableConfig":{"savedVis":{"title":"[Flights] Markdown Instructions","description":"","type":"markdown","params":{"fontSize":10,"openLinksInNewTab":true,"markdown":"## Sample Flight data\\nThis dashboard contains sample data for you to play with. You can view it, search it, and interact with the visualizations. For more information about Kibana, check our [docs](https://www.elastic.co/guide/en/kibana/current/index.html)."},"uiState":{},"data":{"aggs":[],"searchSource":{}}},"hidePanelTitles":true,"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":0,"w":8,"h":8,"i":"392b4936-f753-47bc-a98d-a4e41a0a4cd4"},"panelIndex":"392b4936-f753-47bc-a98d-a4e41a0a4cd4","embeddableConfig":{"enhancements":{},"attributes":{"title":"[Flights] Total Flights","description":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-8fa993db-c147-4954-adf7-4ff264d42576"}],"state":{"visualization":{"layerId":"8fa993db-c147-4954-adf7-4ff264d42576","layerType":"data","metricAccessor":"81124c45-6ab6-42f4-8859-495d55eb8065"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"8fa993db-c147-4954-adf7-4ff264d42576":{"columns":{"81124c45-6ab6-42f4-8859-495d55eb8065":{"label":"Total flights","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true}},"columnOrder":["81124c45-6ab6-42f4-8859-495d55eb8065"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":true}},{"version":"8.8.0","type":"lens","gridData":{"x":32,"y":0,"w":8,"h":4,"i":"9271deff-5a61-4665-83fc-f9fdc6bf0c0b"},"panelIndex":"9271deff-5a61-4665-83fc-f9fdc6bf0c0b","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"7e8fe9b1-f45c-4f3d-9561-30febcd357ec"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"7e8fe9b1-f45c-4f3d-9561-30febcd357ec":{"label":"Delayed","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'FlightDelay : true\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0":{"label":"Part of count(kql=\'FlightDelay : true\') / count()","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"FlightDelay : true","language":"kuery"},"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1":{"label":"Part of count(kql=\'FlightDelay : true\') / count()","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2":{"label":"Part of count(kql=\'FlightDelay : true\') / count()","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"location":{"min":0,"max":41},"text":"count(kql=\'FlightDelay : true\') / count()"}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"customLabel":true}},"columnOrder":["7e8fe9b1-f45c-4f3d-9561-30febcd357ec","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":40,"y":0,"w":8,"h":4,"i":"aa591c29-1a31-4ee1-a71d-b829c06fd162"},"panelIndex":"aa591c29-1a31-4ee1-a71d-b829c06fd162","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"},{"type":"index-pattern","name":"c804c161-375f-4d52-a1cc-2e98b966957d","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"c7851241-5526-499a-960b-357af8c2ce5b"},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"alias":null,"negate":false,"disabled":false,"type":"phrase","key":"FlightDelay","params":{"query":true},"index":"c804c161-375f-4d52-a1cc-2e98b966957d"},"query":{"match_phrase":{"FlightDelay":true}},"$state":{"store":"appState"}}],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"c7851241-5526-499a-960b-357af8c2ce5b":{"label":"Delayed vs 1 week earlier","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count() / count(shift=\'1w\') - 1","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX2"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX2":{"label":"Part of Delayed","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"subtract","args":[{"type":"function","name":"divide","args":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"location":{"min":0,"max":28},"text":"count() / count(shift=\'1w\') "},1],"location":{"min":0,"max":31},"text":"count() / count(shift=\'1w\') - 1"}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX0":{"label":"Part of Delayed","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX1":{"label":"Part of Delayed","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","timeShift":"1w","customLabel":true}},"columnOrder":["c7851241-5526-499a-960b-357af8c2ce5b","c7851241-5526-499a-960b-357af8c2ce5bX2","c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":32,"y":4,"w":8,"h":4,"i":"b766e3b8-4544-46ed-99e6-9ecc4847e2a2"},"panelIndex":"b766e3b8-4544-46ed-99e6-9ecc4847e2a2","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"7e8fe9b1-f45c-4f3d-9561-30febcd357ec"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"7e8fe9b1-f45c-4f3d-9561-30febcd357ec":{"label":"Cancelled","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'Cancelled : true\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0":{"label":"Part of Cancelled","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"Cancelled : true","language":"kuery"},"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1":{"label":"Part of Cancelled","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2":{"label":"Part of Cancelled","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"location":{"min":0,"max":39},"text":"count(kql=\'Cancelled : true\') / count()"}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"customLabel":true}},"columnOrder":["7e8fe9b1-f45c-4f3d-9561-30febcd357ec","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":40,"y":4,"w":8,"h":4,"i":"2e33ade5-96e5-40b4-b460-493e5d4fa834"},"panelIndex":"2e33ade5-96e5-40b4-b460-493e5d4fa834","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"},{"type":"index-pattern","name":"14cea722-a629-4c69-a06d-94a4a4c9a718","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"c7851241-5526-499a-960b-357af8c2ce5b"},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"alias":null,"negate":false,"disabled":false,"type":"phrase","key":"Cancelled","params":{"query":true},"index":"14cea722-a629-4c69-a06d-94a4a4c9a718"},"query":{"match_phrase":{"Cancelled":true}},"$state":{"store":"appState"}}],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"c7851241-5526-499a-960b-357af8c2ce5b":{"label":"Cancelled vs 1 week earlier","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count() / count(shift=\'1w\') - 1","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX2"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX2":{"label":"Part of Delayed vs 1 week earlier","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"subtract","args":[{"type":"function","name":"divide","args":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"location":{"min":0,"max":28},"text":"count() / count(shift=\'1w\') "},1],"location":{"min":0,"max":31},"text":"count() / count(shift=\'1w\') - 1"}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX0":{"label":"Part of Delayed vs 1 week earlier","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX1":{"label":"Part of Delayed vs 1 week earlier","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","timeShift":"1w","customLabel":true}},"columnOrder":["c7851241-5526-499a-960b-357af8c2ce5b","c7851241-5526-499a-960b-357af8c2ce5bX2","c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":8,"w":24,"h":8,"i":"086ac2e9-dd16-4b45-92b8-1e43ff7e3f65"},"panelIndex":"086ac2e9-dd16-4b45-92b8-1e43ff7e3f65","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsXY","state":{"datasourceStates":{"formBased":{"layers":{"03c34665-471c-49c7-acf1-5a11f517421c":{"columns":{"a5b94e30-4e77-4b0a-9187-1d8b13de1456":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true}},"3e267327-7317-4310-aee3-320e0f7c1e70":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___"}},"columnOrder":["a5b94e30-4e77-4b0a-9187-1d8b13de1456","3e267327-7317-4310-aee3-320e0f7c1e70"],"incompleteColumns":{}}}}},"visualization":{"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"valueLabels":"hide","fittingFunction":"None","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"custom","lowerBound":0,"upperBound":1},"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"layerId":"03c34665-471c-49c7-acf1-5a11f517421c","accessors":["3e267327-7317-4310-aee3-320e0f7c1e70"],"position":"top","seriesType":"bar_stacked","showGridlines":false,"xAccessor":"a5b94e30-4e77-4b0a-9187-1d8b13de1456","layerType":"data"}]},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-03c34665-471c-49c7-acf1-5a11f517421c","type":"index-pattern"}]},"hidePanelTitles":false,"enhancements":{}},"title":"[Flights] Flight count"},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":8,"w":24,"h":28,"i":"fb86b32f-fb7a-45cf-9511-f366fef51bbd"},"panelIndex":"fb86b32f-fb7a-45cf-9511-f366fef51bbd","embeddableConfig":{"attributes":{"title":"Cities by delay, cancellation","type":"lens","visualizationType":"lnsDatatable","state":{"datasourceStates":{"formBased":{"layers":{"f26e8f7a-4118-4227-bea0-5c02d8b270f7":{"columns":{"3dd24cb4-45ef-4dd8-b22a-d7b802cb6da0":{"label":"Top values of OriginCityName","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"OriginCityName","isBucketed":true,"params":{"size":1000,"orderBy":{"type":"alphabetical","fallback":true},"orderDirection":"asc","otherBucket":true,"missingBucket":false}},"52f6f2e9-6242-4c44-be63-b799150e7e60X0":{"label":"Part of Delay %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"FlightDelay : true ","language":"kuery"},"customLabel":true},"52f6f2e9-6242-4c44-be63-b799150e7e60X1":{"label":"Part of Delay %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"52f6f2e9-6242-4c44-be63-b799150e7e60X2":{"label":"Part of Delay %","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["52f6f2e9-6242-4c44-be63-b799150e7e60X0","52f6f2e9-6242-4c44-be63-b799150e7e60X1"],"location":{"min":0,"max":42},"text":"count(kql=\'FlightDelay : true \') / count()"}},"references":["52f6f2e9-6242-4c44-be63-b799150e7e60X0","52f6f2e9-6242-4c44-be63-b799150e7e60X1"],"customLabel":true},"52f6f2e9-6242-4c44-be63-b799150e7e60":{"label":"Delay %","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'FlightDelay : true \') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":0}}},"references":["52f6f2e9-6242-4c44-be63-b799150e7e60X2"],"customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0":{"label":"Part of Cancel %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"Cancelled: true","language":"kuery"},"customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1":{"label":"Part of Cancel %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X2":{"label":"Part of Cancel %","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1"],"location":{"min":0,"max":38},"text":"count(kql=\'Cancelled: true\') / count()"}},"references":["7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1"],"customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6":{"label":"Cancel %","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'Cancelled: true\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":0}}},"references":["7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X2"],"customLabel":true}},"columnOrder":["3dd24cb4-45ef-4dd8-b22a-d7b802cb6da0","52f6f2e9-6242-4c44-be63-b799150e7e60","52f6f2e9-6242-4c44-be63-b799150e7e60X0","52f6f2e9-6242-4c44-be63-b799150e7e60X1","52f6f2e9-6242-4c44-be63-b799150e7e60X2","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X2","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6"],"incompleteColumns":{}}}}},"visualization":{"columns":[{"isTransposed":false,"columnId":"3dd24cb4-45ef-4dd8-b22a-d7b802cb6da0","width":262.75},{"columnId":"52f6f2e9-6242-4c44-be63-b799150e7e60","isTransposed":false,"width":302.5,"colorMode":"cell","palette":{"name":"custom","type":"palette","params":{"steps":5,"stops":[{"color":"#f7e0b8","stop":0.6},{"color":"#e7664c","stop":1}],"name":"custom","colorStops":[{"color":"#f7e0b8","stop":0.2},{"color":"#e7664c","stop":0.6}],"rangeType":"number","rangeMin":0.2,"rangeMax":0.6}},"alignment":"center"},{"columnId":"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6","isTransposed":false,"alignment":"center","colorMode":"cell","palette":{"name":"custom","type":"palette","params":{"steps":5,"stops":[{"color":"#f7e0b8","stop":0.6},{"color":"#e7664c","stop":0.6666666666666666}],"rangeType":"number","name":"custom","colorStops":[{"color":"#f7e0b8","stop":0.2},{"color":"#e7664c","stop":0.6}],"rangeMin":0.2,"rangeMax":0.6}}}],"layerId":"f26e8f7a-4118-4227-bea0-5c02d8b270f7","sorting":{"columnId":"52f6f2e9-6242-4c44-be63-b799150e7e60","direction":"desc"},"layerType":"data","rowHeight":"single","rowHeightLines":1},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-f26e8f7a-4118-4227-bea0-5c02d8b270f7","type":"index-pattern"}]},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Most delayed cities"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":25,"w":24,"h":11,"i":"0cc42484-16f7-42ec-b38c-9bf8be69cde7"},"panelIndex":"0cc42484-16f7-42ec-b38c-9bf8be69cde7","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsXY","state":{"datasourceStates":{"formBased":{"layers":{"e80cc05e-c52a-4e5f-ac71-4b37274867f5":{"columns":{"caf7421e-93a3-439e-ab0a-fbdead93c21c":{"label":"Top values of FlightDelayType","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"FlightDelayType","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"0233d302-ec81-4fbe-96cb-7fac84cf035c"},"orderDirection":"desc","otherBucket":true,"missingBucket":false}},"13ec79e3-9d73-4536-9056-3d92802bb30a":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true}},"0233d302-ec81-4fbe-96cb-7fac84cf035c":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___"}},"columnOrder":["caf7421e-93a3-439e-ab0a-fbdead93c21c","13ec79e3-9d73-4536-9056-3d92802bb30a","0233d302-ec81-4fbe-96cb-7fac84cf035c"],"incompleteColumns":{}}}}},"visualization":{"legend":{"isVisible":true,"position":"bottom","legendSize":"auto"},"valueLabels":"hide","fittingFunction":"None","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"},"axisTitlesVisibilitySettings":{"x":true,"yLeft":false,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_percentage_stacked","layers":[{"layerId":"e80cc05e-c52a-4e5f-ac71-4b37274867f5","accessors":["0233d302-ec81-4fbe-96cb-7fac84cf035c"],"position":"top","seriesType":"bar_percentage_stacked","showGridlines":false,"palette":{"type":"palette","name":"cool"},"xAccessor":"13ec79e3-9d73-4536-9056-3d92802bb30a","splitAccessor":"caf7421e-93a3-439e-ab0a-fbdead93c21c","layerType":"data"}]},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-e80cc05e-c52a-4e5f-ac71-4b37274867f5","type":"index-pattern"}]},"hidePanelTitles":false,"enhancements":{}},"title":"[Flights] Delay Type"},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":58,"w":12,"h":11,"i":"5d53db36-2d5a-4adc-af7b-cec4c1a294e0"},"panelIndex":"5d53db36-2d5a-4adc-af7b-cec4c1a294e0","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsPie","state":{"datasourceStates":{"formBased":{"layers":{"0c8e136b-a822-4fb3-836d-e06cbea4eea4":{"columns":{"d1cee8bf-34cf-4141-99d7-ff043ee77b56":{"label":"Top values of FlightDelayType","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"FlightDelayType","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"aa152ace-ee2d-447b-b86d-459bef4d7880"},"orderDirection":"desc","otherBucket":true,"missingBucket":false}},"aa152ace-ee2d-447b-b86d-459bef4d7880":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___"}},"columnOrder":["d1cee8bf-34cf-4141-99d7-ff043ee77b56","aa152ace-ee2d-447b-b86d-459bef4d7880"],"incompleteColumns":{}}}}},"visualization":{"shape":"pie","palette":{"type":"palette","name":"cool"},"layers":[{"layerId":"0c8e136b-a822-4fb3-836d-e06cbea4eea4","numberDisplay":"percent","categoryDisplay":"default","legendDisplay":"default","nestedLegend":false,"layerType":"data","legendSize":"auto","primaryGroups":["d1cee8bf-34cf-4141-99d7-ff043ee77b56"],"metrics":["aa152ace-ee2d-447b-b86d-459bef4d7880"]}]},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"type":"phrase","key":"FlightDelayType","params":{"query":"No Delay"},"disabled":false,"negate":true,"alias":null,"index":"filter-index-pattern-0"},"query":{"match_phrase":{"FlightDelayType":"No Delay"}},"$state":{"store":"appState"}}]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-0c8e136b-a822-4fb3-836d-e06cbea4eea4","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"filter-index-pattern-0","type":"index-pattern"}]},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Delay Type"},{"version":"8.8.0","type":"lens","gridData":{"x":36,"y":58,"w":12,"h":11,"i":"ecd89a7c-9124-4472-bdc6-9bdbd70d45d5"},"panelIndex":"ecd89a7c-9124-4472-bdc6-9bdbd70d45d5","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-dffd86e7-01a9-4990-b974-3706608b5532"}],"state":{"visualization":{"title":"Empty XY chart","legend":{"isVisible":true,"position":"right"},"valueLabels":"hide","preferredSeriesType":"bar_horizontal","layers":[{"layerId":"dffd86e7-01a9-4990-b974-3706608b5532","accessors":["9d212159-afac-41f5-9303-5fb62ff04ba3"],"position":"top","seriesType":"bar_horizontal","showGridlines":false,"layerType":"data","splitAccessor":"d99ad4d7-26ff-4d65-a8ce-34656fdafa0a","palette":{"type":"palette","name":"temperature"}}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"dffd86e7-01a9-4990-b974-3706608b5532":{"columns":{"9d212159-afac-41f5-9303-5fb62ff04ba3":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":true}},"d99ad4d7-26ff-4d65-a8ce-34656fdafa0a":{"label":"Top 10 values of DestWeather","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"DestWeather","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"9d212159-afac-41f5-9303-5fb62ff04ba3"},"orderDirection":"desc","otherBucket":true,"missingBucket":false,"parentFormat":{"id":"terms"},"include":[],"exclude":[],"includeIsRegex":false,"excludeIsRegex":false}}},"columnOrder":["d99ad4d7-26ff-4d65-a8ce-34656fdafa0a","9d212159-afac-41f5-9303-5fb62ff04ba3"],"sampling":1,"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}}]', + '[{"version":"8.8.0","type":"search","gridData":{"x":0,"y":69,"w":48,"h":15,"i":"4"},"panelIndex":"4","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_4"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":16,"w":24,"h":9,"i":"7"},"panelIndex":"7","embeddableConfig":{"attributes":{"title":"[Flights] Delays & Cancellations (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-dc8cf715-b56b-4dd7-a624-7c3ef9e2f2ce"},{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"xy-visualization-layer-10fed425-accd-411b-a773-ee825bc3945b"}],"state":{"visualization":{"legend":{"isVisible":false,"showSingleSeries":false,"position":"bottom","shouldTruncate":true,"maxLines":1},"valueLabels":"hide","fittingFunction":"None","fillOpacity":0.5,"yLeftExtent":{"upperBound":1,"mode":"custom"},"yRightExtent":{"mode":"full"},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"seriesType":"area","layerType":"data","layerId":"dc8cf715-b56b-4dd7-a624-7c3ef9e2f2ce","accessors":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4a"],"yConfig":[{"forAccessor":"b9d6187b-8a7e-4c49-bffd-7a60cc075a4a","axisMode":"left"}],"xAccessor":"6944431b-f90a-4dab-a282-0961cb97edd1","palette":{"name":"default","type":"palette"}},{"layerId":"10fed425-accd-411b-a773-ee825bc3945b","layerType":"annotations","ignoreGlobalFilters":true,"annotations":[{"type":"query","id":"53b7dff0-4c89-11e8-a66a-6989ad5a0a39","label":"Event","key":{"type":"point_in_time"},"timeField":"timestamp","color":"#0062B1","icon":"alert","filter":{"type":"kibana_query","query":"FlightDelay:true AND Cancelled:true","language":"lucene"},"extraFields":["FlightDelay","Cancelled","Carrier"]}]}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"dc8cf715-b56b-4dd7-a624-7c3ef9e2f2ce":{"columns":{"6944431b-f90a-4dab-a282-0961cb97edd1":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true,"dropPartials":false}},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0":{"label":"Part of count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"FlightDelay:true","language":"lucene"},"params":{"emptyAsNull":false},"customLabel":true},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1":{"label":"Part of count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"*","language":"kuery"},"params":{"emptyAsNull":false},"customLabel":true},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX2":{"label":"Part of count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1"],"location":{"min":0,"max":49},"text":"count(lucene=\'FlightDelay:true\') / count(kql=\'*\')"}},"references":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1"],"customLabel":true},"b9d6187b-8a7e-4c49-bffd-7a60cc075a4a":{"label":"Percent Delays","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"format":{"id":"percent"},"formula":"count(lucene=\'FlightDelay:true\') / count(kql=\'*\')","isFormulaBroken":false},"references":["b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX2"],"customLabel":true}},"columnOrder":["6944431b-f90a-4dab-a282-0961cb97edd1","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX0","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX1","b9d6187b-8a7e-4c49-bffd-7a60cc075a4aX2","b9d6187b-8a7e-4c49-bffd-7a60cc075a4a"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Delays & Cancellations"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":58,"w":24,"h":11,"i":"10"},"panelIndex":"10","embeddableConfig":{"attributes":{"title":"[Flights] Delay Buckets (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-247b176d-e81d-47dc-bbd1-4de85d098961"},{"type":"index-pattern","name":"c61f29fc-1ff3-4d46-a6c2-bde8a5b97f4a","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d"}],"state":{"visualization":{"legend":{"isVisible":false,"position":"right","legendSize":"auto","shouldTruncate":true,"maxLines":1,"showSingleSeries":true},"valueLabels":"hide","curveType":"LINEAR","yTitle":"Count","yLeftExtent":{"mode":"full","enforce":true},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":-90},"gridlinesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"layerId":"247b176d-e81d-47dc-bbd1-4de85d098961","accessors":["c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da"],"layerType":"data","seriesType":"bar_stacked","xAccessor":"c7936be7-e59b-424e-a912-69ba820d8e24","simpleView":false,"palette":{"type":"palette","name":"default"},"yConfig":[{"forAccessor":"c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da","axisMode":"left","color":"#1F78C1"}],"xScaleType":"linear","isHistogram":true}]},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"negate":true,"disabled":false,"alias":null,"type":"phrase","key":"FlightDelayMin","value":"0","params":{"query":0,"type":"phrase"},"index":"c61f29fc-1ff3-4d46-a6c2-bde8a5b97f4a"},"query":{"match":{"FlightDelayMin":{"query":0,"type":"phrase"}}},"$state":{"store":"appState"}}],"datasourceStates":{"formBased":{"layers":{"247b176d-e81d-47dc-bbd1-4de85d098961":{"columns":{"c7936be7-e59b-424e-a912-69ba820d8e24":{"label":"Flight Delay Minutes","dataType":"number","operationType":"range","sourceField":"FlightDelayMin","isBucketed":true,"scale":"interval","params":{"includeEmptyRows":false,"type":"histogram","ranges":[{"from":0,"to":1000,"label":""}],"maxBars":"auto"},"customLabel":true},"c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da":{"label":"Count","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":true},"customLabel":true}},"columnOrder":["c7936be7-e59b-424e-a912-69ba820d8e24","c84f9fa9-e2a1-4845-8fcf-f5a34f5f92da"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Delay Buckets"},{"version":"8.8.0","type":"map","gridData":{"x":0,"y":36,"w":24,"h":22,"i":"23"},"panelIndex":"23","embeddableConfig":{"isLayerTOCOpen":true,"hiddenLayers":[],"mapCenter":{"lat":48.72307,"lon":-115.18171,"zoom":4.28},"openTOCDetails":[],"enhancements":{}},"panelRefName":"panel_23"},{"version":"8.8.0","type":"visualization","gridData":{"x":24,"y":36,"w":24,"h":22,"i":"31"},"panelIndex":"31","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_31"},{"version":"8.8.0","type":"visualization","gridData":{"x":0,"y":0,"w":24,"h":8,"i":"6afc61f7-e2d5-45a3-9e7a-281160ad3eb9"},"panelIndex":"6afc61f7-e2d5-45a3-9e7a-281160ad3eb9","embeddableConfig":{"savedVis":{"title":"[Flights] Markdown Instructions","description":"","type":"markdown","params":{"fontSize":10,"openLinksInNewTab":true,"markdown":"## Sample Flight data\\nThis dashboard contains sample data for you to play with. You can view it, search it, and interact with the visualizations. For more information about Kibana, check our [docs](https://www.elastic.co/guide/en/kibana/current/index.html)."},"uiState":{},"data":{"aggs":[],"searchSource":{}}},"hidePanelTitles":true,"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":0,"w":8,"h":8,"i":"392b4936-f753-47bc-a98d-a4e41a0a4cd4"},"panelIndex":"392b4936-f753-47bc-a98d-a4e41a0a4cd4","embeddableConfig":{"enhancements":{},"attributes":{"title":"[Flights] Total Flights","description":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-8fa993db-c147-4954-adf7-4ff264d42576"}],"state":{"visualization":{"layerId":"8fa993db-c147-4954-adf7-4ff264d42576","layerType":"data","metricAccessor":"81124c45-6ab6-42f4-8859-495d55eb8065"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"8fa993db-c147-4954-adf7-4ff264d42576":{"columns":{"81124c45-6ab6-42f4-8859-495d55eb8065":{"label":"Total flights","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true}},"columnOrder":["81124c45-6ab6-42f4-8859-495d55eb8065"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":true}},{"version":"8.8.0","type":"lens","gridData":{"x":32,"y":0,"w":8,"h":4,"i":"9271deff-5a61-4665-83fc-f9fdc6bf0c0b"},"panelIndex":"9271deff-5a61-4665-83fc-f9fdc6bf0c0b","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"7e8fe9b1-f45c-4f3d-9561-30febcd357ec"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"7e8fe9b1-f45c-4f3d-9561-30febcd357ec":{"label":"Delayed","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'FlightDelay : true\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0":{"label":"Part of count(kql=\'FlightDelay : true\') / count()","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"FlightDelay : true","language":"kuery"},"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1":{"label":"Part of count(kql=\'FlightDelay : true\') / count()","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2":{"label":"Part of count(kql=\'FlightDelay : true\') / count()","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"location":{"min":0,"max":41},"text":"count(kql=\'FlightDelay : true\') / count()"}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"customLabel":true}},"columnOrder":["7e8fe9b1-f45c-4f3d-9561-30febcd357ec","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":40,"y":0,"w":8,"h":4,"i":"aa591c29-1a31-4ee1-a71d-b829c06fd162"},"panelIndex":"aa591c29-1a31-4ee1-a71d-b829c06fd162","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"},{"type":"index-pattern","name":"c804c161-375f-4d52-a1cc-2e98b966957d","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"c7851241-5526-499a-960b-357af8c2ce5b"},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"alias":null,"negate":false,"disabled":false,"type":"phrase","key":"FlightDelay","params":{"query":true},"index":"c804c161-375f-4d52-a1cc-2e98b966957d"},"query":{"match_phrase":{"FlightDelay":true}},"$state":{"store":"appState"}}],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"c7851241-5526-499a-960b-357af8c2ce5b":{"label":"Delayed vs 1 week earlier","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count() / count(shift=\'1w\') - 1","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX2"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX2":{"label":"Part of Delayed","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"subtract","args":[{"type":"function","name":"divide","args":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"location":{"min":0,"max":28},"text":"count() / count(shift=\'1w\') "},1],"location":{"min":0,"max":31},"text":"count() / count(shift=\'1w\') - 1"}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX0":{"label":"Part of Delayed","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX1":{"label":"Part of Delayed","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","timeShift":"1w","customLabel":true}},"columnOrder":["c7851241-5526-499a-960b-357af8c2ce5b","c7851241-5526-499a-960b-357af8c2ce5bX2","c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":32,"y":4,"w":8,"h":4,"i":"b766e3b8-4544-46ed-99e6-9ecc4847e2a2"},"panelIndex":"b766e3b8-4544-46ed-99e6-9ecc4847e2a2","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"7e8fe9b1-f45c-4f3d-9561-30febcd357ec"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"7e8fe9b1-f45c-4f3d-9561-30febcd357ec":{"label":"Cancelled","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'Cancelled : true\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0":{"label":"Part of Cancelled","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"Cancelled : true","language":"kuery"},"customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1":{"label":"Part of Cancelled","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2":{"label":"Part of Cancelled","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"location":{"min":0,"max":39},"text":"count(kql=\'Cancelled : true\') / count()"}},"references":["7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1"],"customLabel":true}},"columnOrder":["7e8fe9b1-f45c-4f3d-9561-30febcd357ec","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX0","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX1","7e8fe9b1-f45c-4f3d-9561-30febcd357ecX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":40,"y":4,"w":8,"h":4,"i":"2e33ade5-96e5-40b4-b460-493e5d4fa834"},"panelIndex":"2e33ade5-96e5-40b4-b460-493e5d4fa834","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317"},{"type":"index-pattern","name":"14cea722-a629-4c69-a06d-94a4a4c9a718","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d"}],"state":{"visualization":{"layerId":"b4712d43-1e84-4f5b-878d-8e38ba748317","layerType":"data","metricAccessor":"c7851241-5526-499a-960b-357af8c2ce5b"},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"alias":null,"negate":false,"disabled":false,"type":"phrase","key":"Cancelled","params":{"query":true},"index":"14cea722-a629-4c69-a06d-94a4a4c9a718"},"query":{"match_phrase":{"Cancelled":true}},"$state":{"store":"appState"}}],"datasourceStates":{"formBased":{"layers":{"b4712d43-1e84-4f5b-878d-8e38ba748317":{"columns":{"c7851241-5526-499a-960b-357af8c2ce5b":{"label":"Cancelled vs 1 week earlier","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count() / count(shift=\'1w\') - 1","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX2"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX2":{"label":"Part of Delayed vs 1 week earlier","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"subtract","args":[{"type":"function","name":"divide","args":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"location":{"min":0,"max":28},"text":"count() / count(shift=\'1w\') "},1],"location":{"min":0,"max":31},"text":"count() / count(shift=\'1w\') - 1"}},"references":["c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX0":{"label":"Part of Delayed vs 1 week earlier","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"c7851241-5526-499a-960b-357af8c2ce5bX1":{"label":"Part of Delayed vs 1 week earlier","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","timeShift":"1w","customLabel":true}},"columnOrder":["c7851241-5526-499a-960b-357af8c2ce5b","c7851241-5526-499a-960b-357af8c2ce5bX2","c7851241-5526-499a-960b-357af8c2ce5bX0","c7851241-5526-499a-960b-357af8c2ce5bX1"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":8,"w":24,"h":8,"i":"086ac2e9-dd16-4b45-92b8-1e43ff7e3f65"},"panelIndex":"086ac2e9-dd16-4b45-92b8-1e43ff7e3f65","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsXY","state":{"datasourceStates":{"formBased":{"layers":{"03c34665-471c-49c7-acf1-5a11f517421c":{"columns":{"a5b94e30-4e77-4b0a-9187-1d8b13de1456":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true}},"3e267327-7317-4310-aee3-320e0f7c1e70":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___"}},"columnOrder":["a5b94e30-4e77-4b0a-9187-1d8b13de1456","3e267327-7317-4310-aee3-320e0f7c1e70"],"incompleteColumns":{}}}}},"visualization":{"legend":{"isVisible":true,"position":"right","legendSize":"auto"},"valueLabels":"hide","fittingFunction":"None","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"custom","lowerBound":0,"upperBound":1},"axisTitlesVisibilitySettings":{"x":false,"yLeft":false,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"layerId":"03c34665-471c-49c7-acf1-5a11f517421c","accessors":["3e267327-7317-4310-aee3-320e0f7c1e70"],"position":"top","seriesType":"bar_stacked","showGridlines":false,"xAccessor":"a5b94e30-4e77-4b0a-9187-1d8b13de1456","layerType":"data"}]},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-03c34665-471c-49c7-acf1-5a11f517421c","type":"index-pattern"}]},"hidePanelTitles":false,"enhancements":{}},"title":"[Flights] Flight count"},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":8,"w":24,"h":28,"i":"fb86b32f-fb7a-45cf-9511-f366fef51bbd"},"panelIndex":"fb86b32f-fb7a-45cf-9511-f366fef51bbd","embeddableConfig":{"attributes":{"title":"Cities by delay, cancellation","type":"lens","visualizationType":"lnsDatatable","state":{"datasourceStates":{"formBased":{"layers":{"f26e8f7a-4118-4227-bea0-5c02d8b270f7":{"columns":{"3dd24cb4-45ef-4dd8-b22a-d7b802cb6da0":{"label":"Top values of OriginCityName","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"OriginCityName","isBucketed":true,"params":{"size":1000,"orderBy":{"type":"alphabetical","fallback":true},"orderDirection":"asc","otherBucket":true,"missingBucket":false}},"52f6f2e9-6242-4c44-be63-b799150e7e60X0":{"label":"Part of Delay %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"FlightDelay : true ","language":"kuery"},"customLabel":true},"52f6f2e9-6242-4c44-be63-b799150e7e60X1":{"label":"Part of Delay %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"52f6f2e9-6242-4c44-be63-b799150e7e60X2":{"label":"Part of Delay %","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["52f6f2e9-6242-4c44-be63-b799150e7e60X0","52f6f2e9-6242-4c44-be63-b799150e7e60X1"],"location":{"min":0,"max":42},"text":"count(kql=\'FlightDelay : true \') / count()"}},"references":["52f6f2e9-6242-4c44-be63-b799150e7e60X0","52f6f2e9-6242-4c44-be63-b799150e7e60X1"],"customLabel":true},"52f6f2e9-6242-4c44-be63-b799150e7e60":{"label":"Delay %","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'FlightDelay : true \') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":0}}},"references":["52f6f2e9-6242-4c44-be63-b799150e7e60X2"],"customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0":{"label":"Part of Cancel %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"Cancelled: true","language":"kuery"},"customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1":{"label":"Part of Cancel %","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X2":{"label":"Part of Cancel %","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1"],"location":{"min":0,"max":38},"text":"count(kql=\'Cancelled: true\') / count()"}},"references":["7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1"],"customLabel":true},"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6":{"label":"Cancel %","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'Cancelled: true\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":0}}},"references":["7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X2"],"customLabel":true}},"columnOrder":["3dd24cb4-45ef-4dd8-b22a-d7b802cb6da0","52f6f2e9-6242-4c44-be63-b799150e7e60","52f6f2e9-6242-4c44-be63-b799150e7e60X0","52f6f2e9-6242-4c44-be63-b799150e7e60X1","52f6f2e9-6242-4c44-be63-b799150e7e60X2","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X0","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X1","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6X2","7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6"],"incompleteColumns":{}}}}},"visualization":{"columns":[{"isTransposed":false,"columnId":"3dd24cb4-45ef-4dd8-b22a-d7b802cb6da0","width":262.75},{"columnId":"52f6f2e9-6242-4c44-be63-b799150e7e60","isTransposed":false,"width":302.5,"colorMode":"cell","palette":{"type":"palette","name":"negative","params":{"steps":5,"stops":[{"color":"#fcdedc","stop":0},{"color":"#fec3bd","stop":0.2},{"color":"#fea79e","stop":0.4},{"color":"#fb8b81","stop":0.6},{"color":"#f66d64","stop":0.8}],"name":"negative","rangeType":"number","rangeMin":0,"rangeMax":null,"continuity":"above","reverse":false}},"alignment":"center"},{"columnId":"7b9f3ece-9da3-4c27-b582-d3f8e8cc31d6","isTransposed":false,"alignment":"center","colorMode":"cell","palette":{"type":"palette","name":"negative","params":{"steps":5,"stops":[{"color":"#fcdedc","stop":0},{"color":"#fec3bd","stop":0.2},{"color":"#fea79e","stop":0.4},{"color":"#fb8b81","stop":0.6},{"color":"#f66d64","stop":0.8}],"name":"negative","rangeType":"number","rangeMin":0,"rangeMax":null,"continuity":"above","reverse":false}}}],"layerId":"f26e8f7a-4118-4227-bea0-5c02d8b270f7","sorting":{"columnId":"52f6f2e9-6242-4c44-be63-b799150e7e60","direction":"desc"},"layerType":"data","rowHeight":"single","rowHeightLines":1},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-f26e8f7a-4118-4227-bea0-5c02d8b270f7","type":"index-pattern"}]},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Most delayed cities"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":25,"w":24,"h":11,"i":"0cc42484-16f7-42ec-b38c-9bf8be69cde7"},"panelIndex":"0cc42484-16f7-42ec-b38c-9bf8be69cde7","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsXY","state":{"datasourceStates":{"formBased":{"layers":{"e80cc05e-c52a-4e5f-ac71-4b37274867f5":{"columns":{"caf7421e-93a3-439e-ab0a-fbdead93c21c":{"label":"Top values of FlightDelayType","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"FlightDelayType","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"0233d302-ec81-4fbe-96cb-7fac84cf035c"},"orderDirection":"desc","otherBucket":true,"missingBucket":false}},"13ec79e3-9d73-4536-9056-3d92802bb30a":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true}},"0233d302-ec81-4fbe-96cb-7fac84cf035c":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___"}},"columnOrder":["caf7421e-93a3-439e-ab0a-fbdead93c21c","13ec79e3-9d73-4536-9056-3d92802bb30a","0233d302-ec81-4fbe-96cb-7fac84cf035c"],"incompleteColumns":{}}}}},"visualization":{"legend":{"isVisible":true,"position":"bottom","legendSize":"auto"},"valueLabels":"hide","fittingFunction":"None","yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"},"axisTitlesVisibilitySettings":{"x":true,"yLeft":false,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_percentage_stacked","layers":[{"layerId":"e80cc05e-c52a-4e5f-ac71-4b37274867f5","accessors":["0233d302-ec81-4fbe-96cb-7fac84cf035c"],"position":"top","seriesType":"bar_percentage_stacked","showGridlines":false,"palette":{"type":"palette","name":"cool"},"xAccessor":"13ec79e3-9d73-4536-9056-3d92802bb30a","splitAccessor":"caf7421e-93a3-439e-ab0a-fbdead93c21c","layerType":"data"}]},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-e80cc05e-c52a-4e5f-ac71-4b37274867f5","type":"index-pattern"}]},"hidePanelTitles":false,"enhancements":{}},"title":"[Flights] Delay Type"},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":58,"w":12,"h":11,"i":"5d53db36-2d5a-4adc-af7b-cec4c1a294e0"},"panelIndex":"5d53db36-2d5a-4adc-af7b-cec4c1a294e0","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsPie","state":{"datasourceStates":{"formBased":{"layers":{"0c8e136b-a822-4fb3-836d-e06cbea4eea4":{"columns":{"d1cee8bf-34cf-4141-99d7-ff043ee77b56":{"label":"Top values of FlightDelayType","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"FlightDelayType","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"aa152ace-ee2d-447b-b86d-459bef4d7880"},"orderDirection":"desc","otherBucket":true,"missingBucket":false}},"aa152ace-ee2d-447b-b86d-459bef4d7880":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___"}},"columnOrder":["d1cee8bf-34cf-4141-99d7-ff043ee77b56","aa152ace-ee2d-447b-b86d-459bef4d7880"],"incompleteColumns":{}}}}},"visualization":{"shape":"pie","palette":{"type":"palette","name":"cool"},"layers":[{"layerId":"0c8e136b-a822-4fb3-836d-e06cbea4eea4","numberDisplay":"percent","categoryDisplay":"default","legendDisplay":"default","nestedLegend":false,"layerType":"data","legendSize":"auto","primaryGroups":["d1cee8bf-34cf-4141-99d7-ff043ee77b56"],"metrics":["aa152ace-ee2d-447b-b86d-459bef4d7880"]}]},"query":{"query":"","language":"kuery"},"filters":[{"meta":{"type":"phrase","key":"FlightDelayType","params":{"query":"No Delay"},"disabled":false,"negate":true,"alias":null,"index":"filter-index-pattern-0"},"query":{"match_phrase":{"FlightDelayType":"No Delay"}},"$state":{"store":"appState"}}]},"references":[{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-0c8e136b-a822-4fb3-836d-e06cbea4eea4","type":"index-pattern"},{"id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"filter-index-pattern-0","type":"index-pattern"}]},"enhancements":{},"hidePanelTitles":false},"title":"[Flights] Delay Type"},{"version":"8.8.0","type":"lens","gridData":{"x":36,"y":58,"w":12,"h":11,"i":"ecd89a7c-9124-4472-bdc6-9bdbd70d45d5"},"panelIndex":"ecd89a7c-9124-4472-bdc6-9bdbd70d45d5","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"d3d7af60-4c81-11e8-b3d7-01146121b73d","name":"indexpattern-datasource-layer-dffd86e7-01a9-4990-b974-3706608b5532"}],"state":{"visualization":{"title":"Empty XY chart","legend":{"isVisible":true,"position":"right"},"valueLabels":"hide","preferredSeriesType":"bar_horizontal","layers":[{"layerId":"dffd86e7-01a9-4990-b974-3706608b5532","accessors":["9d212159-afac-41f5-9303-5fb62ff04ba3"],"position":"top","seriesType":"bar_horizontal","showGridlines":false,"layerType":"data","splitAccessor":"d99ad4d7-26ff-4d65-a8ce-34656fdafa0a","palette":{"type":"palette","name":"temperature"}}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"dffd86e7-01a9-4990-b974-3706608b5532":{"columns":{"9d212159-afac-41f5-9303-5fb62ff04ba3":{"label":"Count of records","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":true}},"d99ad4d7-26ff-4d65-a8ce-34656fdafa0a":{"label":"Top 10 values of DestWeather","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"DestWeather","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"9d212159-afac-41f5-9303-5fb62ff04ba3"},"orderDirection":"desc","otherBucket":true,"missingBucket":false,"parentFormat":{"id":"terms"},"include":[],"exclude":[],"includeIsRegex":false,"excludeIsRegex":false}}},"columnOrder":["d99ad4d7-26ff-4d65-a8ce-34656fdafa0a","9d212159-afac-41f5-9303-5fb62ff04ba3"],"sampling":1,"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}}]', timeFrom: 'now-7d', title: '[Flights] Global Flight Dashboard', timeTo: 'now', diff --git a/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts index a73979c88cb2e..19d59c35523f4 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts @@ -313,7 +313,7 @@ export const getSavedObjects = (): SavedObject[] => [ optionsJSON: '{"useMargins":true,"syncColors":false,"syncCursor":true,"syncTooltips":false,"hidePanelTitles":false}', panelsJSON: - '[{"version":"8.8.0","type":"map","gridData":{"x":0,"y":14,"w":24,"h":18,"i":"4"},"panelIndex":"4","embeddableConfig":{"isLayerTOCOpen":false,"hiddenLayers":[],"mapCenter":{"lat":42.16337,"lon":-88.92107,"zoom":3.64},"openTOCDetails":[],"enhancements":{}},"panelRefName":"panel_4"},{"version":"8.8.0","type":"lens","gridData":{"x":36,"y":0,"w":12,"h":7,"i":"11"},"panelIndex":"11","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-28b89898-3feb-415a-8dd9-74d755ac7c2a"}],"state":{"visualization":{"layerId":"28b89898-3feb-415a-8dd9-74d755ac7c2a","layerType":"data","metricAccessor":"f92c482e-1eee-4c2a-9338-64fb3eec286a","palette":{"name":"custom","type":"palette","params":{"steps":3,"name":"custom","reverse":false,"rangeType":"number","rangeMin":0,"rangeMax":null,"progression":"fixed","stops":[{"color":"#D23115","stop":500},{"color":"#FCC400","stop":1000},{"color":"#68BC00","stop":1658}],"colorStops":[{"color":"#D23115","stop":0},{"color":"#FCC400","stop":500},{"color":"#68BC00","stop":1000}],"continuity":"above","maxSteps":5}}},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"28b89898-3feb-415a-8dd9-74d755ac7c2a":{"columns":{"f92c482e-1eee-4c2a-9338-64fb3eec286a":{"label":"Unique Visitors","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"params":{"emptyAsNull":true},"customLabel":true}},"columnOrder":["f92c482e-1eee-4c2a-9338-64fb3eec286a"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":true,"enhancements":{}}},{"version":"8.8.0","type":"visualization","gridData":{"x":24,"y":14,"w":24,"h":33,"i":"14"},"panelIndex":"14","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_14"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":7,"w":24,"h":7,"i":"15"},"panelIndex":"15","embeddableConfig":{"attributes":{"title":"[Logs] Response Codes Over Time + Annotations (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-b38fe501-4b47-4de8-a423-6656d1162174"},{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"xy-visualization-layer-f265e722-ae38-495c-903c-48aa7931fa82"}],"state":{"visualization":{"legend":{"isVisible":true,"showSingleSeries":true,"position":"bottom","shouldTruncate":true,"maxLines":1},"valueLabels":"hide","fittingFunction":"None","fillOpacity":0.5,"yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"seriesType":"area_percentage_stacked","layerType":"data","layerId":"b38fe501-4b47-4de8-a423-6656d1162174","accessors":["896c5eb2-81c5-44f1-a4a1-57344161ea62"],"yConfig":[{"forAccessor":"896c5eb2-81c5-44f1-a4a1-57344161ea62","color":"rgba(115,216,255,1)","axisMode":"left"}],"xAccessor":"8986e393-d24f-49b0-96ca-118fd66d75e5","splitAccessor":"43f5bb0f-c6da-43a0-8a0a-50e9838ed34b","palette":{"name":"default","type":"palette"}},{"layerId":"f265e722-ae38-495c-903c-48aa7931fa82","layerType":"annotations","ignoreGlobalFilters":true,"annotations":[{"type":"query","id":"bd7548a0-2223-11e8-832f-d5027f3c8a47","label":"Event","key":{"type":"point_in_time"},"color":"#D33115","timeField":"timestamp","icon":"asterisk","filter":{"type":"kibana_query","query":"tags:error AND tags:security","language":"lucene"},"extraFields":["geo.src"]}]}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"b38fe501-4b47-4de8-a423-6656d1162174":{"columns":{"8986e393-d24f-49b0-96ca-118fd66d75e5":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true,"dropPartials":false}},"43f5bb0f-c6da-43a0-8a0a-50e9838ed34b":{"label":"Filters","dataType":"string","operationType":"filters","scale":"ordinal","isBucketed":true,"params":{"filters":[{"input":{"query":"response.keyword >= 200 and response.keyword < 400","language":"kuery"},"label":"HTTP 2xx and 3xx"},{"input":{"query":"response.keyword >= 400 and response.keyword < 500","language":"kuery"},"label":"HTTP 4xx"},{"input":{"query":"response.keyword >= 500","language":"kuery"},"label":"HTTP 5xx"}]}},"896c5eb2-81c5-44f1-a4a1-57344161ea62":{"label":"Response Code Count","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":true},"customLabel":true}},"columnOrder":["8986e393-d24f-49b0-96ca-118fd66d75e5","43f5bb0f-c6da-43a0-8a0a-50e9838ed34b","896c5eb2-81c5-44f1-a4a1-57344161ea62"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{},"hidePanelTitles":false},"title":"[Logs] Response Codes Over Time + Annotations"},{"version":"8.8.0","type":"visualization","gridData":{"x":0,"y":0,"w":24,"h":7,"i":"343f0bef-0b19-452e-b1c8-59beb18b6f0c"},"panelIndex":"343f0bef-0b19-452e-b1c8-59beb18b6f0c","embeddableConfig":{"savedVis":{"title":"[Logs] Markdown Instructions","description":"","type":"markdown","params":{"fontSize":12,"openLinksInNewTab":true,"markdown":"## Sample Logs Data\\nThis dashboard contains sample data for you to play with. You can view it, search it, and interact with the visualizations. For more information about Kibana, check our [docs](https://www.elastic.co/guide/en/kibana/current/index.html)."},"uiState":{},"data":{"aggs":[],"searchSource":{"query":{"query":"","language":"kuery"},"filter":[]}}},"enhancements":{},"hidePanelTitles":true}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":0,"w":12,"h":7,"i":"bb94016e-f4a6-49ca-87a9-296a2869d570"},"panelIndex":"bb94016e-f4a6-49ca-87a9-296a2869d570","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-483defd2-775b-4a62-bdef-496c819bb8ed"}],"state":{"visualization":{"layerId":"483defd2-775b-4a62-bdef-496c819bb8ed","layerType":"data","metricAccessor":"37430d12-7452-4cc9-b035-5cfd4061edf0"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"483defd2-775b-4a62-bdef-496c819bb8ed":{"columns":{"37430d12-7452-4cc9-b035-5cfd4061edf0":{"label":"Visits","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true}},"columnOrder":["37430d12-7452-4cc9-b035-5cfd4061edf0"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":36,"y":7,"w":12,"h":7,"i":"8c1456d4-1993-4ba2-b701-04aca02c9fef"},"panelIndex":"8c1456d4-1993-4ba2-b701-04aca02c9fef","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a"}],"state":{"visualization":{"layerId":"f3793bb7-3971-4753-866d-4008e77a9f9a","layerType":"data","metricAccessor":"71c076a6-e782-4866-b8df-5fd85a41f08b"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"f3793bb7-3971-4753-866d-4008e77a9f9a":{"columns":{"71c076a6-e782-4866-b8df-5fd85a41f08bX0":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 500","language":"kuery"},"params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX1":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX2":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"location":{"min":0,"max":46},"text":"count(kql=\'response.keyword >= 500\') / count()"}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08b":{"label":"HTTP 5xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"customLabel":true}},"columnOrder":["71c076a6-e782-4866-b8df-5fd85a41f08b","71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1","71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":7,"w":12,"h":7,"i":"01d8e435-91c0-484f-a11e-856747050b0a"},"panelIndex":"01d8e435-91c0-484f-a11e-856747050b0a","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a"}],"state":{"visualization":{"layerId":"f3793bb7-3971-4753-866d-4008e77a9f9a","layerType":"data","metricAccessor":"71c076a6-e782-4866-b8df-5fd85a41f08b"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"f3793bb7-3971-4753-866d-4008e77a9f9a":{"columns":{"71c076a6-e782-4866-b8df-5fd85a41f08bX0":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 400 and response.keyword < 500","language":"kuery"},"params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX1":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX2":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"location":{"min":0,"max":73},"text":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()"}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08b":{"label":"HTTP 4xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"customLabel":true}},"columnOrder":["71c076a6-e782-4866-b8df-5fd85a41f08b","71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1","71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"visualization","gridData":{"x":0,"y":32,"w":24,"h":15,"i":"8e59c7cf-6e42-4343-a113-c4a255fcf2ce"},"panelIndex":"8e59c7cf-6e42-4343-a113-c4a255fcf2ce","embeddableConfig":{"savedVis":{"title":"","description":"","type":"vega","params":{"spec":"{\\n $schema: https://vega.github.io/schema/vega-lite/v5.json\\n data: {\\n url: {\\n %context%: true\\n %timefield%: @timestamp\\n index: kibana_sample_data_logs\\n body: {\\n aggs: {\\n countries: {\\n terms: {\\n field: geo.src\\n size: 25\\n }\\n aggs: {\\n hours: {\\n histogram: {\\n field: hour_of_day\\n interval: 1\\n }\\n aggs: {\\n unique: {\\n cardinality: {\\n field: clientip\\n }\\n }\\n }\\n }\\n }\\n }\\n }\\n size: 0\\n }\\n }\\n format: {property: \\"aggregations.countries.buckets\\"}\\n }\\n \\n transform: [\\n {\\n flatten: [\\"hours.buckets\\"],\\n as: [\\"buckets\\"]\\n }\\n ]\\n\\n mark: {\\n type: rect\\n tooltip: true\\n }\\n\\n encoding: {\\n x: {\\n field: buckets.key\\n type: ordinal\\n axis: {\\n title: false\\n labelAngle: 0\\n }\\n }\\n y: {\\n field: key\\n type: nominal\\n sort: {\\n field: -buckets.unique.value\\n }\\n axis: {title: false}\\n }\\n color: {\\n field: buckets.unique.value\\n type: quantitative\\n axis: {title: false}\\n scale: {\\n scheme: reds\\n }\\n }\\n }\\n}\\n"},"uiState":{},"data":{"aggs":[],"searchSource":{"query":{"query":"","language":"kuery"},"filter":[]}}},"enhancements":{}},"panelRefName":"panel_8e59c7cf-6e42-4343-a113-c4a255fcf2ce"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":47,"w":24,"h":13,"i":"21bb0939-ee09-4021-8848-6552b3a6a788"},"panelIndex":"21bb0939-ee09-4021-8848-6552b3a6a788","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsDatatable","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-c840e93e-2949-4723-ad35-6bdb2d724404"}],"state":{"visualization":{"columns":[{"columnId":"4e64d6d7-4f92-4d5e-abbb-13796604db30","isTransposed":false},{"columnId":"fb9a848d-76f3-4005-a067-4259a50b5621","isTransposed":false},{"columnId":"a2760bc2-9a6e-46a1-8595-86f61573c7cf","isTransposed":false},{"columnId":"2c8bd8d5-35ff-4386-8d27-3ba882b13e43","isTransposed":false,"colorMode":"text","palette":{"name":"custom","type":"palette","params":{"steps":5,"stops":[{"color":"#d23115","stop":1000},{"color":"#fcc400","stop":1500},{"color":"#68bc00","stop":1501}],"rangeType":"number","rangeMin":0,"rangeMax":null,"continuity":"above","colorStops":[{"color":"#d23115","stop":0},{"color":"#fcc400","stop":1000},{"color":"#68bc00","stop":1500}],"name":"custom"}}},{"columnId":"defa6f97-b874-4556-8438-056fb437787b","isTransposed":false,"colorMode":"text","palette":{"name":"custom","type":"palette","params":{"steps":5,"stops":[{"color":"#D23115","stop":10},{"color":"#FCC400","stop":25},{"color":"#68bc00","stop":26}],"rangeType":"number","rangeMin":0,"rangeMax":null,"continuity":"above","colorStops":[{"color":"#D23115","stop":0},{"color":"#FCC400","stop":10},{"color":"#68bc00","stop":25}],"name":"custom"}}}],"layerId":"c840e93e-2949-4723-ad35-6bdb2d724404","layerType":"data"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"c840e93e-2949-4723-ad35-6bdb2d724404":{"columns":{"4e64d6d7-4f92-4d5e-abbb-13796604db30":{"label":"Type","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"extension.keyword","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"fb9a848d-76f3-4005-a067-4259a50b5621"},"orderDirection":"desc","otherBucket":true,"missingBucket":false,"parentFormat":{"id":"terms"},"include":[],"exclude":[],"includeIsRegex":false,"excludeIsRegex":false},"customLabel":true},"fb9a848d-76f3-4005-a067-4259a50b5621":{"label":"Bytes (Total)","dataType":"number","operationType":"sum","sourceField":"bytes","isBucketed":false,"scale":"ratio","params":{"emptyAsNull":true,"format":{"id":"bytes","params":{"decimals":2}}},"customLabel":true},"a2760bc2-9a6e-46a1-8595-86f61573c7cf":{"label":"Bytes (Last Hour)","dataType":"number","operationType":"sum","sourceField":"bytes","isBucketed":false,"scale":"ratio","reducedTimeRange":"1h","params":{"emptyAsNull":true,"format":{"id":"bytes","params":{"decimals":2}}},"customLabel":true},"2c8bd8d5-35ff-4386-8d27-3ba882b13e43":{"label":"Unique Visits (Total)","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"params":{"emptyAsNull":true},"customLabel":true},"defa6f97-b874-4556-8438-056fb437787b":{"label":"Unique count of clientip","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"reducedTimeRange":"1h","params":{"emptyAsNull":true}}},"columnOrder":["4e64d6d7-4f92-4d5e-abbb-13796604db30","fb9a848d-76f3-4005-a067-4259a50b5621","a2760bc2-9a6e-46a1-8595-86f61573c7cf","2c8bd8d5-35ff-4386-8d27-3ba882b13e43","defa6f97-b874-4556-8438-056fb437787b"],"sampling":1,"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":47,"w":24,"h":13,"i":"cbca842c-b9fa-4523-9ce0-14e350866e33"},"panelIndex":"cbca842c-b9fa-4523-9ce0-14e350866e33","embeddableConfig":{"hidePanelTitles":false,"enhancements":{}},"title":"[Logs] Bytes distribution","panelRefName":"panel_cbca842c-b9fa-4523-9ce0-14e350866e33"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":60,"w":48,"h":19,"i":"1d5f0b3f-d9d2-4b26-997b-83bc5ca3090b"},"panelIndex":"1d5f0b3f-d9d2-4b26-997b-83bc5ca3090b","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsDatatable","state":{"datasourceStates":{"formBased":{"layers":{"c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0":{"columns":{"42783ad7-dbcf-4310-bc06-f21f4eaaac96":{"label":"URL","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"url.keyword","isBucketed":true,"params":{"size":1000,"orderBy":{"type":"column","columnId":"f7835375-4d5b-4839-95ea-41928192a319"},"orderDirection":"desc","otherBucket":true,"missingBucket":false},"customLabel":true},"f7835375-4d5b-4839-95ea-41928192a319":{"label":"Visits","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1daX0":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 400 and response.keyword < 500","language":"kuery"},"customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1daX1":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1daX2":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["07fc84ca-4147-4ba9-879e-d1b4e086e1daX0","07fc84ca-4147-4ba9-879e-d1b4e086e1daX1"],"location":{"min":0,"max":73},"text":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()"}},"references":["07fc84ca-4147-4ba9-879e-d1b4e086e1daX0","07fc84ca-4147-4ba9-879e-d1b4e086e1daX1"],"customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1da":{"label":"HTTP 4xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["07fc84ca-4147-4ba9-879e-d1b4e086e1daX2"],"customLabel":true},"791d5a5b-a7ba-4e9e-b533-51b33c7d7747":{"label":"Unique","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"customLabel":true},"611e3509-e834-4fdd-b573-44e959e95d27":{"label":"95th percentile of bytes","dataType":"number","operationType":"percentile","sourceField":"bytes","isBucketed":false,"scale":"ratio","params":{"percentile":95,"format":{"id":"bytes","params":{"decimals":0}}}},"9f79ecca-123f-4098-a658-6b0e998da003":{"label":"Median of bytes","dataType":"number","operationType":"median","sourceField":"bytes","isBucketed":false,"scale":"ratio","params":{"format":{"id":"bytes","params":{"decimals":0}}}},"491285fd-0196-402c-9b7f-4660fdc1c22aX0":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 500","language":"kuery"},"customLabel":true},"491285fd-0196-402c-9b7f-4660fdc1c22aX1":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"491285fd-0196-402c-9b7f-4660fdc1c22aX2":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["491285fd-0196-402c-9b7f-4660fdc1c22aX0","491285fd-0196-402c-9b7f-4660fdc1c22aX1"],"location":{"min":0,"max":46},"text":"count(kql=\'response.keyword >= 500\') / count()"}},"references":["491285fd-0196-402c-9b7f-4660fdc1c22aX0","491285fd-0196-402c-9b7f-4660fdc1c22aX1"],"customLabel":true},"491285fd-0196-402c-9b7f-4660fdc1c22a":{"label":"HTTP 5xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["491285fd-0196-402c-9b7f-4660fdc1c22aX2"],"customLabel":true}},"columnOrder":["42783ad7-dbcf-4310-bc06-f21f4eaaac96","f7835375-4d5b-4839-95ea-41928192a319","791d5a5b-a7ba-4e9e-b533-51b33c7d7747","07fc84ca-4147-4ba9-879e-d1b4e086e1da","491285fd-0196-402c-9b7f-4660fdc1c22a","491285fd-0196-402c-9b7f-4660fdc1c22aX0","491285fd-0196-402c-9b7f-4660fdc1c22aX1","491285fd-0196-402c-9b7f-4660fdc1c22aX2","07fc84ca-4147-4ba9-879e-d1b4e086e1daX0","07fc84ca-4147-4ba9-879e-d1b4e086e1daX1","07fc84ca-4147-4ba9-879e-d1b4e086e1daX2","611e3509-e834-4fdd-b573-44e959e95d27","9f79ecca-123f-4098-a658-6b0e998da003"],"incompleteColumns":{}}}}},"visualization":{"layerId":"c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0","columns":[{"columnId":"42783ad7-dbcf-4310-bc06-f21f4eaaac96","width":650.6666666666666},{"columnId":"f7835375-4d5b-4839-95ea-41928192a319"},{"columnId":"491285fd-0196-402c-9b7f-4660fdc1c22a","isTransposed":false,"width":81.66666666666669,"colorMode":"cell","palette":{"name":"custom","type":"palette","params":{"steps":5,"stops":[{"color":"#fbddd6","stop":0.1},{"color":"#CC5642","stop":1}],"rangeType":"number","name":"custom","colorStops":[{"color":"#fbddd6","stop":0.05},{"color":"#CC5642","stop":0.1}],"rangeMin":0.05,"rangeMax":0.1}}},{"columnId":"07fc84ca-4147-4ba9-879e-d1b4e086e1da","isTransposed":false,"colorMode":"cell","palette":{"name":"custom","type":"palette","params":{"steps":5,"stops":[{"color":"#fbddd6","stop":0.1},{"color":"#cc5642","stop":1.1}],"name":"custom","colorStops":[{"color":"#fbddd6","stop":0.05},{"color":"#cc5642","stop":0.1}],"rangeType":"number","rangeMin":0.05,"rangeMax":0.1}}},{"columnId":"791d5a5b-a7ba-4e9e-b533-51b33c7d7747","isTransposed":false},{"columnId":"611e3509-e834-4fdd-b573-44e959e95d27","isTransposed":false},{"columnId":"9f79ecca-123f-4098-a658-6b0e998da003","isTransposed":false}],"sorting":{"columnId":"491285fd-0196-402c-9b7f-4660fdc1c22a","direction":"desc"},"layerType":"data","rowHeight":"single","rowHeightLines":1},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0","type":"index-pattern"}]},"enhancements":{"dynamicActions":{"events":[]}},"hidePanelTitles":false},"title":"[Logs] Errors by host"}]', + '[{"version":"8.8.0","type":"map","gridData":{"x":0,"y":14,"w":24,"h":18,"i":"4"},"panelIndex":"4","embeddableConfig":{"isLayerTOCOpen":false,"hiddenLayers":[],"mapCenter":{"lat":42.16337,"lon":-88.92107,"zoom":3.64},"openTOCDetails":[],"enhancements":{}},"panelRefName":"panel_4"},{"version":"8.8.0","type":"lens","gridData":{"x":36,"y":0,"w":12,"h":7,"i":"11"},"panelIndex":"11","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-28b89898-3feb-415a-8dd9-74d755ac7c2a"}],"state":{"visualization":{"layerId":"28b89898-3feb-415a-8dd9-74d755ac7c2a","layerType":"data","metricAccessor":"f92c482e-1eee-4c2a-9338-64fb3eec286a","palette":{"type":"palette","name":"status","params":{"steps":3,"rangeType":"number","rangeMin":0,"rangeMax":null,"progression":"fixed","stops":[{"color":"#23be8f","stop":0},{"color":"#fcd279","stop":608.66},{"color":"#f66d64","stop":1217.33}],"continuity":"above","maxSteps":5}}},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"28b89898-3feb-415a-8dd9-74d755ac7c2a":{"columns":{"f92c482e-1eee-4c2a-9338-64fb3eec286a":{"label":"Unique Visitors","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"params":{"emptyAsNull":true},"customLabel":true}},"columnOrder":["f92c482e-1eee-4c2a-9338-64fb3eec286a"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"hidePanelTitles":true,"enhancements":{}}},{"version":"8.8.0","type":"visualization","gridData":{"x":24,"y":14,"w":24,"h":33,"i":"14"},"panelIndex":"14","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_14"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":7,"w":24,"h":7,"i":"15"},"panelIndex":"15","embeddableConfig":{"attributes":{"title":"[Logs] Response Codes Over Time + Annotations (converted)","visualizationType":"lnsXY","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-b38fe501-4b47-4de8-a423-6656d1162174"},{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"xy-visualization-layer-f265e722-ae38-495c-903c-48aa7931fa82"}],"state":{"visualization":{"legend":{"isVisible":true,"showSingleSeries":true,"position":"bottom","shouldTruncate":true,"maxLines":1},"valueLabels":"hide","fittingFunction":"None","fillOpacity":0.5,"yLeftExtent":{"mode":"full"},"yRightExtent":{"mode":"full"},"yLeftScale":"linear","yRightScale":"linear","axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"preferredSeriesType":"bar_stacked","layers":[{"seriesType":"area_percentage_stacked","layerType":"data","layerId":"b38fe501-4b47-4de8-a423-6656d1162174","accessors":["896c5eb2-81c5-44f1-a4a1-57344161ea62"],"yConfig":[{"forAccessor":"896c5eb2-81c5-44f1-a4a1-57344161ea62","color":"rgba(115,216,255,1)","axisMode":"left"}],"xAccessor":"8986e393-d24f-49b0-96ca-118fd66d75e5","splitAccessor":"43f5bb0f-c6da-43a0-8a0a-50e9838ed34b","palette":{"name":"default","type":"palette"}},{"layerId":"f265e722-ae38-495c-903c-48aa7931fa82","layerType":"annotations","ignoreGlobalFilters":true,"annotations":[{"type":"query","id":"bd7548a0-2223-11e8-832f-d5027f3c8a47","label":"Event","key":{"type":"point_in_time"},"color":"#D33115","timeField":"timestamp","icon":"asterisk","filter":{"type":"kibana_query","query":"tags:error AND tags:security","language":"lucene"},"extraFields":["geo.src"]}]}]},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"b38fe501-4b47-4de8-a423-6656d1162174":{"columns":{"8986e393-d24f-49b0-96ca-118fd66d75e5":{"label":"timestamp","dataType":"date","operationType":"date_histogram","sourceField":"timestamp","isBucketed":true,"scale":"interval","params":{"interval":"auto","includeEmptyRows":true,"dropPartials":false}},"43f5bb0f-c6da-43a0-8a0a-50e9838ed34b":{"label":"Filters","dataType":"string","operationType":"filters","scale":"ordinal","isBucketed":true,"params":{"filters":[{"input":{"query":"response.keyword >= 200 and response.keyword < 400","language":"kuery"},"label":"HTTP 2xx and 3xx"},{"input":{"query":"response.keyword >= 400 and response.keyword < 500","language":"kuery"},"label":"HTTP 4xx"},{"input":{"query":"response.keyword >= 500","language":"kuery"},"label":"HTTP 5xx"}]}},"896c5eb2-81c5-44f1-a4a1-57344161ea62":{"label":"Response Code Count","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":true},"customLabel":true}},"columnOrder":["8986e393-d24f-49b0-96ca-118fd66d75e5","43f5bb0f-c6da-43a0-8a0a-50e9838ed34b","896c5eb2-81c5-44f1-a4a1-57344161ea62"],"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{},"hidePanelTitles":false},"title":"[Logs] Response Codes Over Time + Annotations"},{"version":"8.8.0","type":"visualization","gridData":{"x":0,"y":0,"w":24,"h":7,"i":"343f0bef-0b19-452e-b1c8-59beb18b6f0c"},"panelIndex":"343f0bef-0b19-452e-b1c8-59beb18b6f0c","embeddableConfig":{"savedVis":{"title":"[Logs] Markdown Instructions","description":"","type":"markdown","params":{"fontSize":12,"openLinksInNewTab":true,"markdown":"## Sample Logs Data\\nThis dashboard contains sample data for you to play with. You can view it, search it, and interact with the visualizations. For more information about Kibana, check our [docs](https://www.elastic.co/guide/en/kibana/current/index.html)."},"uiState":{},"data":{"aggs":[],"searchSource":{"query":{"query":"","language":"kuery"},"filter":[]}}},"enhancements":{},"hidePanelTitles":true}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":0,"w":12,"h":7,"i":"bb94016e-f4a6-49ca-87a9-296a2869d570"},"panelIndex":"bb94016e-f4a6-49ca-87a9-296a2869d570","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-483defd2-775b-4a62-bdef-496c819bb8ed"}],"state":{"visualization":{"layerId":"483defd2-775b-4a62-bdef-496c819bb8ed","layerType":"data","metricAccessor":"37430d12-7452-4cc9-b035-5cfd4061edf0"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"483defd2-775b-4a62-bdef-496c819bb8ed":{"columns":{"37430d12-7452-4cc9-b035-5cfd4061edf0":{"label":"Visits","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true}},"columnOrder":["37430d12-7452-4cc9-b035-5cfd4061edf0"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":36,"y":7,"w":12,"h":7,"i":"8c1456d4-1993-4ba2-b701-04aca02c9fef"},"panelIndex":"8c1456d4-1993-4ba2-b701-04aca02c9fef","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a"}],"state":{"visualization":{"layerId":"f3793bb7-3971-4753-866d-4008e77a9f9a","layerType":"data","metricAccessor":"71c076a6-e782-4866-b8df-5fd85a41f08b"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"f3793bb7-3971-4753-866d-4008e77a9f9a":{"columns":{"71c076a6-e782-4866-b8df-5fd85a41f08bX0":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 500","language":"kuery"},"params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX1":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX2":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"location":{"min":0,"max":46},"text":"count(kql=\'response.keyword >= 500\') / count()"}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08b":{"label":"HTTP 5xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"customLabel":true}},"columnOrder":["71c076a6-e782-4866-b8df-5fd85a41f08b","71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1","71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":7,"w":12,"h":7,"i":"01d8e435-91c0-484f-a11e-856747050b0a"},"panelIndex":"01d8e435-91c0-484f-a11e-856747050b0a","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsMetric","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a"}],"state":{"visualization":{"layerId":"f3793bb7-3971-4753-866d-4008e77a9f9a","layerType":"data","metricAccessor":"71c076a6-e782-4866-b8df-5fd85a41f08b"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"f3793bb7-3971-4753-866d-4008e77a9f9a":{"columns":{"71c076a6-e782-4866-b8df-5fd85a41f08bX0":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 400 and response.keyword < 500","language":"kuery"},"params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX1":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","params":{"emptyAsNull":false},"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08bX2":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"location":{"min":0,"max":73},"text":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()"}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1"],"customLabel":true},"71c076a6-e782-4866-b8df-5fd85a41f08b":{"label":"HTTP 4xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"customLabel":true}},"columnOrder":["71c076a6-e782-4866-b8df-5fd85a41f08b","71c076a6-e782-4866-b8df-5fd85a41f08bX0","71c076a6-e782-4866-b8df-5fd85a41f08bX1","71c076a6-e782-4866-b8df-5fd85a41f08bX2"],"incompleteColumns":{}}}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"visualization","gridData":{"x":0,"y":32,"w":24,"h":15,"i":"8e59c7cf-6e42-4343-a113-c4a255fcf2ce"},"panelIndex":"8e59c7cf-6e42-4343-a113-c4a255fcf2ce","embeddableConfig":{"savedVis":{"title":"","description":"","type":"vega","params":{"spec":"{\\n $schema: https://vega.github.io/schema/vega-lite/v5.json\\n data: {\\n url: {\\n %context%: true\\n %timefield%: @timestamp\\n index: kibana_sample_data_logs\\n body: {\\n aggs: {\\n countries: {\\n terms: {\\n field: geo.src\\n size: 25\\n }\\n aggs: {\\n hours: {\\n histogram: {\\n field: hour_of_day\\n interval: 1\\n }\\n aggs: {\\n unique: {\\n cardinality: {\\n field: clientip\\n }\\n }\\n }\\n }\\n }\\n }\\n }\\n size: 0\\n }\\n }\\n format: {property: \\"aggregations.countries.buckets\\"}\\n }\\n \\n transform: [\\n {\\n flatten: [\\"hours.buckets\\"],\\n as: [\\"buckets\\"]\\n }\\n ]\\n\\n mark: {\\n type: rect\\n tooltip: true\\n }\\n\\n encoding: {\\n x: {\\n field: buckets.key\\n type: ordinal\\n axis: {\\n title: false\\n labelAngle: 0\\n }\\n }\\n y: {\\n field: key\\n type: nominal\\n sort: {\\n field: -buckets.unique.value\\n }\\n axis: {title: false}\\n }\\n color: {\\n field: buckets.unique.value\\n type: quantitative\\n axis: {title: false}\\n scale: {\\n scheme: reds\\n }\\n }\\n }\\n}\\n"},"uiState":{},"data":{"aggs":[],"searchSource":{"query":{"query":"","language":"kuery"},"filter":[]}}},"enhancements":{}},"panelRefName":"panel_8e59c7cf-6e42-4343-a113-c4a255fcf2ce"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":47,"w":24,"h":13,"i":"21bb0939-ee09-4021-8848-6552b3a6a788"},"panelIndex":"21bb0939-ee09-4021-8848-6552b3a6a788","embeddableConfig":{"attributes":{"title":"","visualizationType":"lnsDatatable","type":"lens","references":[{"type":"index-pattern","id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-c840e93e-2949-4723-ad35-6bdb2d724404"}],"state":{"visualization":{"columns":[{"columnId":"4e64d6d7-4f92-4d5e-abbb-13796604db30","isTransposed":false},{"columnId":"fb9a848d-76f3-4005-a067-4259a50b5621","isTransposed":false},{"columnId":"a2760bc2-9a6e-46a1-8595-86f61573c7cf","isTransposed":false},{"columnId":"2c8bd8d5-35ff-4386-8d27-3ba882b13e43","isTransposed":false,"colorMode":"text","palette":{"type":"palette","name":"status","params":{"steps":5,"stops":[{"color":"#23be8f","stop":20},{"color":"#9dedce","stop":40},{"color":"#fcd279","stop":60},{"color":"#ffc0b8","stop":80},{"color":"#f66d64","stop":100}],"rangeType":"percent","rangeMin":20,"rangeMax":null,"continuity":"above","reverse":false}}},{"columnId":"defa6f97-b874-4556-8438-056fb437787b","isTransposed":false,"colorMode":"text","palette":{"type":"palette","name":"status","params":{"steps":5,"stops":[{"color":"#23be8f","stop":20},{"color":"#9dedce","stop":40},{"color":"#fcd279","stop":60},{"color":"#ffc0b8","stop":80},{"color":"#f66d64","stop":100}],"rangeType":"percent","rangeMin":20,"rangeMax":null,"continuity":"above","reverse":false}}}],"layerId":"c840e93e-2949-4723-ad35-6bdb2d724404","layerType":"data"},"query":{"query":"","language":"kuery"},"filters":[],"datasourceStates":{"formBased":{"layers":{"c840e93e-2949-4723-ad35-6bdb2d724404":{"columns":{"4e64d6d7-4f92-4d5e-abbb-13796604db30":{"label":"Type","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"extension.keyword","isBucketed":true,"params":{"size":10,"orderBy":{"type":"column","columnId":"fb9a848d-76f3-4005-a067-4259a50b5621"},"orderDirection":"desc","otherBucket":true,"missingBucket":false,"parentFormat":{"id":"terms"},"include":[],"exclude":[],"includeIsRegex":false,"excludeIsRegex":false},"customLabel":true},"fb9a848d-76f3-4005-a067-4259a50b5621":{"label":"Bytes (Total)","dataType":"number","operationType":"sum","sourceField":"bytes","isBucketed":false,"scale":"ratio","params":{"emptyAsNull":true,"format":{"id":"bytes","params":{"decimals":2}}},"customLabel":true},"a2760bc2-9a6e-46a1-8595-86f61573c7cf":{"label":"Bytes (Last Hour)","dataType":"number","operationType":"sum","sourceField":"bytes","isBucketed":false,"scale":"ratio","reducedTimeRange":"1h","params":{"emptyAsNull":true,"format":{"id":"bytes","params":{"decimals":2}}},"customLabel":true},"2c8bd8d5-35ff-4386-8d27-3ba882b13e43":{"label":"Unique Visits (Total)","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"params":{"emptyAsNull":true},"customLabel":true},"defa6f97-b874-4556-8438-056fb437787b":{"label":"Unique count of clientip","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"reducedTimeRange":"1h","params":{"emptyAsNull":true}}},"columnOrder":["4e64d6d7-4f92-4d5e-abbb-13796604db30","fb9a848d-76f3-4005-a067-4259a50b5621","a2760bc2-9a6e-46a1-8595-86f61573c7cf","2c8bd8d5-35ff-4386-8d27-3ba882b13e43","defa6f97-b874-4556-8438-056fb437787b"],"sampling":1,"incompleteColumns":{}}}},"textBased":{"layers":{}}},"internalReferences":[],"adHocDataViews":{}}},"enhancements":{}}},{"version":"8.8.0","type":"lens","gridData":{"x":24,"y":47,"w":24,"h":13,"i":"cbca842c-b9fa-4523-9ce0-14e350866e33"},"panelIndex":"cbca842c-b9fa-4523-9ce0-14e350866e33","embeddableConfig":{"hidePanelTitles":false,"enhancements":{}},"title":"[Logs] Bytes distribution","panelRefName":"panel_cbca842c-b9fa-4523-9ce0-14e350866e33"},{"version":"8.8.0","type":"lens","gridData":{"x":0,"y":60,"w":48,"h":19,"i":"1d5f0b3f-d9d2-4b26-997b-83bc5ca3090b"},"panelIndex":"1d5f0b3f-d9d2-4b26-997b-83bc5ca3090b","embeddableConfig":{"attributes":{"title":"","type":"lens","visualizationType":"lnsDatatable","state":{"datasourceStates":{"formBased":{"layers":{"c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0":{"columns":{"42783ad7-dbcf-4310-bc06-f21f4eaaac96":{"label":"URL","dataType":"string","operationType":"terms","scale":"ordinal","sourceField":"url.keyword","isBucketed":true,"params":{"size":1000,"orderBy":{"type":"column","columnId":"f7835375-4d5b-4839-95ea-41928192a319"},"orderDirection":"desc","otherBucket":true,"missingBucket":false},"customLabel":true},"f7835375-4d5b-4839-95ea-41928192a319":{"label":"Visits","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1daX0":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 400 and response.keyword < 500","language":"kuery"},"customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1daX1":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1daX2":{"label":"Part of HTTP 4xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["07fc84ca-4147-4ba9-879e-d1b4e086e1daX0","07fc84ca-4147-4ba9-879e-d1b4e086e1daX1"],"location":{"min":0,"max":73},"text":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()"}},"references":["07fc84ca-4147-4ba9-879e-d1b4e086e1daX0","07fc84ca-4147-4ba9-879e-d1b4e086e1daX1"],"customLabel":true},"07fc84ca-4147-4ba9-879e-d1b4e086e1da":{"label":"HTTP 4xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 400 and response.keyword < 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["07fc84ca-4147-4ba9-879e-d1b4e086e1daX2"],"customLabel":true},"791d5a5b-a7ba-4e9e-b533-51b33c7d7747":{"label":"Unique","dataType":"number","operationType":"unique_count","scale":"ratio","sourceField":"clientip","isBucketed":false,"customLabel":true},"611e3509-e834-4fdd-b573-44e959e95d27":{"label":"95th percentile of bytes","dataType":"number","operationType":"percentile","sourceField":"bytes","isBucketed":false,"scale":"ratio","params":{"percentile":95,"format":{"id":"bytes","params":{"decimals":0}}}},"9f79ecca-123f-4098-a658-6b0e998da003":{"label":"Median of bytes","dataType":"number","operationType":"median","sourceField":"bytes","isBucketed":false,"scale":"ratio","params":{"format":{"id":"bytes","params":{"decimals":0}}}},"491285fd-0196-402c-9b7f-4660fdc1c22aX0":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","filter":{"query":"response.keyword >= 500","language":"kuery"},"customLabel":true},"491285fd-0196-402c-9b7f-4660fdc1c22aX1":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"count","isBucketed":false,"scale":"ratio","sourceField":"___records___","customLabel":true},"491285fd-0196-402c-9b7f-4660fdc1c22aX2":{"label":"Part of HTTP 5xx","dataType":"number","operationType":"math","isBucketed":false,"scale":"ratio","params":{"tinymathAst":{"type":"function","name":"divide","args":["491285fd-0196-402c-9b7f-4660fdc1c22aX0","491285fd-0196-402c-9b7f-4660fdc1c22aX1"],"location":{"min":0,"max":46},"text":"count(kql=\'response.keyword >= 500\') / count()"}},"references":["491285fd-0196-402c-9b7f-4660fdc1c22aX0","491285fd-0196-402c-9b7f-4660fdc1c22aX1"],"customLabel":true},"491285fd-0196-402c-9b7f-4660fdc1c22a":{"label":"HTTP 5xx","dataType":"number","operationType":"formula","isBucketed":false,"scale":"ratio","params":{"formula":"count(kql=\'response.keyword >= 500\') / count()","isFormulaBroken":false,"format":{"id":"percent","params":{"decimals":1}}},"references":["491285fd-0196-402c-9b7f-4660fdc1c22aX2"],"customLabel":true}},"columnOrder":["42783ad7-dbcf-4310-bc06-f21f4eaaac96","f7835375-4d5b-4839-95ea-41928192a319","791d5a5b-a7ba-4e9e-b533-51b33c7d7747","07fc84ca-4147-4ba9-879e-d1b4e086e1da","491285fd-0196-402c-9b7f-4660fdc1c22a","491285fd-0196-402c-9b7f-4660fdc1c22aX0","491285fd-0196-402c-9b7f-4660fdc1c22aX1","491285fd-0196-402c-9b7f-4660fdc1c22aX2","07fc84ca-4147-4ba9-879e-d1b4e086e1daX0","07fc84ca-4147-4ba9-879e-d1b4e086e1daX1","07fc84ca-4147-4ba9-879e-d1b4e086e1daX2","611e3509-e834-4fdd-b573-44e959e95d27","9f79ecca-123f-4098-a658-6b0e998da003"],"incompleteColumns":{}}}}},"visualization":{"layerId":"c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0","columns":[{"columnId":"42783ad7-dbcf-4310-bc06-f21f4eaaac96","width":650.6666666666666},{"columnId":"f7835375-4d5b-4839-95ea-41928192a319"},{"columnId":"491285fd-0196-402c-9b7f-4660fdc1c22a","isTransposed":false,"width":81.66666666666669,"colorMode":"cell","palette":{"type":"palette","name":"negative","params":{"steps":5,"stops":[{"color":"#fcdedc","stop":20},{"color":"#fec3bd","stop":40},{"color":"#fea79e","stop":60},{"color":"#fb8b81","stop":80},{"color":"#f66d64","stop":100}],"rangeType":"percent","rangeMin":20,"rangeMax":null,"continuity":"above","reverse":false}}},{"columnId":"07fc84ca-4147-4ba9-879e-d1b4e086e1da","isTransposed":false,"colorMode":"cell","palette":{"type":"palette","name":"negative","params":{"steps":5,"stops":[{"color":"#fcdedc","stop":20},{"color":"#fec3bd","stop":40},{"color":"#fea79e","stop":60},{"color":"#fb8b81","stop":80},{"color":"#f66d64","stop":100}],"rangeType":"percent","rangeMin":20,"rangeMax":null,"continuity":"above","reverse":false}}},{"columnId":"791d5a5b-a7ba-4e9e-b533-51b33c7d7747","isTransposed":false},{"columnId":"611e3509-e834-4fdd-b573-44e959e95d27","isTransposed":false},{"columnId":"9f79ecca-123f-4098-a658-6b0e998da003","isTransposed":false}],"sorting":{"columnId":"491285fd-0196-402c-9b7f-4660fdc1c22a","direction":"desc"},"layerType":"data","rowHeight":"single","rowHeightLines":1},"query":{"query":"","language":"kuery"},"filters":[]},"references":[{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0","type":"index-pattern"}]},"enhancements":{"dynamicActions":{"events":[]}},"hidePanelTitles":false},"title":"[Logs] Errors by host"}]', timeFrom: 'now-7d/d', title: '[Logs] Web Traffic', timeTo: 'now', diff --git a/src/plugins/share/common/url_service/locators/locator.test.ts b/src/plugins/share/common/url_service/locators/locator.test.ts index 18bd21c0ed4fd..648695f71f008 100644 --- a/src/plugins/share/common/url_service/locators/locator.test.ts +++ b/src/plugins/share/common/url_service/locators/locator.test.ts @@ -13,8 +13,9 @@ import { KibanaLocation } from '../../../public'; import { LocatorGetUrlParams } from '.'; import { decompressFromBase64 } from 'lz-string'; -const setup = () => { - const baseUrl = 'http://localhost:5601'; +const setup = ( + { baseUrl = 'http://localhost:5601' }: { baseUrl: string } = { baseUrl: 'http://localhost:5601' } +) => { const version = '1.2.3'; const deps: LocatorDependencies = { baseUrl, @@ -88,6 +89,48 @@ describe('Locator', () => { baz: 'b', }); }); + + test('returns URL of the redirect endpoint with custom spaceid', async () => { + const { locator } = setup(); + const url = await locator.getRedirectUrl( + { foo: 'a', baz: 'b' }, + { spaceId: 'custom-space-id' } + ); + + expect(url).toBe( + 'http://localhost:5601/s/custom-space-id/app/r?l=TEST_LOCATOR&v=1.2.3&lz=N4IgZg9hIFwghiANCARvAXrNIC%2BQ' + ); + }); + + test('returns URL of the redirect endpoint with replaced spaceid', async () => { + const { locator } = setup({ baseUrl: 'http://localhost:5601/s/space-id' }); + const url = await locator.getRedirectUrl( + { foo: 'a', baz: 'b' }, + { spaceId: 'custom-space-id' } + ); + + expect(url).toBe( + 'http://localhost:5601/s/custom-space-id/app/r?l=TEST_LOCATOR&v=1.2.3&lz=N4IgZg9hIFwghiANCARvAXrNIC%2BQ' + ); + }); + + test('returns URL of the redirect endpoint without spaceid', async () => { + const { locator } = setup({ baseUrl: 'http://localhost:5601/s/space-id' }); + const url = await locator.getRedirectUrl({ foo: 'a', baz: 'b' }, { spaceId: 'default' }); + + expect(url).toBe( + 'http://localhost:5601/app/r?l=TEST_LOCATOR&v=1.2.3&lz=N4IgZg9hIFwghiANCARvAXrNIC%2BQ' + ); + }); + + test('returns URL of the redirect endpoint with untouched spaceId', async () => { + const { locator } = setup({ baseUrl: 'http://localhost:5601/s/space-id' }); + const url = await locator.getRedirectUrl({ foo: 'a', baz: 'b' }); + + expect(url).toBe( + 'http://localhost:5601/s/space-id/app/r?l=TEST_LOCATOR&v=1.2.3&lz=N4IgZg9hIFwghiANCARvAXrNIC%2BQ' + ); + }); }); describe('.navigate()', () => { diff --git a/src/plugins/share/common/url_service/locators/locator.ts b/src/plugins/share/common/url_service/locators/locator.ts index ba532449463f3..d479eac25c266 100644 --- a/src/plugins/share/common/url_service/locators/locator.ts +++ b/src/plugins/share/common/url_service/locators/locator.ts @@ -19,7 +19,13 @@ import type { LocatorNavigationParams, LocatorGetUrlParams, } from './types'; -import { formatSearchParams, FormatSearchParamsOptions, RedirectOptions } from './redirect'; +import { + formatSearchParams, + FormatSearchParamsOptions, + RedirectOptions, + GetRedirectUrlOptions, + addSpaceIdToPath, +} from './redirect'; export interface LocatorDependencies { /** @@ -92,7 +98,7 @@ export class Locator<P extends SerializableRecord> implements LocatorPublic<P> { return url; } - public getRedirectUrl(params: P, options: FormatSearchParamsOptions = {}): string { + public getRedirectUrl(params: P, options: GetRedirectUrlOptions = {}): string { const { baseUrl = '', version = '0.0.0' } = this.deps; const redirectOptions: RedirectOptions = { id: this.definition.id, @@ -100,12 +106,16 @@ export class Locator<P extends SerializableRecord> implements LocatorPublic<P> { params, }; const formatOptions: FormatSearchParamsOptions = { - ...options, lzCompress: options.lzCompress ?? true, }; const search = formatSearchParams(redirectOptions, formatOptions).toString(); + const path = '/app/r?' + search; - return baseUrl + '/app/r?' + search; + if (options.spaceId) { + return addSpaceIdToPath(baseUrl, options.spaceId, path); + } else { + return baseUrl + path; + } } public async navigate( diff --git a/src/plugins/share/common/url_service/locators/redirect/index.ts b/src/plugins/share/common/url_service/locators/redirect/index.ts index 9e2a9d8f433e9..7e37c2b8b6d23 100644 --- a/src/plugins/share/common/url_service/locators/redirect/index.ts +++ b/src/plugins/share/common/url_service/locators/redirect/index.ts @@ -10,3 +10,4 @@ export * from './types'; export * from './format_search_params'; export * from './parse_search_params'; +export * from './space_url_parser'; diff --git a/src/plugins/share/common/url_service/locators/redirect/space_url_parser.test.ts b/src/plugins/share/common/url_service/locators/redirect/space_url_parser.test.ts new file mode 100644 index 0000000000000..d6dc64c63b0f4 --- /dev/null +++ b/src/plugins/share/common/url_service/locators/redirect/space_url_parser.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { addSpaceIdToPath } from './space_url_parser'; + +describe('addSpaceIdToPath', () => { + test('handles no parameters', () => { + expect(addSpaceIdToPath()).toEqual(`/`); + }); + + test('it adds to the basePath correctly', () => { + expect(addSpaceIdToPath('/my/base/path', 'url-context')).toEqual('/my/base/path/s/url-context'); + }); + + test('it appends the requested path to the end of the url context', () => { + expect(addSpaceIdToPath('/base', 'context', '/final/destination')).toEqual( + '/base/s/context/final/destination' + ); + }); + + test('it replaces existing space identifiers', () => { + expect(addSpaceIdToPath('/my/base/path/s/old-space/', 'new-space')).toEqual( + '/my/base/path/s/new-space' + ); + + expect(addSpaceIdToPath('/my/base/path/s/old-space-no-trailing', 'new-space')).toEqual( + '/my/base/path/s/new-space' + ); + }); + + test('it removes existing space identifier when spaceId is default', () => { + expect(addSpaceIdToPath('/my/base/path/s/old-space', 'default')).toEqual('/my/base/path'); + expect(addSpaceIdToPath('/my/base/path/s/old-space')).toEqual('/my/base/path'); + }); + + test('it throws an error when the requested path does not start with a slash', () => { + expect(() => { + addSpaceIdToPath('', '', 'foo'); + }).toThrowErrorMatchingInlineSnapshot(`"path must start with a /"`); + }); +}); diff --git a/src/plugins/share/common/url_service/locators/redirect/space_url_parser.ts b/src/plugins/share/common/url_service/locators/redirect/space_url_parser.ts new file mode 100644 index 0000000000000..9c9cb519d1c7f --- /dev/null +++ b/src/plugins/share/common/url_service/locators/redirect/space_url_parser.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export function addSpaceIdToPath( + basePath: string = '/', + spaceId: string = '', + requestedPath: string = '' +): string { + if (requestedPath && !requestedPath.startsWith('/')) { + throw new Error(`path must start with a /`); + } + + if (basePath.includes('/s/')) { + // If the base path already contains a space identifier, remove it + basePath = basePath.replace(/\/s\/[^/]+/, ''); + } + + const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath; + + if (spaceId && spaceId !== 'default') { + return `${normalizedBasePath}/s/${spaceId}${requestedPath}`; + } + + return `${normalizedBasePath}${requestedPath}` || '/'; +} diff --git a/src/plugins/share/common/url_service/locators/redirect/types.ts b/src/plugins/share/common/url_service/locators/redirect/types.ts index dfd6211c97434..bbc1b14f2e428 100644 --- a/src/plugins/share/common/url_service/locators/redirect/types.ts +++ b/src/plugins/share/common/url_service/locators/redirect/types.ts @@ -8,6 +8,7 @@ */ import type { SerializableRecord } from '@kbn/utility-types'; +import type { FormatSearchParamsOptions } from './format_search_params'; /** * @public @@ -27,3 +28,13 @@ export interface RedirectOptions<P extends SerializableRecord = unknown & Serial /** Locator params. */ params: P; } + +export interface GetRedirectUrlOptions extends FormatSearchParamsOptions { + /** + * Optional space ID to use when generating the URL. + * If not provided: + * - on the client the current space ID will be used. + * - on the server the URL will be generated without a space ID. + */ + spaceId?: string; +} diff --git a/src/plugins/share/common/url_service/locators/types.ts b/src/plugins/share/common/url_service/locators/types.ts index 5f9a37278a621..25f4fe8f1404a 100644 --- a/src/plugins/share/common/url_service/locators/types.ts +++ b/src/plugins/share/common/url_service/locators/types.ts @@ -15,7 +15,7 @@ import { PersistableStateService, VersionedState, } from '@kbn/kibana-utils-plugin/common'; -import type { FormatSearchParamsOptions } from './redirect'; +import type { GetRedirectUrlOptions } from './redirect'; /** * URL locator registry. @@ -88,7 +88,7 @@ export interface LocatorPublic<P extends SerializableRecord> extends Persistable * @param params URL locator parameters. * @param options URL serialization options. */ - getRedirectUrl(params: P, options?: FormatSearchParamsOptions): string; + getRedirectUrl(params: P, options?: GetRedirectUrlOptions): string; /** * Navigate using the `core.application.navigateToApp()` method to a Kibana diff --git a/src/plugins/share/public/components/context/index.tsx b/src/plugins/share/public/components/context/index.tsx index 13d6138e42a60..0f18a46c8e399 100644 --- a/src/plugins/share/public/components/context/index.tsx +++ b/src/plugins/share/public/components/context/index.tsx @@ -19,7 +19,7 @@ import type { ShareContext, } from '../../types'; -export type { ShareMenuItemV2 } from '../../types'; +export type { ShareMenuItemV2, ShareContextObjectTypeConfig } from '../../types'; export interface IShareContext extends ShareContext { allowEmbed: boolean; diff --git a/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx b/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx index be3d8c941b8ea..ee9fdf01588df 100644 --- a/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx +++ b/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx @@ -19,6 +19,7 @@ describe('Share modal embed content tab', () => { beforeEach(() => { component = mountWithIntl( <EmbedContent + isDirty={false} objectType="dashboard" setIsNotSaved={() => jest.fn()} shareableUrl="/home#/" diff --git a/src/plugins/share/public/components/tabs/embed/embed_content.tsx b/src/plugins/share/public/components/tabs/embed/embed_content.tsx index 557a499a38021..5a9163097c8dc 100644 --- a/src/plugins/share/public/components/tabs/embed/embed_content.tsx +++ b/src/plugins/share/public/components/tabs/embed/embed_content.tsx @@ -23,7 +23,7 @@ import useMountedState from 'react-use/lib/useMountedState'; import { format as formatUrl, parse as parseUrl } from 'url'; import { AnonymousAccessState } from '../../../../common'; -import { type IShareContext } from '../../context'; +import type { IShareContext, ShareContextObjectTypeConfig } from '../../context'; type EmbedProps = Pick< IShareContext, @@ -32,8 +32,10 @@ type EmbedProps = Pick< | 'shareableUrl' | 'embedUrlParamExtensions' | 'objectType' + | 'isDirty' > & { setIsNotSaved: () => void; + objectConfig?: ShareContextObjectTypeConfig; }; interface UrlParams { @@ -52,7 +54,9 @@ export const EmbedContent = ({ shareableUrlForSavedObject, shareableUrl, objectType, + objectConfig = {}, setIsNotSaved, + isDirty, }: EmbedProps) => { const isMounted = useMountedState(); const [urlParams, setUrlParams] = useState<UrlParams | undefined>(undefined); @@ -252,12 +256,20 @@ export const EmbedContent = ({ /> ); + const { draftModeCallOut: DraftModeCallout } = objectConfig; + return ( <> <EuiForm> <EuiText size="s">{helpText}</EuiText> <EuiSpacer /> {renderUrlParamExtensions()} + {isDirty && DraftModeCallout && ( + <> + <EuiSpacer size="m" /> + {DraftModeCallout} + </> + )} <EuiSpacer /> </EuiForm> <EuiFlexGroup justifyContent="flexEnd" responsive={false}> diff --git a/src/plugins/share/public/components/tabs/embed/index.tsx b/src/plugins/share/public/components/tabs/embed/index.tsx index 3c66b48f21c8c..44d61833268cd 100644 --- a/src/plugins/share/public/components/tabs/embed/index.tsx +++ b/src/plugins/share/public/components/tabs/embed/index.tsx @@ -38,8 +38,14 @@ const embedTabReducer: IEmbedTab['reducer'] = (state = { url: '', isNotSaved: fa }; const EmbedTabContent: NonNullable<IEmbedTab['content']> = ({ state, dispatch }) => { - const { embedUrlParamExtensions, shareableUrlForSavedObject, shareableUrl, objectType, isDirty } = - useShareTabsContext()!; + const { + embedUrlParamExtensions, + shareableUrlForSavedObject, + shareableUrl, + objectType, + objectTypeMeta, + isDirty, + } = useShareTabsContext()!; const setIsNotSaved = useCallback(() => { dispatch({ @@ -55,8 +61,10 @@ const EmbedTabContent: NonNullable<IEmbedTab['content']> = ({ state, dispatch }) shareableUrlForSavedObject, shareableUrl, objectType, + objectConfig: objectTypeMeta?.config?.embed, isNotSaved: state?.isNotSaved, setIsNotSaved, + isDirty, }} /> ); diff --git a/src/plugins/share/public/components/tabs/link/index.tsx b/src/plugins/share/public/components/tabs/link/index.tsx index c59ae74a62f35..3b602d43c1dfd 100644 --- a/src/plugins/share/public/components/tabs/link/index.tsx +++ b/src/plugins/share/public/components/tabs/link/index.tsx @@ -51,6 +51,7 @@ const linkTabReducer: ILinkTab['reducer'] = ( const LinkTabContent: ILinkTab['content'] = ({ state, dispatch }) => { const { objectType, + objectTypeMeta, objectId, isDirty, shareableUrl, @@ -86,6 +87,7 @@ const LinkTabContent: ILinkTab['content'] = ({ state, dispatch }) => { <LinkContent {...{ objectType, + objectConfig: objectTypeMeta?.config?.link, objectId, isDirty, shareableUrl, diff --git a/src/plugins/share/public/components/tabs/link/link_content.tsx b/src/plugins/share/public/components/tabs/link/link_content.tsx index 6c0d8e6e988ec..10efd85d3bcdc 100644 --- a/src/plugins/share/public/components/tabs/link/link_content.tsx +++ b/src/plugins/share/public/components/tabs/link/link_content.tsx @@ -10,7 +10,6 @@ import { copyToClipboard, EuiButton, - EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiForm, @@ -21,7 +20,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import React, { useCallback, useState, useRef, useEffect } from 'react'; -import type { IShareContext } from '../../context'; +import type { IShareContext, ShareContextObjectTypeConfig } from '../../context'; type LinkProps = Pick< IShareContext, @@ -33,7 +32,7 @@ type LinkProps = Pick< | 'delegatedShareUrlHandler' | 'shareableUrlLocatorParams' | 'allowShortUrl' ->; +> & { objectConfig?: ShareContextObjectTypeConfig }; interface UrlParams { [extensionName: string]: { @@ -44,6 +43,7 @@ interface UrlParams { export const LinkContent = ({ isDirty, objectType, + objectConfig = {}, shareableUrl, urlService, shareableUrlLocatorParams, @@ -116,6 +116,8 @@ export const LinkContent = ({ setIsLoading(false); }, [snapshotUrl, delegatedShareUrlHandler, allowShortUrl, createShortUrl]); + const { draftModeCallOut: DraftModeCallout } = objectConfig; + return ( <> <EuiForm> @@ -126,21 +128,10 @@ export const LinkContent = ({ values={{ objectType }} /> </EuiText> - {isDirty && objectType === 'lens' && ( + {isDirty && DraftModeCallout && ( <> <EuiSpacer size="m" /> - <EuiCallOut - color="warning" - iconType="warning" - title={ - <FormattedMessage id="share.link.warning.title" defaultMessage="Unsaved changes" /> - } - > - <FormattedMessage - id="share.link.warning.lens" - defaultMessage="Copy the link to get a temporary link. Save the lens visualization to create a permanent link." - /> - </EuiCallOut> + {DraftModeCallout} </> )} <EuiSpacer size="l" /> diff --git a/src/plugins/share/public/types.ts b/src/plugins/share/public/types.ts index 930b1b1d5f127..c9cb28e9660c4 100644 --- a/src/plugins/share/public/types.ts +++ b/src/plugins/share/public/types.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { ComponentType, ReactElement } from 'react'; +import type { ComponentType, ReactElement, ReactNode } from 'react'; import type { InjectedIntl } from '@kbn/i18n-react'; import { EuiContextMenuPanelDescriptor } from '@elastic/eui'; import { EuiContextMenuPanelItemDescriptorEntry } from '@elastic/eui/src/components/context_menu/context_menu'; @@ -21,6 +21,10 @@ export type BrowserUrlService = UrlService< BrowserShortUrlClient >; +export interface ShareContextObjectTypeConfig { + draftModeCallOut?: ReactNode; +} + /** * @public * Properties of the current object to share. Registered share @@ -37,6 +41,7 @@ export interface ShareContext { */ objectTypeMeta: { title: string; + config?: Partial<Record<'link' | 'export' | 'embed', ShareContextObjectTypeConfig>>; }; objectId?: string; /** diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_degraded_fields.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_degraded_fields.tsx index 3a244dcd5eb3c..90e9b1bcb0658 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_degraded_fields.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_degraded_fields.tsx @@ -228,7 +228,7 @@ const getDegradedFieldsColumns = (): Array<EuiBasicTableColumn<DegradedField>> = sortable: true, field: 'values', render: (values: string[]) => { - return values.map((value, idx) => <EuiBadge key={idx}>{value}</EuiBadge>); + return values.map((value, idx) => <EuiBadge key={idx}>{JSON.stringify(value)}</EuiBadge>); }, }, ]; diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss index 348c8c9784ad8..9775bf6b2ac58 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss @@ -3,7 +3,6 @@ word-wrap: break-word; white-space: pre-wrap; line-height: $euiLineHeight; - color: $euiColorFullShade; vertical-align: top; &--highlighted { diff --git a/src/plugins/vis_types/vega/public/__snapshots__/vega_visualization.test.tsx.snap b/src/plugins/vis_types/vega/public/__snapshots__/vega_visualization.test.tsx.snap index dad12b304efdf..f9afbdc899113 100644 --- a/src/plugins/vis_types/vega/public/__snapshots__/vega_visualization.test.tsx.snap +++ b/src/plugins/vis_types/vega/public/__snapshots__/vega_visualization.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`VegaVisualizations VegaVisualization - basics should show vega graph (may fail in dev env) 1`] = `"<div class=\\"vgaVis__view\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\" style=\\"cursor: default;\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"512\\" height=\\"512\\" viewBox=\\"0 0 512 512\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(0,0)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h512v512h-512Z\\"></path><g><g class=\\"mark-group role-scope\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h0v0h0Z\\"></path><g><g class=\\"mark-area role-mark\\" role=\\"graphics-symbol\\" aria-roledescription=\\"area mark container\\"><path d=\\"M0,512C18.963,512,37.926,512,56.889,512C75.852,512,94.815,512,113.778,512C132.741,512,151.704,512,170.667,512C189.63,512,208.593,512,227.556,512C246.519,512,265.481,512,284.444,512C303.407,512,322.37,512,341.333,512C360.296,512,379.259,512,398.222,512C417.185,512,436.148,512,455.111,512C474.074,512,493.037,512,512,512L512,355.2C493.037,324.8,474.074,294.4,455.111,294.4C436.148,294.4,417.185,457.6,398.222,457.6C379.259,457.6,360.296,233.6,341.333,233.6C322.37,233.6,303.407,435.2,284.444,435.2C265.481,435.2,246.519,345.6,227.556,345.6C208.593,345.6,189.63,451.2,170.667,451.2C151.704,451.2,132.741,252.8,113.778,252.8C94.815,252.8,75.852,346.133,56.889,374.4C37.926,402.667,18.963,412.533,0,422.4Z\\" fill=\\"#54B399\\" fill-opacity=\\"1\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h0v0h0Z\\"></path><g><g class=\\"mark-area role-mark\\" role=\\"graphics-symbol\\" aria-roledescription=\\"area mark container\\"><path d=\\"M0,422.4C18.963,412.533,37.926,402.667,56.889,374.4C75.852,346.133,94.815,252.8,113.778,252.8C132.741,252.8,151.704,451.2,170.667,451.2C189.63,451.2,208.593,345.6,227.556,345.6C246.519,345.6,265.481,435.2,284.444,435.2C303.407,435.2,322.37,233.6,341.333,233.6C360.296,233.6,379.259,457.6,398.222,457.6C417.185,457.6,436.148,294.4,455.111,294.4C474.074,294.4,493.037,324.8,512,355.2L512,307.2C493.037,275.2,474.074,243.2,455.111,243.2C436.148,243.2,417.185,371.2,398.222,371.2C379.259,371.2,360.296,22.4,341.333,22.4C322.37,22.4,303.407,278.4,284.444,278.4C265.481,278.4,246.519,204.8,227.556,192C208.593,179.2,189.63,185.6,170.667,172.8C151.704,160,132.741,83.2,113.778,83.2C94.815,83.2,75.852,83.2,56.889,83.2C37.926,83.2,18.963,164.8,0,246.4Z\\" fill=\\"#6092C0\\" fill-opacity=\\"1\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; +exports[`VegaVisualizations VegaVisualization - basics should show vega graph (may fail in dev env) 1`] = `"<div class=\\"vgaVis__view\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\" style=\\"cursor: default;\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"512\\" height=\\"512\\" viewBox=\\"0 0 512 512\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(0,0)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h512v512h-512Z\\"></path><g><g class=\\"mark-group role-scope\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h0v0h0Z\\"></path><g><g class=\\"mark-area role-mark\\" role=\\"graphics-symbol\\" aria-roledescription=\\"area mark container\\"><path d=\\"M0,512C18.963,512,37.926,512,56.889,512C75.852,512,94.815,512,113.778,512C132.741,512,151.704,512,170.667,512C189.63,512,208.593,512,227.556,512C246.519,512,265.481,512,284.444,512C303.407,512,322.37,512,341.333,512C360.296,512,379.259,512,398.222,512C417.185,512,436.148,512,455.111,512C474.074,512,493.037,512,512,512L512,355.2C493.037,324.8,474.074,294.4,455.111,294.4C436.148,294.4,417.185,457.6,398.222,457.6C379.259,457.6,360.296,233.6,341.333,233.6C322.37,233.6,303.407,435.2,284.444,435.2C265.481,435.2,246.519,345.6,227.556,345.6C208.593,345.6,189.63,451.2,170.667,451.2C151.704,451.2,132.741,252.8,113.778,252.8C94.815,252.8,75.852,346.133,56.889,374.4C37.926,402.667,18.963,412.533,0,422.4Z\\" fill=\\"blue\\" fill-opacity=\\"1\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h0v0h0Z\\"></path><g><g class=\\"mark-area role-mark\\" role=\\"graphics-symbol\\" aria-roledescription=\\"area mark container\\"><path d=\\"M0,422.4C18.963,412.533,37.926,402.667,56.889,374.4C75.852,346.133,94.815,252.8,113.778,252.8C132.741,252.8,151.704,451.2,170.667,451.2C189.63,451.2,208.593,345.6,227.556,345.6C246.519,345.6,265.481,435.2,284.444,435.2C303.407,435.2,322.37,233.6,341.333,233.6C360.296,233.6,379.259,457.6,398.222,457.6C417.185,457.6,436.148,294.4,455.111,294.4C474.074,294.4,493.037,324.8,512,355.2L512,307.2C493.037,275.2,474.074,243.2,455.111,243.2C436.148,243.2,417.185,371.2,398.222,371.2C379.259,371.2,360.296,22.4,341.333,22.4C322.37,22.4,303.407,278.4,284.444,278.4C265.481,278.4,246.519,204.8,227.556,192C208.593,179.2,189.63,185.6,170.667,172.8C151.704,160,132.741,83.2,113.778,83.2C94.815,83.2,75.852,83.2,56.889,83.2C37.926,83.2,18.963,164.8,0,246.4Z\\" fill=\\"yellow\\" fill-opacity=\\"1\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; exports[`VegaVisualizations VegaVisualization - basics should show vegalite graph and update on resize (may fail in dev env) 1`] = `"<ul class=\\"vgaVis__messages\\"><li class=\\"vgaVis__message vgaVis__message--warn\\"><pre class=\\"vgaVis__messageCode\\">\\"width\\" and \\"height\\" params are ignored because \\"autosize\\" is enabled. Set \\"autosize\\": \\"none\\" to disable</pre></li></ul><div class=\\"vgaVis__view\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\" style=\\"cursor: default;\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"512\\" height=\\"512\\" viewBox=\\"0 0 512 512\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(7,5)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0.5,0.5h498v500h-498Z\\" fill=\\"transparent\\" stroke=\\"#ddd\\"></path><g><g class=\\"mark-line role-mark marks\\" role=\\"graphics-object\\" aria-roledescription=\\"line mark container\\"><path aria-label=\\"key: Dec 11, 2017; doc_count: 0\\" role=\\"graphics-symbol\\" aria-roledescription=\\"line mark\\" d=\\"M0,500L55.333,500L110.667,500L166,45.5L221.333,33.3L276.667,34L332,486.7L387.333,500L442.667,500L498,500\\" stroke=\\"#54B399\\" stroke-width=\\"2\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; diff --git a/src/plugins/vis_types/vega/public/plugin.ts b/src/plugins/vis_types/vega/public/plugin.ts index e3d92425281b7..d36a547a9d6ed 100644 --- a/src/plugins/vis_types/vega/public/plugin.ts +++ b/src/plugins/vis_types/vega/public/plugin.ts @@ -16,6 +16,7 @@ import { Setup as InspectorSetup } from '@kbn/inspector-plugin/public'; import type { MapsEmsPluginPublicStart } from '@kbn/maps-ems-plugin/public'; import { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; +import { KbnPalette, getKbnPalettes } from '@kbn/palettes'; import { setNotifications, setData, @@ -98,6 +99,17 @@ export class VegaPlugin implements Plugin<void, void> { core: CoreStart, { data, mapsEms, dataViews, usageCollection }: VegaPluginStartDependencies ) { + core.theme.theme$ + .subscribe({ + async next(theme) { + const { scheme } = await import('vega'); + + const palettes = getKbnPalettes(theme); + scheme('elastic', palettes.get(KbnPalette.Default).colors()); + }, + }) + .unsubscribe(); + setNotifications(core.notifications); setData(data); setDataViews(dataViews); diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_base_view.js b/src/plugins/vis_types/vega/public/vega_view/vega_base_view.js index d517e593e2227..89c2fbe8848c5 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_types/vega/public/vega_view/vega_base_view.js @@ -9,11 +9,10 @@ import moment from 'moment'; import dateMath from '@kbn/datemath'; -import { scheme, loader, logger, Warn, version as vegaVersion, expressionFunction } from 'vega'; +import { loader, logger, Warn, version as vegaVersion, expressionFunction } from 'vega'; import { expressionInterpreter } from 'vega-interpreter'; import { version as vegaLiteVersion } from 'vega-lite'; import { Utils } from '../data_model/utils'; -import { euiPaletteColorBlind } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { buildQueryFilter, compareFilters } from '@kbn/es-query'; import { TooltipHandler } from './vega_tooltip'; @@ -22,8 +21,6 @@ import { getEnableExternalUrls, getDataViews } from '../services'; import { extractIndexPatternsFromSpec } from '../lib/extract_index_pattern'; import { normalizeDate, normalizeString, normalizeObject } from './utils'; -scheme('elastic', euiPaletteColorBlind()); - // Vega's extension functions are global. When called, // we forward execution to the instance-specific handler // This functions must be declared in the VegaBaseView class diff --git a/src/plugins/vis_types/vega/public/vega_visualization.test.tsx b/src/plugins/vis_types/vega/public/vega_visualization.test.tsx index ab51db562f4f2..bd1e8d1b12b34 100644 --- a/src/plugins/vis_types/vega/public/vega_visualization.test.tsx +++ b/src/plugins/vis_types/vega/public/vega_visualization.test.tsx @@ -25,6 +25,7 @@ import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; import { VegaVisualizationDependencies } from './plugin'; import React from 'react'; import { TimeCache } from './data_model/time_cache'; +import { scheme } from 'vega'; jest.mock('./default_spec', () => ({ getDefaultSpec: () => jest.requireActual('./test_utils/default.spec.json'), @@ -122,6 +123,7 @@ describe('VegaVisualizations', () => { test('should show vega graph (may fail in dev env)', async () => { let vegaVis; try { + scheme('elastic', ['blue', 'yellow']); vegaVis = new VegaVisualization(domNode, jest.fn()); const vegaParser = new VegaParser( JSON.stringify(vegaGraph), diff --git a/src/plugins/vis_types/vega/tsconfig.json b/src/plugins/vis_types/vega/tsconfig.json index 172dd4c60fea7..3c980d413b1c5 100644 --- a/src/plugins/vis_types/vega/tsconfig.json +++ b/src/plugins/vis_types/vega/tsconfig.json @@ -41,6 +41,7 @@ "@kbn/code-editor", "@kbn/react-kibana-context-render", "@kbn/search-types", + "@kbn/palettes", ], "exclude": [ "target/**/*", diff --git a/test/functional/apps/discover/esql/_esql_columns.ts b/test/functional/apps/discover/esql/_esql_columns.ts index 59c4b8b816664..3ee6c9e4a3f56 100644 --- a/test/functional/apps/discover/esql/_esql_columns.ts +++ b/test/functional/apps/discover/esql/_esql_columns.ts @@ -181,14 +181,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should reset columns if available fields or index pattern are different in transformational query', async () => { - await monacoEditor.setCodeEditorValue('from logstash-* | keep ip, @timestamp'); + await monacoEditor.setCodeEditorValue('from logstash-* | keep ip, @timestamp | limit 500'); await testSubjects.click('querySubmitButton'); await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); expect(await dataGrid.getHeaderFields()).to.eql(['ip', '@timestamp']); // reset columns if available fields are different - await monacoEditor.setCodeEditorValue('from logstash-* | keep ip, @timestamp, bytes'); + await monacoEditor.setCodeEditorValue( + 'from logstash-* | keep ip, @timestamp, bytes | limit 500' + ); await testSubjects.click('querySubmitButton'); await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); diff --git a/test/functional/apps/management/data_views/_field_formatter.ts b/test/functional/apps/management/data_views/_field_formatter.ts index bd88d96f9700a..94f0b671490f6 100644 --- a/test/functional/apps/management/data_views/_field_formatter.ts +++ b/test/functional/apps/management/data_views/_field_formatter.ts @@ -315,6 +315,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // check available formats for ES_FIELD_TYPES.BOOLEAN expectFormatterTypes: [ FIELD_FORMAT_IDS.BOOLEAN, + FIELD_FORMAT_IDS.COLOR, FIELD_FORMAT_IDS.STATIC_LOOKUP, FIELD_FORMAT_IDS.STRING, FIELD_FORMAT_IDS.URL, diff --git a/tsconfig.base.json b/tsconfig.base.json index 6daea879e4151..965f6eeb8cf70 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -18,8 +18,8 @@ "@kbn/ai-assistant/*": ["x-pack/packages/kbn-ai-assistant/*"], "@kbn/ai-assistant-common": ["x-pack/packages/kbn-ai-assistant-common"], "@kbn/ai-assistant-common/*": ["x-pack/packages/kbn-ai-assistant-common/*"], - "@kbn/ai-assistant-management-plugin": ["src/plugins/ai_assistant_management/selection"], - "@kbn/ai-assistant-management-plugin/*": ["src/plugins/ai_assistant_management/selection/*"], + "@kbn/ai-assistant-management-plugin": ["src/platform/plugins/shared/ai_assistant_management/selection"], + "@kbn/ai-assistant-management-plugin/*": ["src/platform/plugins/shared/ai_assistant_management/selection/*"], "@kbn/aiops-change-point-detection": ["x-pack/platform/packages/private/ml/aiops_change_point_detection"], "@kbn/aiops-change-point-detection/*": ["x-pack/platform/packages/private/ml/aiops_change_point_detection/*"], "@kbn/aiops-common": ["x-pack/platform/packages/shared/ml/aiops_common"], @@ -712,8 +712,8 @@ "@kbn/data-service/*": ["packages/kbn-data-service/*"], "@kbn/data-stream-adapter": ["packages/kbn-data-stream-adapter"], "@kbn/data-stream-adapter/*": ["packages/kbn-data-stream-adapter/*"], - "@kbn/data-usage-plugin": ["x-pack/plugins/data_usage"], - "@kbn/data-usage-plugin/*": ["x-pack/plugins/data_usage/*"], + "@kbn/data-usage-plugin": ["x-pack/platform/plugins/private/data_usage"], + "@kbn/data-usage-plugin/*": ["x-pack/platform/plugins/private/data_usage/*"], "@kbn/data-view-editor-plugin": ["src/plugins/data_view_editor"], "@kbn/data-view-editor-plugin/*": ["src/plugins/data_view_editor/*"], "@kbn/data-view-field-editor-example-plugin": ["examples/data_view_field_editor_example"], @@ -794,8 +794,8 @@ "@kbn/dom-drag-drop/*": ["packages/kbn-dom-drag-drop/*"], "@kbn/ebt-tools": ["packages/kbn-ebt-tools"], "@kbn/ebt-tools/*": ["packages/kbn-ebt-tools/*"], - "@kbn/ecs-data-quality-dashboard": ["x-pack/packages/security-solution/ecs_data_quality_dashboard"], - "@kbn/ecs-data-quality-dashboard/*": ["x-pack/packages/security-solution/ecs_data_quality_dashboard/*"], + "@kbn/ecs-data-quality-dashboard": ["x-pack/solutions/security/packages/ecs_data_quality_dashboard"], + "@kbn/ecs-data-quality-dashboard/*": ["x-pack/solutions/security/packages/ecs_data_quality_dashboard/*"], "@kbn/ecs-data-quality-dashboard-plugin": ["x-pack/plugins/ecs_data_quality_dashboard"], "@kbn/ecs-data-quality-dashboard-plugin/*": ["x-pack/plugins/ecs_data_quality_dashboard/*"], "@kbn/elastic-agent-utils": ["packages/kbn-elastic-agent-utils"], @@ -1316,12 +1316,16 @@ "@kbn/object-versioning/*": ["packages/kbn-object-versioning/*"], "@kbn/object-versioning-utils": ["packages/kbn-object-versioning-utils"], "@kbn/object-versioning-utils/*": ["packages/kbn-object-versioning-utils/*"], - "@kbn/observability-ai-assistant-app-plugin": ["x-pack/plugins/observability_solution/observability_ai_assistant_app"], - "@kbn/observability-ai-assistant-app-plugin/*": ["x-pack/plugins/observability_solution/observability_ai_assistant_app/*"], - "@kbn/observability-ai-assistant-management-plugin": ["x-pack/plugins/observability_solution/observability_ai_assistant_management"], - "@kbn/observability-ai-assistant-management-plugin/*": ["x-pack/plugins/observability_solution/observability_ai_assistant_management/*"], - "@kbn/observability-ai-assistant-plugin": ["x-pack/plugins/observability_solution/observability_ai_assistant"], - "@kbn/observability-ai-assistant-plugin/*": ["x-pack/plugins/observability_solution/observability_ai_assistant/*"], + "@kbn/observability-ai-assistant-app-plugin": ["x-pack/solutions/observability/plugins/observability_ai_assistant_app"], + "@kbn/observability-ai-assistant-app-plugin/*": ["x-pack/solutions/observability/plugins/observability_ai_assistant_app/*"], + "@kbn/observability-ai-assistant-management-plugin": ["x-pack/solutions/observability/plugins/observability_ai_assistant_management"], + "@kbn/observability-ai-assistant-management-plugin/*": ["x-pack/solutions/observability/plugins/observability_ai_assistant_management/*"], + "@kbn/observability-ai-assistant-plugin": ["x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant"], + "@kbn/observability-ai-assistant-plugin/*": ["x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/*"], + "@kbn/observability-ai-common": ["x-pack/solutions/observability/packages/observability_ai/observability_ai_common"], + "@kbn/observability-ai-common/*": ["x-pack/solutions/observability/packages/observability_ai/observability_ai_common/*"], + "@kbn/observability-ai-server": ["x-pack/solutions/observability/packages/observability_ai/observability_ai_server"], + "@kbn/observability-ai-server/*": ["x-pack/solutions/observability/packages/observability_ai/observability_ai_server/*"], "@kbn/observability-alert-details": ["x-pack/packages/observability/alert_details"], "@kbn/observability-alert-details/*": ["x-pack/packages/observability/alert_details/*"], "@kbn/observability-alerting-rule-utils": ["x-pack/packages/observability/alerting_rule_utils"], @@ -1374,6 +1378,8 @@ "@kbn/paertial-results-example-plugin/*": ["examples/partial_results_example/*"], "@kbn/painless-lab-plugin": ["x-pack/plugins/painless_lab"], "@kbn/painless-lab-plugin/*": ["x-pack/plugins/painless_lab/*"], + "@kbn/palettes": ["packages/kbn-palettes"], + "@kbn/palettes/*": ["packages/kbn-palettes/*"], "@kbn/panel-loader": ["packages/kbn-panel-loader"], "@kbn/panel-loader/*": ["packages/kbn-panel-loader/*"], "@kbn/peggy": ["packages/kbn-peggy"], @@ -1436,6 +1442,8 @@ "@kbn/react-mute-legacy-root-warning/*": ["packages/kbn-react-mute-legacy-root-warning/*"], "@kbn/recently-accessed": ["packages/kbn-recently-accessed"], "@kbn/recently-accessed/*": ["packages/kbn-recently-accessed/*"], + "@kbn/relocate": ["packages/kbn-relocate"], + "@kbn/relocate/*": ["packages/kbn-relocate/*"], "@kbn/remote-clusters-plugin": ["x-pack/plugins/remote_clusters"], "@kbn/remote-clusters-plugin/*": ["x-pack/plugins/remote_clusters/*"], "@kbn/rendering-plugin": ["test/plugin_functional/plugins/rendering_plugin"], @@ -1622,34 +1630,34 @@ "@kbn/security-plugin-types-server/*": ["x-pack/packages/security/plugin_types_server/*"], "@kbn/security-role-management-model": ["x-pack/packages/security/role_management_model"], "@kbn/security-role-management-model/*": ["x-pack/packages/security/role_management_model/*"], - "@kbn/security-solution-distribution-bar": ["x-pack/packages/security-solution/distribution_bar"], - "@kbn/security-solution-distribution-bar/*": ["x-pack/packages/security-solution/distribution_bar/*"], + "@kbn/security-solution-distribution-bar": ["x-pack/solutions/security/packages/distribution_bar"], + "@kbn/security-solution-distribution-bar/*": ["x-pack/solutions/security/packages/distribution_bar/*"], "@kbn/security-solution-ess": ["x-pack/plugins/security_solution_ess"], "@kbn/security-solution-ess/*": ["x-pack/plugins/security_solution_ess/*"], - "@kbn/security-solution-features": ["x-pack/packages/security-solution/features"], - "@kbn/security-solution-features/*": ["x-pack/packages/security-solution/features/*"], + "@kbn/security-solution-features": ["x-pack/solutions/security/packages/features"], + "@kbn/security-solution-features/*": ["x-pack/solutions/security/packages/features/*"], "@kbn/security-solution-fixtures-plugin": ["x-pack/test/cases_api_integration/common/plugins/security_solution"], "@kbn/security-solution-fixtures-plugin/*": ["x-pack/test/cases_api_integration/common/plugins/security_solution/*"], - "@kbn/security-solution-navigation": ["x-pack/packages/security-solution/navigation"], - "@kbn/security-solution-navigation/*": ["x-pack/packages/security-solution/navigation/*"], + "@kbn/security-solution-navigation": ["x-pack/solutions/security/packages/navigation"], + "@kbn/security-solution-navigation/*": ["x-pack/solutions/security/packages/navigation/*"], "@kbn/security-solution-plugin": ["x-pack/plugins/security_solution"], "@kbn/security-solution-plugin/*": ["x-pack/plugins/security_solution/*"], "@kbn/security-solution-serverless": ["x-pack/plugins/security_solution_serverless"], "@kbn/security-solution-serverless/*": ["x-pack/plugins/security_solution_serverless/*"], - "@kbn/security-solution-side-nav": ["x-pack/packages/security-solution/side_nav"], - "@kbn/security-solution-side-nav/*": ["x-pack/packages/security-solution/side_nav/*"], - "@kbn/security-solution-storybook-config": ["x-pack/packages/security-solution/storybook/config"], - "@kbn/security-solution-storybook-config/*": ["x-pack/packages/security-solution/storybook/config/*"], - "@kbn/security-solution-upselling": ["x-pack/packages/security-solution/upselling"], - "@kbn/security-solution-upselling/*": ["x-pack/packages/security-solution/upselling/*"], + "@kbn/security-solution-side-nav": ["x-pack/solutions/security/packages/side_nav"], + "@kbn/security-solution-side-nav/*": ["x-pack/solutions/security/packages/side_nav/*"], + "@kbn/security-solution-storybook-config": ["x-pack/solutions/security/packages/storybook/config"], + "@kbn/security-solution-storybook-config/*": ["x-pack/solutions/security/packages/storybook/config/*"], + "@kbn/security-solution-upselling": ["x-pack/solutions/security/packages/upselling"], + "@kbn/security-solution-upselling/*": ["x-pack/solutions/security/packages/upselling/*"], "@kbn/security-test-endpoints-plugin": ["x-pack/test/security_functional/plugins/test_endpoints"], "@kbn/security-test-endpoints-plugin/*": ["x-pack/test/security_functional/plugins/test_endpoints/*"], "@kbn/security-ui-components": ["x-pack/packages/security/ui_components"], "@kbn/security-ui-components/*": ["x-pack/packages/security/ui_components/*"], "@kbn/securitysolution-autocomplete": ["packages/kbn-securitysolution-autocomplete"], "@kbn/securitysolution-autocomplete/*": ["packages/kbn-securitysolution-autocomplete/*"], - "@kbn/securitysolution-data-table": ["x-pack/packages/security-solution/data_table"], - "@kbn/securitysolution-data-table/*": ["x-pack/packages/security-solution/data_table/*"], + "@kbn/securitysolution-data-table": ["x-pack/solutions/security/packages/data_table"], + "@kbn/securitysolution-data-table/*": ["x-pack/solutions/security/packages/data_table/*"], "@kbn/securitysolution-ecs": ["packages/kbn-securitysolution-ecs"], "@kbn/securitysolution-ecs/*": ["packages/kbn-securitysolution-ecs/*"], "@kbn/securitysolution-endpoint-exceptions-common": ["packages/kbn-securitysolution-endpoint-exceptions-common"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index c6eab5697fd29..9242957fd923c 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -32,7 +32,7 @@ "xpack.dashboard": "plugins/dashboard_enhanced", "xpack.dataQuality": "plugins/data_quality", "xpack.datasetQuality": "plugins/observability_solution/dataset_quality", - "xpack.dataUsage": "plugins/data_usage", + "xpack.dataUsage": "platform/plugins/private/data_usage", "xpack.discover": "plugins/discover_enhanced", "xpack.crossClusterReplication": "plugins/cross_cluster_replication", "xpack.elasticAssistant": "packages/kbn-elastic-assistant", @@ -102,10 +102,10 @@ ], "xpack.observability": "plugins/observability_solution/observability", "xpack.observabilityAiAssistant": [ - "plugins/observability_solution/observability_ai_assistant", - "plugins/observability_solution/observability_ai_assistant_app" + "platform/plugins/shared/observability_solution/observability_ai_assistant", + "solutions/observability/plugins/observability_ai_assistant_app" ], - "xpack.observabilityAiAssistantManagement": "plugins/observability_solution/observability_ai_assistant_management", + "xpack.observabilityAiAssistantManagement": "solutions/observability/plugins/observability_ai_assistant_management", "xpack.observabilityLogsExplorer": "plugins/observability_solution/observability_logs_explorer", "xpack.observability_onboarding": "plugins/observability_solution/observability_onboarding", "xpack.observabilityShared": "plugins/observability_solution/observability_shared", diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml index 168a1028952f1..656c410a18e08 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml @@ -44,3 +44,7 @@ level: custom type: long description: "Number of outgoing bytes" + - name: core.system.ticks + level: custom + type: long + description: "The amount of CPU time spent in kernel space" diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/index.ts b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/index.ts index becee1697c0c8..c46b3c3e95bf7 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/index.ts +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/index.ts @@ -121,6 +121,11 @@ export const generateEvent: GeneratorFunction = (config, schedule, index, timest bytes: generateNetworkData(timestamp.toISOString()), }, }, + core: { + system: { + ticks: randomBetween(1_000_000, 1_500_100), + }, + }, }, metricset: { period: interval, @@ -159,6 +164,11 @@ export const generateEvent: GeneratorFunction = (config, schedule, index, timest bytes: generateNetworkData(timestamp.toISOString()), }, }, + core: { + system: { + ticks: randomBetween(1_000_000, 1_500_100), + }, + }, }, metricset: { period: interval, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx index 5352e60bcea45..35bf94bc1d1b3 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { ReactNode } from 'react'; @@ -41,9 +41,7 @@ describe('useFetchAnonymizationFields', () => { wrapper: createWrapper(), }); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useFetchAnonymizationFields()); - await waitForNextUpdate(); + await waitFor(() => { expect(http.fetch).toHaveBeenCalledWith( '/api/security_ai_assistant/anonymization_fields/_find', { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx index 6101782ae43b1..cc5df8d0a44b7 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { ReactNode } from 'react'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx index 7e87ca79e88ab..50ae344a78671 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { DeleteConversationParams, @@ -32,18 +32,18 @@ describe('conversations api', () => { await act(async () => { const deleteProps = { http, toasts, id: 'test' } as unknown as DeleteConversationParams; - const { waitForNextUpdate } = renderHook(() => deleteConversation(deleteProps)); - await waitForNextUpdate(); - - expect(deleteProps.http.fetch).toHaveBeenCalledWith( - '/api/security_ai_assistant/current_user/conversations/test', - { - method: 'DELETE', - signal: undefined, - version: '2023-10-31', - } - ); - expect(toasts.addError).not.toHaveBeenCalled(); + renderHook(() => deleteConversation(deleteProps)); + await waitFor(() => { + expect(deleteProps.http.fetch).toHaveBeenCalledWith( + '/api/security_ai_assistant/current_user/conversations/test', + { + method: 'DELETE', + signal: undefined, + version: '2023-10-31', + } + ); + expect(toasts.addError).not.toHaveBeenCalled(); + }); }); }); @@ -58,18 +58,18 @@ describe('conversations api', () => { it('should call api to get conversation', async () => { await act(async () => { const getProps = { http, toasts, id: 'test' } as unknown as GetConversationByIdParams; - const { waitForNextUpdate } = renderHook(() => getConversationById(getProps)); - await waitForNextUpdate(); - - expect(getProps.http.fetch).toHaveBeenCalledWith( - '/api/security_ai_assistant/current_user/conversations/test', - { - method: 'GET', - signal: undefined, - version: '2023-10-31', - } - ); - expect(toasts.addError).not.toHaveBeenCalled(); + renderHook(() => getConversationById(getProps)); + await waitFor(() => { + expect(getProps.http.fetch).toHaveBeenCalledWith( + '/api/security_ai_assistant/current_user/conversations/test', + { + method: 'GET', + signal: undefined, + version: '2023-10-31', + } + ); + expect(toasts.addError).not.toHaveBeenCalled(); + }); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx index f10c7d07a35d6..cfe67c60324cc 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { ReactNode } from 'react'; @@ -41,11 +41,7 @@ describe('useFetchCurrentUserConversations', () => { wrapper: createWrapper(), }); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => - useFetchCurrentUserConversations(defaultProps) - ); - await waitForNextUpdate(); + await waitFor(() => { expect(defaultProps.http.fetch).toHaveBeenCalledWith( '/api/security_ai_assistant/current_user/conversations/_find', { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx index 6d1296fc9aa64..913dbaed3263b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { usePerformEvaluation, UsePerformEvaluationParams } from './use_perform_evaluation'; import { postEvaluation as _postEvaluation } from './evaluate'; import { useMutation as _useMutation } from '@tanstack/react-query'; @@ -50,10 +50,8 @@ describe('usePerformEvaluation', () => { jest.clearAllMocks(); }); it('should call api with undefined evalParams', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => usePerformEvaluation(defaultProps)); - await waitForNextUpdate(); - + renderHook(() => usePerformEvaluation(defaultProps)); + await waitFor(() => { expect(defaultProps.http.post).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { body: undefined, headers: { @@ -80,10 +78,9 @@ describe('usePerformEvaluation', () => { opts.onError(e); } }); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => usePerformEvaluation(defaultProps)); - await waitForNextUpdate(); + renderHook(() => usePerformEvaluation(defaultProps)); + await waitFor(() => expect(defaultProps.http.post).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { body: '{"graphs":["d","c"],"datasetName":"kewl","connectorIds":["h","g"],"runName":"test run"}', headers: { @@ -91,26 +88,19 @@ describe('usePerformEvaluation', () => { }, signal: undefined, version: API_VERSIONS.internal.v1, - }); - }); + }) + ); }); it('should return evaluation response', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => usePerformEvaluation(defaultProps)); - await waitForNextUpdate(); - - await expect(result.current).resolves.toStrictEqual(statusResponse); - }); + const { result } = renderHook(() => usePerformEvaluation(defaultProps)); + await waitFor(() => expect(result.current).resolves.toStrictEqual(statusResponse)); }); it('should display error toast when api throws error', async () => { postEvaluationMock.mockRejectedValue(new Error('this is an error')); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => usePerformEvaluation(defaultProps)); - await waitForNextUpdate(); - expect(toasts.addError).toHaveBeenCalled(); - }); + renderHook(() => usePerformEvaluation(defaultProps)); + await waitFor(() => expect(toasts.addError).toHaveBeenCalled()); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_indices.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_indices.test.tsx index 4f258aa3c1964..a77ab1d63aa6e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_indices.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_indices.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useKnowledgeBaseIndices, UseKnowledgeBaseIndicesParams, @@ -48,10 +48,8 @@ describe('useKnowledgeBaseIndices', () => { }); it('should call api to get knowledge base indices', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useKnowledgeBaseIndices(defaultProps)); - await waitForNextUpdate(); - + renderHook(() => useKnowledgeBaseIndices(defaultProps)); + await waitFor(() => { expect(defaultProps.http.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/knowledge_base/_indices', { @@ -65,20 +63,17 @@ describe('useKnowledgeBaseIndices', () => { }); it('should return indices response', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useKnowledgeBaseIndices(defaultProps)); - await waitForNextUpdate(); - - await expect(result.current).resolves.toStrictEqual(indicesResponse); + const { result } = renderHook(() => useKnowledgeBaseIndices(defaultProps)); + await waitFor(() => { + expect(result.current).resolves.toStrictEqual(indicesResponse); }); }); it('should display error toast when api throws error', async () => { getKnowledgeBaseIndicesMock.mockRejectedValue(new Error('this is an error')); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useKnowledgeBaseIndices(defaultProps)); - await waitForNextUpdate(); + renderHook(() => useKnowledgeBaseIndices(defaultProps)); + await waitFor(() => { expect(toasts.addError).toHaveBeenCalled(); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_status.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_status.test.tsx index 83073b5770ba0..69fccba092ee9 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_status.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_knowledge_base_status.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useKnowledgeBaseStatus, UseKnowledgeBaseStatusParams } from './use_knowledge_base_status'; import { getKnowledgeBaseStatus as _getKnowledgeBaseStatus } from './api'; @@ -49,10 +49,8 @@ describe('useKnowledgeBaseStatus', () => { jest.clearAllMocks(); }); it('should call api to get knowledge base status without resource arg', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useKnowledgeBaseStatus(defaultProps)); - await waitForNextUpdate(); - + renderHook(() => useKnowledgeBaseStatus(defaultProps)); + await waitFor(() => { expect(defaultProps.http.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/knowledge_base/', { @@ -65,12 +63,8 @@ describe('useKnowledgeBaseStatus', () => { }); }); it('should call api to get knowledge base status with resource arg', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => - useKnowledgeBaseStatus({ ...defaultProps, resource: 'something' }) - ); - await waitForNextUpdate(); - + renderHook(() => useKnowledgeBaseStatus({ ...defaultProps, resource: 'something' })); + await waitFor(() => expect(defaultProps.http.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/knowledge_base/something', { @@ -78,26 +72,18 @@ describe('useKnowledgeBaseStatus', () => { signal: undefined, version: '1', } - ); - }); + ) + ); }); it('should return status response', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useKnowledgeBaseStatus(defaultProps)); - await waitForNextUpdate(); - - await expect(result.current).resolves.toStrictEqual(statusResponse); - }); + const { result } = renderHook(() => useKnowledgeBaseStatus(defaultProps)); + await waitFor(() => expect(result.current).resolves.toStrictEqual(statusResponse)); }); it('should display error toast when api throws error', async () => { getKnowledgeBaseStatusMock.mockRejectedValue(new Error('this is an error')); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useKnowledgeBaseStatus(defaultProps)); - await waitForNextUpdate(); - - expect(toasts.addError).toHaveBeenCalled(); - }); + renderHook(() => useKnowledgeBaseStatus(defaultProps)); + await waitFor(() => expect(toasts.addError).toHaveBeenCalled()); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_setup_knowledge_base.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_setup_knowledge_base.test.tsx index c08f6f93617fc..802ddf74bdf72 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_setup_knowledge_base.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/knowledge_base/use_setup_knowledge_base.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useSetupKnowledgeBase, UseSetupKnowledgeBaseParams } from './use_setup_knowledge_base'; import { postKnowledgeBase as _postKnowledgeBase } from './api'; import { useMutation as _useMutation } from '@tanstack/react-query'; @@ -50,10 +50,8 @@ describe('useSetupKnowledgeBase', () => { jest.clearAllMocks(); }); it('should call api to post knowledge base setup', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useSetupKnowledgeBase(defaultProps)); - await waitForNextUpdate(); - + renderHook(() => useSetupKnowledgeBase(defaultProps)); + await waitFor(() => { expect(defaultProps.http.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/knowledge_base/', { @@ -73,36 +71,27 @@ describe('useSetupKnowledgeBase', () => { opts.onError(e); } }); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useSetupKnowledgeBase(defaultProps)); - await waitForNextUpdate(); + renderHook(() => useSetupKnowledgeBase(defaultProps)); + await waitFor(() => expect(defaultProps.http.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/knowledge_base/something', { method: 'POST', version: '1', } - ); - }); + ) + ); }); it('should return setup response', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useSetupKnowledgeBase(defaultProps)); - await waitForNextUpdate(); - - await expect(result.current).resolves.toStrictEqual(statusResponse); - }); + const { result } = renderHook(() => useSetupKnowledgeBase(defaultProps)); + await waitFor(() => expect(result.current).resolves.toStrictEqual(statusResponse)); }); it('should display error toast when api throws error', async () => { postKnowledgeBaseMock.mockRejectedValue(new Error('this is an error')); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useSetupKnowledgeBase(defaultProps)); - await waitForNextUpdate(); - - expect(toasts.addError).toHaveBeenCalled(); - }); + renderHook(() => useSetupKnowledgeBase(defaultProps)); + await waitFor(() => expect(toasts.addError).toHaveBeenCalled()); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx index 8e228d2787a36..8fb1f808f8df5 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { ReactNode } from 'react'; @@ -41,9 +41,7 @@ describe('useFetchPrompts', () => { wrapper: createWrapper(), }); - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useFetchPrompts()); - await waitForNextUpdate(); + await waitFor(() => { expect(http.fetch).toHaveBeenCalledWith('/api/security_ai_assistant/prompts/_find', { method: 'GET', query: { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx index f72f85892d379..54fc610d405de 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx @@ -10,8 +10,7 @@ import { useSendMessage } from '../use_send_message'; import { useConversation } from '../use_conversation'; import { emptyWelcomeConvo, welcomeConvo } from '../../mock/conversation'; import { useChatSend, UseChatSendProps } from './use_chat_send'; -import { act, renderHook } from '@testing-library/react-hooks'; -import { waitFor } from '@testing-library/react'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { TestProviders } from '../../mock/test_providers/test_providers'; import { useAssistantContext } from '../../..'; @@ -64,10 +63,10 @@ describe('use chat send', () => { }); it('handleOnChatCleared clears the conversation', async () => { (clearConversation as jest.Mock).mockReturnValueOnce(testProps.currentConversation); - const { result, waitForNextUpdate } = renderHook(() => useChatSend(testProps), { + const { result } = renderHook(() => useChatSend(testProps), { wrapper: TestProviders, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); act(() => { result.current.handleOnChatCleared(); }); @@ -99,7 +98,7 @@ describe('use chat send', () => { }); }); it('handleRegenerateResponse removes the last message of the conversation, resends the convo to GenAI, and appends the message received', async () => { - const { result, waitForNextUpdate } = renderHook( + const { result } = renderHook( () => useChatSend({ ...testProps, currentConversation: { ...welcomeConvo, id: 'welcome-id' } }), { @@ -107,7 +106,7 @@ describe('use chat send', () => { } ); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); act(() => { result.current.handleRegenerateResponse(); }); @@ -121,10 +120,10 @@ describe('use chat send', () => { }); it('sends telemetry events for both user and assistant', async () => { const promptText = 'prompt text'; - const { result, waitForNextUpdate } = renderHook(() => useChatSend(testProps), { + const { result } = renderHook(() => useChatSend(testProps), { wrapper: TestProviders, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); act(() => { result.current.handleChatSend(promptText); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conveersation_changed.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conveersation_changed.test.tsx index 091c691d8e324..0e088533ba1d8 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conveersation_changed.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conveersation_changed.test.tsx @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import { useConversationChanged } from './use_conversation_changed'; import { customConvo } from '../../../mock/conversation'; import { mockConnectors } from '../../../mock/connectors'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conversation_deletex.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conversation_deletex.test.tsx index f96de69b8ae7c..5210d76d05791 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conversation_deletex.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/use_conversation_deletex.test.tsx @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import { useConversationDeleted } from './use_conversation_deleted'; import { customConvo, alertConvo, welcomeConvo } from '../../../mock/conversation'; import { Conversation, ConversationsBulkActions } from '../../../..'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/use_conversations_table.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/use_conversations_table.test.tsx index 797bde3466223..5a98d86b1b4a2 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/use_conversations_table.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/use_conversations_table.test.tsx @@ -4,7 +4,8 @@ * 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 { renderHook } from '@testing-library/react'; import { useConversationsTable, GetConversationsListParams, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/use_system_prompt_editor.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/use_system_prompt_editor.test.tsx index 009ee6c5a83cd..507c6773dd398 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/use_system_prompt_editor.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/use_system_prompt_editor.test.tsx @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import { useSystemPromptEditor } from './use_system_prompt_editor'; import { mockSystemPrompt, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_settings_management/use_system_prompt_table.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_settings_management/use_system_prompt_table.test.tsx index 220e150ec8647..4fa17c80e5925 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_settings_management/use_system_prompt_table.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_settings_management/use_system_prompt_table.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useSystemPromptTable } from './use_system_prompt_table'; import { Conversation } from '../../../../assistant_context/types'; import { AIConnector } from '../../../../connectorland/connector_selector'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings/use_quick_prompt_editor.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings/use_quick_prompt_editor.test.tsx index 239b8a06293ed..3626249c9fe31 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings/use_quick_prompt_editor.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings/use_quick_prompt_editor.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useQuickPromptEditor } from './use_quick_prompt_editor'; import { mockAlertPromptContext } from '../../../mock/prompt_context'; import { MOCK_QUICK_PROMPTS } from '../../../mock/quick_prompt'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings_management/use_quick_prompt_table.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings_management/use_quick_prompt_table.test.tsx index ae91a8bb971c6..9d957a77dd738 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings_management/use_quick_prompt_table.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/quick_prompts/quick_prompt_settings_management/use_quick_prompt_table.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useQuickPromptTable } from './use_quick_prompt_table'; import { EuiTableActionsColumnType, EuiTableComputedColumnType } from '@elastic/eui'; import { MOCK_QUICK_PROMPTS } from '../../../mock/quick_prompt'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/use_settings_updater/use_settings_updater.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/use_settings_updater/use_settings_updater.test.tsx index e3a6ab1fc75b5..8f68d99c3eaa5 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/use_settings_updater/use_settings_updater.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/use_settings_updater/use_settings_updater.test.tsx @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; + +import { act, waitFor, renderHook } from '@testing-library/react'; import { DEFAULT_LATEST_ALERTS } from '../../../assistant_context/constants'; import { alertConvo, welcomeConvo } from '../../../mock/conversation'; @@ -98,96 +99,101 @@ describe('useSettingsUpdater', () => { jest.clearAllMocks(); }); it('should set all state variables to their initial values when resetSettings is called', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSettingsUpdater( - mockConversations, - { - data: [...mockSystemPrompts, ...mockQuickPrompts], - page: 1, - perPage: 100, - total: 10, - }, - conversationsLoaded, - promptsLoaded, - anonymizationFields - ) - ); - await waitForNextUpdate(); - const { - setConversationSettings, - setConversationsSettingsBulkActions, - setUpdatedKnowledgeBaseSettings, - setUpdatedAssistantStreamingEnabled, - resetSettings, - setPromptsBulkActions, - } = result.current; + const { result } = renderHook(() => + useSettingsUpdater( + mockConversations, + { + data: [...mockSystemPrompts, ...mockQuickPrompts], + page: 1, + perPage: 100, + total: 10, + }, + conversationsLoaded, + promptsLoaded, + anonymizationFields + ) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + const { + setConversationSettings, + setConversationsSettingsBulkActions, + setUpdatedKnowledgeBaseSettings, + setUpdatedAssistantStreamingEnabled, + resetSettings, + setPromptsBulkActions, + } = result.current; + act(() => { setConversationSettings(updatedValues.conversations); setConversationsSettingsBulkActions({}); setPromptsBulkActions({}); setUpdatedAnonymizationData(updatedValues.updatedAnonymizationData); setUpdatedKnowledgeBaseSettings(updatedValues.knowledgeBase); setUpdatedAssistantStreamingEnabled(updatedValues.assistantStreamingEnabled); + }); - expect(result.current.conversationSettings).toEqual(updatedValues.conversations); - expect(result.current.quickPromptSettings).toEqual(updatedValues.allQuickPrompts); - expect(result.current.systemPromptSettings).toEqual(updatedValues.allSystemPrompts); - expect(result.current.updatedAnonymizationData).toEqual(anonymizationFields); - expect(result.current.knowledgeBase).toEqual(updatedValues.knowledgeBase); - expect(result.current.assistantStreamingEnabled).toEqual( - updatedValues.assistantStreamingEnabled - ); + expect(result.current.conversationSettings).toEqual(updatedValues.conversations); + expect(result.current.quickPromptSettings).toEqual(updatedValues.allQuickPrompts); + expect(result.current.systemPromptSettings).toEqual(updatedValues.allSystemPrompts); + expect(result.current.updatedAnonymizationData).toEqual(anonymizationFields); + expect(result.current.knowledgeBase).toEqual(updatedValues.knowledgeBase); + expect(result.current.assistantStreamingEnabled).toEqual( + updatedValues.assistantStreamingEnabled + ); + act(() => { resetSettings(); - - expect(result.current.conversationSettings).toEqual(mockConversations); - expect(result.current.quickPromptSettings).toEqual(mockValues.allQuickPrompts); - expect(result.current.systemPromptSettings).toEqual(mockValues.allSystemPrompts); - expect(result.current.anonymizationFieldsBulkActions).toEqual( - mockValues.anonymizationFieldsBulkActions - ); - expect(result.current.knowledgeBase).toEqual(mockValues.knowledgeBase); - expect(result.current.assistantStreamingEnabled).toEqual( - mockValues.assistantStreamingEnabled - ); }); + + expect(result.current.conversationSettings).toEqual(mockConversations); + expect(result.current.quickPromptSettings).toEqual(mockValues.allQuickPrompts); + expect(result.current.systemPromptSettings).toEqual(mockValues.allSystemPrompts); + expect(result.current.anonymizationFieldsBulkActions).toEqual( + mockValues.anonymizationFieldsBulkActions + ); + expect(result.current.knowledgeBase).toEqual(mockValues.knowledgeBase); + expect(result.current.assistantStreamingEnabled).toEqual(mockValues.assistantStreamingEnabled); }); it('should update all state variables to their updated values when saveSettings is called', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSettingsUpdater( - mockConversations, - { - data: mockSystemPrompts, - page: 1, - perPage: 100, - total: 10, - }, - conversationsLoaded, - promptsLoaded, - anonymizationFields - ) - ); - await waitForNextUpdate(); - const { - setConversationSettings, - setConversationsSettingsBulkActions, - setAnonymizationFieldsBulkActions, - setUpdatedKnowledgeBaseSettings, - setPromptsBulkActions, - } = result.current; + const { result } = renderHook(() => + useSettingsUpdater( + mockConversations, + { + data: mockSystemPrompts, + page: 1, + perPage: 100, + total: 10, + }, + conversationsLoaded, + promptsLoaded, + anonymizationFields + ) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + + const { + setConversationSettings, + setConversationsSettingsBulkActions, + setAnonymizationFieldsBulkActions, + setUpdatedKnowledgeBaseSettings, + setPromptsBulkActions, + } = result.current; + act(() => { setConversationSettings(updatedValues.conversations); setConversationsSettingsBulkActions({ delete: { ids: ['1'] } }); setAnonymizationFieldsBulkActions({ delete: { ids: ['1'] } }); setPromptsBulkActions({}); setUpdatedAnonymizationData(updatedValues.updatedAnonymizationData); setUpdatedKnowledgeBaseSettings(updatedValues.knowledgeBase); + }); + await act(async () => { await result.current.saveSettings(); + }); + await waitFor(() => { expect(mockHttp.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/current_user/conversations/_bulk_action', { @@ -202,80 +208,99 @@ describe('useSettingsUpdater', () => { expect(setKnowledgeBaseMock).toHaveBeenCalledWith(updatedValues.knowledgeBase); }); }); + it('should track when alerts count is updated', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSettingsUpdater( - mockConversations, - { - data: mockSystemPrompts, - page: 1, - perPage: 100, - total: 10, - }, - conversationsLoaded, - promptsLoaded, - anonymizationFields - ) - ); - await waitForNextUpdate(); - const { setUpdatedKnowledgeBaseSettings } = result.current; + const { result } = renderHook(() => + useSettingsUpdater( + mockConversations, + { + data: mockSystemPrompts, + page: 1, + perPage: 100, + total: 10, + }, + conversationsLoaded, + promptsLoaded, + anonymizationFields + ) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + const { setUpdatedKnowledgeBaseSettings } = result.current; + act(() => { setUpdatedKnowledgeBaseSettings({ ...updatedValues.knowledgeBase, }); + }); + + await act(async () => { await result.current.saveSettings(); - expect(reportAssistantSettingToggled).toHaveBeenCalledWith({ alertsCountUpdated: true }); }); + + await waitFor(() => + expect(reportAssistantSettingToggled).toHaveBeenCalledWith({ alertsCountUpdated: true }) + ); }); + it('should track when streaming is updated', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSettingsUpdater( - mockConversations, - { - data: mockSystemPrompts, - page: 1, - perPage: 100, - total: 10, - }, - conversationsLoaded, - promptsLoaded, - anonymizationFields - ) - ); - await waitForNextUpdate(); - const { setUpdatedAssistantStreamingEnabled } = result.current; + const { result } = renderHook(() => + useSettingsUpdater( + mockConversations, + { + data: mockSystemPrompts, + page: 1, + perPage: 100, + total: 10, + }, + conversationsLoaded, + promptsLoaded, + anonymizationFields + ) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + + const { setUpdatedAssistantStreamingEnabled } = result.current; + + act(() => { setUpdatedAssistantStreamingEnabled(false); + }); + + await act(async () => { await result.current.saveSettings(); + }); + + await waitFor(() => expect(reportAssistantSettingToggled).toHaveBeenCalledWith({ assistantStreamingEnabled: false, - }); - }); + }) + ); }); + it('if no settings update, do not track anything', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSettingsUpdater( - mockConversations, - { - data: mockSystemPrompts, - page: 1, - perPage: 100, - total: 10, - }, - conversationsLoaded, - promptsLoaded, - anonymizationFields - ) - ); - await waitForNextUpdate(); - const { setUpdatedKnowledgeBaseSettings } = result.current; + const { result } = renderHook(() => + useSettingsUpdater( + mockConversations, + { + data: mockSystemPrompts, + page: 1, + perPage: 100, + total: 10, + }, + conversationsLoaded, + promptsLoaded, + anonymizationFields + ) + ); + + await waitFor(() => new Promise((resolve) => resolve(null))); + const { setUpdatedKnowledgeBaseSettings } = result.current; + await act(async () => { setUpdatedKnowledgeBaseSettings(mockValues.knowledgeBase); await result.current.saveSettings(); - expect(reportAssistantSettingToggled).not.toHaveBeenCalledWith(); }); + + await waitFor(() => expect(reportAssistantSettingToggled).not.toHaveBeenCalledWith()); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_assistant_overlay/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_assistant_overlay/index.test.tsx index 780ffcbd9a323..7a142710d19ec 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_assistant_overlay/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_assistant_overlay/index.test.tsx @@ -5,11 +5,10 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; import { DefinedUseQueryResult } from '@tanstack/react-query'; import { useAssistantOverlay } from '.'; -import { waitFor } from '@testing-library/react'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { useFetchCurrentUserConversations } from '../api'; import { Conversation } from '../../assistant_context/types'; import { mockConnectors } from '../../mock/connectors'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/index.test.tsx index 696a2e41b37c2..9e4fc2ab1a2c6 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/index.test.tsx @@ -6,7 +6,7 @@ */ import { useConversation } from '.'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { TestProviders } from '../../mock/test_providers/test_providers'; import React from 'react'; import { MessageRole } from '@kbn/elastic-assistant-common'; @@ -54,79 +54,86 @@ describe('useConversation', () => { }); it('should create a new conversation when called with valid conversationId and message', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useConversation(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> - ), - }); - await waitForNextUpdate(); - createConversation.mockResolvedValue(mockConvo); + const { result } = renderHook(() => useConversation(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> + ), + }); + + await waitFor(() => new Promise((resolve) => resolve(null))); - const createResult = await result.current.createConversation({ + createConversation.mockResolvedValue(mockConvo); + + let createResult; + + await act(async () => { + createResult = await result.current.createConversation({ ...mockConvo, replacements: {}, title: mockConvo.title, category: 'assistant', }); - - expect(createResult).toEqual(mockConvo); }); + + expect(createResult).toEqual(mockConvo); }); it('should delete an existing conversation when called with valid conversationId', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useConversation(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> - ), - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useConversation(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> + ), + }); + + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.deleteConversation('new-convo'); + }); - expect(deleteConversation).toHaveBeenCalledWith({ - http: httpMock, - id: 'new-convo', - }); + expect(deleteConversation).toHaveBeenCalledWith({ + http: httpMock, + id: 'new-convo', }); }); it('should update the apiConfig for an existing conversation when called with a valid conversationId and apiConfig', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useConversation(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> - ), - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useConversation(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> + ), + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.setApiConfig({ conversation: WELCOME_CONVERSATION, apiConfig: mockConvo.apiConfig, }); + }); - expect(createConversation).toHaveBeenCalledWith({ - http: httpMock, - conversation: { ...WELCOME_CONVERSATION, apiConfig: mockConvo.apiConfig, id: '' }, - }); + expect(createConversation).toHaveBeenCalledWith({ + http: httpMock, + conversation: { ...WELCOME_CONVERSATION, apiConfig: mockConvo.apiConfig, id: '' }, }); }); it('should remove the last message from a conversation when called with valid conversationId', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useConversation(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> - ), - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useConversation(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + <TestProviders providerContext={{ http: httpMock }}>{children}</TestProviders> + ), + }); + await waitFor(() => new Promise((resolve) => resolve(null))); - getConversationById.mockResolvedValue(mockConvo); + getConversationById.mockResolvedValue(mockConvo); - const removeResult = await result.current.removeLastMessage('new-convo'); + let removeResult; - expect(removeResult).toEqual([message]); + await act(async () => { + removeResult = await result.current.removeLastMessage('new-convo'); }); + + expect(removeResult).toEqual([message]); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx index 0f04068a89ca2..f5ea35983dd80 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act, waitFor } from '@testing-library/react'; import { useCurrentConversation, Props } from '.'; import { useConversation } from '../use_conversation'; import deepEqual from 'fast-deep-equal'; @@ -49,12 +49,15 @@ describe('useCurrentConversation', () => { }; beforeEach(() => { - jest.clearAllMocks(); (useConversation as jest.Mock).mockReturnValue(mockUseConversation); (deepEqual as jest.Mock).mockReturnValue(false); (find as jest.Mock).mockReturnValue(undefined); }); + afterEach(() => { + jest.clearAllMocks(); + }); + const defaultProps: Props = { // @ts-ignore not exact system prompt type, ok for test allSystemPrompts: [{ id: 'system-prompt-id' }, { id: 'something-crazy' }], @@ -321,16 +324,19 @@ describe('useCurrentConversation', () => { await act(async () => { await result.current.handleCreateConversation(); }); + const { defaultSystemPromptId: _, ...everythingExceptSystemPromptId } = mockData.welcome_id.apiConfig; - expect(mockUseConversation.createConversation).toHaveBeenCalledWith({ - apiConfig: { - ...everythingExceptSystemPromptId, - defaultSystemPromptId: 'LBOi3JEBy3uD9EGi1d_G', - }, - title: 'New chat', - }); + await waitFor(() => + expect(mockUseConversation.createConversation).toHaveBeenCalledWith({ + apiConfig: { + ...everythingExceptSystemPromptId, + defaultSystemPromptId: 'LBOi3JEBy3uD9EGi1d_G', + }, + title: 'New chat', + }) + ); }); it('should delete a conversation', async () => { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx index d599190ca5623..267c39c402a1c 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx @@ -207,6 +207,11 @@ export const useCurrentConversation = ({ // if no Welcome convo exists, create one getDefaultConversation({ cTitle: WELCOME_CONVERSATION_TITLE }); + // on the off chance that the conversation is not found, return + if (!nextConversation) { + return; + } + if (nextConversation && nextConversation.id === '') { // This is a default conversation that has not yet been initialized const conversation = await initializeDefaultConversationWithConnector(nextConversation); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx index 4e877e1886fb4..94e7800450c5d 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useAssistantContext } from '.'; import useLocalStorage from 'react-use/lib/useLocalStorage'; @@ -18,10 +18,8 @@ describe('AssistantContext', () => { beforeEach(() => jest.clearAllMocks()); test('it throws an error when useAssistantContext hook is used without a SecurityAssistantContext', () => { - const { result } = renderHook(useAssistantContext); - - expect(result.error).toEqual( - new Error('useAssistantContext must be used within a AssistantProvider') + expect(() => renderHook(useAssistantContext)).toThrow( + /useAssistantContext must be used within a AssistantProvider/ ); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_action_types/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_action_types/index.test.tsx index 50d3a73797413..dd169c9e345e3 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_action_types/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_action_types/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { useLoadActionTypes, Props } from '.'; import { mockActionTypes } from '../../mock/connectors'; @@ -32,10 +32,8 @@ describe('useLoadActionTypes', () => { jest.clearAllMocks(); }); it('should call api to load action types', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useLoadActionTypes(defaultProps)); - await waitForNextUpdate(); - + renderHook(() => useLoadActionTypes(defaultProps)); + await waitFor(() => { expect(defaultProps.http.get).toHaveBeenCalledWith('/api/actions/connector_types', { query: { feature_id: 'generativeAIForSecurity' }, }); @@ -44,26 +42,20 @@ describe('useLoadActionTypes', () => { }); it('should return sorted action types', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useLoadActionTypes(defaultProps)); - await waitForNextUpdate(); - - await expect(result.current).resolves.toStrictEqual( + const { result } = renderHook(() => useLoadActionTypes(defaultProps)); + await waitFor(() => + expect(result.current).resolves.toStrictEqual( mockActionTypes.sort((a, b) => a.name.localeCompare(b.name)) - ); - }); + ) + ); }); it('should display error toast when api throws error', async () => { await act(async () => { const mockHttp = { get: jest.fn().mockRejectedValue(new Error('this is an error')), } as unknown as Props['http']; - const { waitForNextUpdate } = renderHook(() => - useLoadActionTypes({ ...defaultProps, http: mockHttp }) - ); - await waitForNextUpdate(); - - expect(toasts.addError).toHaveBeenCalled(); + renderHook(() => useLoadActionTypes({ ...defaultProps, http: mockHttp })); + await waitFor(() => expect(toasts.addError).toHaveBeenCalled()); }); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_connectors/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_connectors/index.test.tsx index b29274efb19c0..685d01c988e0d 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_connectors/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/use_load_connectors/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useLoadConnectors, Props } from '.'; import { mockConnectors } from '../../mock/connectors'; @@ -68,37 +68,27 @@ describe('useLoadConnectors', () => { jest.clearAllMocks(); }); it('should call api to load action types', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useLoadConnectors(defaultProps)); - await waitForNextUpdate(); - + renderHook(() => useLoadConnectors(defaultProps)); + await waitFor(() => { expect(defaultProps.http.get).toHaveBeenCalledWith('/api/actions/connectors'); expect(toasts.addError).not.toHaveBeenCalled(); }); }); it('should return sorted action types, removing isMissingSecrets and wrong action type ids', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useLoadConnectors(defaultProps)); - await waitForNextUpdate(); - - await expect(result.current).resolves.toStrictEqual( + const { result } = renderHook(() => useLoadConnectors(defaultProps)); + await waitFor(() => { + expect(result.current).resolves.toStrictEqual( // @ts-ignore ts does not like config, but we define it in the mock data loadConnectorsResult.map((c) => ({ ...c, apiProvider: c.config.apiProvider })) ); }); }); it('should display error toast when api throws error', async () => { - await act(async () => { - const mockHttp = { - get: jest.fn().mockRejectedValue(new Error('this is an error')), - } as unknown as Props['http']; - const { waitForNextUpdate } = renderHook(() => - useLoadConnectors({ ...defaultProps, http: mockHttp }) - ); - await waitForNextUpdate(); - - expect(toasts.addError).toHaveBeenCalled(); - }); + const mockHttp = { + get: jest.fn().mockRejectedValue(new Error('this is an error')), + } as unknown as Props['http']; + renderHook(() => useLoadConnectors({ ...defaultProps, http: mockHttp })); + await waitFor(() => expect(toasts.addError).toHaveBeenCalled()); }); }); diff --git a/x-pack/packages/observability/observability_utils/observability_utils_server/entities/get_entities_by_fuzzy_search.ts b/x-pack/packages/observability/observability_utils/observability_utils_server/entities/get_entities_by_fuzzy_search.ts new file mode 100644 index 0000000000000..aedf89b2ab97d --- /dev/null +++ b/x-pack/packages/observability/observability_utils/observability_utils_server/entities/get_entities_by_fuzzy_search.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { castArray, orderBy } from 'lodash'; +import Fuse from 'fuse.js'; +import { ObservabilityElasticsearchClient } from '../es/client/create_observability_es_client'; + +export async function getEntitiesByFuzzySearch({ + esClient, + entity, + start, + end, + index, +}: { + esClient: ObservabilityElasticsearchClient; + entity: Record<string, string>; + start: number; + end: number; + index: string | string[]; +}): Promise<string[]> { + if (Object.keys(entity).length > 1) { + return []; + } + + const [field, value] = Object.entries(entity)[0]; + + const { terms } = await esClient.client.termsEnum({ + index: castArray(index).join(','), + field, + index_filter: { + range: { + '@timestamp': { + gte: new Date(start).toISOString(), + lte: new Date(end).toISOString(), + }, + }, + }, + size: 10_000, + }); + + const results = new Fuse(terms, { includeScore: true, threshold: 0.75 }).search(value); + + return orderBy(results, (result) => result.score, 'asc') + .slice(0, 5) + .map((result) => result.item); +} diff --git a/x-pack/packages/observability/observability_utils/observability_utils_server/entities/get_log_patterns.ts b/x-pack/packages/observability/observability_utils/observability_utils_server/entities/get_log_patterns.ts new file mode 100644 index 0000000000000..b4071d665f383 --- /dev/null +++ b/x-pack/packages/observability/observability_utils/observability_utils_server/entities/get_log_patterns.ts @@ -0,0 +1,405 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + AggregationsCategorizeTextAggregation, + AggregationsDateHistogramAggregation, + AggregationsMaxAggregation, + AggregationsMinAggregation, + AggregationsTopHitsAggregation, + QueryDslQueryContainer, +} from '@elastic/elasticsearch/lib/api/types'; +import { categorizationAnalyzer } from '@kbn/aiops-log-pattern-analysis/categorization_analyzer'; +import { ChangePointType } from '@kbn/es-types/src'; +import { pValueToLabel } from '@kbn/observability-utils-common/ml/p_value_to_label'; +import { calculateAuto } from '@kbn/calculate-auto'; +import { omit, orderBy, uniqBy } from 'lodash'; +import moment from 'moment'; +import { ObservabilityElasticsearchClient } from '../es/client/create_observability_es_client'; +import { kqlQuery } from '../es/queries/kql_query'; +import { rangeQuery } from '../es/queries/range_query'; + +interface FieldPatternResultBase { + field: string; + count: number; + pattern: string; + regex: string; + sample: string; + firstOccurrence: string; + lastOccurrence: string; + highlight: Record<string, string[]>; + metadata: Record<string, unknown[]>; +} + +interface FieldPatternResultChanges { + timeseries: Array<{ x: number; y: number }>; + change: { + timestamp?: string; + significance: 'high' | 'medium' | 'low' | null; + type: ChangePointType; + change_point?: number; + p_value?: number; + }; +} + +export type FieldPatternResult<TChanges extends boolean | undefined = undefined> = + FieldPatternResultBase & (TChanges extends true ? FieldPatternResultChanges : {}); + +export type FieldPatternResultWithChanges = FieldPatternResult<true>; + +interface CategorizeTextOptions { + query: QueryDslQueryContainer; + metadata: string[]; + esClient: ObservabilityElasticsearchClient; + samplingProbability: number; + fields: string[]; + index: string | string[]; + useMlStandardTokenizer: boolean; + size: number; + start: number; + end: number; +} +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +type CategorizeTextSubAggregations = { + sample: { top_hits: AggregationsTopHitsAggregation }; + minTimestamp: { min: AggregationsMinAggregation }; + maxTimestamp: { max: AggregationsMaxAggregation }; +}; + +interface CategorizeTextAggregationResult { + categorize_text: AggregationsCategorizeTextAggregation; + aggs: CategorizeTextSubAggregations & + ( + | {} + | { + timeseries: { date_histogram: AggregationsDateHistogramAggregation }; + changes: { change_point: { buckets_path: string } }; + } + ); +} + +export async function runCategorizeTextAggregation< + TChanges extends boolean | undefined = undefined +>( + options: CategorizeTextOptions & { includeChanges?: TChanges } +): Promise<Array<FieldPatternResult<TChanges>>>; + +export async function runCategorizeTextAggregation({ + esClient, + fields, + metadata, + index, + query, + samplingProbability, + useMlStandardTokenizer, + includeChanges, + size, + start, + end, +}: CategorizeTextOptions & { includeChanges?: boolean }): Promise< + Array<FieldPatternResult<boolean>> +> { + const aggs = Object.fromEntries( + fields.map((field): [string, CategorizeTextAggregationResult] => [ + field, + { + categorize_text: { + field, + min_doc_count: 1, + size, + categorization_analyzer: useMlStandardTokenizer + ? { + tokenizer: 'ml_standard', + char_filter: [ + { + type: 'pattern_replace', + pattern: '\\\\n', + replacement: '', + } as unknown as string, + ], + } + : categorizationAnalyzer, + }, + aggs: { + minTimestamp: { + min: { + field: '@timestamp', + }, + }, + maxTimestamp: { + max: { + field: '@timestamp', + }, + }, + ...(includeChanges + ? { + timeseries: { + date_histogram: { + field: '@timestamp', + min_doc_count: 0, + extended_bounds: { + min: start, + max: end, + }, + fixed_interval: `${calculateAuto + .atLeast(30, moment.duration(end - start, 'ms'))! + .asMilliseconds()}ms`, + }, + }, + changes: { + change_point: { + buckets_path: 'timeseries>_count', + }, + }, + } + : {}), + sample: { + top_hits: { + size: 1, + _source: false, + fields: [field, ...metadata], + sort: { + _score: { + order: 'desc', + }, + }, + highlight: { + fields: { + '*': {}, + }, + }, + }, + }, + }, + }, + ]) + ); + + const response = await esClient.search('get_log_patterns', { + index, + size: 0, + track_total_hits: false, + query: { + bool: { + filter: [query, ...rangeQuery(start, end)], + }, + }, + aggregations: { + sampler: { + random_sampler: { + probability: samplingProbability, + }, + aggs, + }, + }, + }); + + if (!response.aggregations) { + return []; + } + + const fieldAggregates = omit(response.aggregations.sampler, 'seed', 'doc_count', 'probability'); + + return Object.entries(fieldAggregates).flatMap(([fieldName, aggregate]) => { + const buckets = aggregate.buckets; + + return buckets.map((bucket) => { + return { + field: fieldName, + count: bucket.doc_count, + pattern: bucket.key, + regex: bucket.regex, + sample: bucket.sample.hits.hits[0].fields![fieldName][0] as string, + highlight: bucket.sample.hits.hits[0].highlight ?? {}, + metadata: bucket.sample.hits.hits[0].fields!, + firstOccurrence: new Date(bucket.minTimestamp.value!).toISOString(), + lastOccurrence: new Date(bucket.maxTimestamp.value!).toISOString(), + ...('timeseries' in bucket + ? { + timeseries: bucket.timeseries.buckets.map((dateBucket) => ({ + x: dateBucket.key, + y: dateBucket.doc_count, + })), + change: Object.entries(bucket.changes.type).map( + ([changePointType, change]): FieldPatternResultChanges['change'] => { + return { + type: changePointType as ChangePointType, + significance: + change.p_value !== undefined ? pValueToLabel(change.p_value) : null, + change_point: change.change_point, + p_value: change.p_value, + timestamp: + change.change_point !== undefined + ? bucket.timeseries.buckets[change.change_point].key_as_string + : undefined, + }; + } + )[0], + } + : {}), + }; + }); + }); +} + +interface LogPatternOptions { + esClient: ObservabilityElasticsearchClient; + start: number; + end: number; + index: string | string[]; + kuery: string; + metadata?: string[]; + fields: string[]; +} + +export async function getLogPatterns<TChanges extends boolean | undefined = undefined>( + options: LogPatternOptions & { includeChanges?: TChanges } +): Promise<Array<FieldPatternResult<TChanges>>>; + +export async function getLogPatterns({ + esClient, + start, + end, + index, + kuery, + includeChanges, + metadata = [], + fields, +}: LogPatternOptions & { includeChanges?: boolean }): Promise<Array<FieldPatternResult<boolean>>> { + const fieldCapsResponse = await esClient.fieldCaps('get_field_caps_for_log_pattern_analysis', { + fields, + index_filter: { + bool: { + filter: [...rangeQuery(start, end)], + }, + }, + index, + types: ['text', 'match_only_text'], + }); + + const fieldsInFieldCaps = Object.keys(fieldCapsResponse.fields); + + if (!fieldsInFieldCaps.length) { + return []; + } + + const totalDocsResponse = await esClient.search('get_total_docs_for_log_pattern_analysis', { + index, + size: 0, + track_total_hits: true, + query: { + bool: { + filter: [...kqlQuery(kuery), ...rangeQuery(start, end)], + }, + }, + }); + + const totalHits = totalDocsResponse.hits.total.value; + + if (totalHits === 0) { + return []; + } + + let samplingProbability = 100_000 / totalHits; + + if (samplingProbability >= 0.5) { + samplingProbability = 1; + } + + const fieldGroups = includeChanges + ? fieldsInFieldCaps.map((field) => [field]) + : [fieldsInFieldCaps]; + + const allPatterns = await Promise.all( + fieldGroups.map(async (fieldGroup) => { + const topMessagePatterns = await runCategorizeTextAggregation({ + esClient, + index, + fields: fieldGroup, + query: { + bool: { + filter: kqlQuery(kuery), + }, + }, + samplingProbability, + useMlStandardTokenizer: false, + size: 100, + start, + end, + includeChanges, + metadata, + }); + + if (topMessagePatterns.length === 0) { + return []; + } + + const patternsToExclude = topMessagePatterns.filter((pattern) => { + // elasticsearch will barf because the query is too complex. this measures + // the # of groups to capture for a measure of complexity. + const complexity = pattern.regex.match(/(\.\+\?)|(\.\*\?)/g)?.length ?? 0; + return ( + complexity <= 25 && + // anything less than 50 messages should be re-processed with the ml_standard tokenizer + pattern.count > 50 + ); + }); + + const rareMessagePatterns = await runCategorizeTextAggregation({ + esClient, + index, + fields: fieldGroup, + start, + end, + query: { + bool: { + filter: kqlQuery(kuery), + must_not: [ + ...patternsToExclude.map((pattern) => { + return { + bool: { + filter: [ + { + regexp: { + [pattern.field]: { + value: pattern.regex, + }, + }, + }, + { + match: { + [pattern.field]: { + query: pattern.pattern, + fuzziness: 0, + operator: 'and' as const, + auto_generate_synonyms_phrase_query: false, + }, + }, + }, + ], + }, + }; + }), + ], + }, + }, + size: 1000, + includeChanges, + samplingProbability: 1, + useMlStandardTokenizer: true, + metadata, + }); + + return [...patternsToExclude, ...rareMessagePatterns]; + }) + ); + + return uniqBy( + orderBy(allPatterns.flat(), (pattern) => pattern.count, 'desc'), + (pattern) => pattern.sample + ); +} diff --git a/x-pack/packages/observability/observability_utils/observability_utils_server/tsconfig.json b/x-pack/packages/observability/observability_utils/observability_utils_server/tsconfig.json index f6dd781184b86..33d7e75322f00 100644 --- a/x-pack/packages/observability/observability_utils/observability_utils_server/tsconfig.json +++ b/x-pack/packages/observability/observability_utils/observability_utils_server/tsconfig.json @@ -24,6 +24,8 @@ "@kbn/alerting-plugin", "@kbn/rule-registry-plugin", "@kbn/rule-data-utils", + "@kbn/aiops-log-pattern-analysis", + "@kbn/calculate-auto", "@kbn/utility-types", "@kbn/task-manager-plugin", ] diff --git a/x-pack/packages/observability/synthetics_test_data/index.ts b/x-pack/packages/observability/synthetics_test_data/index.ts index d1fe1034d7b1e..bf58a63025aa9 100644 --- a/x-pack/packages/observability/synthetics_test_data/index.ts +++ b/x-pack/packages/observability/synthetics_test_data/index.ts @@ -6,3 +6,4 @@ */ export { makeUpSummary, makeDownSummary } from './src/make_summaries'; +export * from './src/e2e'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/helpers/parse_args_params.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/parse_args_params.ts similarity index 100% rename from x-pack/plugins/observability_solution/synthetics/e2e/helpers/parse_args_params.ts rename to x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/parse_args_params.ts diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/helpers/record_video.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/record_video.ts similarity index 100% rename from x-pack/plugins/observability_solution/synthetics/e2e/helpers/record_video.ts rename to x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/record_video.ts diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/helpers/synthetics_runner.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/synthetics_runner.ts similarity index 100% rename from x-pack/plugins/observability_solution/synthetics/e2e/helpers/synthetics_runner.ts rename to x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/synthetics_runner.ts diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/test_reporter.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/test_reporter.ts similarity index 100% rename from x-pack/plugins/observability_solution/exploratory_view/e2e/test_reporter.ts rename to x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/test_reporter.ts diff --git a/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/utils.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/utils.ts new file mode 100644 index 0000000000000..f340ef8b78b3a --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/src/e2e/helpers/utils.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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, Page } from '@elastic/synthetics'; + +export async function waitForLoadingToFinish({ page }: { page: Page }) { + while (true) { + if (!(await page.isVisible(byTestId('kbnLoadingMessage'), { timeout: 5000 }))) break; + await page.waitForTimeout(1000); + } +} + +export async function loginToKibana({ + page, + user, +}: { + page: Page; + user?: { username: string; password: string }; +}) { + await page.fill('[data-test-subj=loginUsername]', user?.username ?? 'elastic', { + timeout: 60 * 1000, + }); + + await page.fill('[data-test-subj=loginPassword]', user?.password ?? 'changeme'); + + await page.click('[data-test-subj=loginSubmit]'); + + await waitForLoadingToFinish({ page }); +} + +export const byTestId = (testId: string) => { + return `[data-test-subj=${testId}]`; +}; + +export const assertText = async ({ page, text }: { page: Page; text: string }) => { + const element = await page.waitForSelector(`text=${text}`); + expect(await element.isVisible()).toBeTruthy(); +}; + +export const assertNotText = async ({ page, text }: { page: Page; text: string }) => { + expect(await page.$(`text=${text}`)).toBeFalsy(); +}; + +export const getQuerystring = (params: object) => { + return Object.entries(params) + .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value)) + .join('&'); +}; + +export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +export const TIMEOUT_60_SEC = { + timeout: 60 * 1000, +}; diff --git a/x-pack/packages/observability/synthetics_test_data/src/e2e/index.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/index.ts new file mode 100644 index 0000000000000..89a1c34e32586 --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/src/e2e/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { recordVideo } from './helpers/record_video'; +export { SyntheticsRunner } from './helpers/synthetics_runner'; +export { argv } from './helpers/parse_args_params'; +export { readKibanaConfig } from './tasks/read_kibana_config'; diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/tasks/es_archiver.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/tasks/es_archiver.ts similarity index 66% rename from x-pack/plugins/observability_solution/exploratory_view/e2e/tasks/es_archiver.ts rename to x-pack/packages/observability/synthetics_test_data/src/e2e/tasks/es_archiver.ts index bbb66b19f5a5e..46000acd32e9e 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/tasks/es_archiver.ts +++ b/x-pack/packages/observability/synthetics_test_data/src/e2e/tasks/es_archiver.ts @@ -7,6 +7,7 @@ import Path from 'path'; import { execSync } from 'child_process'; +import { REPO_ROOT } from '@kbn/repo-info'; const ES_ARCHIVE_DIR = './fixtures/es_archiver'; @@ -16,7 +17,7 @@ const NODE_TLS_REJECT_UNAUTHORIZED = '1'; export const esArchiverLoad = (folder: string) => { const path = Path.join(ES_ARCHIVE_DIR, folder); execSync( - `node ../../../../scripts/es_archiver load "${path}" --config ../../../test/functional/config.base.js`, + `node ${REPO_ROOT}/scripts/es_archiver load "${path}" --config ${REPO_ROOT}/test/functional/config.base.js`, { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } ); }; @@ -24,14 +25,7 @@ export const esArchiverLoad = (folder: string) => { export const esArchiverUnload = (folder: string) => { const path = Path.join(ES_ARCHIVE_DIR, folder); execSync( - `node ../../../../scripts/es_archiver unload "${path}" --config ../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverResetKibana = () => { - execSync( - `node ../../../../scripts/es_archiver empty-kibana-index --config ../../../test/functional/config.base.js`, + `node ${REPO_ROOT}/scripts/es_archiver unload "${path}" --config ${REPO_ROOT}/test/functional/config.base.js`, { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/tasks/read_kibana_config.ts b/x-pack/packages/observability/synthetics_test_data/src/e2e/tasks/read_kibana_config.ts similarity index 100% rename from x-pack/plugins/observability_solution/synthetics/e2e/tasks/read_kibana_config.ts rename to x-pack/packages/observability/synthetics_test_data/src/e2e/tasks/read_kibana_config.ts diff --git a/x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts b/x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts index a44ffc15c28ec..21272cfe792e2 100644 --- a/x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts +++ b/x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts @@ -235,4 +235,7 @@ const commons = { }, }, }, + meta: { + space_id: 'default', + }, }; diff --git a/x-pack/packages/observability/synthetics_test_data/tsconfig.json b/x-pack/packages/observability/synthetics_test_data/tsconfig.json index 86d57b8d692f7..b372f38a758ed 100644 --- a/x-pack/packages/observability/synthetics_test_data/tsconfig.json +++ b/x-pack/packages/observability/synthetics_test_data/tsconfig.json @@ -16,5 +16,8 @@ "target/**/*" ], "kbn_references": [ + "@kbn/apm-plugin", + "@kbn/es-archiver", + "@kbn/repo-info", ] } diff --git a/x-pack/packages/security-solution/README.mdx b/x-pack/packages/security-solution/README.mdx deleted file mode 100644 index 8f46e37529f9d..0000000000000 --- a/x-pack/packages/security-solution/README.mdx +++ /dev/null @@ -1,10 +0,0 @@ -## Security Solution package - -This package compiles components used by Security Solution - -### Lazy by default - -All components are exported to be lazily-loaded with a default `React.Suspense` default most appropriate to its nature. - -If a page needs to alter the `React.Suspense` behavior, (e.g. a different "loading" component), one can import the `Lazy[ComponentName]` version and surround it with a custom `React.Suspense` component. - diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/jest.config.js b/x-pack/packages/security-solution/ecs_data_quality_dashboard/jest.config.js deleted file mode 100644 index 5f6f7ab9bce1f..0000000000000 --- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/jest.config.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -module.exports = { - coverageDirectory: - '<rootDir>/target/kibana-coverage/jest/x-pack/packages/security-solution/ecs_data_quality_dashboard_impl', - coverageReporters: ['text', 'html'], - collectCoverageFrom: [ - '<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/**/*.{ts,tsx}', - '!<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/**/{__test__,__snapshots__,__examples__,*mock*,stub,tests,test_helpers,integration_tests,types}/**/*', - '!<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/**/*mock*.{ts,tsx}', - '!<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/**/*.test.{ts,tsx}', - '!<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/**/*.d.ts', - '!<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/**/*.config.ts', - ], - preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard'], - setupFilesAfterEnv: [ - '<rootDir>/x-pack/packages/security-solution/ecs_data_quality_dashboard/setup_tests.ts', - ], -}; diff --git a/x-pack/packages/security-solution/storybook/config/kibana.jsonc b/x-pack/packages/security-solution/storybook/config/kibana.jsonc deleted file mode 100644 index cc52a3074f250..0000000000000 --- a/x-pack/packages/security-solution/storybook/config/kibana.jsonc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "shared-common", - "id": "@kbn/security-solution-storybook-config", - "owner": "@elastic/security-threat-hunting-explore" -} diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts index 4b5ef3a5cfda1..603192fb96db4 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts @@ -13,6 +13,9 @@ export { type AssistantMessage, type ToolMessage, type UserMessage, + type MessageOf, + type AssistantMessageOf, + type ToolMessageOf, type ToolSchemaType, type FromToolSchema, type ToolSchema, diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/index.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/index.ts index 3daa898ab2e1a..cedc8297d75bc 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/index.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/index.ts @@ -33,6 +33,9 @@ export { type AssistantMessage, type UserMessage, type ToolMessage, + type AssistantMessageOf, + type MessageOf, + type ToolMessageOf, } from './messages'; export { type ToolSchema, type ToolSchemaType, type FromToolSchema } from './tool_schema'; export { diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts index ca74b094e0a3b..43d03cf130c01 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/messages.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { ToolCall } from './tools'; +import type { ToolCall, ToolCallsOf, ToolNamesOf, ToolOptions, ToolResponsesOf } from './tools'; /** * Enum for all possible {@link Message} roles. @@ -52,17 +52,32 @@ export type AssistantMessage = MessageBase<MessageRole.Assistant> & { /** * Represents a tool invocation result, following a request from the LLM to execute a tool. */ -export type ToolMessage<TToolResponse extends Record<string, any> | unknown> = - MessageBase<MessageRole.Tool> & { - /** - * The call id matching the {@link ToolCall} this tool message is for. - */ - toolCallId: string; - /** - * The response from the tool invocation. - */ - response: TToolResponse; - }; +export type ToolMessage< + TName extends string = string, + TToolResponse extends Record<string, any> | unknown = Record<string, any> | unknown, + TToolData extends Record<string, any> | undefined = Record<string, any> | undefined +> = MessageBase<MessageRole.Tool> & { + /* + * The name of the tool called. Used for refining the type of the response. + */ + name: TName; + /** + * The call id matching the {@link ToolCall} this tool message is for. + */ + toolCallId: string; + /** + * The response from the tool invocation. + */ + response: TToolResponse; +} & (TToolData extends undefined + ? {} + : { + /** + * Additional data from the tool invocation, that is not sent to the LLM + * but can be used to attach baggage (such as timeseries or debug data) + */ + data: TToolData; + }); /** * Mixin composed of all the possible types of messages in a chatComplete discussion. @@ -72,4 +87,30 @@ export type ToolMessage<TToolResponse extends Record<string, any> | unknown> = * - {@link AssistantMessage} * - {@link ToolMessage} */ -export type Message = UserMessage | AssistantMessage | ToolMessage<unknown>; +export type Message = UserMessage | AssistantMessage | ToolMessage; + +/** + * Utility type to get the Assistant message type of a {@link ToolOptions} type. + */ +export type AssistantMessageOf<TToolOptions extends ToolOptions> = Omit< + AssistantMessage, + 'toolCalls' +> & + ToolCallsOf<TToolOptions>; + +/** + * Utility type to get the Tool message type of a {@link ToolOptions} type. + */ + +export type ToolMessageOf<TToolOptions extends ToolOptions> = ToolMessage< + ToolNamesOf<TToolOptions>, + ToolResponsesOf<TToolOptions['tools']> +>; + +/** + * Utility type to get the mixin Message type of a {@link ToolOptions} type. + */ +export type MessageOf<TToolOptions extends ToolOptions> = + | UserMessage + | AssistantMessageOf<TToolOptions> + | ToolMessageOf<TToolOptions>; diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts index 0c7d5c6755f31..5cd52d5f58883 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/tools.ts @@ -8,24 +8,24 @@ import type { ValuesType } from 'utility-types'; import { FromToolSchema, ToolSchema } from './tool_schema'; -type Assert<TValue, TType> = TValue extends TType ? TValue & TType : never; - type ToolsOfChoice<TToolOptions extends ToolOptions> = TToolOptions['toolChoice'] extends { function: infer TToolName; } ? TToolName extends keyof TToolOptions['tools'] - ? Pick<TToolOptions['tools'], TToolName> + ? TToolName extends string + ? Pick<TToolOptions['tools'], TToolName> + : TToolOptions['tools'] : TToolOptions['tools'] : TToolOptions['tools']; /** * Utility type to infer the tool calls response shape. */ -type ToolResponsesOf<TTools extends Record<string, ToolDefinition> | undefined> = +export type ToolResponsesOf<TTools extends Record<string, ToolDefinition> | undefined> = TTools extends Record<string, ToolDefinition> ? Array< ValuesType<{ - [TName in keyof TTools]: ToolResponseOf<Assert<TName, string>, TTools[TName]>; + [TName in keyof TTools & string]: ToolCall<TName, ToolResponseOf<TTools[TName]>>; }> > : never[]; @@ -33,10 +33,11 @@ type ToolResponsesOf<TTools extends Record<string, ToolDefinition> | undefined> /** * Utility type to infer the tool call response shape. */ -type ToolResponseOf<TName extends string, TToolDefinition extends ToolDefinition> = ToolCall< - TName, - TToolDefinition extends { schema: ToolSchema } ? FromToolSchema<TToolDefinition['schema']> : {} ->; +export type ToolResponseOf<TToolDefinition extends ToolDefinition> = TToolDefinition extends { + schema: ToolSchema; +} + ? FromToolSchema<TToolDefinition['schema']> + : {}; /** * Tool invocation choice type. @@ -129,6 +130,10 @@ export interface ToolCall< name: TName; } & (TArguments extends Record<string, any> ? { arguments: TArguments } : {}); } +/** + * Utility type to get the tool names of ToolOptions + */ +export type ToolNamesOf<TToolOptions extends ToolOptions> = keyof TToolOptions['tools'] & string; /** * Tool-related parameters of {@link ChatCompleteAPI} diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts index 3355042910a61..cd90394cd67d3 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts @@ -96,6 +96,17 @@ export interface OutputOptions< * Defaults to false. */ stream?: TStream; + + /** + * Optional configuration for retrying the call if an error occurs. + */ + retry?: { + /** + * Whether to retry on validation errors. Can be a number or retries, + * or a boolean, which means one retry. + */ + onValidationError?: boolean | number; + }; } /** diff --git a/x-pack/platform/packages/shared/ai-infra/product-doc-common/package.json b/x-pack/platform/packages/shared/ai-infra/product-doc-common/package.json index 839d411a2efb9..2d7c67f17728d 100644 --- a/x-pack/platform/packages/shared/ai-infra/product-doc-common/package.json +++ b/x-pack/platform/packages/shared/ai-infra/product-doc-common/package.json @@ -3,4 +3,4 @@ "private": true, "version": "1.0.0", "license": "Elastic License 2.0" -} \ No newline at end of file +} diff --git a/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/categorization_analyzer.ts b/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/categorization_analyzer.ts new file mode 100644 index 0000000000000..3bdf8dea9ee60 --- /dev/null +++ b/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/categorization_analyzer.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AggregationsCustomCategorizeTextAnalyzer } from '@elastic/elasticsearch/lib/api/types'; + +// This is a copy of the default categorization analyzer but using the 'standard' tokenizer rather than the 'ml_standard' tokenizer. +// The 'ml_standard' tokenizer splits tokens in a way that was observed to give better categories in testing many years ago, however, +// the downside of these better categories is then a potential failure to match the original documents when creating a filter for Discover. +// A future enhancement would be to check which analyzer is specified in the mappings for the source field and to use +// that instead of unconditionally using 'standard'. +// However for an initial fix, using the standard analyzer will be more likely to match the results from the majority of searches. +export const categorizationAnalyzer: AggregationsCustomCategorizeTextAnalyzer = { + char_filter: ['first_line_with_letters'], + tokenizer: 'standard', + filter: [ + // @ts-expect-error filter type in AggregationsCustomCategorizeTextAnalyzer is incorrect + { + type: 'stop', + stopwords: [ + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + 'Mon', + 'Tue', + 'Wed', + 'Thu', + 'Fri', + 'Sat', + 'Sun', + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + 'GMT', + 'UTC', + ], + }, + // @ts-expect-error filter type in AggregationsCustomCategorizeTextAnalyzer is incorrect + { + type: 'limit', + max_token_count: '100', + }, + ], +}; diff --git a/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/create_category_request.ts b/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/create_category_request.ts index c1d6f82c9e582..4e8e2268fed5a 100644 --- a/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/create_category_request.ts +++ b/x-pack/platform/packages/shared/ml/aiops_log_pattern_analysis/create_category_request.ts @@ -5,16 +5,14 @@ * 2.0. */ -import type { - QueryDslQueryContainer, - AggregationsCustomCategorizeTextAnalyzer, -} from '@elastic/elasticsearch/lib/api/types'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import type { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { isPopulatedObject } from '@kbn/ml-is-populated-object/src/is_populated_object'; import type { createRandomSamplerWrapper } from '@kbn/ml-random-sampler-utils'; import { createDefaultQuery } from '@kbn/aiops-common/create_default_query'; +import { categorizationAnalyzer } from './categorization_analyzer'; const CATEGORY_LIMIT = 1000; const EXAMPLE_LIMIT = 4; @@ -121,67 +119,3 @@ export function createCategoryRequest( }, }; } - -// This is a copy of the default categorization analyzer but using the 'standard' tokenizer rather than the 'ml_standard' tokenizer. -// The 'ml_standard' tokenizer splits tokens in a way that was observed to give better categories in testing many years ago, however, -// the downside of these better categories is then a potential failure to match the original documents when creating a filter for Discover. -// A future enhancement would be to check which analyzer is specified in the mappings for the source field and to use -// that instead of unconditionally using 'standard'. -// However for an initial fix, using the standard analyzer will be more likely to match the results from the majority of searches. -const categorizationAnalyzer: AggregationsCustomCategorizeTextAnalyzer = { - char_filter: ['first_line_with_letters'], - tokenizer: 'standard', - filter: [ - // @ts-expect-error filter type in AggregationsCustomCategorizeTextAnalyzer is incorrect - { - type: 'stop', - stopwords: [ - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Sunday', - 'Mon', - 'Tue', - 'Wed', - 'Thu', - 'Fri', - 'Sat', - 'Sun', - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', - 'GMT', - 'UTC', - ], - }, - // @ts-expect-error filter type in AggregationsCustomCategorizeTextAnalyzer is incorrect - { - type: 'limit', - max_token_count: '100', - }, - ], -}; diff --git a/x-pack/plugins/data_usage/README.md b/x-pack/platform/plugins/private/data_usage/README.md similarity index 100% rename from x-pack/plugins/data_usage/README.md rename to x-pack/platform/plugins/private/data_usage/README.md diff --git a/x-pack/plugins/data_usage/common/constants.ts b/x-pack/platform/plugins/private/data_usage/common/constants.ts similarity index 100% rename from x-pack/plugins/data_usage/common/constants.ts rename to x-pack/platform/plugins/private/data_usage/common/constants.ts diff --git a/x-pack/plugins/data_usage/common/experimental_features.ts b/x-pack/platform/plugins/private/data_usage/common/experimental_features.ts similarity index 100% rename from x-pack/plugins/data_usage/common/experimental_features.ts rename to x-pack/platform/plugins/private/data_usage/common/experimental_features.ts diff --git a/x-pack/plugins/data_usage/common/index.ts b/x-pack/platform/plugins/private/data_usage/common/index.ts similarity index 100% rename from x-pack/plugins/data_usage/common/index.ts rename to x-pack/platform/plugins/private/data_usage/common/index.ts diff --git a/x-pack/plugins/data_usage/common/query_client.tsx b/x-pack/platform/plugins/private/data_usage/common/query_client.tsx similarity index 100% rename from x-pack/plugins/data_usage/common/query_client.tsx rename to x-pack/platform/plugins/private/data_usage/common/query_client.tsx diff --git a/x-pack/plugins/data_usage/common/rest_types/data_streams.ts b/x-pack/platform/plugins/private/data_usage/common/rest_types/data_streams.ts similarity index 100% rename from x-pack/plugins/data_usage/common/rest_types/data_streams.ts rename to x-pack/platform/plugins/private/data_usage/common/rest_types/data_streams.ts diff --git a/x-pack/plugins/data_usage/common/rest_types/index.ts b/x-pack/platform/plugins/private/data_usage/common/rest_types/index.ts similarity index 100% rename from x-pack/plugins/data_usage/common/rest_types/index.ts rename to x-pack/platform/plugins/private/data_usage/common/rest_types/index.ts diff --git a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.test.ts b/x-pack/platform/plugins/private/data_usage/common/rest_types/usage_metrics.test.ts similarity index 100% rename from x-pack/plugins/data_usage/common/rest_types/usage_metrics.test.ts rename to x-pack/platform/plugins/private/data_usage/common/rest_types/usage_metrics.test.ts diff --git a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts b/x-pack/platform/plugins/private/data_usage/common/rest_types/usage_metrics.ts similarity index 100% rename from x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts rename to x-pack/platform/plugins/private/data_usage/common/rest_types/usage_metrics.ts diff --git a/x-pack/plugins/data_usage/common/test_utils/index.ts b/x-pack/platform/plugins/private/data_usage/common/test_utils/index.ts similarity index 100% rename from x-pack/plugins/data_usage/common/test_utils/index.ts rename to x-pack/platform/plugins/private/data_usage/common/test_utils/index.ts diff --git a/x-pack/plugins/data_usage/common/test_utils/test_provider.tsx b/x-pack/platform/plugins/private/data_usage/common/test_utils/test_provider.tsx similarity index 100% rename from x-pack/plugins/data_usage/common/test_utils/test_provider.tsx rename to x-pack/platform/plugins/private/data_usage/common/test_utils/test_provider.tsx diff --git a/x-pack/plugins/data_usage/common/test_utils/test_query_client_options.ts b/x-pack/platform/plugins/private/data_usage/common/test_utils/test_query_client_options.ts similarity index 100% rename from x-pack/plugins/data_usage/common/test_utils/test_query_client_options.ts rename to x-pack/platform/plugins/private/data_usage/common/test_utils/test_query_client_options.ts diff --git a/x-pack/plugins/data_usage/common/utils.test.ts b/x-pack/platform/plugins/private/data_usage/common/utils.test.ts similarity index 100% rename from x-pack/plugins/data_usage/common/utils.test.ts rename to x-pack/platform/plugins/private/data_usage/common/utils.test.ts diff --git a/x-pack/plugins/data_usage/common/utils.ts b/x-pack/platform/plugins/private/data_usage/common/utils.ts similarity index 100% rename from x-pack/plugins/data_usage/common/utils.ts rename to x-pack/platform/plugins/private/data_usage/common/utils.ts diff --git a/x-pack/plugins/data_usage/jest.config.js b/x-pack/platform/plugins/private/data_usage/jest.config.js similarity index 67% rename from x-pack/plugins/data_usage/jest.config.js rename to x-pack/platform/plugins/private/data_usage/jest.config.js index f73ddf7ec31ee..cc8bf9953aded 100644 --- a/x-pack/plugins/data_usage/jest.config.js +++ b/x-pack/platform/plugins/private/data_usage/jest.config.js @@ -7,9 +7,10 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../..', - roots: ['<rootDir>/x-pack/plugins/data_usage'], - coverageDirectory: '<rootDir>/target/kibana-coverage/jest/x-pack/plugins/data_usage', + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/platform/plugins/private/data_usage'], + coverageDirectory: + '<rootDir>/target/kibana-coverage/jest/x-pack/platform/plugins/private/data_usage', coverageReporters: ['text', 'html'], collectCoverageFrom: ['<rootDir>/x-pack/plugins/datas_usage/{common,public}/**/*.{ts,tsx}'], }; diff --git a/x-pack/plugins/data_usage/kibana.jsonc b/x-pack/platform/plugins/private/data_usage/kibana.jsonc similarity index 100% rename from x-pack/plugins/data_usage/kibana.jsonc rename to x-pack/platform/plugins/private/data_usage/kibana.jsonc diff --git a/x-pack/plugins/data_usage/public/app/components/assets/illustration_product_no_results_magnifying_glass.svg b/x-pack/platform/plugins/private/data_usage/public/app/components/assets/illustration_product_no_results_magnifying_glass.svg similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/assets/illustration_product_no_results_magnifying_glass.svg rename to x-pack/platform/plugins/private/data_usage/public/app/components/assets/illustration_product_no_results_magnifying_glass.svg diff --git a/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/chart_panel.tsx similarity index 97% rename from x-pack/plugins/data_usage/public/app/components/chart_panel.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/chart_panel.tsx index 208b1e576c0d7..9a7700a5de828 100644 --- a/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx +++ b/x-pack/platform/plugins/private/data_usage/public/app/components/chart_panel.tsx @@ -91,7 +91,7 @@ export const ChartPanel: React.FC<ChartPanelProps> = ({ return ( <EuiFlexItem grow={false} key={metricType}> - <EuiPanel hasShadow={false} hasBorder={true}> + <EuiPanel hasShadow={false} hasBorder={true} data-test-subj={`${metricType}-chart`}> <EuiTitle size="xs"> <h5>{chartKeyToTitleMap[metricType as ChartKey] || metricType}</h5> </EuiTitle> diff --git a/x-pack/plugins/data_usage/public/app/components/charts.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/charts.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/charts.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/charts.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/charts_loading.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/charts_loading.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/charts_loading.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/charts_loading.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.test.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/data_usage_metrics.test.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/data_usage_metrics.test.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/data_usage_metrics.test.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/data_usage_metrics.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/data_usage_metrics.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/dataset_quality_link.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/dataset_quality_link.tsx similarity index 90% rename from x-pack/plugins/data_usage/public/app/components/dataset_quality_link.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/dataset_quality_link.tsx index 8e81e6091156b..3b481565ae27c 100644 --- a/x-pack/plugins/data_usage/public/app/components/dataset_quality_link.tsx +++ b/x-pack/platform/plugins/private/data_usage/public/app/components/dataset_quality_link.tsx @@ -41,7 +41,11 @@ export const DatasetQualityLink: React.FC<DatasetQualityLinkProps> = React.memo( } }; return ( - <LegendActionItem label={UX_LABELS.dataQualityPopup.view} onClick={onClickDataQuality} /> + <LegendActionItem + label={UX_LABELS.dataQualityPopup.view} + onClick={onClickDataQuality} + dataTestSubj="DatasetQualityAction" + /> ); } ); diff --git a/x-pack/plugins/data_usage/public/app/components/filters/charts_filter.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/filters/charts_filter.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/filters/charts_filter.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/filters/charts_filter.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/filters/charts_filter_popover.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/filters/charts_filter_popover.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/filters/charts_filter_popover.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/filters/charts_filter_popover.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/filters/charts_filters.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/filters/charts_filters.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/filters/charts_filters.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/filters/charts_filters.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/filters/date_picker.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/filters/date_picker.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/filters/date_picker.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/filters/date_picker.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/filters/toggle_all_button.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/filters/toggle_all_button.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/filters/toggle_all_button.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/filters/toggle_all_button.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/legend_action.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/legend_action.tsx similarity index 93% rename from x-pack/plugins/data_usage/public/app/components/legend_action.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/legend_action.tsx index b748b77163245..1282bd43e863a 100644 --- a/x-pack/plugins/data_usage/public/app/components/legend_action.tsx +++ b/x-pack/platform/plugins/private/data_usage/public/app/components/legend_action.tsx @@ -52,6 +52,7 @@ export const LegendAction: React.FC<LegendActionProps> = React.memo( return ( <EuiFlexGroup gutterSize="s" alignItems="center"> <EuiPopover + data-test-subj="legendActionPopover" button={ <EuiFlexGroup gutterSize="s" alignItems="center"> <EuiFlexItem grow={false}> @@ -59,6 +60,7 @@ export const LegendAction: React.FC<LegendActionProps> = React.memo( iconType="boxesHorizontal" aria-label={UX_LABELS.dataQualityPopup.open} onClick={() => togglePopover(uniqueStreamName)} + data-test-subj="legendActionButton" /> </EuiFlexItem> </EuiFlexGroup> @@ -71,11 +73,13 @@ export const LegendAction: React.FC<LegendActionProps> = React.memo( <LegendActionItem label={UX_LABELS.dataQualityPopup.copy} onClick={onCopyDataStreamName} + dataTestSubj="copyDataStreamNameAction" /> {hasIndexManagementFeature && ( <LegendActionItem label={UX_LABELS.dataQualityPopup.manage} onClick={onClickIndexManagement} + dataTestSubj="manageDataStreamAction" /> )} {hasDataSetQualityFeature && <DatasetQualityLink dataStreamName={label} />} diff --git a/x-pack/plugins/data_usage/public/app/components/legend_action_item.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/legend_action_item.tsx similarity index 64% rename from x-pack/plugins/data_usage/public/app/components/legend_action_item.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/legend_action_item.tsx index 3b4f0d9f698f7..542fff6902fb9 100644 --- a/x-pack/plugins/data_usage/public/app/components/legend_action_item.tsx +++ b/x-pack/platform/plugins/private/data_usage/public/app/components/legend_action_item.tsx @@ -9,9 +9,15 @@ import React, { memo } from 'react'; import { EuiListGroupItem } from '@elastic/eui'; export const LegendActionItem = memo( - ({ label, onClick }: { label: string; onClick: () => Promise<void> | void }) => ( - <EuiListGroupItem label={label} onClick={onClick} size="s" /> - ) + ({ + label, + onClick, + dataTestSubj, + }: { + label: string; + onClick: () => Promise<void> | void; + dataTestSubj: string; + }) => <EuiListGroupItem label={label} onClick={onClick} data-test-subj={dataTestSubj} size="s" /> ); LegendActionItem.displayName = 'LegendActionItem'; diff --git a/x-pack/plugins/data_usage/public/app/components/no_data_callout.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/no_data_callout.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/no_data_callout.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/no_data_callout.tsx diff --git a/x-pack/plugins/data_usage/public/app/components/page.tsx b/x-pack/platform/plugins/private/data_usage/public/app/components/page.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/components/page.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/components/page.tsx diff --git a/x-pack/plugins/data_usage/public/app/data_usage_metrics_page.tsx b/x-pack/platform/plugins/private/data_usage/public/app/data_usage_metrics_page.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/data_usage_metrics_page.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/data_usage_metrics_page.tsx diff --git a/x-pack/plugins/data_usage/public/app/hooks/index.tsx b/x-pack/platform/plugins/private/data_usage/public/app/hooks/index.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/hooks/index.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/hooks/index.tsx diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_charts_filter.tsx b/x-pack/platform/plugins/private/data_usage/public/app/hooks/use_charts_filter.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/hooks/use_charts_filter.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/hooks/use_charts_filter.tsx diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.test.tsx b/x-pack/platform/plugins/private/data_usage/public/app/hooks/use_charts_url_params.test.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.test.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/hooks/use_charts_url_params.test.tsx diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.tsx b/x-pack/platform/plugins/private/data_usage/public/app/hooks/use_charts_url_params.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/hooks/use_charts_url_params.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/hooks/use_charts_url_params.tsx diff --git a/x-pack/plugins/data_usage/public/app/hooks/use_date_picker.tsx b/x-pack/platform/plugins/private/data_usage/public/app/hooks/use_date_picker.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/app/hooks/use_date_picker.tsx rename to x-pack/platform/plugins/private/data_usage/public/app/hooks/use_date_picker.tsx diff --git a/x-pack/plugins/data_usage/public/application.tsx b/x-pack/platform/plugins/private/data_usage/public/application.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/application.tsx rename to x-pack/platform/plugins/private/data_usage/public/application.tsx diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_data_streams.test.tsx b/x-pack/platform/plugins/private/data_usage/public/hooks/use_get_data_streams.test.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/hooks/use_get_data_streams.test.tsx rename to x-pack/platform/plugins/private/data_usage/public/hooks/use_get_data_streams.test.tsx diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_data_streams.ts b/x-pack/platform/plugins/private/data_usage/public/hooks/use_get_data_streams.ts similarity index 100% rename from x-pack/plugins/data_usage/public/hooks/use_get_data_streams.ts rename to x-pack/platform/plugins/private/data_usage/public/hooks/use_get_data_streams.ts diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.test.tsx b/x-pack/platform/plugins/private/data_usage/public/hooks/use_get_usage_metrics.test.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.test.tsx rename to x-pack/platform/plugins/private/data_usage/public/hooks/use_get_usage_metrics.test.tsx diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.ts b/x-pack/platform/plugins/private/data_usage/public/hooks/use_get_usage_metrics.ts similarity index 100% rename from x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.ts rename to x-pack/platform/plugins/private/data_usage/public/hooks/use_get_usage_metrics.ts diff --git a/x-pack/plugins/data_usage/public/hooks/use_test_id_generator.ts b/x-pack/platform/plugins/private/data_usage/public/hooks/use_test_id_generator.ts similarity index 100% rename from x-pack/plugins/data_usage/public/hooks/use_test_id_generator.ts rename to x-pack/platform/plugins/private/data_usage/public/hooks/use_test_id_generator.ts diff --git a/x-pack/plugins/data_usage/public/hooks/use_url_params.ts b/x-pack/platform/plugins/private/data_usage/public/hooks/use_url_params.ts similarity index 100% rename from x-pack/plugins/data_usage/public/hooks/use_url_params.ts rename to x-pack/platform/plugins/private/data_usage/public/hooks/use_url_params.ts diff --git a/x-pack/plugins/data_usage/public/index.ts b/x-pack/platform/plugins/private/data_usage/public/index.ts similarity index 100% rename from x-pack/plugins/data_usage/public/index.ts rename to x-pack/platform/plugins/private/data_usage/public/index.ts diff --git a/x-pack/plugins/data_usage/public/plugin.ts b/x-pack/platform/plugins/private/data_usage/public/plugin.ts similarity index 100% rename from x-pack/plugins/data_usage/public/plugin.ts rename to x-pack/platform/plugins/private/data_usage/public/plugin.ts diff --git a/x-pack/plugins/data_usage/public/translations.tsx b/x-pack/platform/plugins/private/data_usage/public/translations.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/translations.tsx rename to x-pack/platform/plugins/private/data_usage/public/translations.tsx diff --git a/x-pack/plugins/data_usage/public/types.ts b/x-pack/platform/plugins/private/data_usage/public/types.ts similarity index 100% rename from x-pack/plugins/data_usage/public/types.ts rename to x-pack/platform/plugins/private/data_usage/public/types.ts diff --git a/x-pack/plugins/data_usage/public/utils/format_bytes.test.ts b/x-pack/platform/plugins/private/data_usage/public/utils/format_bytes.test.ts similarity index 100% rename from x-pack/plugins/data_usage/public/utils/format_bytes.test.ts rename to x-pack/platform/plugins/private/data_usage/public/utils/format_bytes.test.ts diff --git a/x-pack/plugins/data_usage/public/utils/format_bytes.ts b/x-pack/platform/plugins/private/data_usage/public/utils/format_bytes.ts similarity index 100% rename from x-pack/plugins/data_usage/public/utils/format_bytes.ts rename to x-pack/platform/plugins/private/data_usage/public/utils/format_bytes.ts diff --git a/x-pack/plugins/data_usage/public/utils/use_breadcrumbs.tsx b/x-pack/platform/plugins/private/data_usage/public/utils/use_breadcrumbs.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/utils/use_breadcrumbs.tsx rename to x-pack/platform/plugins/private/data_usage/public/utils/use_breadcrumbs.tsx diff --git a/x-pack/plugins/data_usage/public/utils/use_kibana.tsx b/x-pack/platform/plugins/private/data_usage/public/utils/use_kibana.tsx similarity index 100% rename from x-pack/plugins/data_usage/public/utils/use_kibana.tsx rename to x-pack/platform/plugins/private/data_usage/public/utils/use_kibana.tsx diff --git a/x-pack/plugins/data_usage/server/common/errors.ts b/x-pack/platform/plugins/private/data_usage/server/common/errors.ts similarity index 100% rename from x-pack/plugins/data_usage/server/common/errors.ts rename to x-pack/platform/plugins/private/data_usage/server/common/errors.ts diff --git a/x-pack/plugins/data_usage/server/config.ts b/x-pack/platform/plugins/private/data_usage/server/config.ts similarity index 100% rename from x-pack/plugins/data_usage/server/config.ts rename to x-pack/platform/plugins/private/data_usage/server/config.ts diff --git a/x-pack/plugins/data_usage/server/errors.ts b/x-pack/platform/plugins/private/data_usage/server/errors.ts similarity index 100% rename from x-pack/plugins/data_usage/server/errors.ts rename to x-pack/platform/plugins/private/data_usage/server/errors.ts diff --git a/x-pack/plugins/data_usage/server/index.ts b/x-pack/platform/plugins/private/data_usage/server/index.ts similarity index 100% rename from x-pack/plugins/data_usage/server/index.ts rename to x-pack/platform/plugins/private/data_usage/server/index.ts diff --git a/x-pack/plugins/data_usage/server/mocks/index.ts b/x-pack/platform/plugins/private/data_usage/server/mocks/index.ts similarity index 100% rename from x-pack/plugins/data_usage/server/mocks/index.ts rename to x-pack/platform/plugins/private/data_usage/server/mocks/index.ts diff --git a/x-pack/plugins/data_usage/server/plugin.ts b/x-pack/platform/plugins/private/data_usage/server/plugin.ts similarity index 100% rename from x-pack/plugins/data_usage/server/plugin.ts rename to x-pack/platform/plugins/private/data_usage/server/plugin.ts diff --git a/x-pack/plugins/data_usage/server/routes/error_handler.ts b/x-pack/platform/plugins/private/data_usage/server/routes/error_handler.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/error_handler.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/error_handler.ts diff --git a/x-pack/plugins/data_usage/server/routes/index.tsx b/x-pack/platform/plugins/private/data_usage/server/routes/index.tsx similarity index 100% rename from x-pack/plugins/data_usage/server/routes/index.tsx rename to x-pack/platform/plugins/private/data_usage/server/routes/index.tsx diff --git a/x-pack/plugins/data_usage/server/routes/internal/data_streams.test.ts b/x-pack/platform/plugins/private/data_usage/server/routes/internal/data_streams.test.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/data_streams.test.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/data_streams.test.ts diff --git a/x-pack/plugins/data_usage/server/routes/internal/data_streams.ts b/x-pack/platform/plugins/private/data_usage/server/routes/internal/data_streams.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/data_streams.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/data_streams.ts diff --git a/x-pack/plugins/data_usage/server/routes/internal/data_streams_handler.ts b/x-pack/platform/plugins/private/data_usage/server/routes/internal/data_streams_handler.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/data_streams_handler.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/data_streams_handler.ts diff --git a/x-pack/plugins/data_usage/server/routes/internal/index.tsx b/x-pack/platform/plugins/private/data_usage/server/routes/internal/index.tsx similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/index.tsx rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/index.tsx diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.test.ts b/x-pack/platform/plugins/private/data_usage/server/routes/internal/usage_metrics.test.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/usage_metrics.test.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/usage_metrics.test.ts diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.ts b/x-pack/platform/plugins/private/data_usage/server/routes/internal/usage_metrics.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/usage_metrics.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/usage_metrics.ts diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts b/x-pack/platform/plugins/private/data_usage/server/routes/internal/usage_metrics_handler.ts similarity index 100% rename from x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts rename to x-pack/platform/plugins/private/data_usage/server/routes/internal/usage_metrics_handler.ts diff --git a/x-pack/plugins/data_usage/server/services/app_context.ts b/x-pack/platform/plugins/private/data_usage/server/services/app_context.ts similarity index 100% rename from x-pack/plugins/data_usage/server/services/app_context.ts rename to x-pack/platform/plugins/private/data_usage/server/services/app_context.ts diff --git a/x-pack/plugins/data_usage/server/services/autoops_api.ts b/x-pack/platform/plugins/private/data_usage/server/services/autoops_api.ts similarity index 100% rename from x-pack/plugins/data_usage/server/services/autoops_api.ts rename to x-pack/platform/plugins/private/data_usage/server/services/autoops_api.ts diff --git a/x-pack/plugins/data_usage/server/services/index.ts b/x-pack/platform/plugins/private/data_usage/server/services/index.ts similarity index 100% rename from x-pack/plugins/data_usage/server/services/index.ts rename to x-pack/platform/plugins/private/data_usage/server/services/index.ts diff --git a/x-pack/plugins/data_usage/server/types/index.ts b/x-pack/platform/plugins/private/data_usage/server/types/index.ts similarity index 100% rename from x-pack/plugins/data_usage/server/types/index.ts rename to x-pack/platform/plugins/private/data_usage/server/types/index.ts diff --git a/x-pack/plugins/data_usage/server/types/types.ts b/x-pack/platform/plugins/private/data_usage/server/types/types.ts similarity index 100% rename from x-pack/plugins/data_usage/server/types/types.ts rename to x-pack/platform/plugins/private/data_usage/server/types/types.ts diff --git a/x-pack/plugins/data_usage/server/utils/custom_http_request_error.ts b/x-pack/platform/plugins/private/data_usage/server/utils/custom_http_request_error.ts similarity index 100% rename from x-pack/plugins/data_usage/server/utils/custom_http_request_error.ts rename to x-pack/platform/plugins/private/data_usage/server/utils/custom_http_request_error.ts diff --git a/x-pack/plugins/data_usage/server/utils/get_metering_stats.ts b/x-pack/platform/plugins/private/data_usage/server/utils/get_metering_stats.ts similarity index 100% rename from x-pack/plugins/data_usage/server/utils/get_metering_stats.ts rename to x-pack/platform/plugins/private/data_usage/server/utils/get_metering_stats.ts diff --git a/x-pack/plugins/data_usage/server/utils/index.ts b/x-pack/platform/plugins/private/data_usage/server/utils/index.ts similarity index 100% rename from x-pack/plugins/data_usage/server/utils/index.ts rename to x-pack/platform/plugins/private/data_usage/server/utils/index.ts diff --git a/x-pack/plugins/data_usage/tsconfig.json b/x-pack/platform/plugins/private/data_usage/tsconfig.json similarity index 91% rename from x-pack/plugins/data_usage/tsconfig.json rename to x-pack/platform/plugins/private/data_usage/tsconfig.json index 8647f7957451a..6ebec73506c67 100644 --- a/x-pack/plugins/data_usage/tsconfig.json +++ b/x-pack/platform/plugins/private/data_usage/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, @@ -8,7 +8,7 @@ "common/**/*", "public/**/*", "server/**/*", - "../../../typings/**/*" + "../../../../../typings/**/*" ], "kbn_references": [ "@kbn/core", diff --git a/x-pack/platform/plugins/private/translations/translations/fr-FR.json b/x-pack/platform/plugins/private/translations/translations/fr-FR.json index 898aac0bf0860..a8360ff6106ee 100644 --- a/x-pack/platform/plugins/private/translations/translations/fr-FR.json +++ b/x-pack/platform/plugins/private/translations/translations/fr-FR.json @@ -215,17 +215,8 @@ "charts.legend.toggleLegendButtonAriaLabel": "Afficher/Masquer la légende", "charts.legend.toggleLegendButtonTitle": "Afficher/Masquer la légende", "charts.noDataLabel": "Résultat introuvable", - "charts.palettes.complementaryLabel": "Complémentaire", - "charts.palettes.coolLabel": "Froide", "charts.palettes.customLabel": "Personnalisée", - "charts.palettes.defaultPaletteLabel": "Par défaut", - "charts.palettes.grayLabel": "Gris", "charts.palettes.kibanaPaletteLabel": "Compatibilité", - "charts.palettes.negativeLabel": "Négative", - "charts.palettes.positiveLabel": "Positive", - "charts.palettes.statusLabel": "Statut", - "charts.palettes.temperatureLabel": "Température", - "charts.palettes.warmLabel": "Chaude", "charts.partialData.bucketTooltipText": "La plage temporelle sélectionnée n'inclut pas ce compartiment en entier. Il se peut qu'elle contienne des données partielles.", "charts.warning.warningLabel": "{numberWarnings, number} {numberWarnings, plural, one {avertissement} other {avertissements}}", "cloud.connectionDetails.apiKeyFormat.beats.description": "Utilisé pour la configuration de Beats", @@ -2826,9 +2817,6 @@ "embeddableApi.panelNotificationTrigger.title": "Notifications du panneau", "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "Une usine incorporable pour le type : {key} est déjà enregistrée.", "embeddableApi.reactEmbeddable.factoryNotFoundError": "Aucune usine incorporable n'a été trouvée pour le type : {key}", - "embeddableApi.samples.contactCard.displayName": "carte de visite", - "embeddableApi.samples.filterableContainer.displayName": "tableau de bord filtrable", - "embeddableApi.samples.filterableEmbeddable.displayName": "filtrable", "embeddableApi.selectRangeTrigger.description": "Une plage de valeurs sur la visualisation", "embeddableApi.selectRangeTrigger.title": "Sélection de la plage", "embeddableApi.valueClickTrigger.description": "Un point de données cliquable sur la visualisation", @@ -7617,8 +7605,6 @@ "share.link.copyEmbedCodeButton": "Copier le code intégré", "share.link.copyLinkButton": "Copier le lien", "share.link.helpText": "Partager un lien direct vers ce {objectType}.", - "share.link.warning.lens": "Copiez le lien afin d’obtenir un lien temporaire. Enregistrez la visualisation Lens pour créer un lien permanent.", - "share.link.warning.title": "Modifications non enregistrées", "share.modalContent.copyUrlButtonLabel": "Copier l'URL Post", "share.postURLWatcherMessage": "Copiez cette URL POST pour appeler la génération depuis l'extérieur de Kibana ou à partir de Watcher.", "share.postURLWatcherMessage.unsavedChanges": "L'URL peut changer si vous mettez Kibana à niveau.", @@ -18328,7 +18314,6 @@ "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.pipelinesLabel": "Pipelines", "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.schedulingTitle": "Planification", "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.syncRulesLabel": "Règles de synchronisation", - "xpack.enterpriseSearch.nav.title": "Enterprise Search", "xpack.enterpriseSearch.navigation.applicationsSearchApplicationsLinkLabel": "Applications de recherche", "xpack.enterpriseSearch.navigation.appSearchEnginesLinkLabel": "Moteurs", "xpack.enterpriseSearch.navigation.contentConnectorsLinkLabel": "Connecteurs", @@ -18678,8 +18663,6 @@ "xpack.enterpriseSearch.searchNav.build.searchApplications": "Applications de recherche", "xpack.enterpriseSearch.searchNav.content": "Contenu", "xpack.enterpriseSearch.searchNav.devTools": "Outils de développement", - "xpack.enterpriseSearch.searchNav.entsearch": "Enterprise Search", - "xpack.enterpriseSearch.searchNav.entsearch.appSearch": "App Search", "xpack.enterpriseSearch.searchNav.headerSolutionSwitcher.searchSolutionTitle": "Recherche", "xpack.enterpriseSearch.searchNav.kibana": "Kibana", "xpack.enterpriseSearch.searchNav.management": "Gestion", @@ -25992,7 +25975,6 @@ "xpack.investigateApp.addObservationUI.h2.addAnObservationChartLabel": "Ajouter un graphique d'observation", "xpack.investigateApp.addObservationUI.p.selectADataSourceLabel": "Sélectionnez une source de données pour générer un graphique d'aperçu", "xpack.investigateApp.appTitle": "Investigations", - "xpack.investigateApp.assistantHypothesis.observabilityAIAssistantContextualInsight.helpMeInvestigateThisLabel": "Aidez-moi à résoudre la cause de cet échec", "xpack.investigateApp.defaultChart.error_equation.description": "Vérifiez l'équation.", "xpack.investigateApp.defaultChart.error_equation.title": "Une erreur s'est produite lors de l'affichage du graphique", "xpack.investigateApp.defaultChart.noData.title": "Aucune donnée graphique disponible", @@ -26157,6 +26139,8 @@ "xpack.lens.app.share.defaultDashboardTitle": "Visualisation Lens [{date}]", "xpack.lens.app.shareButtonDisabledWarning": "La visualisation ne comprend aucune donnée à partager.", "xpack.lens.app.shareModal.title": "Partager cette visualisation Lens", + "xpack.lens.app.shareModal.draftModeCallout.link.warning": "Copiez le lien afin d’obtenir un lien temporaire. Enregistrez la visualisation Lens pour créer un lien permanent.", + "xpack.lens.app.shareModal.draftModeCallout.title": "Modifications non enregistrées", "xpack.lens.app.shareTitle": "Partager", "xpack.lens.app.shareTitleAria": "Partager la visualisation", "xpack.lens.app.showUnderlyingDataMultipleLayers": "Impossible d’afficher les données sous-jacentes pour les visualisations avec plusieurs calques.", @@ -39080,43 +39064,26 @@ "xpack.securitySolution.detectionEngine.rules.upgradeRules.comparisonSide.title": "Affichage différé", "xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionDescriptionLabel": "Affiche la règle actuellement installée", "xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionLabel": "Règle actuelle", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.fieldsWithUpdates": "La mise à niveau contient {count} {count, plural, one {champ} other {champs}}", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.numOfConflicts": "{count} {count, plural, one {conflit} other {conflits}}", "xpack.securitySolution.detectionEngine.rules.upgradeRules.editButtonLabel": "Modifier", "xpack.securitySolution.detectionEngine.rules.upgradeRules.elasticUpdateVersionLabel": "Mise à jour Elastic", "xpack.securitySolution.detectionEngine.rules.upgradeRules.expandHiddenDiffLinesLabel": "Développer {linesCount}{linesCount, plural, one {ligne} other {lignes}}", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldReadOnly.noteLabel": "Guide d'investigation", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflict": "Conflit résolu", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflictDescription": "Nous avons suggéré une mise à jour pour ce champ modifié, veuillez la consulter avant d'accepter.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflicts": "{count} des champs {count, plural, one {a} other {ont}} un conflit non résolu. Veuillez en prendre connaissance et apporter les modifications appropriées.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflictsDescription": "Veuillez apporter une contribution au conflit non résolu. Vous pouvez également conserver la version actuelle sans les mises à jour, ou accepter la mise à jour Elastic tout en perdant vos modifications.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflicts": "{count} des champs {count, plural, one {a} other {ont}} un conflit de mise à jour. Veuillez examiner la mise à jour en cours suggérée.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflictsDescription": "Veuillez consulter la version mise à jour recommandée avant de l'accepter. Vous pouvez modifier le champ, puis l'enregistrer, si nécessaire.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgrade": "La mise à jour est prête à être appliquée.", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgradeDescription": "Tous les conflits ont maintenant été examinés et résolus, veuillez mettre à jour la règle.", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.separator": "-", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.solvableConflict": "Conflit résolu", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.solvableConflictDescription": "Nous avons suggéré une mise à jour pour ce champ modifié, veuillez la consulter avant d'accepter.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAccepted": "Mise à jour acceptée", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAcceptedDescription": "Vous pouvez toujours apporter des modifications, veuillez consulter/accepter tous les autres conflits avant de mettre à jour la règle.", "xpack.securitySolution.detectionEngine.rules.upgradeRules.finalUpdate": "Mise à jour finale", "xpack.securitySolution.detectionEngine.rules.upgradeRules.noRulesBodyTitle": "Il n’y a actuellement aucune mise à jour disponible pour vos règles Elastic installées.", "xpack.securitySolution.detectionEngine.rules.upgradeRules.noRulesTitle": "Toutes les règles Elastic sont à jour", "xpack.securitySolution.detectionEngine.rules.upgradeRules.ruleUpgradeHelper": "Découvrez comment {docsLink}.", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.saveButtonLabel": "Enregistrer", "xpack.securitySolution.detectionEngine.rules.upgradeRules.searchBarPlaceholder": "Rechercher par nom de règle", "xpack.securitySolution.detectionEngine.rules.upgradeRules.updatedVersionDescriptionLabel": "Affiche la règle qui sera installée", "xpack.securitySolution.detectionEngine.rules.upgradeRules.updateYourRulesDocsLink": "mettre à jour vos règles", "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeAll": "Tout mettre à jour", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeHelpText": "Choisissez les valeurs de champ utilisées dans la règle mise à niveau.", "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeSelected": "Mettre à jour {numberOfSelectedRules} règle(s) sélectionnée(s)", "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.ariaLabel": "Sélectionnez les versions à comparer", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsCurrentLabel": "Base - Actuel", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsFinalLabel": "Base - Final", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsTargetLabel": "Base - Cible", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsFinalLabel": "Actuel - Final", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsTargetLabel": "Actuel - Cible", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.targetVsFinalLabel": "Actuel - Final", "xpack.securitySolution.detectionEngine.rulesSnoozeBadge.error.unableToFetch": "Impossible de récupérer les paramètres de répétition", "xpack.securitySolution.detectionEngine.ruleStatus.askAssistant": "Demander à l'assistant", "xpack.securitySolution.detectionEngine.ruleStatus.askAssistantDesc": "Message d'erreur de l'exécution de la règle", diff --git a/x-pack/platform/plugins/private/translations/translations/ja-JP.json b/x-pack/platform/plugins/private/translations/translations/ja-JP.json index 1e4409f185464..6afd565219882 100644 --- a/x-pack/platform/plugins/private/translations/translations/ja-JP.json +++ b/x-pack/platform/plugins/private/translations/translations/ja-JP.json @@ -215,17 +215,8 @@ "charts.legend.toggleLegendButtonAriaLabel": "凡例を切り替える", "charts.legend.toggleLegendButtonTitle": "凡例を切り替える", "charts.noDataLabel": "結果が見つかりませんでした", - "charts.palettes.complementaryLabel": "補完", - "charts.palettes.coolLabel": "Cool", "charts.palettes.customLabel": "カスタム", - "charts.palettes.defaultPaletteLabel": "デフォルト", - "charts.palettes.grayLabel": "グレー", "charts.palettes.kibanaPaletteLabel": "互換性", - "charts.palettes.negativeLabel": "負", - "charts.palettes.positiveLabel": "正", - "charts.palettes.statusLabel": "ステータス", - "charts.palettes.temperatureLabel": "温度", - "charts.palettes.warmLabel": "ウォーム", "charts.partialData.bucketTooltipText": "選択された時間範囲にはこのバケット全体は含まれていません。一部データが含まれている可能性があります。", "charts.warning.warningLabel": "{numberWarnings, number} {numberWarnings, plural, other {件の警告}}", "cloud.connectionDetails.apiKeyFormat.beats.description": "Beatsを構成するために使用", @@ -2821,9 +2812,6 @@ "embeddableApi.panelNotificationTrigger.title": "パネル通知", "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "タイプ\"{key}\"の埋め込み可能ファクトリはすでに登録されています。", "embeddableApi.reactEmbeddable.factoryNotFoundError": "タイプ\"{key}\"の埋め込み可能ファクトリが見つかりません", - "embeddableApi.samples.contactCard.displayName": "連絡先カード", - "embeddableApi.samples.filterableContainer.displayName": "フィルター可能なダッシュボード", - "embeddableApi.samples.filterableEmbeddable.displayName": "フィルター可能", "embeddableApi.selectRangeTrigger.description": "ビジュアライゼーションでの値の範囲", "embeddableApi.selectRangeTrigger.title": "範囲選択", "embeddableApi.valueClickTrigger.description": "ビジュアライゼーションでデータポイントをクリック", @@ -7494,8 +7482,6 @@ "share.link.copyEmbedCodeButton": "埋め込みコードをコピー", "share.link.copyLinkButton": "リンクをコピー", "share.link.helpText": "この{objectType}への直接リンクを共有します。", - "share.link.warning.lens": "リンクをコピーして、一時リンクを取得します。Lensビジュアライゼーションを保存して、永続リンクを作成します。", - "share.link.warning.title": "保存されていない変更", "share.modalContent.copyUrlButtonLabel": "POST URLをコピー", "share.postURLWatcherMessage": "POST URLをコピーしてKibana外または旧Watcherから生成を呼び出します。", "share.postURLWatcherMessage.unsavedChanges": "Kibanaをアップグレードした場合、URLが変更されることがあります。", @@ -18187,7 +18173,6 @@ "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.pipelinesLabel": "パイプライン", "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.schedulingTitle": "スケジュール", "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.syncRulesLabel": "同期ルール", - "xpack.enterpriseSearch.nav.title": "エンタープライズ サーチ", "xpack.enterpriseSearch.navigation.applicationsSearchApplicationsLinkLabel": "検索アプリケーション", "xpack.enterpriseSearch.navigation.appSearchEnginesLinkLabel": "エンジン", "xpack.enterpriseSearch.navigation.contentConnectorsLinkLabel": "コネクター", @@ -18536,8 +18521,6 @@ "xpack.enterpriseSearch.searchNav.build.searchApplications": "検索アプリケーション", "xpack.enterpriseSearch.searchNav.content": "コンテンツ", "xpack.enterpriseSearch.searchNav.devTools": "開発ツール", - "xpack.enterpriseSearch.searchNav.entsearch": "エンタープライズ サーチ", - "xpack.enterpriseSearch.searchNav.entsearch.appSearch": "App Search", "xpack.enterpriseSearch.searchNav.headerSolutionSwitcher.searchSolutionTitle": "検索", "xpack.enterpriseSearch.searchNav.kibana": "Kibana", "xpack.enterpriseSearch.searchNav.management": "管理", @@ -25851,7 +25834,6 @@ "xpack.investigateApp.addObservationUI.h2.addAnObservationChartLabel": "観測グラフを追加", "xpack.investigateApp.addObservationUI.p.selectADataSourceLabel": "データソースを選択して、プレビューグラフを生成", "xpack.investigateApp.appTitle": "調査", - "xpack.investigateApp.assistantHypothesis.observabilityAIAssistantContextualInsight.helpMeInvestigateThisLabel": "このエラーの調査を支援", "xpack.investigateApp.defaultChart.error_equation.description": "式を確認してください。", "xpack.investigateApp.defaultChart.error_equation.title": "グラフの表示中にエラーが発生しました", "xpack.investigateApp.defaultChart.noData.title": "グラフデータがありません", @@ -26016,6 +25998,8 @@ "xpack.lens.app.share.defaultDashboardTitle": "Lensビジュアライゼーション[{date}]", "xpack.lens.app.shareButtonDisabledWarning": "ビジュアライゼーションには共有するデータがありません。", "xpack.lens.app.shareModal.title": "このLensビジュアライゼーションを共有", + "xpack.lens.app.shareModal.draftModeCallout.link.warning": "リンクをコピーして、一時リンクを取得します。Lensビジュアライゼーションを保存して、永続リンクを作成します。", + "xpack.lens.app.shareModal.draftModeCallout.title": "保存されていない変更", "xpack.lens.app.shareTitle": "共有", "xpack.lens.app.shareTitleAria": "ビジュアライゼーションを共有", "xpack.lens.app.showUnderlyingDataMultipleLayers": "複数レイヤーのビジュアライゼーションでは、基本データを表示できません", @@ -38937,43 +38921,26 @@ "xpack.securitySolution.detectionEngine.rules.upgradeRules.comparisonSide.title": "差異ビュー", "xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionDescriptionLabel": "現在インストールされているルールを表示します", "xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionLabel": "現在のルール", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.fieldsWithUpdates": "アップグレードには{count} {count, plural, other {個のフィールド}}があります", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.numOfConflicts": "{count} {count, plural, other {件の競合}}", "xpack.securitySolution.detectionEngine.rules.upgradeRules.editButtonLabel": "編集", "xpack.securitySolution.detectionEngine.rules.upgradeRules.elasticUpdateVersionLabel": "Elastic更新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.expandHiddenDiffLinesLabel": "変更されていない{linesCount} {linesCount, plural, other {行}}を展開", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldReadOnly.noteLabel": "調査ガイド", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflict": "解決された競合", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflictDescription": "この修正されたフィールドの更新を提案しました。承認する前に確認してください。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflicts": "{count}個のフィールド{count, plural, other {には}}未解決の競合があります。確認し、必要に応じて修正してください。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflictsDescription": "未解決の競合の情報を入力してください。更新を適用せずに現在の状態を維持することもできます。Elasticの更新を承認すると、修正内容は失われます。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflicts": "{count}個のフィールド{count, plural, other {には}}更新の競合があります。更新中の候補の更新を確認してください。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflictsDescription": "更新を承認する前に、提案された更新バージョンを確認してください。変更する場合は、編集してフィールドを保存できます。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgrade": "更新を適用できます。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgradeDescription": "すべての競合が確認され、解決されました。ルールを更新してください。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.separator": "-", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.solvableConflict": "解決された競合", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.solvableConflictDescription": "この修正されたフィールドの更新を提案しました。承認する前に確認してください。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAccepted": "更新が承認されました", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAcceptedDescription": "変更を行うことができます。ルールを更新する前に、他のすべての競合を確認/承認してください。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.finalUpdate": "最終更新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.noRulesBodyTitle": "現在、インストールされているElasticルールに利用可能な更新はありません。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.noRulesTitle": "すべてのElasticルールが最新です", "xpack.securitySolution.detectionEngine.rules.upgradeRules.ruleUpgradeHelper": "{docsLink}方法を確認してください。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.saveButtonLabel": "保存", "xpack.securitySolution.detectionEngine.rules.upgradeRules.searchBarPlaceholder": "ルール名で検索", "xpack.securitySolution.detectionEngine.rules.upgradeRules.updatedVersionDescriptionLabel": "インストールされるルールを表示します", "xpack.securitySolution.detectionEngine.rules.upgradeRules.updateYourRulesDocsLink": "ルールを更新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeAll": "すべて更新", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeHelpText": "アップグレードされたルールで使用されるフィールド値を選択してください。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeSelected": "{numberOfSelectedRules}個の選択したルールを更新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.ariaLabel": "比較するバージョンを選択", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsCurrentLabel": "基本と現在", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsFinalLabel": "基本と最終", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsTargetLabel": "基本とターゲット", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsFinalLabel": "現在と最終", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsTargetLabel": "現在とターゲット", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.targetVsFinalLabel": "ターゲットと最終", "xpack.securitySolution.detectionEngine.rulesSnoozeBadge.error.unableToFetch": "スヌーズ設定を取得できません", "xpack.securitySolution.detectionEngine.ruleStatus.askAssistant": "アシスタントに聞く", "xpack.securitySolution.detectionEngine.ruleStatus.askAssistantDesc": "ルールの実行失敗メッセージ", diff --git a/x-pack/platform/plugins/private/translations/translations/zh-CN.json b/x-pack/platform/plugins/private/translations/translations/zh-CN.json index c1508435745b9..58280cb567881 100644 --- a/x-pack/platform/plugins/private/translations/translations/zh-CN.json +++ b/x-pack/platform/plugins/private/translations/translations/zh-CN.json @@ -241,17 +241,8 @@ "charts.legend.toggleLegendButtonAriaLabel": "切换图例", "charts.legend.toggleLegendButtonTitle": "切换图例", "charts.noDataLabel": "找不到结果", - "charts.palettes.complementaryLabel": "互补性", - "charts.palettes.coolLabel": "冷", "charts.palettes.customLabel": "定制", - "charts.palettes.defaultPaletteLabel": "默认", - "charts.palettes.grayLabel": "灰", "charts.palettes.kibanaPaletteLabel": "兼容性", - "charts.palettes.negativeLabel": "负", - "charts.palettes.positiveLabel": "正", - "charts.palettes.statusLabel": "状态", - "charts.palettes.temperatureLabel": "温度", - "charts.palettes.warmLabel": "暖", "charts.partialData.bucketTooltipText": "选定的时间范围不包括此整个存储桶。其可能包含部分数据。", "charts.warning.warningLabel": "{numberWarnings, number} 个{numberWarnings, plural, other {警告}}", "cloud.connectionDetails.apiKeyFormat.beats.description": "用于配置 Beats", @@ -2811,9 +2802,6 @@ "embeddableApi.panelNotificationTrigger.title": "面板通知", "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "已注册类型为 {key} 的可嵌入工厂。", "embeddableApi.reactEmbeddable.factoryNotFoundError": "未找到类型为 {key} 的可嵌入工厂", - "embeddableApi.samples.contactCard.displayName": "联系卡片", - "embeddableApi.samples.filterableContainer.displayName": "可筛选仪表板", - "embeddableApi.samples.filterableEmbeddable.displayName": "可筛选", "embeddableApi.selectRangeTrigger.description": "可视化上的值范围", "embeddableApi.selectRangeTrigger.title": "范围选择", "embeddableApi.valueClickTrigger.description": "可视化上的数据点单击", @@ -7377,8 +7365,6 @@ "share.link.copyEmbedCodeButton": "复制嵌入代码", "share.link.copyLinkButton": "复制链接", "share.link.helpText": "共享指向此 {objectType} 的直接链接。", - "share.link.warning.lens": "复制链接以获取临时链接。保存 Lens 可视化以创建永久链接。", - "share.link.warning.title": "未保存的更改", "share.modalContent.copyUrlButtonLabel": "复制 Post URL", "share.postURLWatcherMessage": "复制此 POST URL 以从 Kibana 外部或从 Watcher 调用生成。", "share.postURLWatcherMessage.unsavedChanges": "如果升级 Kibana,URL 可能会发生更改。", @@ -17884,7 +17870,6 @@ "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.pipelinesLabel": "管道", "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.schedulingTitle": "正在计划", "xpack.enterpriseSearch.nav.searchIndicesTitle.nav.syncRulesLabel": "同步规则", - "xpack.enterpriseSearch.nav.title": "Enterprise Search", "xpack.enterpriseSearch.navigation.applicationsSearchApplicationsLinkLabel": "搜索应用程序", "xpack.enterpriseSearch.navigation.appSearchEnginesLinkLabel": "引擎", "xpack.enterpriseSearch.navigation.contentConnectorsLinkLabel": "连接器", @@ -18234,8 +18219,6 @@ "xpack.enterpriseSearch.searchNav.build.searchApplications": "搜索应用程序", "xpack.enterpriseSearch.searchNav.content": "内容", "xpack.enterpriseSearch.searchNav.devTools": "开发工具", - "xpack.enterpriseSearch.searchNav.entsearch": "Enterprise Search", - "xpack.enterpriseSearch.searchNav.entsearch.appSearch": "App Search", "xpack.enterpriseSearch.searchNav.headerSolutionSwitcher.searchSolutionTitle": "搜索", "xpack.enterpriseSearch.searchNav.kibana": "Kibana", "xpack.enterpriseSearch.searchNav.management": "管理", @@ -25414,7 +25397,6 @@ "xpack.investigateApp.addObservationUI.h2.addAnObservationChartLabel": "添加观察图表", "xpack.investigateApp.addObservationUI.p.selectADataSourceLabel": "选择数据源以生成预览图表", "xpack.investigateApp.appTitle": "调查", - "xpack.investigateApp.assistantHypothesis.observabilityAIAssistantContextualInsight.helpMeInvestigateThisLabel": "帮助我调查此故障", "xpack.investigateApp.defaultChart.error_equation.description": "检查方程。", "xpack.investigateApp.defaultChart.error_equation.title": "渲染图表时出错", "xpack.investigateApp.defaultChart.noData.title": "没有可用图表数据", @@ -25578,6 +25560,8 @@ "xpack.lens.app.share.defaultDashboardTitle": "Lens 可视化 [{date}]", "xpack.lens.app.shareButtonDisabledWarning": "此可视化没有可共享的数据。", "xpack.lens.app.shareModal.title": "共享此 Lens 可视化", + "xpack.lens.app.shareModal.draftModeCallout.link.warning": "复制链接以获取临时链接。保存 Lens 可视化以创建永久链接。", + "xpack.lens.app.shareModal.draftModeCallout.title": "未保存的更改", "xpack.lens.app.shareTitle": "共享", "xpack.lens.app.shareTitleAria": "共享可视化", "xpack.lens.app.showUnderlyingDataMultipleLayers": "无法显示具有多个图层的可视化的底层数据", @@ -38361,43 +38345,26 @@ "xpack.securitySolution.detectionEngine.rules.upgradeRules.comparisonSide.title": "差异视图", "xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionDescriptionLabel": "显示当前安装的规则", "xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionLabel": "当前规则", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.fieldsWithUpdates": "升级包含 {count} 个{count, plural, other {字段}}", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.numOfConflicts": "{count} 个{count, plural, other {冲突}}", "xpack.securitySolution.detectionEngine.rules.upgradeRules.editButtonLabel": "编辑", "xpack.securitySolution.detectionEngine.rules.upgradeRules.elasticUpdateVersionLabel": "Elastic 更新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.expandHiddenDiffLinesLabel": "展开 {linesCount} 个未更改的{linesCount, plural, other {行}}", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldReadOnly.noteLabel": "调查指南", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflict": "已解决冲突", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflictDescription": "我们已为这个已修改字段推荐了更新,请在接受前进行复查。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflicts": "{count} 个字段{count, plural, other {存在}}未解决的冲突。请复查并做出相应更改。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflictsDescription": "请为未解决的冲突提供输入。您还可以保持现状而不进行更新,也可以接受 Elastic 更新但丢失修改。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflicts": "{count} 个字段{count, plural, other {存在}}更新冲突,请复查正在更新的建议更新。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflictsDescription": "在接受更新之前,请复查建议的已更新版本。如果希望更改字段,您可以编辑然后保存字段。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgrade": "更新已准备就绪,可以应用。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgradeDescription": "现已复查并解决所有冲突,请更新规则。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.separator": "-", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.solvableConflict": "已解决冲突", "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.solvableConflictDescription": "我们已为这个已修改字段推荐了更新,请在接受前进行复查。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAccepted": "已接受更新", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAcceptedDescription": "您仍然可以做出更改,在更新规则之前,请复查/接受所有其他冲突。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.finalUpdate": "最后更新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.noRulesBodyTitle": "您已安装的 Elastic 规则当前没有可用更新。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.noRulesTitle": "所有 Elastic 规则均保持最新", "xpack.securitySolution.detectionEngine.rules.upgradeRules.ruleUpgradeHelper": "了解如何 {docsLink}。", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.saveButtonLabel": "保存", "xpack.securitySolution.detectionEngine.rules.upgradeRules.searchBarPlaceholder": "按规则名称搜索", "xpack.securitySolution.detectionEngine.rules.upgradeRules.updatedVersionDescriptionLabel": "显示将安装的规则", "xpack.securitySolution.detectionEngine.rules.upgradeRules.updateYourRulesDocsLink": "更新您的规则", "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeAll": "全部更新", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeHelpText": "选择用在已升级规则中的字段值。", "xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeSelected": "更新 {numberOfSelectedRules} 个选定规则", "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.ariaLabel": "选择要比较的版本", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsCurrentLabel": "基础与当前", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsFinalLabel": "基础与最终", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsTargetLabel": "基础与目标", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsFinalLabel": "当前与最终", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsTargetLabel": "当前与目标", - "xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.targetVsFinalLabel": "目标与最终", "xpack.securitySolution.detectionEngine.rulesSnoozeBadge.error.unableToFetch": "无法提取暂停设置", "xpack.securitySolution.detectionEngine.ruleStatus.askAssistant": "询问助手", "xpack.securitySolution.detectionEngine.ruleStatus.askAssistantDesc": "规则的执行失败消息", diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/constants.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/constants.ts index 71d9369318225..9c0ea6bb30230 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/constants.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/constants.ts @@ -7,7 +7,7 @@ // Definitions index -export const DEFINITIONS_ALIAS = '.kibana-entities-definitions'; +export const DEFINITIONS_ALIAS = '.kibana_entities-definitions'; export const TEMPLATE_VERSION = 1; // Privileges diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/constants.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/constants.ts similarity index 77% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/constants.ts rename to x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/constants.ts index 6316abcae48a3..3982a91b8f671 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/constants.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/constants.ts @@ -5,7 +5,4 @@ * 2.0. */ -export enum FinalSideMode { - READONLY = 'readonly', - EDIT = 'edit', -} +export const BUILT_IN_ID_PREFIX = 'built_in_'; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/containers_from_ecs_data.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/containers_from_ecs_data.ts new file mode 100644 index 0000000000000..244cfb82fc6d9 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/containers_from_ecs_data.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { BuiltInDefinition } from '../../types'; +import { BUILT_IN_ID_PREFIX } from './constants'; + +export const builtInContainersFromEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}containers_from_ecs_data`, + display_name: 'Containers', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}containers_from_ecs_data_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}containers_from_ecs_data`, + index_patterns: ['filebeat-*', 'logs-*', 'metrics-*', 'metricbeat-*'], + identity_fields: ['container.id'], + display_name: 'container.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: [], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/hosts_from_ecs_data.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/hosts_from_ecs_data.ts new file mode 100644 index 0000000000000..a6aa14991c0d8 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/hosts_from_ecs_data.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { BUILT_IN_ID_PREFIX } from './constants'; +import { BuiltInDefinition } from '../../types'; + +export const builtInHostsFromEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}hosts_from_ecs_data`, + display_name: 'Hosts', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}hosts_from_ecs_data_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}hosts_from_ecs_data`, + index_patterns: ['filebeat-*', 'logs-*', 'metrics-*', 'metricbeat-*'], + identity_fields: ['host.name'], + display_name: 'host.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: [], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/index.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/index.ts new file mode 100644 index 0000000000000..9f7b67469b6a4 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/index.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 { builtInServicesFromEcsEntityDefinition } from './services_from_ecs_data'; +import { builtInHostsFromEcsEntityDefinition } from './hosts_from_ecs_data'; +import { builtInContainersFromEcsEntityDefinition } from './containers_from_ecs_data'; +import { BuiltInDefinition } from '../../types'; + +import * as kubernetes from './kubernetes'; + +export const builtInDefinitions: BuiltInDefinition[] = [ + builtInServicesFromEcsEntityDefinition, + builtInHostsFromEcsEntityDefinition, + builtInContainersFromEcsEntityDefinition, + ...Object.values(kubernetes), +]; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/cluster.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/cluster.ts new file mode 100644 index 0000000000000..11d9059aeb021 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/cluster.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesClusterEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_ecs`, + display_name: 'Kubernetes Clusters (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['orchestrator.cluster.name'], + display_name: 'orchestrator.cluster.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['orchestrator.cluster.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/cron_job.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/cron_job.ts new file mode 100644 index 0000000000000..597ee54cd7b95 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/cron_job.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesCronJobEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_ecs`, + display_name: 'Kubernetes CronJobs (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.cronjob.name'], + display_name: 'kubernetes.cronjob.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.cronjob.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/daemon_set.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/daemon_set.ts new file mode 100644 index 0000000000000..efe49291c7a8e --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/daemon_set.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesDaemonSetEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_ecs`, + display_name: 'Kubernetes DaemonSets (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.daemonset.name'], + display_name: 'kubernetes.daemonset.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.daemonset.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/deployment.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/deployment.ts new file mode 100644 index 0000000000000..e68ff1e0b047c --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/deployment.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesDeploymentEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_ecs`, + display_name: 'Kubernetes Deployments (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.deployment.name'], + display_name: 'kubernetes.deployment.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.deployment.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/ecs_index_patterns.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/ecs_index_patterns.ts new file mode 100644 index 0000000000000..14e2766cac2b2 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/ecs_index_patterns.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const commonEcsIndexPatterns = ['metrics-kubernetes*', 'logs-*']; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/index.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/index.ts new file mode 100644 index 0000000000000..ecfa67ff893ba --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { builtInKubernetesClusterEcsEntityDefinition } from './cluster'; +export { builtInKubernetesNodeEcsEntityDefinition } from './node'; +export { builtInKubernetesPodEcsEntityDefinition } from './pod'; +export { builtInKubernetesReplicaSetEcsEntityDefinition } from './replica_set'; +export { builtInKubernetesDeploymentEcsEntityDefinition } from './deployment'; +export { builtInKubernetesStatefulSetEcsEntityDefinition } from './stateful_set'; +export { builtInKubernetesDaemonSetEcsEntityDefinition } from './daemon_set'; +export { builtInKubernetesJobEcsEntityDefinition } from './job'; +export { builtInKubernetesCronJobEcsEntityDefinition } from './cron_job'; +export { builtInKubernetesServiceEcsEntityDefinition } from './service'; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/job.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/job.ts new file mode 100644 index 0000000000000..17f7a6d6ea5f1 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/job.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesJobEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_job_ecs`, + display_name: 'Kubernetes Jobs (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_job_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_job_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.job.name'], + display_name: 'kubernetes.job.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.job.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/node.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/node.ts new file mode 100644 index 0000000000000..eaaf5e10d45b4 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/node.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesNodeEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_node_ecs`, + display_name: 'Kubernetes Nodes (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_node_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_node_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.node.name'], + display_name: 'kubernetes.node.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.node.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/pod.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/pod.ts new file mode 100644 index 0000000000000..d18c5d87fd53a --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/pod.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesPodEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_ecs`, + display_name: 'Kubernetes Pods (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.pod.uid'], + display_name: 'kubernetes.pod.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.pod.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/replica_set.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/replica_set.ts new file mode 100644 index 0000000000000..c44514440dee1 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/replica_set.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesReplicaSetEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_ecs`, + display_name: 'Kubernetes ReplicaSets (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.replicaset.name'], + display_name: 'kubernetes.replicaset.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.replicaset.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/service.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/service.ts new file mode 100644 index 0000000000000..4336cad1b0ea0 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/service.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesServiceEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_service_ecs`, + display_name: 'Kubernetes Services (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_service_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_service_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.service.name'], + display_name: 'kubernetes.service.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.service.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/stateful_set.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/stateful_set.ts new file mode 100644 index 0000000000000..5c3fc0df6070d --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/ecs/stateful_set.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonEcsIndexPatterns } from './ecs_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesStatefulSetEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_ecs`, + display_name: 'Kubernetes StatefulSets (ECS)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_ecs_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_ecs`, + index_patterns: commonEcsIndexPatterns, + identity_fields: ['kubernetes.statefulset.name'], + display_name: 'kubernetes.statefulset.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['kubernetes.statefulset.name: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/index.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/index.ts new file mode 100644 index 0000000000000..fa559fb86d9db --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './ecs'; +export * from './semconv'; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/cluster.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/cluster.ts new file mode 100644 index 0000000000000..14371c4fe1871 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/cluster.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesClusterSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_semconv`, + display_name: 'Kubernetes Clusters (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_cluster_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.cluster.uid'], + display_name: 'k8s.cluster.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.cluster.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/cron_job.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/cron_job.ts new file mode 100644 index 0000000000000..35db4649b24d4 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/cron_job.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesCronJobSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_semconv`, + display_name: 'Kubernetes CronJobs (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_cron_job_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.cronjob.uid'], + display_name: 'k8s.cronjob.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.cronjob.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/daemon_set.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/daemon_set.ts new file mode 100644 index 0000000000000..fa233fbeec4f9 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/daemon_set.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesDaemonSetSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_semconv`, + display_name: 'Kubernetes DaemonSets (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_daemon_set_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.daemonset.uid'], + display_name: 'k8s.daemonset.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.daemonset.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/deployment.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/deployment.ts new file mode 100644 index 0000000000000..13e29cf8b4e58 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/deployment.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesDeploymentSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_semconv`, + display_name: 'Kubernetes Deployments (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_deployment_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.deployment.uid'], + display_name: 'k8s.deployment.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.deployment.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/index.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/index.ts new file mode 100644 index 0000000000000..fbfcd9c5f9024 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { builtInKubernetesClusterSemConvEntityDefinition } from './cluster'; +export { builtInKubernetesNodeSemConvEntityDefinition } from './node'; +export { builtInKubernetesPodSemConvEntityDefinition } from './pod'; +export { builtInKubernetesReplicaSetSemConvEntityDefinition } from './replica_set'; +export { builtInKubernetesDeploymentSemConvEntityDefinition } from './deployment'; +export { builtInKubernetesStatefulSetSemConvEntityDefinition } from './stateful_set'; +export { builtInKubernetesDaemonSetSemConvEntityDefinition } from './daemon_set'; +export { builtInKubernetesJobSemConvEntityDefinition } from './job'; +export { builtInKubernetesCronJobSemConvEntityDefinition } from './cron_job'; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/job.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/job.ts new file mode 100644 index 0000000000000..d830b33fae0e5 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/job.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesJobSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_job_semconv`, + display_name: 'Kubernetes Jobs (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_job_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_job_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.job.uid'], + display_name: 'k8s.job.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.job.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/node.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/node.ts new file mode 100644 index 0000000000000..a99e2fa88d8f0 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/node.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesNodeSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_node_semconv`, + display_name: 'Kubernetes Nodes (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_node_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_node_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.node.uid'], + display_name: 'k8s.node.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.node.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/otel_index_patterns.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/otel_index_patterns.ts new file mode 100644 index 0000000000000..9978f61efafab --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/otel_index_patterns.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const commonOtelIndexPatterns = ['metrics-*otel*', 'logs-*']; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/pod.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/pod.ts new file mode 100644 index 0000000000000..cb983201beede --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/pod.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesPodSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_semconv`, + display_name: 'Kubernetes Pods (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_pod_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.pod.uid'], + display_name: 'k8s.pod.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.pod.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/replica_set.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/replica_set.ts new file mode 100644 index 0000000000000..feba9f02383bc --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/replica_set.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesReplicaSetSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_semconv`, + display_name: 'Kubernetes ReplicaSets (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_replica_set_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.replicaset.uid'], + display_name: 'k8s.replicaset.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.replicaset.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/stateful_set.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/stateful_set.ts new file mode 100644 index 0000000000000..0776be72c4d1d --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/kubernetes/semconv/stateful_set.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 { BUILT_IN_ID_PREFIX } from '../../constants'; +import { commonOtelIndexPatterns } from './otel_index_patterns'; +import { BuiltInDefinition } from '../../../../types'; + +export const builtInKubernetesStatefulSetSemConvEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_semconv`, + display_name: 'Kubernetes StatefulSets (OTEL)', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_semconv_semconv`, + type_id: `${BUILT_IN_ID_PREFIX}kubernetes_stateful_set_semconv`, + index_patterns: commonOtelIndexPatterns, + identity_fields: ['k8s.statefulset.uid'], + display_name: 'k8s.statefulset.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: ['k8s.statefulset.uid: *'], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/services_from_ecs_data.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/services_from_ecs_data.ts new file mode 100644 index 0000000000000..cc4b665666bb0 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/built_in/services_from_ecs_data.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { BuiltInDefinition } from '../../types'; +import { BUILT_IN_ID_PREFIX } from './constants'; + +export const builtInServicesFromEcsEntityDefinition: BuiltInDefinition = { + type: { + id: `${BUILT_IN_ID_PREFIX}services_from_ecs_data`, + display_name: 'Services', + }, + sources: [ + { + id: `${BUILT_IN_ID_PREFIX}services_from_ecs_data_ecs`, + type_id: `${BUILT_IN_ID_PREFIX}services_from_ecs_data`, + index_patterns: ['logs-*', 'filebeat*', 'traces-*'], + identity_fields: ['service.name'], + display_name: 'service.name', + timestamp_field: '@timestamp', + metadata_fields: [], + filters: [], + }, + ], +}; diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/install_built_in_definitions.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/install_built_in_definitions.ts new file mode 100644 index 0000000000000..e5535d6e35f1a --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/install_built_in_definitions.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IClusterClient, Logger } from '@kbn/core/server'; +import { storeTypeDefinition } from './type_definition'; +import { storeSourceDefinition } from './source_definition'; +import { builtInDefinitions } from './built_in'; +import { EntitySourceDefinition, EntityTypeDefinition } from '../types'; + +export async function installBuiltInDefinitions(clusterClient: IClusterClient, logger: Logger) { + logger.info('Installing built in entity definitions'); + + const types: EntityTypeDefinition[] = []; + const sources: EntitySourceDefinition[] = []; + for (const definition of builtInDefinitions) { + types.push(definition.type); + sources.push(...definition.sources); + } + + const typeInstallations = await Promise.allSettled( + types.map((type) => storeTypeDefinition({ type, clusterClient, logger, replace: true })) + ); + + typeInstallations.forEach((installation) => { + if (installation.status === 'rejected') { + logger.error(installation.reason); + } + }); + + const sourceInstallations = await Promise.allSettled( + sources.map((source) => + storeSourceDefinition({ + source, + clusterClient, + logger, + replace: true, + }) + ) + ); + + // This may fail because the type installation failed and storeSourceDefinition verifies that the type exists first + // It may also fail for other reasons but we continue in case there are more sources for the same type that might succeed + sourceInstallations.forEach((installation) => { + if (installation.status === 'rejected') { + logger.error(installation.reason); + } + }); +} diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/setup_entity_definitions_index.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/setup_entity_definitions_index.ts index b9e3f39a3dd62..4c43d68a4e116 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/setup_entity_definitions_index.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/setup_entity_definitions_index.ts @@ -6,8 +6,9 @@ */ import { errors } from '@elastic/elasticsearch'; -import { IClusterClient, Logger } from '@kbn/core/server'; +import { Logger } from '@kbn/core/server'; import { DEFINITIONS_ALIAS, TEMPLATE_VERSION } from '../constants'; +import { InternalClusterClient } from '../types'; const definitionsIndexTemplate = { name: `${DEFINITIONS_ALIAS}-template`, @@ -51,7 +52,10 @@ const definitionsIndexTemplate = { const CURRENT_INDEX = `${DEFINITIONS_ALIAS}-${TEMPLATE_VERSION}` as const; -export async function setupEntityDefinitionsIndex(clusterClient: IClusterClient, logger: Logger) { +export async function setupEntityDefinitionsIndex( + clusterClient: InternalClusterClient, + logger: Logger +) { const esClient = clusterClient.asInternalUser; try { logger.debug(`Installing entity definitions index template for version ${TEMPLATE_VERSION}`); diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/source_definition.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/source_definition.ts index 7ed1779708e54..eab219792295c 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/source_definition.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/source_definition.ts @@ -5,26 +5,53 @@ * 2.0. */ -import { IScopedClusterClient, Logger } from '@kbn/core/server'; +import { Logger } from '@kbn/core/server'; import { DEFINITIONS_ALIAS, TEMPLATE_VERSION } from '../constants'; -import { EntitySourceDefinition, StoredEntitySourceDefinition } from '../types'; +import { + EntitySourceDefinition, + InternalClusterClient, + StoredEntitySourceDefinition, +} from '../types'; import { SourceAs, runESQLQuery } from '../run_esql_query'; import { EntityDefinitionConflict } from '../errors/entity_definition_conflict'; +import { readTypeDefinitionById } from './type_definition'; +import { UnknownEntityType } from '../errors/unknown_entity_type'; -export async function storeSourceDefinition( - source: EntitySourceDefinition, - clusterClient: IScopedClusterClient, - logger: Logger -): Promise<EntitySourceDefinition> { +interface StoreSourceDefinitionOptions { + source: EntitySourceDefinition; + clusterClient: InternalClusterClient; + logger: Logger; + replace?: boolean; +} + +export async function storeSourceDefinition({ + source, + clusterClient, + logger, + replace = false, +}: StoreSourceDefinitionOptions): Promise<EntitySourceDefinition> { const esClient = clusterClient.asInternalUser; + try { + await readTypeDefinitionById(source.type_id, clusterClient, logger); + } catch (error) { + if (error instanceof UnknownEntityType) { + throw new UnknownEntityType( + `Type with ID ${source.type_id} not found, cannot attach source with ID ${source.id}` + ); + } + + throw error; + } + const sources = await runESQLQuery('fetch source definition for conflict check', { esClient, - query: `FROM ${DEFINITIONS_ALIAS} METADATA _id | WHERE definition_type == "source" AND _id == "source:${source.id}" | KEEP _id`, + query: `FROM ${DEFINITIONS_ALIAS} METADATA _id | WHERE definition_type == "source" AND _id == "${source.type_id}:${source.id}" | KEEP _id`, logger, }); - if (sources.length !== 0) { + if (sources.length !== 0 && replace === false) { + logger.debug(`Entity source definition with ID ${source.id} already exists`); throw new EntityDefinitionConflict('source', source.id); } @@ -34,10 +61,12 @@ export async function storeSourceDefinition( source, }; + logger.debug(`Installing entity source definition ${source.id} for type ${source.type_id}`); await esClient.index({ index: DEFINITIONS_ALIAS, - id: `source:${definition.source.id}`, + id: `${source.type_id}:${definition.source.id}`, document: definition, + refresh: 'wait_for', }); return definition.source; @@ -48,7 +77,7 @@ export interface ReadSourceDefinitionOptions { } export async function readSourceDefinitions( - clusterClient: IScopedClusterClient, + clusterClient: InternalClusterClient, logger: Logger, options?: ReadSourceDefinitionOptions ): Promise<EntitySourceDefinition[]> { diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/type_definition.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/type_definition.ts index 710e176a4a128..9b362a8df2b3e 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/type_definition.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/definitions/type_definition.ts @@ -5,26 +5,36 @@ * 2.0. */ -import { IScopedClusterClient, Logger } from '@kbn/core/server'; +import { Logger } from '@kbn/core/server'; import { DEFINITIONS_ALIAS, TEMPLATE_VERSION } from '../constants'; -import { EntityTypeDefinition, StoredEntityTypeDefinition } from '../types'; +import { EntityTypeDefinition, InternalClusterClient, StoredEntityTypeDefinition } from '../types'; import { SourceAs, runESQLQuery } from '../run_esql_query'; import { EntityDefinitionConflict } from '../errors/entity_definition_conflict'; +import { UnknownEntityType } from '../errors/unknown_entity_type'; -export async function storeTypeDefinition( - type: EntityTypeDefinition, - clusterClient: IScopedClusterClient, - logger: Logger -): Promise<EntityTypeDefinition> { +interface StoreTypeDefinitionOptions { + type: EntityTypeDefinition; + clusterClient: InternalClusterClient; + logger: Logger; + replace?: boolean; +} + +export async function storeTypeDefinition({ + type, + clusterClient, + logger, + replace = false, +}: StoreTypeDefinitionOptions): Promise<EntityTypeDefinition> { const esClient = clusterClient.asInternalUser; const types = await runESQLQuery('fetch type definition for conflict check', { esClient, - query: `FROM ${DEFINITIONS_ALIAS} METADATA _id | WHERE definition_type == "type" AND _id == "type:${type.id}" | KEEP _id`, + query: `FROM ${DEFINITIONS_ALIAS} METADATA _id | WHERE definition_type == "type" AND _id == "${type.id}" | KEEP _id`, logger, }); - if (types.length !== 0) { + if (types.length !== 0 && replace === false) { + logger.debug(`Entity type definition with ID ${type.id} already exists`); throw new EntityDefinitionConflict('type', type.id); } @@ -34,17 +44,19 @@ export async function storeTypeDefinition( type, }; + logger.debug(`Installing entity type definition ${type.id}`); await esClient.index({ index: DEFINITIONS_ALIAS, - id: `type:${definition.type.id}`, + id: `${definition.type.id}`, document: definition, + refresh: 'wait_for', }); return definition.type; } export async function readTypeDefinitions( - clusterClient: IScopedClusterClient, + clusterClient: InternalClusterClient, logger: Logger ): Promise<EntityTypeDefinition[]> { const esClient = clusterClient.asInternalUser; @@ -60,3 +72,26 @@ export async function readTypeDefinitions( return types.map((storedTypeDefinition) => storedTypeDefinition._source.type); } + +export async function readTypeDefinitionById( + id: string, + clusterClient: InternalClusterClient, + logger: Logger +): Promise<EntityTypeDefinition> { + const esClient = clusterClient.asInternalUser; + + const types = await runESQLQuery<SourceAs<StoredEntityTypeDefinition>>( + 'fetch type definition by ID', + { + esClient, + query: `FROM ${DEFINITIONS_ALIAS} METADATA _id,_source | WHERE definition_type == "type" AND _id == "${id}" | KEEP _source`, + logger, + } + ); + + if (types.length === 0) { + throw new UnknownEntityType(`Type with ID ${id} not found`); + } + + return types[0]._source.type; +} diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/entity_client.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/entity_client.ts index bb40fc2849a46..1cc83c0b27560 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/entity_client.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/entity_client.ts @@ -8,7 +8,6 @@ import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import { IScopedClusterClient, Logger } from '@kbn/core/server'; import { EntityV2 } from '@kbn/entities-schema'; -import { without } from 'lodash'; import { ReadSourceDefinitionOptions, readSourceDefinitions, @@ -16,7 +15,7 @@ import { } from './definitions/source_definition'; import { readTypeDefinitions, storeTypeDefinition } from './definitions/type_definition'; import { getEntityInstancesQuery } from './queries'; -import { mergeEntitiesList } from './queries/utils'; +import { mergeEntitiesList, sortEntitiesList } from './queries/utils'; import { EntitySourceDefinition, EntityTypeDefinition, @@ -25,6 +24,7 @@ import { } from './types'; import { UnknownEntityType } from './errors/unknown_entity_type'; import { runESQLQuery } from './run_esql_query'; +import { validateFields } from './validate_fields'; export class EntityClient { constructor( @@ -59,76 +59,71 @@ export class EntityClient { sort, limit, }: SearchBySources) { - const entities = await Promise.all( - sources.map(async (source) => { - const mandatoryFields = [ - ...source.identity_fields, - ...(source.timestamp_field ? [source.timestamp_field] : []), - ...(source.display_name ? [source.display_name] : []), - ]; - const metaFields = [...metadataFields, ...source.metadata_fields]; - - // operations on an unmapped field result in a failing query so we verify - // field capabilities beforehand - const { fields } = await this.options.clusterClient.asCurrentUser.fieldCaps({ - index: source.index_patterns, - fields: [...mandatoryFields, ...metaFields], - }); - - const sourceHasMandatoryFields = mandatoryFields.every((field) => !!fields[field]); - if (!sourceHasMandatoryFields) { - // we can't build entities without id fields so we ignore the source. - // TODO filters should likely behave similarly. we should also throw - const missingFields = mandatoryFields.filter((field) => !fields[field]); - this.options.logger.info( - `Ignoring source for type [${source.type_id}] with index_patterns [${ - source.index_patterns - }] because some mandatory fields [${missingFields.join(', ')}] are not mapped` - ); - return []; - } - - // but metadata field not being available is fine - const availableMetadataFields = metaFields.filter((field) => fields[field]); - if (availableMetadataFields.length < metaFields.length) { - this.options.logger.info( - `Ignoring unmapped fields [${without(metaFields, ...availableMetadataFields).join( - ', ' - )}]` - ); - } - - const { query, filter } = getEntityInstancesQuery({ - source: { - ...source, - metadata_fields: availableMetadataFields, - filters: [...source.filters, ...filters], - }, - start, - end, - sort, - limit, - }); - this.options.logger.debug( - () => `Entity query: ${query}\nfilter: ${JSON.stringify(filter, null, 2)}` - ); - - const rawEntities = await runESQLQuery<EntityV2>('resolve entities', { - query, - filter, - esClient: this.options.clusterClient.asCurrentUser, - logger: this.options.logger, - }); - - return rawEntities; - }) - ).then((results) => results.flat()); - - return mergeEntitiesList(sources, entities).slice(0, limit); + const searches = sources.map(async (source) => { + const availableMetadataFields = await validateFields({ + source, + metadataFields, + esClient: this.options.clusterClient.asCurrentUser, + logger: this.options.logger, + }); + + const { query, filter } = getEntityInstancesQuery({ + source: { + ...source, + metadata_fields: availableMetadataFields, + filters: [...source.filters, ...filters], + }, + start, + end, + sort, + limit, + }); + this.options.logger.debug( + () => `Entity query: ${query}\nfilter: ${JSON.stringify(filter, null, 2)}` + ); + + const rawEntities = await runESQLQuery<EntityV2>('resolve entities', { + query, + filter, + esClient: this.options.clusterClient.asCurrentUser, + logger: this.options.logger, + }); + + return rawEntities; + }); + + const results = await Promise.allSettled(searches); + const entities = ( + results.filter((result) => result.status === 'fulfilled') as Array< + PromiseFulfilledResult<EntityV2[]> + > + ).flatMap((result) => result.value); + const errors = ( + results.filter((result) => result.status === 'rejected') as PromiseRejectedResult[] + ).map((result) => result.reason.message); + + if (sources.length === 1) { + return { entities, errors }; + } + + // we have to manually merge, sort and limit entities since we run + // independant queries for each source + return { + errors, + entities: sortEntitiesList({ + sources, + sort, + entities: mergeEntitiesList({ entities, sources, metadataFields }), + }).slice(0, limit), + }; } async storeTypeDefinition(type: EntityTypeDefinition) { - return storeTypeDefinition(type, this.options.clusterClient, this.options.logger); + return storeTypeDefinition({ + type, + clusterClient: this.options.clusterClient, + logger: this.options.logger, + }); } async readTypeDefinitions() { @@ -136,7 +131,11 @@ export class EntityClient { } async storeSourceDefinition(source: EntitySourceDefinition) { - return storeSourceDefinition(source, this.options.clusterClient, this.options.logger); + return storeSourceDefinition({ + source, + clusterClient: this.options.clusterClient, + logger: this.options.logger, + }); } async readSourceDefinitions(options?: ReadSourceDefinitionOptions) { diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.test.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.test.ts index 9bc475d031923..3ec87b220f84c 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.test.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.test.ts @@ -29,7 +29,7 @@ describe('getEntityInstancesQuery', () => { expect(query).toEqual( 'FROM logs-*, metrics-* | ' + - 'STATS host.name = VALUES(host.name::keyword), entity.last_seen_timestamp = MAX(custom_timestamp_field), service.id = MAX(service.id::keyword) BY service.name::keyword | ' + + 'STATS host.name = TOP(host.name::keyword, 10, "asc"), entity.last_seen_timestamp = MAX(custom_timestamp_field), service.id = MAX(service.id::keyword) BY service.name::keyword | ' + 'RENAME `service.name::keyword` AS service.name | ' + 'EVAL entity.type = "service", entity.id = service.name, entity.display_name = COALESCE(service.id, entity.id) | ' + 'SORT entity.id DESC | ' + diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.ts index 5ce7a54eb1d1c..8814b907f7d38 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/index.ts @@ -6,7 +6,7 @@ */ import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; -import { asKeyword } from './utils'; +import { asKeyword, defaultSort } from './utils'; import { EntitySourceDefinition, SortBy } from '../types'; const sourceCommand = ({ source }: { source: EntitySourceDefinition }) => { @@ -46,7 +46,7 @@ const dslFilter = ({ const statsCommand = ({ source }: { source: EntitySourceDefinition }) => { const aggs = source.metadata_fields .filter((field) => !source.identity_fields.some((idField) => idField === field)) - .map((field) => `${field} = VALUES(${asKeyword(field)})`); + .map((field) => `${field} = TOP(${asKeyword(field)}, 10, "asc")`); if (source.timestamp_field) { aggs.push(`entity.last_seen_timestamp = MAX(${source.timestamp_field})`); @@ -84,15 +84,11 @@ const evalCommand = ({ source }: { source: EntitySourceDefinition }) => { }; const sortCommand = ({ source, sort }: { source: EntitySourceDefinition; sort?: SortBy }) => { - if (sort) { - return `SORT ${sort.field} ${sort.direction}`; + if (!sort) { + sort = defaultSort([source]); } - if (source.timestamp_field) { - return `SORT entity.last_seen_timestamp DESC`; - } - - return `SORT entity.id ASC`; + return `SORT ${sort.field} ${sort.direction}`; }; export function getEntityInstancesQuery({ diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.test.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.test.ts index 295ab7796585c..2aee58828defa 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.test.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.test.ts @@ -17,22 +17,32 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', }, { 'entity.id': 'foo', 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', }, ]; - const mergedEntities = mergeEntitiesList([], entities); + const mergedEntities = mergeEntitiesList({ + entities, + metadataFields: [], + sources: [ + { identity_fields: ['service.name'], metadata_fields: ['only_in_record_1'] }, + { identity_fields: ['service.name'], metadata_fields: ['only_in_record_2'] }, + ] as EntitySourceDefinition[], + }); expect(mergedEntities.length).toEqual(1); expect(mergedEntities[0]).toEqual({ 'entity.id': 'foo', 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', }); }); @@ -43,6 +53,7 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-1', 'agent.name': 'agent-1', 'service.environment': ['dev', 'staging'], @@ -53,6 +64,7 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': ['host-2', 'host-3'], 'agent.name': 'agent-2', 'service.environment': 'prod', @@ -60,23 +72,21 @@ describe('mergeEntitiesList', () => { }, ]; - const mergedEntities = mergeEntitiesList( - [ - { - metadata_fields: ['host.name', 'agent.name', 'service.environment', 'only_in_record_1'], - }, - { - metadata_fields: ['host.name', 'agent.name', 'service.environment', 'only_in_record_2'], - }, + const mergedEntities = mergeEntitiesList({ + entities, + metadataFields: ['host.name', 'agent.name', 'service.environment'], + sources: [ + { identity_fields: ['service.name'], metadata_fields: ['only_in_record_1'] }, + { identity_fields: ['service.name'], metadata_fields: ['only_in_record_2'] }, ] as EntitySourceDefinition[], - entities - ); + }); expect(mergedEntities.length).toEqual(1); expect(mergedEntities[0]).toEqual({ 'entity.id': 'foo', 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': ['host-1', 'host-2', 'host-3'], 'agent.name': ['agent-1', 'agent-2'], 'service.environment': ['dev', 'staging', 'prod'], @@ -92,6 +102,7 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-1', }, { @@ -99,6 +110,7 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T20:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-2', }, { @@ -106,33 +118,33 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T16:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-3', }, { 'entity.id': 'foo', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-3', }, ]; - const mergedEntities = mergeEntitiesList( - [ - { - metadata_fields: ['host.name'], - }, - { - metadata_fields: ['host.name'], - }, + const mergedEntities = mergeEntitiesList({ + entities, + metadataFields: ['host.name'], + sources: [ + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, ] as EntitySourceDefinition[], - entities - ); + }); expect(mergedEntities.length).toEqual(1); expect(mergedEntities[0]).toEqual({ 'entity.id': 'foo', 'entity.last_seen_timestamp': '2024-11-20T20:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': ['host-1', 'host-2', 'host-3'], }); }); @@ -143,28 +155,32 @@ describe('mergeEntitiesList', () => { 'entity.id': 'foo', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-1', }, { 'entity.id': 'foo', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-2', }, ]; - const mergedEntities = mergeEntitiesList( - [ - { metadata_fields: ['host.name'] }, - { metadata_fields: ['host.name'] }, + const mergedEntities = mergeEntitiesList({ + entities, + metadataFields: ['host.name'], + sources: [ + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, ] as EntitySourceDefinition[], - entities - ); + }); expect(mergedEntities.length).toEqual(1); expect(mergedEntities[0]).toEqual({ 'entity.id': 'foo', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': ['host-1', 'host-2'], }); }); @@ -176,6 +192,7 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-1', }, { @@ -183,6 +200,7 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T20:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': 'host-2', }, { @@ -190,29 +208,74 @@ describe('mergeEntitiesList', () => { 'entity.last_seen_timestamp': '2024-11-20T16:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': ['host-1', 'host-2'], }, ]; - const mergedEntities = mergeEntitiesList( - [ - { - metadata_fields: ['host.name'], - }, - { - metadata_fields: ['host.name'], - }, + const mergedEntities = mergeEntitiesList({ + entities, + metadataFields: ['host.name'], + sources: [ + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, ] as EntitySourceDefinition[], - entities - ); + }); expect(mergedEntities.length).toEqual(1); expect(mergedEntities[0]).toEqual({ 'entity.id': 'foo', 'entity.last_seen_timestamp': '2024-11-20T20:00:00.000Z', 'entity.type': 'service', 'entity.display_name': 'foo', + 'service.name': 'foo', 'host.name': ['host-1', 'host-2'], }); }); + + it('assigns all identity fields to the merged entity', () => { + const entities = [ + { + 'entity.id': 'foo', + 'entity.last_seen_timestamp': '2024-11-20T18:00:00.000Z', + 'entity.type': 'service', + 'entity.display_name': 'foo', + 'service.name': 'foo', + }, + { + 'entity.id': 'foo', + 'entity.last_seen_timestamp': '2024-11-20T20:00:00.000Z', + 'entity.type': 'service', + 'entity.display_name': 'foo', + servicename_field: 'foo', + }, + { + 'entity.id': 'foo', + 'entity.last_seen_timestamp': '2024-11-20T16:00:00.000Z', + 'entity.type': 'service', + 'entity.display_name': 'foo', + service_name: 'foo', + }, + ]; + + const mergedEntities = mergeEntitiesList({ + entities, + metadataFields: [], + sources: [ + { identity_fields: ['service.name'], metadata_fields: [] as string[] }, + { identity_fields: ['servicename_field'], metadata_fields: [] as string[] }, + { identity_fields: ['service_name'], metadata_fields: [] as string[] }, + ] as EntitySourceDefinition[], + }); + expect(mergedEntities.length).toEqual(1); + expect(mergedEntities[0]).toEqual({ + 'entity.id': 'foo', + 'entity.last_seen_timestamp': '2024-11-20T20:00:00.000Z', + 'entity.type': 'service', + 'entity.display_name': 'foo', + 'service.name': 'foo', + servicename_field: 'foo', + service_name: 'foo', + }); + }); }); }); diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.ts index 5d1ebf3001434..c08d5adb3ce4d 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/queries/utils.ts @@ -6,8 +6,8 @@ */ import { EntityV2 } from '@kbn/entities-schema'; -import { compact, uniq } from 'lodash'; -import { EntitySourceDefinition } from '../types'; +import { orderBy, uniq } from 'lodash'; +import { EntitySourceDefinition, SortBy } from '../types'; function getLatestDate(date1?: string, date2?: string) { if (!date1 && !date2) return; @@ -17,7 +17,12 @@ function getLatestDate(date1?: string, date2?: string) { ).toISOString(); } -function mergeEntities(metadataFields: string[], entity1: EntityV2, entity2: EntityV2): EntityV2 { +function mergeEntities( + identityFields: string[], + mergeableFields: string[], + entity1: EntityV2, + entity2: EntityV2 +): EntityV2 { const merged: EntityV2 = { ...entity1 }; const latestTimestamp = getLatestDate( @@ -29,13 +34,17 @@ function mergeEntities(metadataFields: string[], entity1: EntityV2, entity2: Ent } for (const [key, value] of Object.entries(entity2).filter(([_key]) => - metadataFields.includes(_key) + mergeableFields.includes(_key) )) { if (merged[key]) { - merged[key] = uniq([ - ...(Array.isArray(merged[key]) ? merged[key] : [merged[key]]), - ...(Array.isArray(value) ? value : [value]), - ]); + // we want to keep identity fields as single-value properties. + // this can happen if two sources group by the same identity + if (!identityFields.includes(key)) { + merged[key] = uniq([ + ...(Array.isArray(merged[key]) ? merged[key] : [merged[key]]), + ...(Array.isArray(value) ? value : [value]), + ]); + } } else { merged[key] = value; } @@ -43,13 +52,21 @@ function mergeEntities(metadataFields: string[], entity1: EntityV2, entity2: Ent return merged; } -export function mergeEntitiesList( - sources: EntitySourceDefinition[], - entities: EntityV2[] -): EntityV2[] { - const metadataFields = uniq( - sources.flatMap((source) => compact([source.timestamp_field, ...source.metadata_fields])) - ); +export function mergeEntitiesList({ + entities, + sources, + metadataFields, +}: { + entities: EntityV2[]; + sources: EntitySourceDefinition[]; + metadataFields: string[]; +}): EntityV2[] { + const identityFields = uniq([...sources.flatMap((source) => source.identity_fields)]); + const mergeableFields = uniq([ + ...identityFields, + ...metadataFields, + ...sources.flatMap((source) => source.metadata_fields), + ]); const instances: { [key: string]: EntityV2 } = {}; for (let i = 0; i < entities.length; i++) { @@ -57,7 +74,7 @@ export function mergeEntitiesList( const id = entity['entity.id']; if (instances[id]) { - instances[id] = mergeEntities(metadataFields, instances[id], entity); + instances[id] = mergeEntities(identityFields, mergeableFields, instances[id], entity); } else { instances[id] = entity; } @@ -66,6 +83,30 @@ export function mergeEntitiesList( return Object.values(instances); } +export function sortEntitiesList({ + entities, + sources, + sort, +}: { + entities: EntityV2[]; + sources: EntitySourceDefinition[]; + sort?: SortBy; +}) { + if (!sort) { + sort = defaultSort(sources); + } + + return orderBy(entities, sort.field, sort.direction.toLowerCase() as 'asc' | 'desc'); +} + export function asKeyword(field: string) { return `${field}::keyword`; } + +export function defaultSort(sources: EntitySourceDefinition[]): SortBy { + if (sources.some((source) => source.timestamp_field)) { + return { field: 'entity.last_seen_timestamp', direction: 'DESC' }; + } + + return { field: 'entity.id', direction: 'ASC' }; +} diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/types.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/types.ts index e9815942592de..f3db5840e7a6a 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/types.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/types.ts @@ -5,13 +5,17 @@ * 2.0. */ +import { IClusterClient } from '@kbn/core/server'; import { z } from '@kbn/zod'; import moment from 'moment'; +export type InternalClusterClient = Pick<IClusterClient, 'asInternalUser'>; + // Definitions export const entityTypeDefinitionRt = z.object({ id: z.string(), + display_name: z.string(), }); export type EntityTypeDefinition = z.TypeOf<typeof entityTypeDefinitionRt>; @@ -29,6 +33,11 @@ export const entitySourceDefinitionRt = z.object({ export type EntitySourceDefinition = z.TypeOf<typeof entitySourceDefinitionRt>; +export interface BuiltInDefinition { + type: EntityTypeDefinition; + sources: EntitySourceDefinition[]; +} + // Stored definitions export type DefinitionType = 'type' | 'source'; @@ -74,6 +83,8 @@ const searchCommonRt = z.object({ filters: z.optional(z.array(z.string())).default([]), }); +export type SearchCommon = z.output<typeof searchCommonRt>; + export const searchByTypeRt = z.intersection( searchCommonRt, z.object({ diff --git a/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/validate_fields.ts b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/validate_fields.ts new file mode 100644 index 0000000000000..f24cee745ffd7 --- /dev/null +++ b/x-pack/platform/plugins/shared/entity_manager/server/lib/v2/validate_fields.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { without } from 'lodash'; +import { Logger } from '@kbn/logging'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { EntitySourceDefinition } from './types'; + +// verifies field capabilities of the provided source. +// we map source fields in two categories: +// - mandatory: those are necessary for building entities according to the +// source definition (identity_fields, timestamp_field and display_name). +// unmapped mandatory field throws an error +// - optional: the requested metadata fields. unmapped metadata field is not +// fatal, we simply ignore it +// returns the available metadata fields. +export async function validateFields({ + esClient, + source, + metadataFields, + logger, +}: { + esClient: ElasticsearchClient; + source: EntitySourceDefinition; + metadataFields: string[]; + logger: Logger; +}) { + const mandatoryFields = [ + ...source.identity_fields, + ...(source.timestamp_field ? [source.timestamp_field] : []), + ...(source.display_name ? [source.display_name] : []), + ]; + const metaFields = [...metadataFields, ...source.metadata_fields]; + + const { fields } = await esClient + .fieldCaps({ + index: source.index_patterns, + fields: [...mandatoryFields, ...metaFields], + }) + .catch((err) => { + if (err.meta?.statusCode === 404) { + throw new Error( + `No index found for source [${ + source.id + }] with index patterns [${source.index_patterns.join(', ')}]` + ); + } + throw err; + }); + + const sourceHasMandatoryFields = mandatoryFields.every((field) => !!fields[field]); + if (!sourceHasMandatoryFields) { + // TODO filters should likely behave similarly + const missingFields = mandatoryFields.filter((field) => !fields[field]); + throw new Error( + `Mandatory fields [${missingFields.join(', ')}] are not mapped for source [${ + source.id + }] with index patterns [${source.index_patterns.join(', ')}]` + ); + } + + // operations on an unmapped field result in a failing query + const availableMetadataFields = metaFields.filter((field) => fields[field]); + if (availableMetadataFields.length < metaFields.length) { + logger.info( + `Ignoring unmapped metadata fields [${without(metaFields, ...availableMetadataFields).join( + ', ' + )}] for source [${source.id}]` + ); + } + return availableMetadataFields; +} diff --git a/x-pack/platform/plugins/shared/entity_manager/server/plugin.ts b/x-pack/platform/plugins/shared/entity_manager/server/plugin.ts index d2e9d12a33797..fed5b1c4df458 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/plugin.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/plugin.ts @@ -39,6 +39,7 @@ import { READ_ENTITY_SOURCE_DEFINITION_PRIVILEGE, READ_ENTITIES_PRIVILEGE, } from './lib/v2/constants'; +import { installBuiltInDefinitions } from './lib/v2/definitions/install_built_in_definitions'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface EntityManagerServerPluginSetup {} @@ -165,10 +166,11 @@ export class EntityManagerServerPlugin this.server.encryptedSavedObjects = plugins.encryptedSavedObjects; } - const esClient = core.elasticsearch.client.asInternalUser; - // Setup v1 definitions index - installEntityManagerTemplates({ esClient, logger: this.logger }) + installEntityManagerTemplates({ + esClient: core.elasticsearch.client.asInternalUser, + logger: this.logger, + }) .then(async () => { // the api key validation requires a check against the cluster license // which is lazily loaded. we ensure it gets loaded before the update @@ -185,9 +187,11 @@ export class EntityManagerServerPlugin .catch((err) => this.logger.error(err)); // Setup v2 definitions index - setupEntityDefinitionsIndex(core.elasticsearch.client, this.logger).catch((error) => { - this.logger.error(error); - }); + setupEntityDefinitionsIndex(core.elasticsearch.client, this.logger) + .then(() => installBuiltInDefinitions(core.elasticsearch.client, this.logger)) + .catch((error) => { + this.logger.error(error); + }); return { getScopedClient: async ({ request }: { request: KibanaRequest }) => { diff --git a/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/search.ts b/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/search.ts index 82d0e5e84f2da..a2ebb26da715f 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/search.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/search.ts @@ -24,9 +24,9 @@ export const searchEntitiesRoute = createEntityManagerServerRoute({ handler: async ({ request, response, params, logger, getScopedClient }) => { try { const client = await getScopedClient({ request }); - const entities = await client.v2.searchEntities(params.body); + const result = await client.v2.searchEntities(params.body); - return response.ok({ body: { entities } }); + return response.ok({ body: result }); } catch (e) { logger.error(e); @@ -51,9 +51,9 @@ export const searchEntitiesPreviewRoute = createEntityManagerServerRoute({ }), handler: async ({ request, response, params, getScopedClient }) => { const client = await getScopedClient({ request }); - const entities = await client.v2.searchEntitiesBySources(params.body); + const result = await client.v2.searchEntitiesBySources(params.body); - return response.ok({ body: { entities } }); + return response.ok({ body: result }); }, }); diff --git a/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/source_definition_routes.ts b/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/source_definition_routes.ts index 4fdfa281cfd72..c02627f889939 100644 --- a/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/source_definition_routes.ts +++ b/x-pack/platform/plugins/shared/entity_manager/server/routes/v2/source_definition_routes.ts @@ -13,6 +13,7 @@ import { import { entitySourceDefinitionRt } from '../../lib/v2/types'; import { createEntityManagerServerRoute } from '../create_entity_manager_server_route'; import { EntityDefinitionConflict } from '../../lib/v2/errors/entity_definition_conflict'; +import { UnknownEntityType } from '../../lib/v2/errors/unknown_entity_type'; const createSourceDefinitionRoute = createEntityManagerServerRoute({ endpoint: 'POST /internal/entities/v2/definitions/sources', @@ -40,8 +41,16 @@ const createSourceDefinitionRoute = createEntityManagerServerRoute({ }, }); } catch (error) { + if (error instanceof UnknownEntityType) { + return response.notFound({ + body: { + message: error.message, + }, + }); + } + if (error instanceof EntityDefinitionConflict) { - response.conflict({ + return response.conflict({ body: { message: error.message, }, diff --git a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts index b5d380fa9aac6..c65720aae2e48 100644 --- a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts +++ b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts @@ -12,6 +12,7 @@ import { ChatCompletionEventType, } from '@kbn/inference-common'; import { createOutputApi } from './create_output_api'; +import { createToolValidationError } from '../../server/chat_complete/errors'; describe('createOutputApi', () => { let chatComplete: jest.Mock; @@ -119,4 +120,80 @@ describe('createOutputApi', () => { }, ]); }); + + describe('when using retry', () => { + const unvalidatedFailedToolCall = { + function: { + name: 'myFunction', + arguments: JSON.stringify({ foo: 'bar' }), + }, + toolCallId: 'foo', + }; + + const validationError = createToolValidationError('Validation failed', { + toolCalls: [unvalidatedFailedToolCall], + }); + + it('retries once when onValidationError is a boolean', async () => { + chatComplete.mockRejectedValueOnce(validationError); + chatComplete.mockResolvedValueOnce( + Promise.resolve({ content: 'retried content', toolCalls: [unvalidatedFailedToolCall] }) + ); + + const output = createOutputApi(chatComplete); + + const response = await output({ + id: 'retry-id', + stream: false, + connectorId: '.retry-connector', + input: 'input message', + retry: { + onValidationError: true, + }, + }); + + expect(chatComplete).toHaveBeenCalledTimes(2); + expect(response).toEqual({ + id: 'retry-id', + content: 'retried content', + output: unvalidatedFailedToolCall.function.arguments, + }); + }); + + it('retries the number of specified attempts', async () => { + chatComplete.mockRejectedValue(validationError); + + const output = createOutputApi(chatComplete); + + await expect( + output({ + id: 'retry-id', + stream: false, + connectorId: '.retry-connector', + input: 'input message', + retry: { + onValidationError: 2, + }, + }) + ).rejects.toThrow('Validation failed'); + + expect(chatComplete).toHaveBeenCalledTimes(3); + }); + + it('throws an error if retry is provided in streaming mode', () => { + const output = createOutputApi(chatComplete); + + expect(() => + output({ + id: 'stream-retry-id', + stream: true, + connectorId: '.stream-retry-connector', + input: 'input message', + retry: { + onValidationError: 1, + }, + }) + ).toThrowError('Retry options are not supported in streaming mode'); + }); + }); }); diff --git a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts index d263f733bf4ee..3e65cb283dd45 100644 --- a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts +++ b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts @@ -10,17 +10,22 @@ import { ChatCompletionEventType, MessageRole, OutputAPI, + OutputCompositeResponse, OutputEventType, OutputOptions, ToolSchema, + isToolValidationError, withoutTokenCountEvents, } from '@kbn/inference-common'; import { isObservable, map } from 'rxjs'; import { ensureMultiTurn } from '../utils/ensure_multi_turn'; +type DefaultOutputOptions = OutputOptions<string, ToolSchema | undefined, boolean>; + export function createOutputApi(chatCompleteApi: ChatCompleteAPI): OutputAPI; + export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { - return ({ + return function callOutputApi({ id, connectorId, input, @@ -29,19 +34,26 @@ export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { previousMessages, functionCalling, stream, - }: OutputOptions<string, ToolSchema | undefined, boolean>) => { + retry, + }: DefaultOutputOptions): OutputCompositeResponse<string, ToolSchema | undefined, boolean> { + if (stream && retry !== undefined) { + throw new Error(`Retry options are not supported in streaming mode`); + } + + const messages = ensureMultiTurn([ + ...(previousMessages || []), + { + role: MessageRole.User, + content: input, + }, + ]); + const response = chatCompleteApi({ connectorId, stream, functionCalling, system, - messages: ensureMultiTurn([ - ...(previousMessages || []), - { - role: MessageRole.User, - content: input, - }, - ]), + messages, ...(schema ? { tools: { @@ -79,16 +91,55 @@ export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { }) ); } else { - return response.then((chatResponse) => { - return { - id, - content: chatResponse.content, - output: - chatResponse.toolCalls.length && 'arguments' in chatResponse.toolCalls[0].function - ? chatResponse.toolCalls[0].function.arguments - : undefined, - }; - }); + return response.then( + (chatResponse) => { + return { + id, + content: chatResponse.content, + output: + chatResponse.toolCalls.length && 'arguments' in chatResponse.toolCalls[0].function + ? chatResponse.toolCalls[0].function.arguments + : undefined, + }; + }, + (error: Error) => { + if (isToolValidationError(error) && retry?.onValidationError) { + const retriesLeft = + typeof retry.onValidationError === 'number' ? retry.onValidationError : 1; + + return callOutputApi({ + id, + connectorId, + input, + schema, + system, + previousMessages: messages.concat( + { + role: MessageRole.Assistant as const, + content: '', + toolCalls: error.meta.toolCalls!, + }, + ...(error.meta.toolCalls?.map((toolCall) => { + return { + name: toolCall.function.name, + role: MessageRole.Tool as const, + toolCallId: toolCall.toolCallId, + response: { + error: error.meta, + }, + }; + }) ?? []) + ), + functionCalling, + stream: false, + retry: { + onValidationError: retriesLeft - 1, + }, + }) as OutputCompositeResponse<string, ToolSchema | undefined, false>; + } + throw error; + } + ); } }; } diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts index ca6f60dd45a55..565727b7f57fe 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts @@ -170,6 +170,7 @@ describe('bedrockClaudeAdapter', () => { ], }, { + name: 'my_function', role: MessageRole.Tool, toolCallId: '0', response: { diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts index c3410b2af3623..95a46f73d5d1f 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts @@ -172,6 +172,7 @@ describe('geminiAdapter', () => { ], }, { + name: 'my_function', role: MessageRole.Tool, toolCallId: '0', response: { diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts index 2d0154313b632..48544f1bb0fb1 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts @@ -142,6 +142,7 @@ describe('openAIAdapter', () => { ], }, { + name: 'my_function', role: MessageRole.Tool, toolCallId: '0', response: { diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts index fa412f335800d..49b6bb5142023 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts @@ -58,7 +58,6 @@ export const openAIAdapter: InferenceConnectorAdapter = { request = { stream, messages: messagesToOpenAI({ system: wrapped.system, messages: wrapped.messages }), - temperature: 0, }; } else { request = { @@ -66,7 +65,6 @@ export const openAIAdapter: InferenceConnectorAdapter = { messages: messagesToOpenAI({ system, messages }), tool_choice: toolChoiceToOpenAI(toolChoice), tools: toolsToOpenAI(tools), - temperature: 0, }; } diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts index 13b1c8d87270c..e58c94759e165 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { last } from 'lodash'; +import { last, omit } from 'lodash'; import { defer, switchMap, throwError } from 'rxjs'; import type { Logger } from '@kbn/logging'; import type { KibanaRequest } from '@kbn/core-http-server'; @@ -51,14 +51,26 @@ export function createChatCompleteApi({ request, actions, logger }: CreateChatCo const connectorType = connector.type; const inferenceAdapter = getInferenceAdapter(connectorType); + const messagesWithoutData = messages.map((message) => omit(message, 'data')); + if (!inferenceAdapter) { return throwError(() => createInferenceRequestError(`Adapter for type ${connectorType} not implemented`, 400) ); } - logger.debug(() => `Sending request: ${JSON.stringify(last(messages))}`); - logger.trace(() => JSON.stringify({ messages, toolChoice, tools, system })); + logger.debug( + () => `Sending request, last message is: ${JSON.stringify(last(messagesWithoutData))}` + ); + + logger.trace(() => + JSON.stringify({ + messages: messagesWithoutData, + toolChoice, + tools, + system, + }) + ); return inferenceAdapter.chatComplete({ system, diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/errors.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/errors.ts index a830f57fec559..00ef2d90ca1f7 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/errors.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/errors.ts @@ -44,7 +44,7 @@ export function createToolValidationError( name?: string; arguments?: string; errorsText?: string; - toolCalls?: UnvalidatedToolCall[]; + toolCalls: UnvalidatedToolCall[]; } ): ChatCompletionToolValidationError { return new InferenceTaskError(ChatCompletionErrorCode.ToolValidationError, message, meta); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/simulated_function_calling/wrap_with_simulated_function_calling.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/simulated_function_calling/wrap_with_simulated_function_calling.ts index 4eb6cfd8d50e1..d2cb0bfae4999 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/simulated_function_calling/wrap_with_simulated_function_calling.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/simulated_function_calling/wrap_with_simulated_function_calling.ts @@ -79,7 +79,7 @@ export function wrapWithSimulatedFunctionCalling({ }; } -const convertToolResponseMessage = (message: ToolMessage<unknown>): UserMessage => { +const convertToolResponseMessage = (message: ToolMessage): UserMessage => { return { role: MessageRole.User, content: JSON.stringify({ diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.test.ts index c6e5b032120a3..f7c1115305f57 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.test.ts @@ -183,7 +183,7 @@ describe('chunksIntoMessage', () => { } await expect(async () => getMessage()).rejects.toThrowErrorMatchingInlineSnapshot( - `"Tool call arguments for myFunction were invalid"` + `"Tool call arguments for myFunction (001) were invalid"` ); }); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.ts index fe9b745f442fc..77c4164348cc6 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/chunks_into_message.ts @@ -5,17 +5,17 @@ * 2.0. */ -import { last, map, merge, OperatorFunction, scan, share } from 'rxjs'; -import type { Logger } from '@kbn/logging'; import { - UnvalidatedToolCall, - ToolOptions, ChatCompletionChunkEvent, ChatCompletionEventType, ChatCompletionMessageEvent, ChatCompletionTokenCountEvent, + ToolOptions, + UnvalidatedToolCall, withoutTokenCountEvents, } from '@kbn/inference-common'; +import type { Logger } from '@kbn/logging'; +import { OperatorFunction, map, merge, share, toArray } from 'rxjs'; import { validateToolCalls } from '../../util/validate_tool_calls'; export function chunksIntoMessage<TToolOptions extends ToolOptions>({ @@ -37,38 +37,36 @@ export function chunksIntoMessage<TToolOptions extends ToolOptions>({ shared$, shared$.pipe( withoutTokenCountEvents(), - scan( - (prev, chunk) => { - prev.content += chunk.content ?? ''; + toArray(), + map((chunks): ChatCompletionMessageEvent<TToolOptions> => { + const concatenatedChunk = chunks.reduce( + (prev, chunk) => { + prev.content += chunk.content ?? ''; + + chunk.tool_calls?.forEach((toolCall) => { + let prevToolCall = prev.tool_calls[toolCall.index]; + if (!prevToolCall) { + prev.tool_calls[toolCall.index] = { + function: { + name: '', + arguments: '', + }, + toolCallId: '', + }; - chunk.tool_calls?.forEach((toolCall) => { - let prevToolCall = prev.tool_calls[toolCall.index]; - if (!prevToolCall) { - prev.tool_calls[toolCall.index] = { - function: { - name: '', - arguments: '', - }, - toolCallId: '', - }; + prevToolCall = prev.tool_calls[toolCall.index]; + } - prevToolCall = prev.tool_calls[toolCall.index]; - } + prevToolCall.function.name += toolCall.function.name; + prevToolCall.function.arguments += toolCall.function.arguments; + prevToolCall.toolCallId += toolCall.toolCallId; + }); - prevToolCall.function.name += toolCall.function.name; - prevToolCall.function.arguments += toolCall.function.arguments; - prevToolCall.toolCallId += toolCall.toolCallId; - }); + return prev; + }, + { content: '', tool_calls: [] as UnvalidatedToolCall[] } + ); - return prev; - }, - { - content: '', - tool_calls: [] as UnvalidatedToolCall[], - } - ), - last(), - map((concatenatedChunk): ChatCompletionMessageEvent<TToolOptions> => { logger.debug(() => `Received completed message: ${JSON.stringify(concatenatedChunk)}`); const validatedToolCalls = validateToolCalls<TToolOptions>({ diff --git a/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts b/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts index 8b4cc49dfaa46..84e3dd57cded1 100644 --- a/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts +++ b/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts @@ -76,9 +76,11 @@ const chatCompleteBodySchema: Type<ChatCompleteRequestBody> = schema.object({ name: schema.maybe(schema.string()), }), schema.object({ + name: schema.string(), role: schema.literal(MessageRole.Tool), toolCallId: schema.string(), response: schema.recordOf(schema.string(), schema.any()), + data: schema.maybe(schema.recordOf(schema.string(), schema.any())), }), ]) ), diff --git a/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/actions/generate_esql.ts b/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/actions/generate_esql.ts index 3d8701eba72db..5c2612aa0a4d4 100644 --- a/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/actions/generate_esql.ts +++ b/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/actions/generate_esql.ts @@ -34,6 +34,7 @@ export const generateEsqlTask = <TToolOptions extends ToolOptions>({ docBase, functionCalling, logger, + system, }: { connectorId: string; systemMessage: string; @@ -43,6 +44,7 @@ export const generateEsqlTask = <TToolOptions extends ToolOptions>({ docBase: EsqlDocumentBase; functionCalling?: FunctionCallingMode; logger: Pick<Logger, 'debug'>; + system?: string; }) => { return function askLlmToRespond({ documentationRequest: { commands, functions }, @@ -97,7 +99,7 @@ export const generateEsqlTask = <TToolOptions extends ToolOptions>({ When converting queries from one language to ES|QL, make sure that the functions are available and documented in ES|QL. E.g., for SPL's LEN, use LENGTH. For IF, use CASE. - `, + ${system ? `## Additional instructions\n\n${system}` : ''}`, messages: [ ...messages, { @@ -106,6 +108,7 @@ export const generateEsqlTask = <TToolOptions extends ToolOptions>({ toolCalls: [fakeRequestDocsToolCall], }, { + name: fakeRequestDocsToolCall.function.name, role: MessageRole.Tool, response: { documentation: requestedDocumentation, diff --git a/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/task.ts b/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/task.ts index 56c48b73f4994..801d80a30174e 100644 --- a/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/task.ts +++ b/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/task.ts @@ -21,6 +21,7 @@ export function naturalLanguageToEsql<TToolOptions extends ToolOptions>({ toolChoice, logger, functionCalling, + system, ...rest }: NlToEsqlTaskParams<TToolOptions>): Observable<NlToEsqlTaskEvent<TToolOptions>> { return from(loadDocBase()).pipe( @@ -41,6 +42,7 @@ export function naturalLanguageToEsql<TToolOptions extends ToolOptions>({ tools, toolChoice, }, + system, }); return requestDocumentation({ diff --git a/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/types.ts b/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/types.ts index db3ac3b493481..5a1477524dbd4 100644 --- a/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/types.ts +++ b/x-pack/platform/plugins/shared/inference/server/tasks/nl_to_esql/types.ts @@ -29,5 +29,6 @@ export type NlToEsqlTaskParams<TToolOptions extends ToolOptions> = { connectorId: string; logger: Pick<Logger, 'debug'>; functionCalling?: FunctionCallingMode; + system?: string; } & TToolOptions & ({ input: string } | { messages: Message[] }); diff --git a/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.test.ts b/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.test.ts index 57b030771c6c0..8691a50cda207 100644 --- a/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.test.ts @@ -108,7 +108,7 @@ describe('validateToolCalls', () => { }); } expect(() => validate()).toThrowErrorMatchingInlineSnapshot( - `"Tool call arguments for my_function were invalid"` + `"Tool call arguments for my_function (1) were invalid"` ); try { @@ -119,6 +119,15 @@ describe('validateToolCalls', () => { arguments: JSON.stringify({ foo: 'bar' }), errorsText: `data must have required property 'bar'`, name: 'my_function', + toolCalls: [ + { + function: { + arguments: JSON.stringify({ foo: 'bar' }), + name: 'my_function', + }, + toolCallId: '1', + }, + ], }); } else { fail('Expected toolValidationError'); diff --git a/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.ts b/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.ts index ffc2482774b23..3698a93206c07 100644 --- a/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.ts +++ b/x-pack/platform/plugins/shared/inference/server/util/validate_tool_calls.ts @@ -54,11 +54,12 @@ export function validateToolCalls<TToolOptions extends ToolOptions>({ if (!valid) { throw createToolValidationError( - `Tool call arguments for ${toolCall.function.name} were invalid`, + `Tool call arguments for ${toolCall.function.name} (${toolCall.toolCallId}) were invalid`, { name: toolCall.function.name, errorsText: validator.errorsText(), arguments: toolCall.function.arguments, + toolCalls, } ); } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/jest_setup.js b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/jest_setup.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/jest_setup.js rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/jest_setup.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/main.js b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/main.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/main.js rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/main.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/preview.js b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/preview.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/preview.js rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/preview.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/README.md b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/README.md similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/README.md rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/README.md diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/TRACING.md b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/TRACING.md similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/TRACING.md rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/TRACING.md diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/capabilities.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/capabilities.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/capabilities.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/capabilities.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/connectors.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/connectors.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/connectors.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/connectors.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/conversation_complete.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/conversation_complete.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/convert_messages_for_inference.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/convert_messages_for_inference.ts similarity index 98% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/convert_messages_for_inference.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/convert_messages_for_inference.ts index 974b002ea93c6..229183ed142a7 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/convert_messages_for_inference.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/convert_messages_for_inference.ts @@ -52,6 +52,7 @@ export function convertMessagesForInference(messages: Message[]): InferenceMessa } inferenceMessages.push({ + name: message.message.name!, role: InferenceMessageRole.Tool, response: JSON.parse(message.message.content ?? '{}'), toolCallId: toolCallRequest.toolCalls![0].toolCallId, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/feature.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/feature.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/feature.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/feature.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/function_visibility.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/functions/function_visibility.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/function_visibility.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/functions/function_visibility.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/functions/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/functions/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/visualize_esql.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/functions/visualize_esql.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/visualize_esql.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/functions/visualize_esql.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/rule_connector.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/rule_connector.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/rule_connector.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/rule_connector.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/concatenate_chat_completion_chunks.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/concatenate_chat_completion_chunks.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/concatenate_chat_completion_chunks.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/concatenate_chat_completion_chunks.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/calculate_auto.js b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/calculate_auto.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/calculate_auto.js rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/calculate_auto.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/unit_to_seconds.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/unit_to_seconds.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/unit_to_seconds.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/get_bucket_size/unit_to_seconds.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/short_id_table.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/short_id_table.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/short_id_table.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/short_id_table.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/short_id_table.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/short_id_table.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/short_id_table.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/short_id_table.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/until_aborted.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/until_aborted.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/until_aborted.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/until_aborted.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/with_token_budget.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/with_token_budget.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/with_token_budget.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/with_token_budget.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/with_token_budget.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/with_token_budget.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/with_token_budget.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/with_token_budget.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/without_token_count_events.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/without_token_count_events.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/without_token_count_events.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common/utils/without_token_count_events.ts diff --git a/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/jest.config.js b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/jest.config.js new file mode 100644 index 0000000000000..4ff20cb91d531 --- /dev/null +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/jest.config.js @@ -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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../../..', + roots: [ + '<rootDir>/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public', + '<rootDir>/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/common', + '<rootDir>/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server', + ], + setupFiles: [ + '<rootDir>/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/.storybook/jest_setup.js', + ], + collectCoverage: true, + collectCoverageFrom: [ + '<rootDir>/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/{common,public,server}/**/*.{js,ts,tsx}', + ], + + coverageReporters: ['html'], +}; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/kibana.jsonc similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/kibana.jsonc diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/chat_feedback.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/common.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/common.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/common.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/common.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_feedback.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_feedback.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_feedback.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_feedback.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_response.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_response.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_response.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/insight_response.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/schemas/user_sent_prompt.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/telemetry_event_type.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/telemetry_event_type.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/analytics/telemetry_event_type.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/analytics/telemetry_event_type.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/api/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/api/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/api/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/api/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/assets/elastic_ai_assistant.png b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/assets/elastic_ai_assistant.png similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/assets/elastic_ai_assistant.png rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/assets/elastic_ai_assistant.png diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/assets/illustration.png b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/assets/illustration.png similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/assets/illustration.png rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/assets/illustration.png diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/assets/illustration.svg b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/assets/illustration.svg similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/assets/illustration.svg rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/assets/illustration.svg diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/assistant_avatar.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/assistant_avatar.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/assistant_avatar.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/assistant_avatar.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/assistant_avatar.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/assistant_avatar.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/assistant_avatar.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/assistant_avatar.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/regenerate_response_button.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/start_chat_button.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/buttons/stop_generating_button.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/chat/chat_item_controls.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/chat/chat_item_controls.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/chat/chat_item_controls.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/chat/chat_item_controls.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/chat/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/chat/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/chat/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/chat/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/actions_menu.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/actions_menu.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/actions_menu.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/actions_menu.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight_base.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight_base.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_error.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight_error.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_error.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/insight/insight_error.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/failed_to_load_response.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/failed_to_load_response.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/failed_to_load_response.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/failed_to_load_response.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.stories.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.stories.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_panel.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx similarity index 96% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx index 85fa0f4609903..a473e34ba2a0c 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx @@ -156,7 +156,14 @@ export function MessageText({ loading, content, onActionClick }: Props) { }, table: (props) => ( <> - <EuiTable {...props} /> + <EuiTable + {...props} + className={css` + .euiTableCellContent__text { + white-space: normal; + } + `} + /> <EuiSpacer size="m" /> </> ), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/missing_credentials_callout.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/missing_credentials_callout.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/components/missing_credentials_callout.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/components/missing_credentials_callout.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_chat_service_context.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_chat_service_context.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_chat_service_context.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_chat_service_context.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_multipane_flyout_context.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_multipane_flyout_context.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_multipane_flyout_context.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_multipane_flyout_context.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_provider.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_provider.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_provider.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/context/observability_ai_assistant_provider.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_abortable_async.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_abortable_async.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_abortable_async.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_abortable_async.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_flyout_state.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_flyout_state.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_flyout_state.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_flyout_state.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_genai_connectors.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_genai_connectors.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_genai_connectors.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_genai_connectors.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_kibana.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_kibana.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_kibana.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_kibana.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant_chat_service.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant_chat_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant_chat_service.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_observability_ai_assistant_chat_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_once.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_once.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_once.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/hooks/use_once.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/mock.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/mock.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/plugin.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/plugin.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/plugin.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/complete.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/complete.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/complete.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/complete.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_chat_service.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_chat_service.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_service.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_service.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/create_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/default_starter_prompts.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/default_starter_prompts.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/service/default_starter_prompts.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/service/default_starter_prompts.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/storybook_mock.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/storybook_mock.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/builders.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/builders.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_screen_context_action.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/create_screen_context_action.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_screen_context_action.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/create_screen_context_action.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/get_connectors_management_href.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/get_connectors_management_href.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/get_connectors_management_href.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/get_connectors_management_href.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/get_contextual_insight_messages.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/get_contextual_insight_messages.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/get_contextual_insight_messages.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/get_contextual_insight_messages.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/get_models_management_href.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/get_models_management_href.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/get_models_management_href.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/get_models_management_href.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/readable_stream_reader_into_observable.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/readable_stream_reader_into_observable.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/readable_stream_reader_into_observable.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/readable_stream_reader_into_observable.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/storybook_decorator.tsx b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/storybook_decorator.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/storybook_decorator.tsx rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/public/utils/storybook_decorator.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/analytics/recall_ranking.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/analytics/recall_ranking.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/analytics/recall_ranking.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/analytics/recall_ranking.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/config.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/config.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/config.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/config.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/context.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/context.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/index.ts similarity index 98% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/index.ts index ce4c8e59fbae2..244c867e7f644 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/index.ts @@ -15,7 +15,7 @@ import { registerKibanaFunction } from './kibana'; import { registerExecuteConnectorFunction } from './execute_connector'; import { GET_DATA_ON_SCREEN_FUNCTION_NAME } from '../service/chat_function_client'; -// cannot be imported from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts due to circular dependency +// cannot be imported from x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts due to circular dependency export const QUERY_FUNCTION_NAME = 'query'; export type FunctionRegistrationParameters = Omit< diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/kibana.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/kibana.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/summarize.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/functions/summarize.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/index.ts similarity index 88% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/index.ts index 0ad41969cedc2..b84234164f8c8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/index.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/index.ts @@ -18,6 +18,8 @@ export type { ObservabilityAIAssistantServerSetup, } from './types'; +export type { ObservabilityAIAssistantClient } from './service/client'; + export { aiAssistantLogsIndexPattern, aiAssistantSimulatedFunctionCalling, @@ -26,6 +28,9 @@ export { export { streamIntoObservable } from './service/util/stream_into_observable'; +export { createFunctionRequestMessage } from '../common/utils/create_function_request_message'; +export { createFunctionResponseMessage } from '../common/utils/create_function_response_message'; + export const config: PluginConfigDescriptor<ObservabilityAIAssistantConfig> = { deprecations: ({ unusedFromRoot }) => [ unusedFromRoot('xpack.observability.aiAssistant.enabled', { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/plugin.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/plugin.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/plugin.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/chat/route.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/chat/route.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/chat/route.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/chat/route.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/conversations/route.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/conversations/route.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/conversations/route.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/conversations/route.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/create_observability_ai_assistant_server_route.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/create_observability_ai_assistant_server_route.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/create_observability_ai_assistant_server_route.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/create_observability_ai_assistant_server_route.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/functions/route.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/functions/route.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/get_global_observability_ai_assistant_route_repository.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/get_global_observability_ai_assistant_route_repository.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/get_global_observability_ai_assistant_route_repository.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/get_global_observability_ai_assistant_route_repository.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/register_routes.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/register_routes.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/register_routes.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/register_routes.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/routes/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/index.test.ts similarity index 99% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/index.test.ts index 89e7aa4cbb4de..2456499b2d66f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/index.test.ts @@ -12,8 +12,6 @@ import { last, merge, repeat } from 'lodash'; import { Subject, Observable } from 'rxjs'; import { EventEmitter, type Readable } from 'stream'; import { finished } from 'stream/promises'; -import type { InferenceClient } from '@kbn/inference-plugin/server'; -import { ChatCompletionEventType as InferenceChatCompletionEventType } from '@kbn/inference-common'; import { ObservabilityAIAssistantClient } from '.'; import { MessageRole, type Message } from '../../../common'; import { @@ -21,6 +19,8 @@ import { MessageAddEvent, StreamingChatResponseEventType, } from '../../../common/conversation_complete'; +import { ChatCompletionEventType as InferenceChatCompletionEventType } from '@kbn/inference-common'; +import { InferenceClient } from '@kbn/inference-plugin/server'; import { createFunctionResponseMessage } from '../../../common/utils/create_function_response_message'; import { CONTEXT_FUNCTION_NAME } from '../../functions/context'; import { ChatFunctionClient } from '../chat_function_client'; @@ -1530,6 +1530,7 @@ describe('Observability AI Assistant client', () => { const parsed = last(body.messages); expect(parsed).toEqual({ + name: 'get_top_alerts', role: 'tool', response: { message: 'Function response exceeded the maximum length allowed and was truncated', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/index.ts similarity index 99% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/index.ts index 688bd7a2ec860..c03f7d6333825 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/index.ts @@ -627,9 +627,11 @@ export class ObservabilityAIAssistantClient { recall = async ({ queries, categories, + limit, }: { queries: Array<{ text: string; boost?: number }>; categories?: string[]; + limit?: { size?: number; tokenCount?: number }; }): Promise<RecalledEntry[]> => { return ( this.dependencies.knowledgeBaseService?.recall({ @@ -639,6 +641,7 @@ export class ObservabilityAIAssistantClient { categories, esClient: this.dependencies.esClient, uiSettingsClient: this.dependencies.uiSettingsClient, + limit, }) || [] ); }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_span_attributes.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_span_attributes.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_span_attributes.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_span_attributes.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_tracer.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_tracer.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_tracer.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/get_langtrace_tracer.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/instrumentation/lang_tracer.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/convert_inference_events_to_streaming_events.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/convert_inference_events_to_streaming_events.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/convert_inference_events_to_streaming_events.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/convert_inference_events_to_streaming_events.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/debug.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/debug.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/debug.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/debug.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/extract_messages.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/extract_messages.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/extract_messages.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/extract_messages.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/extract_token_count.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/extract_token_count.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/extract_token_count.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/extract_token_count.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/fail_on_non_existing_function_call.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/fail_on_non_existing_function_call.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/fail_on_non_existing_function_call.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/fail_on_non_existing_function_call.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/hide_token_count_events.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/hide_token_count_events.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/hide_token_count_events.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/hide_token_count_events.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/instrument_and_count_tokens.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/instrument_and_count_tokens.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/instrument_and_count_tokens.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/client/operators/instrument_and_count_tokens.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/conversation_component_template.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/conversation_component_template.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/conversation_component_template.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/conversation_component_template.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/inference_endpoint.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/inference_endpoint.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/inference_endpoint.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/inference_endpoint.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/kb_component_template.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/kb_component_template.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/kb_component_template.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/kb_component_template.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts similarity index 98% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts index 1cf1cdc326fdf..bb77dfc768d95 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts @@ -134,6 +134,7 @@ export class KnowledgeBaseService { namespace, esClient, uiSettingsClient, + limit = {}, }: { queries: Array<{ text: string; boost?: number }>; categories?: string[]; @@ -141,6 +142,7 @@ export class KnowledgeBaseService { namespace: string; esClient: { asCurrentUser: ElasticsearchClient; asInternalUser: ElasticsearchClient }; uiSettingsClient: IUiSettingsClient; + limit?: { tokens?: number; size?: number }; }): Promise<RecalledEntry[]> => { if (!this.dependencies.config.enableKnowledgeBase) { return []; @@ -186,9 +188,9 @@ export class KnowledgeBaseService { documentsFromKb.concat(documentsFromConnectors), 'score', 'desc' - ).slice(0, 20); + ).slice(0, limit.size ?? 20); - const MAX_TOKENS = 4000; + const maxTokens = limit.tokens ?? 4_000; let tokenCount = 0; @@ -197,7 +199,7 @@ export class KnowledgeBaseService { for (const entry of sortedEntries) { returnedEntries.push(entry); tokenCount += encode(entry.text).length; - if (tokenCount >= MAX_TOKENS) { + if (tokenCount >= maxTokens) { break; } } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_search_connectors.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_search_connectors.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_search_connectors.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_search_connectors.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/setup_conversation_and_kb_index_assets.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/setup_conversation_and_kb_index_assets.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/setup_conversation_and_kb_index_assets.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/setup_conversation_and_kb_index_assets.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/task_manager_definitions/register_migrate_knowledge_base_entries_task.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/task_manager_definitions/register_migrate_knowledge_base_entries_task.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/task_manager_definitions/register_migrate_knowledge_base_entries_task.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/task_manager_definitions/register_migrate_knowledge_base_entries_task.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_access_query.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_access_query.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_access_query.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_access_query.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_category_query.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_category_query.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_category_query.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_category_query.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/observable_into_openai_stream.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/observable_into_openai_stream.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/observable_into_openai_stream.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/observable_into_openai_stream.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/observable_into_stream.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/observable_into_stream.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/observable_into_stream.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/observable_into_stream.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/stream_into_observable.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/stream_into_observable.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/stream_into_observable.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/stream_into_observable.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/with_assistant_span.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/with_assistant_span.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/with_assistant_span.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/service/util/with_assistant_span.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/types.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/types.ts similarity index 95% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/types.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/types.ts index ece417d968a13..3ee66bfaed664 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/types.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/types.ts @@ -23,7 +23,7 @@ import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/server'; import type { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/server'; import type { RuleRegistryPluginStartContract } from '@kbn/rule-registry-plugin/server'; import type { AlertingServerSetup, AlertingServerStart } from '@kbn/alerting-plugin/server'; -import type { InferenceServerStart } from '@kbn/inference-plugin/server'; +import type { InferenceServerSetup, InferenceServerStart } from '@kbn/inference-plugin/server'; import type { ObservabilityAIAssistantService } from './service'; export interface ObservabilityAIAssistantServerSetup { @@ -50,6 +50,7 @@ export interface ObservabilityAIAssistantPluginSetupDependencies { cloud?: CloudSetup; serverless?: ServerlessPluginSetup; alerting: AlertingServerSetup; + inference: InferenceServerSetup; } export interface ObservabilityAIAssistantPluginStartDependencies { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.test.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.test.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/parse_suggestion_scores.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/recall_and_score.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/recall_and_score.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/recall_and_score.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/recall_and_score.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/tsconfig.json similarity index 91% rename from x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json rename to x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/tsconfig.json index 77b81c9c72882..db9c1cddae90a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/tsconfig.json +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/tsconfig.json @@ -1,10 +1,10 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, "include": [ - "../../../typings/**/*", + "../../../../../typings/**/*", "common/**/*", "public/**/*", "scripts/**/*", @@ -46,6 +46,7 @@ "@kbn/management-settings-ids", "@kbn/ai-assistant-common", "@kbn/inference-common", + "@kbn/inference-plugin", "@kbn/core-lifecycle-server", "@kbn/server-route-repository-utils", "@kbn/inference-plugin" diff --git a/x-pack/plugins/actions/server/saved_objects/mappings.ts b/x-pack/plugins/actions/server/saved_objects/mappings.ts index 70e3e7447a6a0..856431198c73a 100644 --- a/x-pack/plugins/actions/server/saved_objects/mappings.ts +++ b/x-pack/plugins/actions/server/saved_objects/mappings.ts @@ -40,6 +40,9 @@ export const actionMappings: SavedObjectsTypeMappingDefinition = { export const actionTaskParamsMappings: SavedObjectsTypeMappingDefinition = { dynamic: false, properties: { + apiKeyId: { + type: 'keyword', + }, // NO NEED TO BE INDEXED // actionId: { // type: 'keyword', diff --git a/x-pack/plugins/actions/server/saved_objects/model_versions/action_task_params_model_versions.ts b/x-pack/plugins/actions/server/saved_objects/model_versions/action_task_params_model_versions.ts index 570ebff743c17..ebd87cdcb0915 100644 --- a/x-pack/plugins/actions/server/saved_objects/model_versions/action_task_params_model_versions.ts +++ b/x-pack/plugins/actions/server/saved_objects/model_versions/action_task_params_model_versions.ts @@ -6,13 +6,28 @@ */ import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server'; -import { actionTaskParamsSchemaV1 } from '../schemas/action_task_params'; +import { actionTaskParamsSchemaV1, actionTaskParamsSchemaV2 } from '../schemas/action_task_params'; export const actionTaskParamsModelVersions: SavedObjectsModelVersionMap = { '1': { changes: [], schemas: { + forwardCompatibility: actionTaskParamsSchemaV1.extends({}, { unknowns: 'ignore' }), create: actionTaskParamsSchemaV1, }, }, + '2': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + apiKeyId: { type: 'keyword' }, + }, + }, + ], + schemas: { + forwardCompatibility: actionTaskParamsSchemaV2.extends({}, { unknowns: 'ignore' }), + create: actionTaskParamsSchemaV2, + }, + }, }; diff --git a/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/index.ts b/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/index.ts index 4ce0e679adf5e..cd49049abdfbc 100644 --- a/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/index.ts +++ b/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/index.ts @@ -6,3 +6,4 @@ */ export { actionTaskParamsSchema as actionTaskParamsSchemaV1 } from './v1'; +export { actionTaskParamsSchema as actionTaskParamsSchemaV2 } from './v2'; diff --git a/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/v2.ts b/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/v2.ts new file mode 100644 index 0000000000000..b0fd0c3b9f3b4 --- /dev/null +++ b/x-pack/plugins/actions/server/saved_objects/schemas/action_task_params/v2.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import { actionTaskParamsSchema as actionTaskParamsSchemaV1 } from './v1'; + +export const actionTaskParamsSchema = actionTaskParamsSchemaV1.extends({ + apiKeyId: schema.maybe(schema.string()), +}); diff --git a/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts index 527134a2b5138..527de165db993 100644 --- a/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts @@ -15,6 +15,7 @@ export const scheduleBodySchema = schema.arrayOf( rule_id: schema.string(), start: schema.string(), end: schema.maybe(schema.string()), + run_actions: schema.maybe(schema.boolean()), }, { validate({ start, end }) { diff --git a/x-pack/plugins/alerting/server/saved_objects/model_versions/ad_hoc_run_params_model_versions.ts b/x-pack/plugins/alerting/server/saved_objects/model_versions/ad_hoc_run_params_model_versions.ts index 95f544be5c8e2..91a8418a42a37 100644 --- a/x-pack/plugins/alerting/server/saved_objects/model_versions/ad_hoc_run_params_model_versions.ts +++ b/x-pack/plugins/alerting/server/saved_objects/model_versions/ad_hoc_run_params_model_versions.ts @@ -6,7 +6,10 @@ */ import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server'; -import { rawAdHocRunParamsSchemaV1 } from '../schemas/raw_ad_hoc_run_params'; +import { + rawAdHocRunParamsSchemaV1, + rawAdHocRunParamsSchemaV2, +} from '../schemas/raw_ad_hoc_run_params'; export const adHocRunParamsModelVersions: SavedObjectsModelVersionMap = { '1': { @@ -16,4 +19,11 @@ export const adHocRunParamsModelVersions: SavedObjectsModelVersionMap = { create: rawAdHocRunParamsSchemaV1, }, }, + '2': { + changes: [], + schemas: { + forwardCompatibility: rawAdHocRunParamsSchemaV2.extends({}, { unknowns: 'ignore' }), + create: rawAdHocRunParamsSchemaV2, + }, + }, }; diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/index.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/index.ts index 977a13f3a7e4b..17907c6405830 100644 --- a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/index.ts +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/index.ts @@ -6,3 +6,4 @@ */ export { rawAdHocRunParamsSchema as rawAdHocRunParamsSchemaV1 } from './v1'; +export { rawAdHocRunParamsSchema as rawAdHocRunParamsSchemaV2 } from './v2'; diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/latest.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/latest.ts new file mode 100644 index 0000000000000..03c55b706231d --- /dev/null +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/latest.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TypeOf } from '@kbn/config-schema'; +import { rawAdHocRunParamsSchema } from './v2'; + +export type RawAdHocRunParams = TypeOf<typeof rawAdHocRunParamsSchema>; diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v1.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v1.ts index 8676c2c606912..5970599492422 100644 --- a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v1.ts +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v1.ts @@ -21,7 +21,7 @@ const rawAdHocRunSchedule = schema.object({ runAt: schema.string(), }); -const rawAdHocRunParamsRuleSchema = schema.object({ +export const rawAdHocRunParamsRuleSchema = schema.object({ name: schema.string(), tags: schema.arrayOf(schema.string()), alertTypeId: schema.string(), diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v2.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v2.ts new file mode 100644 index 0000000000000..f8505d1f5f4ba --- /dev/null +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_ad_hoc_run_params/v2.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import { FilterStateStore } from '@kbn/es-query'; +import { + rawAdHocRunParamsSchema as rawAdHocRunParamsSchemaV1, + rawAdHocRunParamsRuleSchema as rawAdHocRunParamsRuleSchemaV1, +} from './v1'; + +const ISOWeekdaysSchema = schema.oneOf([ + schema.literal(1), + schema.literal(2), + schema.literal(3), + schema.literal(4), + schema.literal(5), + schema.literal(6), + schema.literal(7), +]); + +const rawRuleAlertsFilterSchema = schema.object({ + query: schema.maybe( + schema.object({ + kql: schema.string(), + filters: schema.arrayOf( + schema.object({ + query: schema.maybe(schema.recordOf(schema.string(), schema.any())), + meta: schema.object({ + alias: schema.maybe(schema.nullable(schema.string())), + disabled: schema.maybe(schema.boolean()), + negate: schema.maybe(schema.boolean()), + controlledBy: schema.maybe(schema.string()), + group: schema.maybe(schema.string()), + index: schema.maybe(schema.string()), + isMultiIndex: schema.maybe(schema.boolean()), + type: schema.maybe(schema.string()), + key: schema.maybe(schema.string()), + params: schema.maybe(schema.any()), + value: schema.maybe(schema.string()), + field: schema.maybe(schema.string()), + relation: schema.maybe(schema.oneOf([schema.literal('OR'), schema.literal('AND')])), + }), + $state: schema.maybe( + schema.object({ + store: schema.oneOf([ + schema.literal(FilterStateStore.APP_STATE), // change + schema.literal(FilterStateStore.GLOBAL_STATE), // change + ]), + }) + ), + }) + ), + dsl: schema.string(), // change + }) + ), + timeframe: schema.maybe( + schema.object({ + days: schema.arrayOf(ISOWeekdaysSchema), + hours: schema.object({ + start: schema.string(), + end: schema.string(), + }), + timezone: schema.string(), + }) + ), +}); + +const rawAdHocRunParamsRuleActionSchema = schema.object({ + uuid: schema.string(), + group: schema.maybe(schema.string()), + actionRef: schema.string(), + actionTypeId: schema.string(), + params: schema.recordOf(schema.string(), schema.any()), + frequency: schema.maybe( + schema.object({ + summary: schema.boolean(), + notifyWhen: schema.oneOf([ + schema.literal('onActionGroupChange'), + schema.literal('onActiveAlert'), + schema.literal('onThrottleInterval'), + ]), + throttle: schema.nullable(schema.string()), + }) + ), + alertsFilter: schema.maybe(rawRuleAlertsFilterSchema), + useAlertDataForTemplate: schema.maybe(schema.boolean()), +}); + +const rawAdHocRunParamsRuleSchema = rawAdHocRunParamsRuleSchemaV1.extends({ + actions: schema.maybe(schema.arrayOf(rawAdHocRunParamsRuleActionSchema)), +}); + +export const rawAdHocRunParamsSchema = rawAdHocRunParamsSchemaV1.extends({ + rule: rawAdHocRunParamsRuleSchema, +}); diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/open_modal.test.tsx b/x-pack/plugins/cases/public/components/visualizations/actions/open_modal.test.tsx index e8fc0b6f16951..d701635cbbbec 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/open_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/visualizations/actions/open_modal.test.tsx @@ -113,7 +113,7 @@ describe('openModal', () => { }); }); - it('should have correct onClose handler - when close modal clicked', () => { + it('should have correct onClose handler - when close modal clicked', async () => { openModal( getMockLensApi(), 'myAppId', @@ -121,12 +121,14 @@ describe('openModal', () => { getMockServices() ); - const onClose = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onClose; - onClose(); - expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); + await waitFor(() => { + const onClose = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onClose; + onClose(); + expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); + }); }); - it('should have correct onClose handler - when case selected', () => { + it('should have correct onClose handler - when case selected', async () => { openModal( getMockLensApi(), 'myAppId', @@ -134,12 +136,14 @@ describe('openModal', () => { getMockServices() ); - const onClose = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onClose; - onClose({ id: 'case-id', title: 'case-title' }); - expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); + await waitFor(() => { + const onClose = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onClose; + onClose({ id: 'case-id', title: 'case-title' }); + expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); + }); }); - it('should have correct onClose handler - when case created', () => { + it('should have correct onClose handler - when case created', async () => { openModal( getMockLensApi(), 'myAppId', @@ -147,12 +151,14 @@ describe('openModal', () => { getMockServices() ); - const onClose = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onClose; - onClose(null, true); - expect(unmountComponentAtNode as jest.Mock).not.toHaveBeenCalled(); + await waitFor(() => { + const onClose = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onClose; + onClose(null, true); + expect(unmountComponentAtNode as jest.Mock).not.toHaveBeenCalled(); + }); }); - it('should have correct onSuccess handler', () => { + it('should have correct onSuccess handler', async () => { openModal( getMockLensApi(), 'myAppId', @@ -160,9 +166,11 @@ describe('openModal', () => { getMockServices() ); - const onSuccess = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onSuccess; - onSuccess(); - expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); + await waitFor(() => { + const onSuccess = mockUseCasesAddToExistingCaseModal.mock.calls[0][0].onSuccess; + onSuccess(); + expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); + }); }); it('should open modal with an attachment with the time range in absolute values', async () => { diff --git a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts index 9ff212f3d4774..d5064e3b311fe 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts @@ -10,10 +10,12 @@ import type { caseApiV1 } from '../../../../../common/types/api'; import { CASE_ALERTS_URL } from '../../../../../common/constants'; import { createCaseError } from '../../../../common/error'; import { createCasesRoute } from '../../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../../constants'; export const getCasesByAlertIdRoute = createCasesRoute({ method: 'get', path: CASE_ALERTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ alert_id: schema.string({ minLength: 1 }), diff --git a/x-pack/plugins/cases/server/routes/api/cases/categories/get_categories.ts b/x-pack/plugins/cases/server/routes/api/cases/categories/get_categories.ts index 3cf1550e10f84..c2c3c86faa6f7 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/categories/get_categories.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/categories/get_categories.ts @@ -9,10 +9,12 @@ import { INTERNAL_GET_CASE_CATEGORIES_URL } from '../../../../../common/constant import { createCaseError } from '../../../../common/error'; import { createCasesRoute } from '../../create_cases_route'; import type { caseApiV1 } from '../../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../../constants'; export const getCategoriesRoute = createCasesRoute({ method: 'get', path: INTERNAL_GET_CASE_CATEGORIES_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'internal', }, diff --git a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts index 65016de1758ae..f09e9abeb4cb3 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts @@ -10,10 +10,12 @@ import { schema } from '@kbn/config-schema'; import { CASES_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const deleteCaseRoute = createCasesRoute({ method: 'delete', path: CASES_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Delete cases`, diff --git a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts index 3e92333615991..14b25ca926130 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts @@ -9,10 +9,12 @@ import { CASES_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const findCaseRoute = createCasesRoute({ method: 'get', path: `${CASES_URL}/_find`, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Search cases`, diff --git a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts index 158360ff7b23f..fa986660d99be 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts @@ -14,6 +14,7 @@ import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CASE_DETAILS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; const params = { params: schema.object({ @@ -31,6 +32,7 @@ export const getCaseRoute = ({ isServerless }: { isServerless?: boolean }) => createCasesRoute({ method: 'get', path: CASE_DETAILS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params, routerOptions: { access: 'public', diff --git a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts index 1e0c1b3984225..3f508214515c4 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts @@ -10,10 +10,12 @@ import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseApiV1 } from '../../../../common/types/api'; import type { caseDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const patchCaseRoute = createCasesRoute({ method: 'patch', path: CASES_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: 'Update cases', diff --git a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts index f9440e428af40..792e41017f248 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts @@ -10,10 +10,12 @@ import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseApiV1 } from '../../../../common/types/api'; import type { caseDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const postCaseRoute = createCasesRoute({ method: 'post', path: CASES_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Create a case`, diff --git a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts index 4e46034c7d8f7..609a4aed2c801 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts @@ -12,10 +12,12 @@ import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import { caseApiV1 } from '../../../../common/types/api'; import type { caseDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const pushCaseRoute: CaseRoute = createCasesRoute({ method: 'post', path: CASE_PUSH_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Push a case to an external service`, diff --git a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts index c196cc01e8417..26555f6ce147e 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts @@ -9,10 +9,12 @@ import { CASE_REPORTERS_URL } from '../../../../../common/constants'; import { createCaseError } from '../../../../common/error'; import { createCasesRoute } from '../../create_cases_route'; import type { caseApiV1 } from '../../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../../constants'; export const getReportersRoute = createCasesRoute({ method: 'get', path: CASE_REPORTERS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Get case creators`, diff --git a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts index 11a9aa006e77f..f2d1df584a424 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts @@ -9,10 +9,12 @@ import { CASE_TAGS_URL } from '../../../../../common/constants'; import { createCaseError } from '../../../../common/error'; import { createCasesRoute } from '../../create_cases_route'; import type { caseApiV1 } from '../../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../../constants'; export const getTagsRoute = createCasesRoute({ method: 'get', path: CASE_TAGS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Get case tags`, diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts index 26c4400212339..709fb024b64cb 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts @@ -9,10 +9,12 @@ import { schema } from '@kbn/config-schema'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; import { createCasesRoute } from '../create_cases_route'; import { createCaseError } from '../../../common/error'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const deleteAllCommentsRoute = createCasesRoute({ method: 'delete', path: CASE_COMMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: `Delete all case comments and alerts`, diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts index 40fe590d8e2f7..5f9400ef606a0 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts @@ -10,10 +10,12 @@ import { schema } from '@kbn/config-schema'; import { CASE_COMMENT_DETAILS_URL } from '../../../../common/constants'; import { createCasesRoute } from '../create_cases_route'; import { createCaseError } from '../../../common/error'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const deleteCommentRoute = createCasesRoute({ method: 'delete', path: CASE_COMMENT_DETAILS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts index 933d0bb1b0fd5..c2e208cc44958 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts @@ -11,10 +11,12 @@ import type { attachmentApiV1 } from '../../../../common/types/api'; import { CASE_FIND_ATTACHMENTS_URL } from '../../../../common/constants'; import { createCasesRoute } from '../create_cases_route'; import { createCaseError } from '../../../common/error'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const findCommentsRoute = createCasesRoute({ method: 'get', path: CASE_FIND_ATTACHMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts index 988cee1f854d6..d00a003a42a7b 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts @@ -11,10 +11,12 @@ import type { alertApiV1 } from '../../../../common/types/api'; import { CASE_DETAILS_ALERTS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getAllAlertsAttachedToCaseRoute = createCasesRoute({ method: 'get', path: CASE_DETAILS_ALERTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string({ minLength: 1 }), diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts index f62a11caae772..59cbc1870f22c 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts @@ -12,6 +12,7 @@ import { CASE_COMMENTS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { attachmentDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; /** * @deprecated since version 8.1.0 @@ -26,6 +27,7 @@ export const getAllCommentsRoute = ({ createCasesRoute({ method: 'get', path: CASE_COMMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts index 6a1a56b4d6358..a45c93a1c0823 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts @@ -11,10 +11,12 @@ import { CASE_COMMENT_DETAILS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { attachmentDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getCommentRoute = createCasesRoute({ method: 'get', path: CASE_COMMENT_DETAILS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts index ce00c566321d5..3a619a1f767c3 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts @@ -12,10 +12,12 @@ import { CASE_COMMENTS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const patchCommentRoute = createCasesRoute({ method: 'patch', path: CASE_COMMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts index a44c93f9a7879..31baa7b7daf02 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts @@ -11,10 +11,12 @@ import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseDomainV1 } from '../../../../common/types/domain'; import type { attachmentApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const postCommentRoute = createCasesRoute({ method: 'post', path: CASE_COMMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts index 881fc71833a65..3af1ecc44eb1d 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts @@ -9,10 +9,12 @@ import { CASE_CONFIGURE_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { configureApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getCaseConfigureRoute = createCasesRoute({ method: 'get', path: CASE_CONFIGURE_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: 'Get case settings', diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts index a11af001480e6..41484a60a4f5b 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts @@ -5,7 +5,10 @@ * 2.0. */ -import { CASE_CONFIGURE_CONNECTORS_URL } from '../../../../common/constants'; +import { + CASE_CONFIGURE_CONNECTORS_URL, + GET_CONNECTORS_CONFIGURE_API_TAG, +} from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; @@ -15,8 +18,13 @@ import { createCasesRoute } from '../create_cases_route'; export const getConnectorsRoute = createCasesRoute({ method: 'get', path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, + security: { + authz: { + requiredPrivileges: [GET_CONNECTORS_CONFIGURE_API_TAG], + }, + }, routerOptions: { - tags: ['access:casesGetConnectorsConfigure', 'oas-tag:cases'], + tags: ['oas-tag:cases'], access: 'public', summary: 'Get case connectors', description: 'Retrieves information about connectors that are supported for use in cases.', diff --git a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts index 9deb650fa91e4..f5f5fd5fbe59c 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts @@ -11,10 +11,12 @@ import { CASE_CONFIGURE_DETAILS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { configureApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const patchCaseConfigureRoute = createCasesRoute({ method: 'patch', path: CASE_CONFIGURE_DETAILS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: 'Update case settings', diff --git a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts index fa42207ac211c..32ecc4899ff65 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts @@ -11,10 +11,12 @@ import { CASE_CONFIGURE_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { configureApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const postCaseConfigureRoute = createCasesRoute({ method: 'post', path: CASE_CONFIGURE_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'public', summary: 'Add case settings', diff --git a/x-pack/plugins/cases/server/routes/api/constants.ts b/x-pack/plugins/cases/server/routes/api/constants.ts new file mode 100644 index 0000000000000..d8b425bad9ed1 --- /dev/null +++ b/x-pack/plugins/cases/server/routes/api/constants.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 type { RouteSecurity } from '@kbn/core-http-server'; + +/** + * This constant is used as the default value for the security object in routes + * where a reason for opting out needs to be provided. + */ +export const DEFAULT_CASES_ROUTE_SECURITY: RouteSecurity = { + authz: { + enabled: false, + reason: + "This route is opted out from authorization because cases uses it's own authorization model inside the cases client.", + }, +}; diff --git a/x-pack/plugins/cases/server/routes/api/files/post_file.ts b/x-pack/plugins/cases/server/routes/api/files/post_file.ts index 2d7b5b6318a4b..4b29ff69a1573 100644 --- a/x-pack/plugins/cases/server/routes/api/files/post_file.ts +++ b/x-pack/plugins/cases/server/routes/api/files/post_file.ts @@ -20,10 +20,12 @@ import { CASE_FILES_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const postFileRoute = createCasesRoute({ method: 'post', path: CASE_FILES_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/index.ts b/x-pack/plugins/cases/server/routes/api/index.ts index 31eafe0f29d28..0f316a9b6ca91 100644 --- a/x-pack/plugins/cases/server/routes/api/index.ts +++ b/x-pack/plugins/cases/server/routes/api/index.ts @@ -9,6 +9,7 @@ * Default page number when interacting with the saved objects API. */ export const DEFAULT_PAGE = 1; + /** * Default number of results when interacting with the saved objects API. */ diff --git a/x-pack/plugins/cases/server/routes/api/internal/bulk_create_attachments.ts b/x-pack/plugins/cases/server/routes/api/internal/bulk_create_attachments.ts index 18ae3d1cf74e0..d585eee080162 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/bulk_create_attachments.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/bulk_create_attachments.ts @@ -12,10 +12,12 @@ import { createCasesRoute } from '../create_cases_route'; import { escapeHatch } from '../utils'; import type { attachmentApiV1 } from '../../../../common/types/api'; import type { caseDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const bulkCreateAttachmentsRoute = createCasesRoute({ method: 'post', path: INTERNAL_BULK_CREATE_ATTACHMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/bulk_delete_file_attachments.ts b/x-pack/plugins/cases/server/routes/api/internal/bulk_delete_file_attachments.ts index 3e92c11766cd0..6ff2ef9848cda 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/bulk_delete_file_attachments.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/bulk_delete_file_attachments.ts @@ -14,10 +14,12 @@ import { createCaseError } from '../../../common/error'; import { escapeHatch } from '../utils'; import type { attachmentApiV1 } from '../../../../common/types/api'; import { BulkDeleteFileAttachmentsRequestRt } from '../../../../common/types/api/attachment/v1'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const bulkDeleteFileAttachments = createCasesRoute({ method: 'post', path: INTERNAL_DELETE_FILE_ATTACHMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/bulk_get_attachments.ts b/x-pack/plugins/cases/server/routes/api/internal/bulk_get_attachments.ts index f1e42a3cc8772..d132b80ae0d24 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/bulk_get_attachments.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/bulk_get_attachments.ts @@ -14,10 +14,12 @@ import { INTERNAL_BULK_GET_ATTACHMENTS_URL } from '../../../../common/constants' import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import { escapeHatch } from '../utils'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const bulkGetAttachmentsRoute = createCasesRoute({ method: 'post', path: INTERNAL_BULK_GET_ATTACHMENTS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/bulk_get_cases.ts b/x-pack/plugins/cases/server/routes/api/internal/bulk_get_cases.ts index 1ea9ae8a29778..e5b6e78b4e45b 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/bulk_get_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/bulk_get_cases.ts @@ -10,10 +10,12 @@ import { INTERNAL_BULK_GET_CASES_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import { escapeHatch } from '../utils'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const bulkGetCasesRoute = createCasesRoute({ method: 'post', path: INTERNAL_BULK_GET_CASES_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { body: escapeHatch, }, diff --git a/x-pack/plugins/cases/server/routes/api/internal/get_case_metrics.ts b/x-pack/plugins/cases/server/routes/api/internal/get_case_metrics.ts index 61215828be0b0..c23763fb77b23 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/get_case_metrics.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/get_case_metrics.ts @@ -12,10 +12,12 @@ import type { metricsApiV1 } from '../../../../common/types/api'; import { INTERNAL_CASE_METRICS_DETAILS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getCaseMetricRoute = createCasesRoute({ method: 'get', path: INTERNAL_CASE_METRICS_DETAILS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string({ minLength: 1 }), diff --git a/x-pack/plugins/cases/server/routes/api/internal/get_case_user_actions_stats.ts b/x-pack/plugins/cases/server/routes/api/internal/get_case_user_actions_stats.ts index 07393c9f1880c..ca975d87ba135 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/get_case_user_actions_stats.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/get_case_user_actions_stats.ts @@ -9,10 +9,12 @@ import type { userActionApiV1 } from '../../../../common/types/api'; import { INTERNAL_GET_CASE_USER_ACTIONS_STATS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getCaseUserActionStatsRoute = createCasesRoute({ method: 'get', path: INTERNAL_GET_CASE_USER_ACTIONS_STATS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/get_case_users.ts b/x-pack/plugins/cases/server/routes/api/internal/get_case_users.ts index eec44b5c92602..f081d792a772d 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/get_case_users.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/get_case_users.ts @@ -10,10 +10,12 @@ import { INTERNAL_CASE_USERS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { userApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getCaseUsersRoute = createCasesRoute({ method: 'get', path: INTERNAL_CASE_USERS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/get_cases_metrics.ts b/x-pack/plugins/cases/server/routes/api/internal/get_cases_metrics.ts index 68a9489323aaf..33432f59847c3 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/get_cases_metrics.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/get_cases_metrics.ts @@ -12,10 +12,12 @@ import type { metricsApiV1 } from '../../../../common/types/api'; import { INTERNAL_CASE_METRICS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getCasesMetricRoute = createCasesRoute({ method: 'get', path: INTERNAL_CASE_METRICS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'internal', }, diff --git a/x-pack/plugins/cases/server/routes/api/internal/get_connectors.ts b/x-pack/plugins/cases/server/routes/api/internal/get_connectors.ts index a88d6ee9b5c14..b725c606384b0 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/get_connectors.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/get_connectors.ts @@ -10,10 +10,12 @@ import { INTERNAL_CONNECTORS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { connectorApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const getConnectorsRoute = createCasesRoute({ method: 'get', path: INTERNAL_CONNECTORS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/replace_custom_field.ts b/x-pack/plugins/cases/server/routes/api/internal/replace_custom_field.ts index 4e60982f02c53..dff69fa771c59 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/replace_custom_field.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/replace_custom_field.ts @@ -11,10 +11,12 @@ import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { customFieldsApiV1 } from '../../../../common/types/api'; import type { customFieldDomainV1 } from '../../../../common/types/domain'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const replaceCustomFieldRoute = createCasesRoute({ method: 'put', path: INTERNAL_PUT_CUSTOM_FIELDS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/internal/search_cases.ts b/x-pack/plugins/cases/server/routes/api/internal/search_cases.ts index c7881868a4b2a..53bb7ddf64e23 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/search_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/search_cases.ts @@ -10,10 +10,12 @@ import { CASES_INTERNAL_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { caseApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const searchCasesRoute = createCasesRoute({ method: 'post', path: `${CASES_INTERNAL_URL}/_search`, + security: DEFAULT_CASES_ROUTE_SECURITY, routerOptions: { access: 'internal', }, diff --git a/x-pack/plugins/cases/server/routes/api/internal/suggest_user_profiles.ts b/x-pack/plugins/cases/server/routes/api/internal/suggest_user_profiles.ts index 79a3b4588d6a5..36e533274de36 100644 --- a/x-pack/plugins/cases/server/routes/api/internal/suggest_user_profiles.ts +++ b/x-pack/plugins/cases/server/routes/api/internal/suggest_user_profiles.ts @@ -7,7 +7,10 @@ import type { KibanaRequest } from '@kbn/core-http-server'; import type { UserProfileService } from '../../../services'; -import { INTERNAL_SUGGEST_USER_PROFILES_URL } from '../../../../common/constants'; +import { + INTERNAL_SUGGEST_USER_PROFILES_URL, + SUGGEST_USER_PROFILES_API_TAG, +} from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import { escapeHatch } from '../utils'; @@ -17,8 +20,12 @@ export const suggestUserProfilesRoute = (userProfileService: UserProfileService) createCasesRoute({ method: 'post', path: INTERNAL_SUGGEST_USER_PROFILES_URL, + security: { + authz: { + requiredPrivileges: [SUGGEST_USER_PROFILES_API_TAG], + }, + }, routerOptions: { - tags: ['access:casesSuggestUserProfiles'], access: 'internal', }, params: { diff --git a/x-pack/plugins/cases/server/routes/api/register_routes.ts b/x-pack/plugins/cases/server/routes/api/register_routes.ts index 4a02e43fdae65..3202891e18677 100644 --- a/x-pack/plugins/cases/server/routes/api/register_routes.ts +++ b/x-pack/plugins/cases/server/routes/api/register_routes.ts @@ -74,7 +74,7 @@ export const registerRoutes = (deps: RegisterRoutesDeps) => { const { router, routes, logger, kibanaVersion, telemetryUsageCounter } = deps; routes.forEach((route) => { - const { method, path, params, options, routerOptions, handler } = route; + const { method, path, params, options, routerOptions, handler, security } = route; (router[method] as RouteRegistrar<typeof method, CasesRequestHandlerContext>)( { @@ -85,6 +85,7 @@ export const registerRoutes = (deps: RegisterRoutesDeps) => { query: params?.query ?? escapeHatch, body: params?.body ?? schema.nullable(escapeHatch), }, + security, }, async (context, request, response) => { let responseHeaders = {}; diff --git a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts index da8eb57507131..2d4fe5a1ca01b 100644 --- a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts @@ -12,6 +12,7 @@ import { CASE_STATUS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; import type { statsApiV1 } from '../../../../common/types/api'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; /** * @deprecated since version 8.1.0 @@ -26,6 +27,7 @@ export const getStatusRoute = ({ createCasesRoute({ method: 'get', path: CASE_STATUS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, options: { deprecated: true }, routerOptions: { access: isServerless ? 'internal' : 'public', diff --git a/x-pack/plugins/cases/server/routes/api/types.ts b/x-pack/plugins/cases/server/routes/api/types.ts index 93d11980ca654..4c15da16490eb 100644 --- a/x-pack/plugins/cases/server/routes/api/types.ts +++ b/x-pack/plugins/cases/server/routes/api/types.ts @@ -14,6 +14,7 @@ import type { RouteValidatorConfig, RouteConfigOptions, RouteMethod, + RouteSecurity, } from '@kbn/core/server'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; @@ -55,4 +56,9 @@ export interface CaseRoute<P = unknown, Q = unknown, B = unknown> { */ routerOptions?: RouteConfigOptions<RouteMethod>; handler: (args: CaseRouteHandlerArguments<P, Q, B>) => Promise<IKibanaResponse>; + /** + * Defines the security requirements for a route, including authorization and authentication. + * By default cases does not use this. + */ + security?: RouteSecurity; } diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts index 3002a4c67305e..5458e3ff4aaca 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts @@ -11,10 +11,12 @@ import type { userActionApiV1 } from '../../../../common/types/api'; import { CASE_FIND_USER_ACTIONS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; export const findUserActionsRoute = createCasesRoute({ method: 'get', path: CASE_FIND_USER_ACTIONS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts index c926a608868ee..427d5ffc18eef 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts @@ -12,6 +12,7 @@ import type { userActionApiV1 } from '../../../../common/types/api'; import { CASE_USER_ACTIONS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; +import { DEFAULT_CASES_ROUTE_SECURITY } from '../constants'; /** * @deprecated since version 8.1.0 @@ -26,6 +27,7 @@ export const getUserActionsRoute = ({ createCasesRoute({ method: 'get', path: CASE_USER_ACTIONS_URL, + security: DEFAULT_CASES_ROUTE_SECURITY, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx index 1c782973dd0ed..9511d11aa4f70 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx @@ -286,7 +286,7 @@ export const ControlGeneralViewResponse = ({ <b>{i18n.actions}: </b> {response.actions?.map((action, i) => ( <span key={action}> - <b style={{ color: action === 'block' ? colors.danger : colors.ink }}> + <b css={{ color: action === 'block' ? colors.danger : colors.ink }}> {action[0].toUpperCase() + action.slice(1)} </b> {i !== (response.actions?.length || 0) - 1 && ', '} diff --git a/x-pack/plugins/cloud_defend/public/pages/policies/index.tsx b/x-pack/plugins/cloud_defend/public/pages/policies/index.tsx index c732be5421a17..d9890830ffcda 100644 --- a/x-pack/plugins/cloud_defend/public/pages/policies/index.tsx +++ b/x-pack/plugins/cloud_defend/public/pages/policies/index.tsx @@ -87,7 +87,7 @@ const TotalIntegrationsCount = ({ pageCount, totalCount, }: Record<'pageCount' | 'totalCount', number>) => ( - <EuiText size="xs" style={{ marginLeft: 8 }}> + <EuiText size="xs" css={{ marginLeft: 8 }}> <EuiTextColor color="subdued"> <FormattedMessage id="xpack.cloudDefend.policies.totalIntegrationsCountMessage" @@ -108,7 +108,7 @@ const SearchField = ({ return ( <EuiFlexGroup> - <EuiFlexItem grow={true} style={{ alignItems: 'flex-end' }}> + <EuiFlexItem grow={true} css={{ alignItems: 'flex-end' }}> <EuiFieldSearch fullWidth onSearch={setLocalValue} diff --git a/x-pack/plugins/cloud_defend/public/plugin.tsx b/x-pack/plugins/cloud_defend/public/plugin.tsx index 106ad3e47de78..43224794cddd6 100755 --- a/x-pack/plugins/cloud_defend/public/plugin.tsx +++ b/x-pack/plugins/cloud_defend/public/plugin.tsx @@ -71,7 +71,7 @@ export class CloudDefendPlugin const CloudDefendRouter = (props: CloudDefendRouterProps) => ( <KibanaContextProvider services={{ ...core, ...plugins }}> <RedirectAppLinks coreStart={core}> - <div style={{ width: '100%', height: '100%' }}> + <div css={{ width: '100%', height: '100%' }}> <SetupContext.Provider value={{ isCloudEnabled: this.isCloudEnabled }}> <Router {...props} /> </SetupContext.Provider> diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/error_handling.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/error_handling.spec.ts index 914558fbdc97f..82c45b52ad567 100644 --- a/x-pack/plugins/discover_enhanced/ui_tests/tests/error_handling.spec.ts +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/error_handling.spec.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { expect } from '@kbn/scout'; +import { expect, tags } from '@kbn/scout'; import { test, testData } from '../fixtures'; -test.describe('Discover app - errors', { tag: ['@ess'] }, () => { +test.describe('Discover app - errors', { tag: tags.ESS_ONLY }, () => { test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { await kbnClient.savedObjects.clean({ types: ['search', 'index-pattern'] }); await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.LOGSTASH); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_search_embeddable.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_search_embeddable.spec.ts index 7103f2b25e633..6c37611dbc202 100644 --- a/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_search_embeddable.spec.ts +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_search_embeddable.spec.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ScoutWorkerFixtures, expect } from '@kbn/scout'; +import { ScoutWorkerFixtures, expect, tags } from '@kbn/scout'; import { test, testData } from '../fixtures'; const createSavedSearch = async ( @@ -37,66 +37,62 @@ const createSavedSearch = async ( ], }); -test.describe( - 'Discover app - saved search embeddable', - { tag: ['@ess', '@svlSecurity', '@svlOblt', '@svlSearch'] }, - () => { - const SAVED_SEARCH_TITLE = 'TempSearch'; - const SAVED_SEARCH_ID = '90943e30-9a47-11e8-b64d-95841ca0b247'; - test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { - await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.LOGSTASH); - await kbnClient.importExport.load(testData.KBN_ARCHIVES.DASHBOARD_DRILLDOWNS); - await uiSettings.set({ - defaultIndex: testData.DATA_VIEW_ID.LOGSTASH, // TODO: investigate why it is required for `node scripts/playwright_test.js` run - 'timepicker:timeDefaults': `{ "from": "${testData.LOGSTASH_DEFAULT_START_TIME}", "to": "${testData.LOGSTASH_DEFAULT_END_TIME}"}`, - }); +test.describe('Discover app - saved search embeddable', { tag: tags.DEPLOYMENT_AGNOSTIC }, () => { + const SAVED_SEARCH_TITLE = 'TempSearch'; + const SAVED_SEARCH_ID = '90943e30-9a47-11e8-b64d-95841ca0b247'; + test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { + await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.LOGSTASH); + await kbnClient.importExport.load(testData.KBN_ARCHIVES.DASHBOARD_DRILLDOWNS); + await uiSettings.set({ + defaultIndex: testData.DATA_VIEW_ID.LOGSTASH, // TODO: investigate why it is required for `node scripts/playwright_test.js` run + 'timepicker:timeDefaults': `{ "from": "${testData.LOGSTASH_DEFAULT_START_TIME}", "to": "${testData.LOGSTASH_DEFAULT_END_TIME}"}`, }); + }); - test.afterAll(async ({ kbnClient, uiSettings }) => { - await uiSettings.unset('defaultIndex', 'timepicker:timeDefaults'); - await kbnClient.savedObjects.cleanStandardList(); - }); + test.afterAll(async ({ kbnClient, uiSettings }) => { + await uiSettings.unset('defaultIndex', 'timepicker:timeDefaults'); + await kbnClient.savedObjects.cleanStandardList(); + }); - test.beforeEach(async ({ browserAuth, pageObjects }) => { - await browserAuth.loginAsPrivilegedUser(); - await pageObjects.dashboard.goto(); - }); + test.beforeEach(async ({ browserAuth, pageObjects }) => { + await browserAuth.loginAsPrivilegedUser(); + await pageObjects.dashboard.goto(); + }); - test('should allow removing the dashboard panel after the underlying saved search has been deleted', async ({ + test('should allow removing the dashboard panel after the underlying saved search has been deleted', async ({ + kbnClient, + page, + pageObjects, + }) => { + await pageObjects.dashboard.openNewDashboard(); + await createSavedSearch( kbnClient, - page, - pageObjects, - }) => { - await pageObjects.dashboard.openNewDashboard(); - await createSavedSearch( - kbnClient, - SAVED_SEARCH_ID, - SAVED_SEARCH_TITLE, - testData.DATA_VIEW_ID.LOGSTASH - ); - await pageObjects.dashboard.addPanelFromLibrary(SAVED_SEARCH_TITLE); - await page.testSubj.locator('savedSearchTotalDocuments').waitFor({ - state: 'visible', - }); + SAVED_SEARCH_ID, + SAVED_SEARCH_TITLE, + testData.DATA_VIEW_ID.LOGSTASH + ); + await pageObjects.dashboard.addPanelFromLibrary(SAVED_SEARCH_TITLE); + await page.testSubj.locator('savedSearchTotalDocuments').waitFor({ + state: 'visible', + }); - await pageObjects.dashboard.saveDashboard('Dashboard with deleted saved search'); - await kbnClient.savedObjects.delete({ - type: 'search', - id: SAVED_SEARCH_ID, - }); + await pageObjects.dashboard.saveDashboard('Dashboard with deleted saved search'); + await kbnClient.savedObjects.delete({ + type: 'search', + id: SAVED_SEARCH_ID, + }); - await page.reload(); - await page.waitForLoadingIndicatorHidden(); - await expect( - page.testSubj.locator('embeddableError'), - 'Embeddable error should be displayed' - ).toBeVisible(); + await page.reload(); + await page.waitForLoadingIndicatorHidden(); + await expect( + page.testSubj.locator('embeddableError'), + 'Embeddable error should be displayed' + ).toBeVisible(); - await pageObjects.dashboard.removePanel('embeddableError'); - await expect( - page.testSubj.locator('embeddableError'), - 'Embeddable error should not be displayed' - ).toBeHidden(); - }); - } -); + await pageObjects.dashboard.removePanel('embeddableError'); + await expect( + page.testSubj.locator('embeddableError'), + 'Embeddable error should not be displayed' + ).toBeHidden(); + }); +}); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_searches.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_searches.spec.ts index 1398f5f24ab27..94a0d6b7b0638 100644 --- a/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_searches.spec.ts +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/saved_searches.spec.ts @@ -31,98 +31,93 @@ const assertDataViewIsSelected = async (page: ExtendedScoutTestFixtures['page'], 'Incorrect data view is selected' ).toHaveText(name); -test.describe( - 'Discover app - saved searches', - { tag: ['@ess', '@svlSecurity', '@svlOblt', '@svlSearch'] }, - () => { - const START_TIME = '2019-04-27T23:56:51.374Z'; - const END_TIME = '2019-08-23T16:18:51.821Z'; - const PANEL_NAME = 'Ecommerce Data'; - const SEARCH_QUERY = 'customer_gender:MALE'; - const SAVED_SEARCH_NAME = 'test-unselect-saved-search'; - const filterFieldAndValue = { - field: 'category', - value: `Men's Shoes`, - }; - - test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { - await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.ECOMMERCE); - await kbnClient.importExport.load(testData.KBN_ARCHIVES.DISCOVER); - await kbnClient.importExport.load(testData.KBN_ARCHIVES.ECOMMERCE); - await uiSettings.set({ - defaultIndex: testData.DATA_VIEW_ID.ECOMMERCE, - 'timepicker:timeDefaults': `{ "from": "${START_TIME}", "to": "${END_TIME}"}`, - }); +test.describe('Discover app - saved searches', { tag: ['@ess', '@svlSearch', '@svlOblt'] }, () => { + // TODO: Update to use an ES archive with an index accessible to 'viewer' + // for running this test against the Security serverless project. + const START_TIME = '2019-04-27T23:56:51.374Z'; + const END_TIME = '2019-08-23T16:18:51.821Z'; + const PANEL_NAME = 'Ecommerce Data'; + const SEARCH_QUERY = 'customer_gender:MALE'; + const SAVED_SEARCH_NAME = 'test-unselect-saved-search'; + const filterFieldAndValue = { + field: 'category', + value: `Men's Shoes`, + }; + + test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { + await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.ECOMMERCE); + await kbnClient.importExport.load(testData.KBN_ARCHIVES.DISCOVER); + await kbnClient.importExport.load(testData.KBN_ARCHIVES.ECOMMERCE); + await uiSettings.set({ + defaultIndex: testData.DATA_VIEW_ID.ECOMMERCE, + 'timepicker:timeDefaults': `{ "from": "${START_TIME}", "to": "${END_TIME}"}`, }); - - test.afterAll(async ({ kbnClient, uiSettings }) => { - await uiSettings.unset('defaultIndex', 'timepicker:timeDefaults'); - await kbnClient.savedObjects.cleanStandardList(); + }); + + test.afterAll(async ({ kbnClient, uiSettings }) => { + await uiSettings.unset('defaultIndex', 'timepicker:timeDefaults'); + await kbnClient.savedObjects.cleanStandardList(); + }); + + test.beforeEach(async ({ browserAuth }) => { + await browserAuth.loginAsPrivilegedUser(); + }); + + test('should customize time range on dashboards', async ({ pageObjects, page }) => { + await pageObjects.dashboard.goto(); + await pageObjects.dashboard.openNewDashboard(); + await pageObjects.dashboard.addPanelFromLibrary(PANEL_NAME); + await page.testSubj.locator('savedSearchTotalDocuments').waitFor({ + state: 'visible', }); - test.beforeEach(async ({ browserAuth }) => { - await browserAuth.loginAsPrivilegedUser(); + await pageObjects.dashboard.customizePanel({ + name: PANEL_NAME, + customTimeRageCommonlyUsed: { value: 'Last_90 days' }, }); - - test('should customize time range on dashboards', async ({ pageObjects, page }) => { - await pageObjects.dashboard.goto(); - await pageObjects.dashboard.openNewDashboard(); - await pageObjects.dashboard.addPanelFromLibrary(PANEL_NAME); - await page.testSubj.locator('savedSearchTotalDocuments').waitFor({ - state: 'visible', - }); - - await pageObjects.dashboard.customizePanel({ - name: PANEL_NAME, - customTimeRageCommonlyUsed: { value: 'Last_90 days' }, - }); - await expect( - page.testSubj.locator('embeddedSavedSearchDocTable').locator('.euiDataGrid__noResults'), - 'No results message in Saved Search panel should be visible' - ).toBeVisible(); + await expect( + page.testSubj.locator('embeddedSavedSearchDocTable').locator('.euiDataGrid__noResults'), + 'No results message in Saved Search panel should be visible' + ).toBeVisible(); + }); + + test(`should unselect saved search when navigating to a 'new'`, async ({ pageObjects, page }) => { + await pageObjects.discover.goto(); + await assertDataViewIsSelected(page, testData.DATA_VIEW.ECOMMERCE); + await pageObjects.filterBar.addFilter({ + ...filterFieldAndValue, + operator: 'is', }); + await page.testSubj.fill('queryInput', SEARCH_QUERY); + await page.testSubj.click('querySubmitButton'); + await pageObjects.discover.waitForHistogramRendered(); - test(`should unselect saved search when navigating to a 'new'`, async ({ - pageObjects, - page, - }) => { - await pageObjects.discover.goto(); - await assertDataViewIsSelected(page, testData.DATA_VIEW.ECOMMERCE); - await pageObjects.filterBar.addFilter({ + await pageObjects.discover.saveSearch(SAVED_SEARCH_NAME); + await pageObjects.discover.waitForHistogramRendered(); + + expect( + await pageObjects.filterBar.hasFilter({ ...filterFieldAndValue, - operator: 'is', - }); - await page.testSubj.fill('queryInput', SEARCH_QUERY); - await page.testSubj.click('querySubmitButton'); - await pageObjects.discover.waitForHistogramRendered(); - - await pageObjects.discover.saveSearch(SAVED_SEARCH_NAME); - await pageObjects.discover.waitForHistogramRendered(); - - expect( - await pageObjects.filterBar.hasFilter({ - ...filterFieldAndValue, - enabled: true, // Filter is enabled by default - }) - ).toBe(true); - await expect(page.testSubj.locator('queryInput')).toHaveText(SEARCH_QUERY); - - // create new search - await pageObjects.discover.clickNewSearch(); - await assertDataViewIsSelected(page, testData.DATA_VIEW.ECOMMERCE); - await assertNoFilterAndEmptyQuery(filterFieldAndValue, pageObjects, page); - - // change data view - await pageObjects.discover.selectDataView(testData.DATA_VIEW.LOGSTASH); - await assertNoFilterAndEmptyQuery(filterFieldAndValue, pageObjects, page); - - // change data view again - await pageObjects.discover.selectDataView(testData.DATA_VIEW.ECOMMERCE); - await assertNoFilterAndEmptyQuery(filterFieldAndValue, pageObjects, page); - - // create new search again - await pageObjects.discover.clickNewSearch(); - await assertDataViewIsSelected(page, testData.DATA_VIEW.ECOMMERCE); - }); - } -); + enabled: true, // Filter is enabled by default + }) + ).toBe(true); + await expect(page.testSubj.locator('queryInput')).toHaveText(SEARCH_QUERY); + + // create new search + await pageObjects.discover.clickNewSearch(); + await assertDataViewIsSelected(page, testData.DATA_VIEW.ECOMMERCE); + await assertNoFilterAndEmptyQuery(filterFieldAndValue, pageObjects, page); + + // change data view + await pageObjects.discover.selectDataView(testData.DATA_VIEW.LOGSTASH); + await assertNoFilterAndEmptyQuery(filterFieldAndValue, pageObjects, page); + + // change data view again + await pageObjects.discover.selectDataView(testData.DATA_VIEW.ECOMMERCE); + await assertNoFilterAndEmptyQuery(filterFieldAndValue, pageObjects, page); + + // create new search again + await pageObjects.discover.clickNewSearch(); + await assertDataViewIsSelected(page, testData.DATA_VIEW.ECOMMERCE); + }); +}); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts index 04836afb99b5b..40b07726b31e4 100644 --- a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts @@ -5,12 +5,12 @@ * 2.0. */ -import { expect } from '@kbn/scout'; +import { expect, tags } from '@kbn/scout'; import { test, testData, assertionMessages } from '../fixtures'; test.describe( 'Discover app - value suggestions: useTimeRange enabled', - { tag: ['@ess', '@svlSecurity', '@svlOblt', '@svlSearch'] }, + { tag: tags.DEPLOYMENT_AGNOSTIC }, () => { test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.LOGSTASH); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts index 319d8af3e93c9..d8035597fa0e4 100644 --- a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts @@ -10,7 +10,9 @@ import { test, testData, assertionMessages } from '../fixtures'; test.describe( 'Discover app - value suggestions non-time based', - { tag: ['@ess', '@svlSecurity', '@svlOblt', '@svlSearch'] }, + { tag: ['@ess', '@svlSearch', '@svlOblt'] }, + // TODO: Update to use an ES archive with an index accessible to 'viewer' + // for running this test against the Security serverless project. () => { test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.NO_TIME_FIELD); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_use_time_range_disabled.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_use_time_range_disabled.spec.ts index 857709b091940..cce172ad8494c 100644 --- a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_use_time_range_disabled.spec.ts +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_use_time_range_disabled.spec.ts @@ -5,12 +5,12 @@ * 2.0. */ -import { expect } from '@kbn/scout'; +import { expect, tags } from '@kbn/scout'; import { test, testData, assertionMessages } from '../fixtures'; test.describe( 'Discover app - value suggestions: useTimeRange disabled', - { tag: ['@ess', '@svlSecurity', '@svlOblt', '@svlSearch'] }, + { tag: tags.DEPLOYMENT_AGNOSTIC }, () => { test.beforeAll(async ({ esArchiver, kbnClient, uiSettings }) => { await esArchiver.loadIfNeeded(testData.ES_ARCHIVES.LOGSTASH); diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/index.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/index.ts index 706e4444488d9..f17ffac7d42ac 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/index.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { AuthenticatedUser, ElasticsearchClient, Logger } from '@kbn/core/server'; +import { AuditLogger, AuthenticatedUser, ElasticsearchClient, Logger } from '@kbn/core/server'; import { DEFAULT_NAMESPACE_STRING } from '@kbn/core-saved-objects-utils-server'; import { ESSearchRequest, ESSearchResponse } from '@kbn/es-types'; @@ -19,6 +19,7 @@ export interface AIAssistantDataClientParams { elasticsearchClientPromise: Promise<ElasticsearchClient>; kibanaVersion: string; spaceId: string; + auditLogger?: AuditLogger; logger: Logger; indexPatternsResourceName: string; currentUser: AuthenticatedUser | null; diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/audit_events.test.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/audit_events.test.ts new file mode 100644 index 0000000000000..8d65d9e628285 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/audit_events.test.ts @@ -0,0 +1,181 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + knowledgeBaseAuditEvent, + KnowledgeBaseAuditAction, + AUDIT_OUTCOME, + AUDIT_CATEGORY, + AUDIT_TYPE, +} from './audit_events'; + +describe('knowledgeBaseAuditEvent', () => { + it('should generate a success event with id', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + id: '123', + outcome: AUDIT_OUTCOME.SUCCESS, + }); + + expect(event).toEqual({ + message: 'User has created knowledge base entry [id=123]', + event: { + action: KnowledgeBaseAuditAction.CREATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CREATION], + outcome: AUDIT_OUTCOME.SUCCESS, + }, + }); + }); + it('should generate a success event with name', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + name: 'My document', + outcome: AUDIT_OUTCOME.SUCCESS, + }); + + expect(event).toEqual({ + message: 'User has created knowledge base entry [name="My document"]', + event: { + action: KnowledgeBaseAuditAction.CREATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CREATION], + outcome: AUDIT_OUTCOME.SUCCESS, + }, + }); + }); + it('should generate a success event with name and id', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + name: 'My document', + id: '123', + outcome: AUDIT_OUTCOME.SUCCESS, + }); + + expect(event).toEqual({ + message: 'User has created knowledge base entry [id=123, name="My document"]', + event: { + action: KnowledgeBaseAuditAction.CREATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CREATION], + outcome: AUDIT_OUTCOME.SUCCESS, + }, + }); + }); + + it('should generate a success event without id or name', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + outcome: AUDIT_OUTCOME.SUCCESS, + }); + + expect(event).toEqual({ + message: 'User has created a knowledge base entry', + event: { + action: KnowledgeBaseAuditAction.CREATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CREATION], + outcome: AUDIT_OUTCOME.SUCCESS, + }, + }); + }); + + it('should generate a failure event with an error', () => { + const error = new Error('Test error'); + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + id: '456', + error, + }); + + expect(event).toEqual({ + message: 'Failed attempt to create knowledge base entry [id=456]', + event: { + action: KnowledgeBaseAuditAction.CREATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CREATION], + outcome: AUDIT_OUTCOME.FAILURE, + }, + error: { + code: error.name, + message: error.message, + }, + }); + }); + + it('should handle unknown outcome', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + id: '789', + outcome: AUDIT_OUTCOME.UNKNOWN, + }); + + expect(event).toEqual({ + message: 'User is creating knowledge base entry [id=789]', + event: { + action: KnowledgeBaseAuditAction.CREATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CREATION], + outcome: AUDIT_OUTCOME.UNKNOWN, + }, + }); + }); + + it('should handle update action', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.UPDATE, + id: '123', + outcome: AUDIT_OUTCOME.SUCCESS, + }); + + expect(event).toEqual({ + message: 'User has updated knowledge base entry [id=123]', + event: { + action: KnowledgeBaseAuditAction.UPDATE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.CHANGE], + outcome: AUDIT_OUTCOME.SUCCESS, + }, + }); + }); + + it('should handle delete action', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.DELETE, + id: '123', + }); + + expect(event).toEqual({ + message: 'User has deleted knowledge base entry [id=123]', + event: { + action: KnowledgeBaseAuditAction.DELETE, + category: [AUDIT_CATEGORY.DATABASE], + type: [AUDIT_TYPE.DELETION], + outcome: AUDIT_OUTCOME.SUCCESS, + }, + }); + }); + + it('should default to success if outcome is not provided and no error exists', () => { + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + }); + + expect(event.event?.outcome).toBe(AUDIT_OUTCOME.SUCCESS); + }); + + it('should prioritize error outcome over provided outcome', () => { + const error = new Error('Error with priority'); + const event = knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + outcome: AUDIT_OUTCOME.SUCCESS, + error, + }); + + expect(event.event?.outcome).toBe(AUDIT_OUTCOME.FAILURE); + }); +}); diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/audit_events.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/audit_events.ts new file mode 100644 index 0000000000000..584efd603f4b7 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/audit_events.ts @@ -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 { EcsEvent } from '@kbn/core/server'; +import { AuditEvent } from '@kbn/security-plugin/server'; +import { ArrayElement } from '@kbn/utility-types'; + +export enum AUDIT_TYPE { + CHANGE = 'change', + DELETION = 'deletion', + ACCESS = 'access', + CREATION = 'creation', +} + +export enum AUDIT_CATEGORY { + AUTHENTICATION = 'authentication', + DATABASE = 'database', + WEB = 'web', +} + +export enum AUDIT_OUTCOME { + FAILURE = 'failure', + SUCCESS = 'success', + UNKNOWN = 'unknown', +} + +export enum KnowledgeBaseAuditAction { + CREATE = 'knowledge_base_entry_create', + UPDATE = 'knowledge_base_entry_update', + DELETE = 'knowledge_base_entry_delete', +} + +type VerbsTuple = [string, string, string]; +const knowledgeBaseEventVerbs: Record<KnowledgeBaseAuditAction, VerbsTuple> = { + knowledge_base_entry_create: ['create', 'creating', 'created'], + knowledge_base_entry_update: ['update', 'updating', 'updated'], + knowledge_base_entry_delete: ['delete', 'deleting', 'deleted'], +}; + +const knowledgeBaseEventTypes: Record<KnowledgeBaseAuditAction, ArrayElement<EcsEvent['type']>> = { + knowledge_base_entry_create: AUDIT_TYPE.CREATION, + knowledge_base_entry_update: AUDIT_TYPE.CHANGE, + knowledge_base_entry_delete: AUDIT_TYPE.DELETION, +}; + +export interface KnowledgeBaseAuditEventParams { + action: KnowledgeBaseAuditAction; + error?: Error; + id?: string; + name?: string; + outcome?: EcsEvent['outcome']; +} + +export function knowledgeBaseAuditEvent({ + action, + error, + id, + name, + outcome, +}: KnowledgeBaseAuditEventParams): AuditEvent { + let doc = 'a knowledge base entry'; + if (id && name) { + doc = `knowledge base entry [id=${id}, name="${name}"]`; + } else if (id) { + doc = `knowledge base entry [id=${id}]`; + } else if (name) { + doc = `knowledge base entry [name="${name}"]`; + } + const [present, progressive, past] = knowledgeBaseEventVerbs[action]; + const message = error + ? `Failed attempt to ${present} ${doc}` + : outcome === 'unknown' + ? `User is ${progressive} ${doc}` + : `User has ${past} ${doc}`; + const type = knowledgeBaseEventTypes[action]; + + return { + message, + event: { + action, + category: [AUDIT_CATEGORY.DATABASE], + type: type ? [type] : undefined, + outcome: error ? AUDIT_OUTCOME.FAILURE : outcome ?? AUDIT_OUTCOME.SUCCESS, + }, + error: error && { + code: error.name, + message: error.message, + }, + }; +} diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/create_knowledge_base_entry.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/create_knowledge_base_entry.ts index 8e1d749c7f78b..cda1781c3a1e9 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/create_knowledge_base_entry.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/create_knowledge_base_entry.ts @@ -8,6 +8,7 @@ import { v4 as uuidv4 } from 'uuid'; import { AnalyticsServiceSetup, + type AuditLogger, AuthenticatedUser, ElasticsearchClient, Logger, @@ -18,6 +19,7 @@ import { KnowledgeBaseEntryResponse, KnowledgeBaseEntryUpdateProps, } from '@kbn/elastic-assistant-common'; +import { AUDIT_OUTCOME, KnowledgeBaseAuditAction, knowledgeBaseAuditEvent } from './audit_events'; import { CREATE_KNOWLEDGE_BASE_ENTRY_ERROR_EVENT, CREATE_KNOWLEDGE_BASE_ENTRY_SUCCESS_EVENT, @@ -26,6 +28,7 @@ import { getKnowledgeBaseEntry } from './get_knowledge_base_entry'; import { CreateKnowledgeBaseEntrySchema, UpdateKnowledgeBaseEntrySchema } from './types'; export interface CreateKnowledgeBaseEntryParams { + auditLogger?: AuditLogger; esClient: ElasticsearchClient; knowledgeBaseIndex: string; logger: Logger; @@ -37,6 +40,7 @@ export interface CreateKnowledgeBaseEntryParams { } export const createKnowledgeBaseEntry = async ({ + auditLogger, esClient, knowledgeBaseIndex, spaceId, @@ -75,13 +79,27 @@ export const createKnowledgeBaseEntry = async ({ logger, user, }); - + auditLogger?.log( + knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + id: newKnowledgeBaseEntry?.id, + name: newKnowledgeBaseEntry?.name, + outcome: AUDIT_OUTCOME.SUCCESS, + }) + ); telemetry.reportEvent(CREATE_KNOWLEDGE_BASE_ENTRY_SUCCESS_EVENT.eventType, telemetryPayload); return newKnowledgeBaseEntry; } catch (err) { logger.error( `Error creating Knowledge Base Entry: ${err} with kbResource: ${knowledgeBaseEntry.name}` ); + auditLogger?.log( + knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + outcome: AUDIT_OUTCOME.FAILURE, + error: err, + }) + ); telemetry.reportEvent(CREATE_KNOWLEDGE_BASE_ENTRY_ERROR_EVENT.eventType, { ...telemetryPayload, errorMessage: err.message ?? 'Unknown error', diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/index.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/index.ts index c3ce7fb1a43a0..0065066455475 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/index.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/index.ts @@ -25,7 +25,7 @@ import { import pRetry from 'p-retry'; import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { StructuredTool } from '@langchain/core/tools'; -import { AnalyticsServiceSetup, ElasticsearchClient } from '@kbn/core/server'; +import { AnalyticsServiceSetup, AuditLogger, ElasticsearchClient } from '@kbn/core/server'; import { IndexPatternsFetcher } from '@kbn/data-views-plugin/server'; import { map } from 'lodash'; import { AIAssistantDataClient, AIAssistantDataClientParams } from '..'; @@ -333,6 +333,8 @@ export class AIAssistantKnowledgeBaseDataClient extends AIAssistantDataClient { } }; + // TODO make this function private + // no telemetry, no audit logs /** * Adds LangChain Documents to the knowledge base * @@ -591,10 +593,12 @@ export class AIAssistantKnowledgeBaseDataClient extends AIAssistantDataClient { * @param global */ public createKnowledgeBaseEntry = async ({ + auditLogger, knowledgeBaseEntry, telemetry, global = false, }: { + auditLogger?: AuditLogger; knowledgeBaseEntry: KnowledgeBaseEntryCreateProps; global?: boolean; telemetry: AnalyticsServiceSetup; @@ -617,6 +621,7 @@ export class AIAssistantKnowledgeBaseDataClient extends AIAssistantDataClient { this.options.logger.debug(`kbIndex: ${this.indexTemplateAndPattern.alias}`); const esClient = await this.options.elasticsearchClientPromise; return createKnowledgeBaseEntry({ + auditLogger, esClient, knowledgeBaseIndex: this.indexTemplateAndPattern.alias, logger: this.options.logger, diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/cups_overflow.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/cups_overflow.md index 2be741a88b697..aac67e6329fb8 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/cups_overflow.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/cups_overflow.md @@ -23,6 +23,15 @@ tags: - CVE-2024-47177 --- +## Update October 2, 2024 + +The following packages introduced out-of-the-box (OOTB) rules to detect the exploitation of these vulnerabilities. Please check your "Prebuilt Security Detection Rules" integration versions or visit the [Downloadable rule updates](https://www.elastic.co/guide/en/security/current/prebuilt-rules-downloadable-updates.html) site. + +- Stack Version 8.15 - Package Version 8.15.6+ +- Stack Version 8.14 - Package Version 8.14.12+ +- Stack Version 8.13 - Package Version 8.13.18+ +- Stack Version 8.12 - Package Version 8.12.23+ + ## Key takeaways * On September 26, 2024, security researcher Simone Margaritelli (@evilsocket) disclosed multiple vulnerabilities affecting the `cups-browsed`, `libscupsfilters`, and `libppd` components of the CUPS printing system, impacting versions \<= 2.0.1. @@ -232,4 +241,4 @@ We expect more to be revealed as the initial disclosure was labeled part 1. Ulti * [https://www.cve.org/CVERecord?id=CVE-2024-47176](https://www.cve.org/CVERecord?id=CVE-2024-47176) * [https://www.cve.org/CVERecord?id=CVE-2024-47177](https://www.cve.org/CVERecord?id=CVE-2024-47177) -*The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.* \ No newline at end of file +*The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.* diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elastic_releases_debmm.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elastic_releases_debmm.md index e0348caa59269..883b84f1eb441 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elastic_releases_debmm.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elastic_releases_debmm.md @@ -434,7 +434,7 @@ Covering non-commodity malware (APTs, zero-days, etc.) and emerging threats (new The expert tier focuses on advanced automation, seamless integration with other security tools, and continuous improvement through regular updates and external collaboration. While proactive threat hunting is essential for maintaining a solid security posture, it complements the ruleset management process by identifying new patterns and insights that can be incorporated into detection rules. Teams implement sophisticated automation for rule updates, ensuring continuous integration of advanced detections. At Elastic, our team is constantly refining our rulesets through daily triage, regular updates, and sharing [threat hunt queries](https://github.com/elastic/detection-rules/tree/main/hunting) in our public GitHub repository to help the community improve their detection capabilities. -![DEBMM - Tier 4](/assets/images/elastic-releases-debmm/image7.png "DEBMM - Tier 4") +![DEBMM - Tier 4](/assets/images/elastic-releases-debmm/image1.png "DEBMM - Tier 4") ##### Criteria @@ -480,11 +480,11 @@ Once you understand the DEBMM and its tiers, you can begin applying it to assess The following steps will guide you through the process: -**1. Audit Your Current Maturity Tier**: Evaluate your existing detection rulesets against the criteria outlined in the DEBMM. Identify your rulesets' strengths, weaknesses, and most significant risks to help determine your current maturity tier. For more details, see the [Example Questionnaire](#Example-Questionnaire). +**1. Audit Your Current Maturity Tier:** Evaluate your existing detection rulesets against the criteria outlined in the DEBMM. Identify your rulesets' strengths, weaknesses, and most significant risks to help determine your current maturity tier. For more details, see the [Example Questionnaire](#Example-Questionnaire). -**2. Understand the Scope of Effort: **Recognize the significant and sustained effort required to move from one tier to the next. As teams progress through the tiers, the complexity and depth of activities increase, requiring more resources, advanced skills, and comprehensive strategies. For example, transitioning from Tier 1 to Tier 2 involves systematic rule tuning and detailed gap analysis, while advancing to Tier 3 and Tier 4 requires robust external validation processes, proactive threat hunting, and sophisticated automation. +**2. Understand the Scope of Effort:** Recognize the significant and sustained effort required to move from one tier to the next. As teams progress through the tiers, the complexity and depth of activities increase, requiring more resources, advanced skills, and comprehensive strategies. For example, transitioning from Tier 1 to Tier 2 involves systematic rule tuning and detailed gap analysis, while advancing to Tier 3 and Tier 4 requires robust external validation processes, proactive threat hunting, and sophisticated automation. -**3. Set Goals for Progression: **Define specific goals for advancing to the next tier. Use the qualitative and quantitative measures to set clear objectives for each criterion. +**3. Set Goals for Progression:** Define specific goals for advancing to the next tier. Use the qualitative and quantitative measures to set clear objectives for each criterion. **4. Develop a Roadmap:** Create a detailed plan outlining the actions needed to achieve the goals. Include timelines, resources, and responsible team members. Ensure foundational practices from lower tiers are consistently applied as you progress while identifying opportunities for quick wins or significant impact by first addressing the most critical and riskiest areas for improvement. diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elevate_your_threat_hunting.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elevate_your_threat_hunting.md new file mode 100644 index 0000000000000..dcf4e4839bbf9 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/elevate_your_threat_hunting.md @@ -0,0 +1,226 @@ +--- +title: "Elevate Your Threat Hunting with Elastic" +slug: "elevate-your-threat-hunting" +date: "2024-10-18" +description: "Elastic is releasing a threat hunting package designed to aid defenders with proactive detection queries to identify actor-agnostic intrusions." +author: + - slug: terrance-dejesus + - slug: mika-ayenson + - slug: samir-bousseaden + - slug: justin-ibarra +image: "elevate-your-threat-hunting.jpg" +category: + - slug: security-operations +tags: + - threat hunting +--- + +We are excited to announce a new resource in the Elastic [Detection Rules](https://github.com/elastic/detection-rules) repository: a collection of hunting queries powered by various Elastic query languages! + +These hunting queries can be found under the [Hunting](https://github.com/elastic/detection-rules/tree/main/hunting) package. This initiative is designed to empower our community with specialized threat hunting queries and resources across multiple platforms, complementing our robust SIEM and EDR ruleset. These are developed to be consistent with the paradigms and methodologies we discuss in the Elastic [Threat Hunting guide](https://www.elastic.co/security/threat-hunting). + +## Why Threat Hunting? + +Threat hunting is a proactive approach to security that involves searching for hidden threats that evade conventional detection solutions while assuming breach. At Elastic, we recognize the importance of threat hunting in strengthening security defenses and are committed to facilitating this critical activity. + +While we commit a substantial amount of time and effort towards building out resilient detections, we understand that alerting on malicious behavior is only one part of an effective overall strategy. Threat hunting moves the needle to the left, allowing for a more proactive approach to understanding and securing the environment. + +The idea is that the rules and hunt queries will supplement each other in many ways. Most hunts also serve as great pivot points once an alert has triggered, as a powerful means to ascertain related details and paint a full picture. They are just as useful when it comes to triaging as proactively hunting. + +Additionally, we often find ourselves writing resilient and robust logic that just doesn’t meet the criteria for a rule, whether it is too noisy or not specific enough. This will serve as an additional means to preserve the value of these research outcomes in the form of these queries. + +## What We Are Providing + +The new Hunting package provides a diverse range of hunting queries targeting all the same environments as our rules do, and potentially even more, including: + +* Endpoints (Windows, Linux, macOS) +* Cloud (CSPs, SaaS providers, etc.) +* Network +* Large Language Models (LLM) +* Any other Elastic [integration](https://www.elastic.co/integrations) or datasource that adds value + +These queries are crafted by our security experts to help you gather initial data that is required to test your hypothesis during your hunts. These queries also include names and descriptions that may be a starting point for your hunting efforts as well. All of this valuable information is then stored in an index file (both YAML and Markdown) for management, ease-of-use and centralizing our collection of hunting queries. + +### Hunting Package + +The Hunting package has also been made to be its own module within Detection Rules with a few simple commands for easy management and searching throughout the catalogue of hunting queries. Our goal is not to provide an out-of-the-box hunting tool, but rather a foundation for programmatically managing and eventually leveraging these hunting queries. + +Existing Commands: + +**Generate Markdown** - Load TOML files or path of choice and convert to Markdown representation in respective locations. +![](/assets/images/elevate-your-threat-hunting/image6.png "") + +**Refresh Index** - Refresh indexes from the collection of queries, both YAML and Markdown. +![](/assets/images/elevate-your-threat-hunting/image4.png "") + +**Search** - Search for hunting queries based on MITRE tactic, technique or subtechnique IDs. Also includes the ability to search per data source. +![](/assets/images/elevate-your-threat-hunting/image5.png "") + +**Run Query** - Run query of choice against a particular stack to identify hits (requires pre-auth). Generates a search link for easy pivot. +![](/assets/images/elevate-your-threat-hunting/image8.png "") + +**View Hunt**- View a hunting file in TOML or JSON format. +![](/assets/images/elevate-your-threat-hunting/image7.png "") + +**Hunt Summary**- Generate count statistics based on breakdown of integration, platform, or language +![](/assets/images/elevate-your-threat-hunting/image2.png "") + +## Benefits of these Hunt Queries + +Each hunting query will be saved in its respective TOML file for programmatic use, but also have a replicated markdown file that serves as a quick reference for manual tasks or review. We understand that while automation is crucial to hunting maturity, often hunters may want a quick and easy copy-paste job to reveal events of interest. Our collection of hunt queries and CLI options offers several advantages to both novice and experienced threat hunters. Each query in the library is designed to serve as a powerful tool for detecting hidden threats, as well as offering additional layers of investigation during incident response. + +* Programmatic and Manual Flexibility: Each query is structured in a standardized TOML format for programmatic use, but also offers a Markdown version for those who prefer manual interaction. +* Scalable queries: Our hunt queries are designed with scalability in mind, leveraging the power of Elastic’s versatile and latest query languages such as ES|QL. This scalability ensures that you can continuously adapt your hunting efforts as your organization’s infrastructure grows, maintaining high levels of visibility and security. +* Integration with Elastic’s Product: These queries integrate with the Elastic Stack and our automation enables you to test quickly, enabling you to pivot through Elastic’s Security UI for deeper analysis. +* Diverse Query Types Available: Out hunt queries support a wide variety of query languages, including KQL, EQL, ES|QL, OsQuery, and YARA, making them adaptable across different data sources and environments. Whether hunting across endpoints, cloud environments, or specific integrations like Okta or LLMs, users can leverage the right language for their unique needs. +* Extended Coverage for Elastic Prebuilt Rules: While Elastic’s prebuilt detection rules offer robust coverage, there are always scenarios where vendor detection logic may not fully meet operational needs due to the specific environment or nature of the threat. These hunting queries help to fill in those gaps by offering broader and more nuanced coveraged, particularly for behaviors that don’t nearly fit into rule-based detections. +* Stepping stone for hunt initialization or pivoting: These queries serve as an initial approach to kickstart investigations or pivot from initial findings. Whether used proactively to identify potential threats or reactively to expand upon triggered alerts, these queries can provide additional context and insights based on threat hunter hypothesis and workflows. +* MITRE ATT&CK Alignment: Every hunt query includes MITRE ATT&CK mappings to provide contextual insight and help prioritize the investigation of threats according to threat behaviors. +* Community and Maintenance: This hunting module lives within the broader Elastic Detection Rules repository, ensuring continual updates alongside our prebuilt rules. Community contributions also enable our users to collaborate and expand unique ways to hunt. + +As we understand the fast-paced nature of hunting and need for automation, we have included searching capabilities and a run option to quickly identify if you have matching results from any hunting queries in this library. + +## Details of Each Hunting Analytic + +Each hunting search query in our repository includes the following details to maximize its effectiveness and ease of use: + +* **Data Source or Integration**: The origin of the data utilized in the hunt. +* **Name**: A descriptive title for the hunting query. +* **Hypothesis**: The underlying assumption or threat scenario the hunt aims to investigate. This is representated as the description. +* **Query(s)**: Provided in one of several formats, including ES|QL, EQL, KQL, or OsQuery. +* **Notes**: Additional information on how to pivot within the data, key indicators to watch for, and other valuable insights. +* **References**: Links to relevant resources and documentation that support the hunt. +* **Mapping to MITRE ATT&CK**: How the hunt correlates to known tactics, techniques, and procedures in the MITRE ATT&CK framework. + +![](/assets/images/elevate-your-threat-hunting/image9.png "") + +For those who prefer a more hands-on approach, we also provide TOML files for programmatic consumption. Additionally, we offer an easy converter to Markdown for users who prefer to manually copy and paste the hunts into their systems. + +### Hunting Query Creation Example: + +In the following example, we will explore a basic hunting cycle for the purpose of creating a new hunting query that we want to use in later hunting cycles. Note that this is an oversimplified hunting cycle that may require several more steps in a real-world application. + +**Hypothesis**: We assume that a threat adversary (TA) is targeting identity providers (IdPs), specifically Okta, by compromising cloud accounts by identifying runtime instances in CI/CD pipelines that use client credentials for authentication with Okta’s API. Their goal is to identify unsecure credentials, take these and obtain an access token whose assumed credentials are tied to an Okta administrator. + +**Evidence**: We suspect that in order to identify evidence of this, we need Okta system logs that report API activity, specifically any public client app sending access token requests where the grant type provided are client credentials. We also suspect that because the TA is unaware of the mapped OAuth scopes for this application, that when the access token request is sent, it may fail due to the incorrect OAuth scopes being explicitly sent. We also know that demonstrating proof-of-possession (DPoP) is not required for our client applications during authentication workflow because doing so would be disruptive to operations so we prioritize operability over security. + +Below is the python code used to emulate the behavior of attempting to get an access token with stolen client credentials where the scope is `okta.trustedOrigins.manage` so the actor can add a new cross-origins (CORS) policy and route client authentication through their own server. + +``` +import requests + +okta_domain = "TARGET_DOMAIN" +client_id = "STOLEN_CLIENT_ID" +client_secret = "STOLEN_CLIENT_CREDENTIALS" + +# Prepare the request +auth_url = f"{okta_domain}/oauth2/default/v1/token" +auth_data = { + "grant_type": "client_credentials", + "scope": "okta.trustedOrigins.manage" +} +auth_headers = { + "Accept": "application/json", + "Content-Type": "application/x-www-form-urlencoded", + "Authorization": f"Basic {client_id}:{client_secret}" +} +# Make the request +response = requests.post(auth_url, headers=auth_headers, data=auth_data) + +# Handle the response +if response.ok: + token = response.json().get("access_token") + print(f"Token: {token}") +else: + print(f"Error: {response.text}") +``` + +Following this behavior, we formulate a query as such for hunting where we filter out some known client applications like DataDog and Elastic’s Okta integrations. + +``` +from logs-okta.system* +| where @timestamp > NOW() - 7 day +| where + event.dataset == "okta.system" + + // filter on failed access token grant requests where source is a public client app + and event.action == "app.oauth2.as.token.grant" + and okta.actor.type == "PublicClientApp" + and okta.outcome.result == "FAILURE" + + // filter out known Elastic and Datadog actors + and not ( + okta.actor.display_name LIKE "Elastic%" + or okta.actor.display_name LIKE "Datadog%" + ) + + // filter for scopes that are not implicitly granted + and okta.outcome.reason == "no_matching_scope" +``` + +As shown below, we identify matching results and begin to pivot and dive deeper into this investigation, eventually involving incident response (IR) and escalating appropriately. + +![](/assets/images/elevate-your-threat-hunting/image10.png "") + +During our after actions report (AAR), we take note of the query that helped identify these compromised credentials and decide to preserve this as a hunting query in our forked Detection Rules repository. It doesn’t quite make sense to create a detection rule based on the fidelity of this and knowing the constant development work we do with custom applications that interact with the Okta APIs, therefore we reserve it as a hunting query. + +Creating a new hunting query TOML file in the `hunting/okta/queries` package, we add the following information: + +``` +author = "EvilC0rp Defenders" +description = """Long Description of Hunt Intentions""" +integration = ["okta"] +uuid = "0b936024-71d9-11ef-a9be-f661ea17fbcc" +name = "Failed OAuth Access Token Retrieval via Public Client App" +language = ["ES|QL"] +license = "Apache License 2.0" +notes = [Array of useful notes from our investigation] +mitre = ['T1550.001'] +query = [Our query as shown above] +``` + +With the file saved we run `python -m hunting generate-markdown FILEPATH` to generate the markdown version of it in `hunting/okta/docs/`. + +![](/assets/images/elevate-your-threat-hunting/image1.png "") + +Once saved, we can view our new hunting content by using the `view-rule` command or search for it by running the `search` command, specifying Okta as the data source and [T1550.001](https://attack.mitre.org/techniques/T1550/001/) as the subtechnique we are looking for. + +![](/assets/images/elevate-your-threat-hunting/image7.png "") + +![](/assets/images/elevate-your-threat-hunting/image5.png "") + +Last but not least, we can check that the query runs successfully by using the `run-query` command as long as we save a `.detection-rules-cfg-yaml` file with our Elasticsearch authentication details, which will tell us if we have matching results or not. + +![](/assets/images/elevate-your-threat-hunting/image8.png "") + +Now we can refresh our hunting indexes with the `refresh-index` command and ensure that our markdown file has been created. + +![](/assets/images/elevate-your-threat-hunting/image11.png "") + +## How We Plan to Expand + +Our aim is to continually enhance the Hunting package with additional queries, covering an even wider array of threat scenarios. We will update this resource based on: + +* **Emerging Threats**: Developing new queries as new types of cyber threats arise. +* **Community Feedbac**k: Incorporating suggestions and improvements proposed by our community. +* **Fill Gaps Where Traditional alerting Fails**: While we understand the power of our advanced SIEM and EDR, we also understand how some situations favor hunting instead. +* **Longevity and Maintenance**: Our hunting package lives within the very same repository we actively manage our out-of-the-box (OOTB) prebuilt detection rules for the Elastic SIEM. As a result, we plan to routinely add and update our hunting resources. +* **New Features**: Develop new features and commands to aid users with the repository of their hunting efforts. + +Our expansion would not be complete without sharing to the rest of the community in an effort to provide value wherever possible. The adoption of these resources or even paradigms surrounding threat scenarios is an important effort by our team to help hunting efforts. + +Lastly, we acknowledge and applaud the existing hunting efforts done or in-progress by our industry peers and community. We also acknowledge that maintaining such a package of hunting analytics and/or queries requires consistency and careful planning. Thus this package will receive continued support and additional hunting queries added over time, often aligning with our detection research efforts or community submissions! + +## Get Involved + +Explore the Hunting resources, utilize the queries and python package, participate in our community discussion forums to share your experiences and contribute to the evolution of this resource. Your feedback is crucial for us to refine and expand our offerings. + +* [Detection Rules Community Slack Channel](https://elasticstack.slack.com/archives/C016E72DWDS) +* Hunting “[Getting Started](https://github.com/elastic/detection-rules/tree/main/hunting)” Doc +* [Elastic Security Labs](https://twitter.com/elasticseclabs) on X + +## Conclusion + +With the expansion of these hunting resources, Elastic reaffirms its commitment to advancing cybersecurity defenses. This resource is designed for both experienced threat hunters and those new to the field, providing the tools needed to detect and mitigate sophisticated cyber threats effectively. + +Stay tuned for more updates, and happy hunting! \ No newline at end of file diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/exploring_aws_sts_assumeroot.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/exploring_aws_sts_assumeroot.md new file mode 100644 index 0000000000000..b00b2cc5938a4 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/exploring_aws_sts_assumeroot.md @@ -0,0 +1,363 @@ +--- +title: "Exploring AWS STS AssumeRoot" +subtitle: "AssumeRoot Abuse and Detection Strategies in AWS Organizations" +slug: "exploring-aws-sts-assumeroot" +date: "2024-12-09" +description: "Explore AWS STS AssumeRoot, its risks, detection strategies, and practical scenarios to secure against privilege escalation and account compromise using Elastic's SIEM and CloudTrail data." +author: + - slug: terrance-dejesus +image: "Security Labs Images 20.jpg" +category: + - slug: security-research +--- + +## Preamble + +Welcome to another installment of AWS detection engineering with Elastic. This article will dive into the new AWS [Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) (STS) API operation, [AssumeRoot](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html), simulate some practical behavior in a sandbox AWS environment, and explore detection capabilities within Elastic’s SIEM. + +What to expect from this article: + +* Basic insight into AWS STS web service +* Insight into STS’ AssumeRoot API operation +* Threat scenario using AssumeRoot with Terraform and Python code +* Detection and hunting opportunities for potential AssumeRoot abuse + +## Understanding AWS STS and the AssumeRoot API + +AWS Security Token Service (STS) is a web service that enables users, accounts, and roles to request temporary, limited-privilege credentials. For IAM users, their accounts are typically registered in AWS Identity and Access Management (IAM), where either a login profile is attached for accessing the console or access keys, and secrets are created for programmatic use by services like Lambda, EC2, and others. + +While IAM credentials are persistent, [**STS credentials**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html#sts-regionalization) are temporary. These credentials \- comprising an access key, secret key, and session token \- are granted upon request and are valid for a specific period. Requests are typically sent to the global `sts.amazonaws.com` endpoint, which responds with temporary credentials for a user or role. These credentials can then be used to access other AWS services on behalf of the specified user or role, as long as the action is explicitly allowed by the associated permission policy. + +This process is commonly known as assuming a role, executed via the [`AssumeRole`](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API. It is frequently used in AWS environments and organizations for various scenarios. For example: + +* An EC2 instance with an attached role will automatically use `AssumeRole` to retrieve temporary credentials for API requests. +* Similarly, Lambda functions often invoke `AssumeRole` to authenticate and perform their designated actions. + +Although `AssumeRole` is incredibly useful, it can pose a risk if roles are over-permissioned by the organization. Misconfigured policies with excessive permissions can allow adversaries to abuse these roles, especially in environments where the [Principle of Least Privilege](https://docs.aws.amazon.com/wellarchitected/latest/framework/sec_permissions_least_privileges.html) (PoLP) is not strictly enforced. Note that the security risks associated with AssumeRole are typically attributed to misconfigurations or not following best security practices by organizations. These are not the result of AssumeRole or even AssumeRoot development decisions. + +### Introduction to AssumeRoot + +AWS recently introduced the `AssumeRoot` API operation to STS. Similar to `AssumeRole`, it allows users to retrieve temporary credentials \- but specifically for the [root user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) of a member account in an AWS organization. + +### What Are Member Accounts? + +In AWS, [member accounts](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html) are separate accounts within an organization that have their own IAM users, services, and roles. These accounts are distinct from the management account, but they still fall under the same organizational hierarchy. Each AWS organization is created with a unique root account tied to the email address used during its setup. Similarly, every member account requires a root user or email address at the time of its creation, effectively establishing its own root identity. + +### How Does AssumeRoot Work? + +When a privileged user in the management account needs root-level privileges for a member account, they can use the `AssumeRoot` API to retrieve temporary credentials for the member account's root user. Unlike `AssumeRole`, where the target principal is a user ARN, the target principal for `AssumeRoot` is the member account ID itself. Additionally, a task policy ARN must be specified, which defines the specific permissions allowed with the temporary credentials. + +Here are the available task policy ARNs for `AssumeRoot`: + +* [IAMAuditRootUserCredentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-IAMAuditRootUserCredentials) +* [IAMCreateRootUserPassword](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-IAMCreateRootUserPassword) +* [IAMDeleteRootUserCredentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-IAMDeleteRootUserCredentials) +* [S3UnlockBucketPolicy](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-S3UnlockBucketPolicy) +* [SQSUnlockQueuePolicy](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-SQSUnlockQueuePolicy) + +### Potential Abuse of Task Policies + +While these predefined task policies limit what can be done with `AssumeRoot`, their scope can still be theoretically abused in the right circumstances. For example: + +* **IAMCreateRootUserPassword**: This policy grants the [`iam:CreateLoginProfile`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateLoginProfile.html) permission, allowing the creation of a login profile for a user that typically doesn't require console access. If an adversary gains access to programmatic credentials, they could create a login profile and gain console access to the account that is more persistent. +* **IAMDeleteRootUserCredentials**: This policy allows the deletion of root credentials, but also grants permissions like [`iam:ListAccessKeys`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html) and [`iam:ListMFADevices`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADevices.html). These permissions could help an adversary gather critical information about access credentials or MFA configurations for further exploitation. + +## AssumeRoot in Action + +Now that we understand how AssumeRoot works at a high level, how it differs from AssumeRole, and the potential risks associated with improper security practices, let’s walk through a practical scenario to simulate its usage. It should be noted that this is one of many potential scenarios where AssumeRoot may or could be abused. As of this article's publication, no active abuse has been reported in the wild, as expected with a newer AWS functionality. + +Below is a simple depiction of what we will accomplish in the following sections: + +![AssumeRoot scenario workflow](/assets/images/exploring-aws-sts-assumeroot/image3.png) + +Before diving in, it’s important to highlight that we’re using an admin-level IAM user configured as the default profile for our local AWS CLI. This setup enables us to properly configure the environment using [Terraform](https://developer.hashicorp.com/terraform) and simulate potential threat scenarios in AWS for detection purposes. + +### Member Account Creation + +The first step is to enable centralized root access for member accounts, as outlined in the [AWS documentation](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts.html). Centralized root access allows us to group all AWS accounts into a single organization, with each member account having its own root user. + +Next, we manually create a member account within our organization through the Accounts section in the AWS Management Console. For this scenario, the key requirement is to note the member account ID, a unique 12-digit number. For our example, we’ll assume this ID is `000000000001` and name it *AWSAssumeRoot*. Centralized management of AWS accounts is a common practice for organizations that may separate different operational services into separate AWS accounts but want to maintain centralized management. + +![AWS console showing management account and member account *AWSAssumeRoot*](/assets/images/exploring-aws-sts-assumeroot/image4.png) + +We also add the member account as the [delegated administrator](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_delegate_policies.html) for centralized root access as well, which allows that root member account to have centralized root access for any other member accounts of the organization. + +While we won’t cover it in depth, we have also enabled the new [Resource control policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) (RCPs) within Identity and Access Management (IAM), which will allow central administration over permissions granted to resources within accounts in our organization, but by default, the *RCPFullAWSAccess* policy allows all permissions to all services for all principals and is attached directly to root. + +### Environment Setup + +For our simulation, we use Terraform to create an overly permissive IAM user named compromised\_user. This user is granted the predefined [AdministratorAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AdministratorAccess.html) policy, which provides admin-level privileges. Additionally, we generated an access key for this user while intentionally omitting a login profile to reflect a typical setup where credentials are used programmatically. This is not an uncommon practice, especially in developer environments. + +Below is the `main.tf` configuration used to create the resources: + +``` +provider "aws" { + region = var.region +} + +data "aws_region" "current" {} + +# Create an IAM user with AdministratorAccess (simulated compromised user) +resource "aws_iam_user" "compromised_user" { + name = "CompromisedUser" +} + +# Attach AdministratorAccess Policy to the compromised user +resource "aws_iam_user_policy_attachment" "compromised_user_policy" { + user = aws_iam_user.compromised_user.name + policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess" +} + +# Create access keys for the compromised user +resource "aws_iam_access_key" "compromised_user_key" { + user = aws_iam_user.compromised_user.name +} +``` + +We also define an `outputs.tf` file to capture key details about the environment, such as the region, access credentials, and the user ARN: + +``` +output "aws_region" { + description = "AWS Region where the resources are deployed" + value = var.region +} + +output "compromised_user_access_key" { + value = aws_iam_access_key.compromised_user_key.id + sensitive = true + description = "Access key for the compromised IAM user" +} + +output "compromised_user_secret_key" { + value = aws_iam_access_key.compromised_user_key.secret + sensitive = true + description = "Secret key for the compromised IAM user" +} + +output "compromised_user_name" { + value = aws_iam_user.compromised_user.name + description = "Name of the compromised IAM user" +} + +output "compromised_user_arn" { + value = aws_iam_user.compromised_user.arn + description = "ARN of the compromised IAM user" +} +``` + +Once we run `terraform apply`, the configuration creates a highly permissive IAM user (`compromised_user`) with associated credentials. These credentials simulate those that an adversary might obtain for initial access or escalating privileges. + +This is one of the first hurdles for an adversary, collecting valid credentials. In today’s threat landscape information stealer malware and phishing campaigns are more common than ever, aimed at obtaining credentials that can be sold or used for lateral movement. While this is a hurdle, the probability of compromised credentials for initial access is high \- such as those with [SCATTERED SPIDER](https://www.cisa.gov/sites/default/files/2023-11/aa23-320a_scattered_spider_0.pdf) and [SCARLETEEL](https://sysdig.com/blog/scarleteel-2-0/). + +![](/assets/images/exploring-aws-sts-assumeroot/image1.png) + +### Establish an STS Client Session with Stolen Credentials + +The next step is to establish an STS client session using the compromised credentials (`compromised_user` access key and secret key). This session allows the adversary to make requests to AWS STS on behalf of the compromised user. + +Here’s the Python code to establish the STS client using the [AWS Boto3 SDK](https://aws.amazon.com/sdk-for-python/) (the AWS SDK used to create, configure, and manage AWS services, such as Amazon EC2 and Amazon S3). This Python code is used to create the STS client with stolen IAM user credentials: + +``` + sts_client = boto3.client( + "sts", + aws_access_key_id=compromised_access_key, + aws_secret_access_key=compromised_secret_key, + region_name=region, + endpoint_url=f'https://sts.{region}.amazonaws.com' + ) + ``` + +![Terminal output when creating STS client with stolen IAM user credentials](/assets/images/exploring-aws-sts-assumeroot/image7.png) + +**Note:** During testing, we discovered that the `endpoint_url` must explicitly point to `https://sts.<region>.amazonaws.com`. Omitting this may result in an `InvalidOperation` error when attempting to invoke the `AssumeRoot` API. + +This STS client session forms the foundation for simulating an adversary's actions as we have taken compromised credentials and initiated our malicious actions. + +### Assume Root for Member Account on Behalf of Compromised User + +After establishing an STS client session as the compromised user, we can proceed to call the AssumeRoot API. This request allows us to assume the root identity of a member account within an AWS Organization. For the request, the TargetPrincipal is set to the member account ID we obtained earlier, the session duration is set to 900 seconds (15 minutes), and the TaskPolicyArn is defined as `IAMCreateRootUserPassword`. This policy scopes the permissions to actions related to creating or managing root login credentials. + +A notable permission included in this policy is [`CreateLoginProfile`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateLoginProfile.html), which enables the creation of a login password for the root user. This allows access to the AWS Management Console as the root user. + +Below is the Python code to assume root of member account `000000000001`, with permissions scoped by *IAMCreateRootUserPassword*. + +``` +response = sts_client.assume_root( + TargetPrincipal=member_account_id, + DurationSeconds=900, + TaskPolicyArn={"arn": "arn:aws:iam::aws:policy/root-task/IAMCreateRootUserPassword"}, +) +root_temp_creds = response["Credentials"] +``` + +If the AssumeRoot request is successful, the response provides temporary credentials (`root_temp_creds`) for the root account of the target member. These credentials include an access key, secret key, and session token, enabling temporary root-level access for the duration of the session. + +![Terminal output showing AssumeRoot with IAMCreateRootUserPassword for AWSAssumeRoot member account +](/assets/images/exploring-aws-sts-assumeroot/image6.png) + +### Creating a Login Profile for the Member Root Account + +With temporary root credentials in hand, the next step is to establish an authenticated IAM client session as the root user of the member account. Using this session, we can call the `create_login_profile()` method. This method allows us to assign a login password to the root user, enabling console access. + +The following Python code establishes an authenticated IAM client and creates a login profile: + +``` +iam_client = boto3.client( + "iam", + aws_access_key_id=root_temp_creds["AccessKeyId"], + aws_secret_access_key=root_temp_creds["SecretAccessKey"], + aws_session_token=root_temp_creds["SessionToken"], +) + +response = iam_client.create_login_profile() +``` + +It’s worth noting that the `create_login_profile()` method requires no explicit parameters for the root user, as it acts on the credentials of the currently authenticated session. In this case, it will apply to the root user of the member account. + +![Terminal output showing IAM client established as Root member account and CreateLoginProfile request](/assets/images/exploring-aws-sts-assumeroot/image5.png) + + +### Reset the Administrator Password and Login to the AWS Console + +At this stage, we’re nearly complete\! Let’s recap the progress so far: + +1. Using compromised IAM user credentials, we established an STS session to assume the identity of an overly permissive user. +2. Leveraging this session, we assumed the identity of the root user of a target member account, acquiring temporary credentials scoped to the `IAMCreateRootUserPassword` task policy. +3. With these temporary root credentials, we established an IAM client session and successfully created a login profile for the root user. + +The final step involves resetting the root user password to gain permanent access to the AWS Management Console. To do this, visit the AWS console login page and attempt to log in as the root user. Select the “Forgot Password” option to initiate the password recovery process. This will prompt a CAPTCHA challenge, after which a password reset link is sent to the root user’s email address. This would be the third roadblock for an adversary as they would need access to the root user’s email inbox to continue with the password reset workflow. It should be acknowledged that if *CreateLoginProfile* is called, you can specify the password for the user and enforce a “password reset required”. However, this is not allowed for root accounts by default, and for good reason by AWS. Unlike the first hurdle of having valid credentials, access to a user’s inbox may prove more difficult and less likely, but again, with enough motivation and resources, it is still possible. + +![Password recovery request from AWS sign-in for root](/assets/images/exploring-aws-sts-assumeroot/image2.png) + +After selecting the password reset link, you can set a new password for the root user. This step provides lasting access to the console as the root user. Unlike the temporary credentials obtained earlier, this access is no longer limited by the session duration or scoped permissions of the IAMCreateRootUserPassword policy, granting unrestricted administrative control over the member account. + +![Successful login as root for AWSAssumeRoot member account](/assets/images/exploring-aws-sts-assumeroot/image8.png) + +**Before moving on, if you followed along and tried this in your environment, we want to gently remind you to use Terraform to remove testing resources** using the terraform destroy command in the same folder where you initialized and deployed the resources. + +## Detection and Hunting Opportunities + +While exploring cloud features and APIs from an adversary's perspective is insightful, our ultimate responsibility lies in detecting and mitigating malicious or anomalous behavior, alerting stakeholders, and responding effectively. Also, while such a scenario has not been publicly documented in the wild, we should not wait to be a victim either and be reactive, hence the reason for our whitebox scenario. + +The following detection and hunting queries rely on AWS CloudTrail data ingested into the Elastic Stack using the [AWS integration](https://www.elastic.co/docs/current/integrations/aws). If your environment differs, you may need to adjust these queries for custom ingestion processes or adapt them for a different SIEM or query tool. + +**Note:** Ensure that AWS CloudTrail is enabled for all accounts in your organization to provide comprehensive visibility into activity across your AWS environment. You may also need to enable the specific trail used for monitoring across the entire organization so all member accounts are observed properly. + +### Hunting \- Unusual Action for IAM User Access Key + +This query identifies potentially compromised IAM access keys that are used to make unusual API calls. It sorts the results in ascending order to surface less frequent API calls within the last two weeks. This query can be adjusted to account for different API calls or include other CloudTrail-specific fields. + +Hunting Query: [AWS IAM Unusual AWS Access Key Usage for User](https://github.com/elastic/detection-rules/blob/7b88b36d294407cc1ea2ab1b0acbbbf3104162a9/hunting/aws/docs/iam_unusual_access_key_usage_for_user.md) + +MITRE ATT\&CK: + +* T1078.004 \- [Valid Accounts: Cloud Accounts](https://attack.mitre.org/techniques/T1078/004/) + +Language: ES|QL + +``` +FROM logs-aws.cloudtrail* +| WHERE @timestamp > now() - 14 day +| WHERE + event.dataset == "aws.cloudtrail" + and event.outcome == "success" + and aws.cloudtrail.user_identity.access_key_id IS NOT NULL + and aws.cloudtrail.resources.arn IS NOT NULL + and event.action NOT IN ("GetObject") +| EVAL daily_buckets = DATE_TRUNC(1 days, @timestamp) +| STATS + api_counts = count(*) by daily_buckets, aws.cloudtrail.user_identity.arn, aws.cloudtrail.user_identity.access_key_id, aws.cloudtrail.resources.arn, event.action +| WHERE api_counts < 2 +| SORT api_counts ASC +``` + +### Detection \- Unusual Assume Root Action by Rare IAM User + +Detection Rule: [AWS STS AssumeRoot by Rare User and Member Account](https://github.com/elastic/detection-rules/blob/main/rules/integrations/aws/privilege_escalation_sts_assume_root_from_rare_user_and_member_account.toml) + +This query identifies instances where the `AssumeRoot` API call is made by an IAM user ARN and member account that have not performed this action in the last 14 days. This anomaly-based detection uses Elastic’s [New Terms](https://www.elastic.co/guide/en/security/current/rules-ui-create.html#create-new-terms-rule) detection rule. + +* The `aws.cloudtrail.user_identity.arn` field identifies the source IAM user from the management AWS account. +* The `aws.cloudtrail.resources.account_id` field reflects the target member account. + +MITRE ATT\&CK: + +* T1548.005 \- [Temporary Elevated Cloud Access](https://attack.mitre.org/techniques/T1548/005/) +* T1098.003 \- [Additional Cloud Roles](https://attack.mitre.org/techniques/T1098/003/) + +Language: KQL + +``` +event.dataset: "aws.cloudtrail" + and event.provider: "sts.amazonaws.com" + and event.action: "AssumeRoot" + and event.outcome: "success" +``` + +New Term Fields: +If any combination of these fields has not been seen executing AssumeRoot within the last 14 days, an alert is generated. + +* `aws.cloudtrail.user_identity.arn` +* `aws.cloudtrail.resources.account_id` + +### Detection \- Self-Created Login Profile for Root Member Account + +This query detects instances where a login profile is created for a root member account by the root account itself, potentially indicating unauthorized or anomalous behavior. + +Detection Rule: [AWS IAM Login Profile Added for Root](https://github.com/elastic/detection-rules/blob/4374128458d116211d5d22993b6d87f6c82a30a0/rules/integrations/aws/persistence_iam_create_login_profile_for_root.toml) + +MITRE ATT\&CK: + +* T1098.003 \- [Account Manipulation: Additional Cloud Roles](https://attack.mitre.org/techniques/T1098/003/) +* T1548.005 \- [Abuse Elevation Control Mechanism: Temporary Elevated Cloud Access](https://attack.mitre.org/techniques/T1548/005/) +* T1078.004 \- [Valid Accounts: Cloud Accounts](https://attack.mitre.org/techniques/T1078/004/) + +Language: ES|QL + +``` +FROM logs-aws.cloudtrail* +| WHERE + // filter for CloudTrail logs from IAM + event.dataset == "aws.cloudtrail" + and event.provider == "iam.amazonaws.com" + // filter for successful CreateLoginProfile API call + and event.action == "CreateLoginProfile" + and event.outcome == "success" + // filter for Root member account + and aws.cloudtrail.user_identity.type == "Root" + // filter for an access key existing which sources from AssumeRoot + and aws.cloudtrail.user_identity.access_key_id IS NOT NULL + // filter on the request parameters not including UserName which assumes self-assignment + and NOT TO_LOWER(aws.cloudtrail.request_parameters) LIKE "*username*" +| keep + @timestamp, + aws.cloudtrail.request_parameters, + aws.cloudtrail.response_elements, + aws.cloudtrail.user_identity.type, + aws.cloudtrail.user_identity.arn, + aws.cloudtrail.user_identity.access_key_id, + cloud.account.id, + event.action, + source.address + source.geo.continent_name, + source.geo.region_name, + source.geo.city_name, + user_agent.original, + user.id +``` + +These detections are specific to our scenario, however, are not fully inclusive regarding all potential AssumeRoot abuse. If you choose to explore and discover some additional hunting or threat detection opportunities, feel free to share in our [Detection Rules](https://github.com/elastic/detection-rules) repository or the [Threat Hunting](https://github.com/elastic/detection-rules/tree/main/hunting) library of ours. + +## Hardening Practices for AssumeRoot Use + +AWS [documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) contains several important considerations for best security practices regarding IAM, STS, and many other services. However, cloud security is not a “one size fits all” workflow and security practices should be tailored to your environment, risk-tolerance, and more. + +**Visibility is Key:** If you can’t see it, you can’t protect it. Start by enabling CloudTrail with organization-wide trails to log activity across all accounts. Focus on capturing IAM and STS operations for insights into access and permission usage. Pair this with Security Hub for continuous monitoring and tools like Elastic or GuardDuty to hunt for unusual AssumeRoot actions. + +**Lock Down AssumeRoot Permissions:** Scope AssumeRoot usage to critical tasks only, like audits or recovery, by restricting task policies to essentials like IAMAuditRootUserCredentials. Assign these permissions to specific roles in the management account and keep those roles tightly controlled. Regularly review and remove unnecessary permissions to maintain the PLoP. + +**MFA and Guardrails for Root Access:** Enforce MFA for all users, especially those with access to AssumeRoot. Use AWS Organizations to disable root credential recovery unless absolutely needed and remove unused root credentials entirely. RCPs can help centralize and tighten permissions for tasks involving AssumeRoot or other sensitive operations. + +# Conclusion + +We hope this article provides valuable insight into AWS’ AssumeRoot API operation, how it can be abused by adversaries, and some threat detection and hunting guidance. Abusing AssumeRoot is one of many living-off-the-cloud (LotC) techniques that adversaries have the capability to target, but we encourage others to explore, research, and share their findings accordingly with the community and AWS. \ No newline at end of file diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/false_file_immutability.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/false_file_immutability.md index 17830f2f3dab7..94d14462751a7 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/false_file_immutability.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/false_file_immutability.md @@ -11,12 +11,12 @@ category: - slug: vulnerability-updates --- -# Introduction +## Introduction This article will discuss a previously-unnamed vulnerability class in Windows, showing how long-standing incorrect assumptions in the design of core Windows features can result in both undefined behavior and security vulnerabilities. We will demonstrate how one such vulnerability in the Windows 11 kernel can be exploited to achieve arbitrary code execution with kernel privileges. -# Windows file sharing +## Windows file sharing When an application opens a file on Windows, it typically uses some form of the Win32 [**CreateFile**](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew) API. @@ -43,7 +43,7 @@ Sharing isn’t mandatory. Callers can pass a share mode of zero to obtain exclu > An open file that is not shared (dwShareMode set to zero) cannot be opened again, either by the application that opened it or by another application, until its handle has been closed. This is also referred to as exclusive access. -## Sharing enforcement +### Sharing enforcement In the kernel, sharing is enforced by filesystem drivers. As a file is opened, it’s the responsibility of the filesystem driver to call [**IoCheckShareAccess**](https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-iocheckshareaccess) or [**IoCheckLinkShareAccess**](https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-iochecklinkshareaccess) to see whether the requested **DesiredAccess**/**ShareMode** tuple is compatible with any existing handles to the file being opened. [NTFS](https://learn.microsoft.com/en-us/windows-server/storage/file-server/ntfs-overview) is the primary filesystem on Windows, but it’s closed-source, so for illustrative purposes we’ll instead look at Microsoft’s FastFAT sample code performing [the same check](https://github.com/Microsoft/Windows-driver-samples/blob/622212c3fff587f23f6490a9da939fb85968f651/filesys/fastfat/create.c#L6822-L6884). Unlike an IDA decompilation, it even comes with comments! @@ -119,7 +119,7 @@ if (FlagOn(*DesiredAccess, FILE_WRITE_DATA) || DeleteOnClose) { Another way to think of this check is that **ZwMapViewOfSection(SEC_IMAGE)** implies no-write-sharing as long as the view exists. -# Authenticode +## Authenticode The [Windows Authenticode Specification](https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/authenticode_pe.docx) describes a way to employ cryptography to “sign” PE files. A “digital signature” cryptographically attests that the PE was produced by a particular entity. Digital signatures are tamper-evident, meaning that any material modification of signed files should be detectable because the digital signature will no longer match. Digital signatures are typically appended to the end of PE files. @@ -128,7 +128,7 @@ The [Windows Authenticode Specification](https://download.microsoft.com/download Authenticode can’t apply traditional hashing (e.g. **sha256sum**) in this case, because the act of appending the signature would change the file’s hash, breaking the signature it just generated. Instead, the Authenticode specification describes an algorithm to skip specific portions of the PE file that will be changed during the signing process. This algorithm is called **authentihash**. You can use authentihash with any hashing algorithm, such as SHA256. When a PE file is digitally signed, the file’s authentihash is what’s actually signed. -## Code integrity +### Code integrity Windows has a few different ways to validate Authenticode signatures. User mode applications can call [**WinVerifyTrust**](https://learn.microsoft.com/en-us/windows/win32/api/wintrust/nf-wintrust-winverifytrust) to validate a file’s signature in user mode. The Code Integrity (CI) subsystem, residing in ```ci.dll```, validates signatures in the kernel. If [Hypervisor-Protected Code Integrity](https://learn.microsoft.com/en-us/windows-hardware/drivers/bringup/device-guard-and-credential-guard) is running, the Secure Kernel employs ```skci.dll``` to validate Authenticode. This article will focus on Code Integrity (```ci.dll```) in the regular kernel. @@ -148,7 +148,7 @@ User Mode Code Integrity (UMCI): KMCI and UMCI implement different policies for different scenarios. For example, the policy for Protected Processes is different from that of INTEGRITYCHECK. -# Incorrect assumptions +## Incorrect assumptions Microsoft [documentation](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea) implies that files successfully opened without write sharing can’t be modified by another user or process. @@ -176,7 +176,7 @@ If those paged-out pages are later touched, the CPU will issue a page fault and Note the following exception: The memory manager may treat PE-relocated pages as unmodified, dynamically reapplying relocations during page faults. -## Page hashes +### Page hashes Page hashes are a list of hashes of each 4KB page within a PE file. Since pages are 4KB, page faults typically occur on 4KB of data at a time. Full Authenticode verification requires the entire contiguous PE file, which isn’t available during a page fault. Page hashes allow the MM to validate hashes of individual pages during page faults. @@ -187,7 +187,7 @@ CI can also compute them on-the-fly during signature validation, a mechanism we Page hashes are not free - they use CPU and slow down page faults. They’re not used in most cases. -# Attacking code integrity +## Attacking code integrity Imagine a scenario where a ransomware operator wants to ransom a hospital, so they send a phishing email to a hospital employee. The employee opens the email attachment and enables macros, running the ransomware. The ransomware employs a UAC bypass to immediately elevate to admin, then attempts to terminate any security software on the system so it can operate unhindered. Anti-Malware services run as [Protected Process Light](https://learn.microsoft.com/en-us/windows/win32/services/protecting-anti-malware-services-) (PPL), protecting them from tampering by malware with admin rights, so the ransomware can’t terminate the Anti-Malware service. @@ -202,7 +202,7 @@ When a network redirector is in use, the server on the other end of the pipe nee An attacker can employ a network redirector to modify a PPL’s DLL server-side, bypassing sharing restrictions. This means that PEs backing an executable image section are incorrectly assumed to be immutable. This is a class of vulnerability that we are calling **False File Immutability** (FFI). -## Paging exploitation +### Paging exploitation If an attacker successfully exploits False File Immutability to inject code into an in-use PE, wouldn’t page hashes catch such an attack? The answer is: sometimes. If we look at the following table, we can see that page hashes are enforced for kernel drivers and Protected Processes, but not for PPL, so let’s pretend we’re an attacker targeting PPL. @@ -219,7 +219,7 @@ Last year at Black Hat Asia 2023 ([abstract](https://www.blackhat.com/asia-23/br Alongside the presentation, we released the [PPLFault exploit](https://github.com/gabriellandau/PPLFault) which demonstrates the vulnerability by dumping the memory of an otherwise-protected PPL. We also released the GodFault exploit chain, which combines the PPLFault Admin-to-PPL exploit with the AngryOrchard PPL-to-kernel exploit to achieve full read/write control of physical memory from user mode. We did this to motivate Microsoft to take action on a vulnerability that MSRC [declined to fix](https://www.elastic.co/security-labs/forget-vulnerable-drivers-admin-is-all-you-need) because it did not meet their [servicing criteria](https://www.microsoft.com/en-us/msrc/windows-security-servicing-criteria). Thankfully, the Windows Defender team at Microsoft stepped up, [releasing a fix](https://x.com/GabrielLandau/status/1757818200127946922) in February 2024 that enforces dynamic page hashes for executable images loaded over network redirectors, breaking PPLFault. -# New research +## New research Above, we discussed Authenticode signatures embedded within PE files. In addition to embedded signatures, Windows supports a form of detached signature called a [security catalog](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/catalog-files). Security catalogs (.cat files) are essentially a list of signed authentihashes. Every PE with an authentihash in that list is considered to be signed by that signer. Windows keeps a large collection of catalog files in ```C:\Windows\System32\CatRoot``` which CI loads, validates, and caches. @@ -240,7 +240,7 @@ Breaking this down, we see a few key insights. First, **ZwCreateSection(SEC_COMM Next, the file is opened without **FILE_SHARE_WRITE**, meaning write sharing is denied. This is intended to prevent modification of the security catalog during processing. However, as we have shown above, this is a bad assumption and another example of False File Immutability. It should be possible, in theory, to perform a PPLFault-style attack on security catalog processing. -## Planning the attack +### Planning the attack ![](/assets/images/false-file-immutability/image11.png) @@ -254,7 +254,7 @@ The general flow of the attack is as follows: 7. CI finds the malicious driver’s authentihash in the catalog and loads the driver. At this point, the attacker has achieved arbitrary code execution in the kernel. -## Implementation and considerations +### Implementation and considerations The plan is to use a PPLFault-style attack, but there are some important differences in this situation. PPLFault used an [opportunistic lock](https://learn.microsoft.com/en-us/windows/win32/fileio/opportunistic-locks) (oplock) to deterministically freeze the victim process’s initialization. This gave the attacker time to switch over to the payload and flush the system working set. Unfortunately, we couldn’t find any good opportunities for oplocks here. Instead, we’re going to pursue a probabilistic approach: rapidly toggling the security catalog between the malicious and benign versions. @@ -279,14 +279,14 @@ The attacker wins if CI validates a benign catalog then parses a malicious one. ![Code Integrity validating a benign catalog, then parsing a malicious one](/assets/images/false-file-immutability/image20.png) -## Exploit demo +### Exploit demo We named the exploit **ItsNotASecurityBoundary** as an homage to MSRC's [policy](https://www.microsoft.com/en-us/msrc/windows-security-servicing-criteria) that "Administrator-to-kernel is not a security boundary.” The code is in GitHub [here](https://github.com/gabriellandau/ItsNotASecurityBoundary). Demo video [here](https://drive.google.com/file/d/13Uw38ZrNeYwfoIuD76qlLgyXP8kRc8Nz/view?usp=sharing). -# Understanding these vulnerabilities +## Understanding these vulnerabilities In order to properly defend against these vulnerabilities, we first need to understand them better. @@ -311,7 +311,7 @@ First, the attacking client sets a packet’s structure’s length field to 16 b Double-read vulnerabilities frequently apply to shared-memory scenarios. They commonly occur in drivers that operate on user-writable buffers. Due to False File Immutability, developers need to be aware that their scope is actually much wider, and includes all files writable by attackers. Denying write sharing does not necessarily prevent file modification. -## Affected Operations +### Affected Operations What types of operations are affected by False File Immutability? @@ -322,7 +322,7 @@ What types of operations are affected by False File Immutability? | Regular I/O | **ReadFile** **ZwReadFile** | 1. Avoid double reads\ 2. Copy the file to a heap buffer before processing | -## What else could be vulnerable? +### What else could be vulnerable? Looking for potentially-vulnerable calls to **ZwMapViewOfSection** in the NT kernel yields quite a few interesting functions: @@ -339,27 +339,27 @@ Looking outside of the NT kernel, we can find other drivers to investigate: ![Potentially-vulnerable uses of **ZwMapViewOfSection** in Windows 11 kernel drivers](/assets/images/false-file-immutability/image1.png) -## Don’t forget about user mode +### Don’t forget about user mode We’ve mostly been discussing the kernel up to this point, but it’s important to note that any user mode application that calls **ReadFile**, **MapViewOfFile**, or **LoadLibrary** on an attacker-controllable file, denying write sharing for immutability, may be vulnerable. Here’s a few hypothetical examples. -### MapViewOfFile +#### MapViewOfFile Imagine an application that is split into two components - a low-privileged worker process with network access, and a privileged service that installs updates. The worker downloads updates and stages them to a specific folder. When the privileged service sees a new update staged, it first validates the signature before installing the update. An attacker could abuse FFI to modify the update after the signature check. -### ReadFile +#### ReadFile Since files are subject to double-read vulnerabilities, anything that parses complex file formats may be vulnerable, including antivirus engines and search indexers. -### LoadLibrary +#### LoadLibrary Some applications rely on UMCI to prevent attackers from loading malicious DLLs into their processes. As we’ve shown with PPLFault, FFI can defeat UMCI. -# Stopping the exploit +## Stopping the exploit Per their official servicing guidelines, MSRC won’t service Admin -> Kernel vulnerabilities by default. In this parlance, servicing means “fix via security update.” This type of vulnerability, however, allows malware to bypass [AV Process Protections](https://learn.microsoft.com/en-us/windows/win32/services/protecting-anti-malware-services-), leaving AV and EDR vulnerable to instant-kill attacks. @@ -376,7 +376,7 @@ As mentioned above in the Affected Operations section, applications can mitigate An alternative mitigation strategy to break these types of exploits is to pin the pages of the file mapping into physical memory using an API such as **MmProbeAndLockPages**. This prevents eviction of those pages when the attacker empties the working set. -## End-user detection and mitigation +### End-user detection and mitigation Fortunately, there is a way for end-users to mitigate this exploit without changes from Microsoft – Hypervisor Protected Code Integrity (HVCI). If HVCI is enabled, CI.dll doesn’t do catalog parsing at all. Instead, it sends the catalog contents to the Secure Kernel, which runs in a separate virtual machine on the same host. The Secure Kernel stores the received catalog contents in its own heap, from which signature validation and parsing are performed. Just like with the **ExAllocatePool** mitigation described above, the exploit is mitigated because file changes have no effect on the heap copy. @@ -387,7 +387,7 @@ The probabilistic nature of this attack means that there are likely many failed ![**Microsoft-Windows-CodeIntegrity/Operational** event log showing an invalid security catalog](/assets/images/false-file-immutability/image4.png) -# Disclosure +## Disclosure The disclosure timeline is as follows: - 2024-02-14: We reported ItsNotASecurityBoundary and FineButWeCanStillEasilyStopIt to MSRC as VULN-119340, suggesting **ExAllocatePool** and **MmProbeAndLockPages** as simple low-risk fixes @@ -397,7 +397,7 @@ The disclosure timeline is as follows: - 2024-06-14: MSRC closed the case, stating "We have completed our investigation and determined that the case doesn't meet our bar for servicing at this time. As a result, we have opened a next-version candidate bug for the issue, and it will be evaluated for upcoming releases. Thanks, again, for sharing this report with us." -# Fixing Code Integrity +## Fixing Code Integrity Looking at the original implementation of **CI!I_MapAndSizeDataFile**, we can see the legacy code calling **ZwCreateSection** and **ZwMapViewOfSection**: @@ -408,7 +408,7 @@ Contrast that with the new **CI!CipMapAndSizeDataFileWithMDL**, which follows th ![The new **CI!CipMapAndSizeDataFileWithMDL** has a mitigation](/assets/images/false-file-immutability/image3.png) -# Summary and conclusion +## Summary and conclusion Today we discussed and named a bug class: **False File Immutability**. We are aware of two public exploits that leverage it, PPLFault and ItsNotASecurityBoundary. diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/ghostpulse_haunts_victims_using_defense_evasion_bag_o_tricks.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/ghostpulse_haunts_victims_using_defense_evasion_bag_o_tricks.md index a96832f5de73c..21392357f1322 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/ghostpulse_haunts_victims_using_defense_evasion_bag_o_tricks.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/ghostpulse_haunts_victims_using_defense_evasion_bag_o_tricks.md @@ -10,8 +10,15 @@ image: "photo-edited-05@2x.jpg" category: - slug: attack-pattern - slug: malware-analysis +tags: + - ghostpulse + - ref8207 --- +## Update + +In October 2024, we released an update to stage 2 of GHOSTPULSE that includes new evasion techniques. You can check it out [here](https://www.elastic.co/security-labs/tricks-and-treats). + ## Preamble Elastic Security Labs has observed a campaign to compromise users with signed [MSIX](https://learn.microsoft.com/en-us/windows/msix/overview) application packages to gain initial access. The campaign leverages a stealthy loader we call GHOSTPULSE which decrypts and injects its final payload to evade detection. @@ -71,7 +78,7 @@ Next, GHOSTPULSE builds an Import Address Table (IAT) incorporating essential AP ![Stage 1 hashing algorithm](/assets/images/ghostpulse-haunts-victims-using-defense-evasion-bag-o-tricks/image13.png) -``` +``` python # Python code used for API hashing def calculate_api_name_hash(api_name): value = 0 @@ -82,7 +89,7 @@ def calculate_api_name_hash(api_name): Below is the Stage 1 IAT structure reconstructed from the GHOSTPULSE malware sample, provided for reference: -``` +``` c struct core_stage1_IAT { void *kernel32_LoadLibraryW; @@ -124,7 +131,7 @@ It then proceeds with its operation by reading and parsing the file named `hando The initial phase involves identifying the commencement of the encrypted data by searching for the IDAT string in the file, which is followed by a distinctive 4-byte tag value. If the tag corresponds to the value stored in the malware's configuration, the malware extracts the bytes of the encrypted blob. The initial structure is as follows: -``` +``` c struct initial_idat_chunk { DWORD size_of_chunk; @@ -145,7 +152,7 @@ struct initial_idat_chunk In the second step, the malware locates the next occurrence of IDAT and proceeds to extract the encrypted chunks that follow it which has the following format: -``` +``` c struct next_idat_chunk { DWORD size_of_chunk; @@ -174,7 +181,7 @@ This technique is known as “module stomping”. The following image shows the Stage 2 initiates by constructing a new IAT structure and utilizing the CRC32 algorithm as the API name hashing mechanism. The following is the IAT structure of stage 2: -``` +``` c struct core_stage2_IAT { void *kernel32_module; @@ -244,7 +251,7 @@ Concerning NT functions, the malware reads the ntdll.dll library from disk and w The following is the structure used by the malware to store NT API offsets: -``` +``` c struct __unaligned __declspec(align(4)) core_stage2_nt_offsets_table { __int64 ntdll_module; diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/globally_distributed_stealers.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/globally_distributed_stealers.md index 65a42ae95c13b..5a452164b6a10 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/globally_distributed_stealers.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/globally_distributed_stealers.md @@ -181,7 +181,7 @@ To fully leverage detection capabilities listed below for these threats with Ela - [Connection to WebService by an Unsigned Binary](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/command_and_control_connection_to_webservice_by_an_unsigned_binary.toml) - [Connection to WebService by a Signed Binary Proxy](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/command_and_control_connection_to_webservice_by_a_signed_binary_proxy.toml) - - [Suspicious DNS Query from Mounted Virtual Disk](https://github.com/elastic/endpoint-rules/blob/main/rules/command_and_control_execution_wevsvc_from_virtual_disk.toml) + - [Suspicious DNS Query from Mounted Virtual Disk](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/windows/command_and_control_suspicious_dns_query_from_mounted_virtual_disk.toml) - [Suspicious Access to Web Browser Credential Stores](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/credential_access_suspicious_access_to_web_browser_credential_stores.toml) - [Web Browser Credential Access via Unsigned Process](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/credential_access_web_browser_credential_access_via_unsigned_process.toml) - [Access to Browser Credentials from Suspicious Memory](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/credential_access_access_to_browser_credentials_from_suspicious_memory.toml) diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/inital_research_of_jokerspy.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/inital_research_of_jokerspy.md index 4adcfcecaa03a..12c65e414ddd5 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/inital_research_of_jokerspy.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/inital_research_of_jokerspy.md @@ -173,11 +173,6 @@ Techniques and Sub techniques represent how an adversary achieves a tactical goa ## Detection logic -### Prevention - -- [Non-Native Dylib Extracted into Suspicious Directory](https://github.com/elastic/endpoint-rules/blob/1006a4d9a3d95e35149a3640fadf68a32c02afa9/rules/execution_dylib_extracted_to_new_directory.toml#L10) -- [Potential Privilege Escalation via TCC bypass with fake TCC.db](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/privilege_escalation_potential_privilege_escalation_via_tcc_bypass_with_fake_tcc.db.toml) - ### YARA Elastic Security has created YARA rules to identify this activity. Below are YARA rules to identify the JOKERSPY backdoor and SwiftBelt tool. diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/itw_windows_lpe_0days_insights_and_detection_strategies.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/itw_windows_lpe_0days_insights_and_detection_strategies.md index 3a0ef112df819..7801e7762e00e 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/itw_windows_lpe_0days_insights_and_detection_strategies.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/itw_windows_lpe_0days_insights_and_detection_strategies.md @@ -137,7 +137,7 @@ process.name :"dwm.exe" and user.id:S-1-5-90-0-* and ![DWM dropping reflective DLL to disk post exploit execution](/assets/images/itw-windows-lpe-0days-insights-and-detection-strategies/image5.png) -Below is a [detection](https://github.com/elastic/endpoint-rules/blob/20833cbeaac4284ecf9818b44438bda4bc3cae18/rules/privilege_escalation_logonui_dcomp.toml) EQL query that looks for the LogonUI DLL load hijack: +Below is a [detection](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/windows/privilege_escalation_potential_privilege_escalation_via_logonui.toml) EQL query that looks for the LogonUI DLL load hijack: ``` library where process.executable : "?:\\Windows\\System32\\LogonUI.exe" and @@ -282,7 +282,7 @@ api where process.pid != 4 and process.Ext.api.name : "WriteProcessMemory" process.Ext.api.parameters.address > 281474976710655 ``` -Here is an example of these [alerts](https://github.com/elastic/endpoint-rules/blob/20833cbeaac4284ecf9818b44438bda4bc3cae18/rules/privilege_escalation_api_kernel_address_space.toml) triggering on exploits leveraging this primitive: +Here is an example of these [alerts](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/windows/privilege_escalation_suspicious_kernel_mode_address_manipulation.tom) triggering on exploits leveraging this primitive: ![Detection of PreviousMode abuse](/assets/images/itw-windows-lpe-0days-insights-and-detection-strategies/image7.png) diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/katz_and_mouse_game.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/katz_and_mouse_game.md new file mode 100644 index 0000000000000..b9db8c5a904ad --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/katz_and_mouse_game.md @@ -0,0 +1,414 @@ +--- +title: "Katz and Mouse Game: MaaS Infostealers Adapt to Patched Chrome Defenses" +slug: "katz-and-mouse-game" +date: "2024-10-28" +description: "Elastic Security Labs breaks down bypass implementations from the infostealer ecosystem’s reaction to Chrome 127's Application-Bound Encryption scheme." +author: + - slug: jia-yu-chan + - slug: salim-bitam + - slug: daniel-stepanic + - slug: samir-bousseaden + - slug: cyril-francois + - slug: seth-goodwin +image: "Security Labs Images 2.jpg" +category: + - slug: malware-analysis +tags: + - infostealer + - chrome + - cookie + - VIDAR + - STEALC + - LUMMA + - METASTEALER + - PHEMEDRONE + - XENOSTEALER +--- + +# Introduction + +In July, Google [announced](https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html) a new protection mechanism for cookies stored within Chrome on Windows, known as Application-Bound Encryption. There is no doubt this security implementation has raised the bar and directly impacted the malware ecosystem. After months with this new feature, many infostealers have written new code to bypass this protection (as the Chrome Security Team predicted) in order to stay competitive in the market and deliver capabilities that reliably retrieve cookie data from Chrome browsers. + +Elastic Security Labs has been tracking a subset of this activity, identifying multiple techniques used by different malware families to circumvent App-Bound Encryption. While the ecosystem is still evolving in light of this pressure, our goal is to share technical details that help organizations understand and defend against these techniques. In this article, we will cover the different methods used by the following infostealer families: + + - STEALC/VIDAR + - METASTEALER + - PHEMEDRONE + - XENOSTEALER + - LUMMA + +# Key takeaways + + - Latest versions of infostealers implement bypasses around Google’s recent cookie protection feature using Application-Bound Encryption + - Techniques include integrating offensive security tool ChromeKatz, leveraging COM to interact with Chrome services and decrypt the app-bound encryption key, and using the remote debugging feature within Chrome + - Defenders should actively monitor for different cookie bypass techniques against Chrome on Windows in anticipation of future mitigations and bypasses likely to emerge in the near- to mid-term + - Elastic Security provides mitigations through memory signatures, behavioral rules, and hunting opportunities to enable faster identification and response to infostealer activity + +# Background + +Generically speaking, cookies are used by web applications to store visitor information in the browser the visitor uses to access that web app. This information helps the web app track that user, their preferences, and other information from location to location– even across devices. + +The authentication token is one use of the client-side data storage structures that enables much of how modern web interactivity works. These tokens are stored by the browser after the user has successfully authenticated with a web application. After username and password, after multifactor authentication (MFA) via one-time passcodes or biometrics, the web application “remembers” your browser is you via the exchange of this token with each subsequent web request. + +A malicious actor who gets access to a valid authentication token can reuse it to impersonate the user to that web service with the ability to take over accounts, steal personal or financial information, or perform other actions as that user such as transfer financial assets. + +Cybercriminals use infostealers to steal and commoditize this type of information for their financial gain. + +## Google Chrome Cookie Security + +Legacy versions of Google Chrome on Windows used the Windows native [Data Protection API](https://learn.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection) (DPAPI) to encrypt cookies and protect them from other user contexts. This provided adequate protection against several attack scenarios, but any malicious software running in the targeted user’s context could decrypt these cookies using the DPAPI methods directly. Unfortunately, this context is exactly the niche that infostealers often find themselves in after social engineering for initial access. The DPAPI scheme is now [well known to attackers](https://posts.specterops.io/operational-guidance-for-offensive-user-dpapi-abuse-1fb7fac8b107) with several attack vectors; from local decryption using the API, to stealing the masterkey and decrypting remotely, to abusing the domain-wide backup DPAPI key in an enterprise environment. + +With the release of Chrome 127 in July 2024, Google [implemented](https://developer.chrome.com/release-notes/127) Application-Bound Encryption of browser data. This mechanism directly addressed many common DPAPI attacks against Windows Chrome browser data–including cookies. It does this by storing the data in encrypted datafiles, and using a service running as SYSTEM to verify any decryption attempts are coming from the Chrome process before returning the key to that process for decryption of the stored data. + +![Chrome 127 Application-Bound Encryption Scheme. Source: https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html](/assets/images/katz-and-mouse-game/image5.png) + + + +While it is our view that this encryption scheme is not a panacea to protect all browser data (as the Chrome Security Team acknowledges in their release) we do feel it has been successful in driving malware authors to TTPs that are more overtly malicious, and easier for defenders to identify and respond to. + +# Stealer Bypass Techniques, Summarized + +The following sections will describe specific infostealer techniques used to bypass Google’s App-Bound Encryption feature as observed by Elastic. Although this isn’t an exhaustive compilation of bypasses, and development of these families is ongoing, they represent an interesting dynamic within the infostealer space showing how malware developers responded to Google’s recently updated security control. The techniques observed by our team include: + + - Remote debugging via Chrome’s DevTools Protocol + - Reading process memory of Chrome network service process (ChromeKatz and ```ReadProcessMemory``` (RPM)) + - Elevating to ```SYSTEM``` then decrypting ```app_bound_encryption_key``` with the ```DecryptData``` method of ```GoogleChromeElevationService``` through COM + +![Timeline of events](/assets/images/katz-and-mouse-game/image30.png) + +## STEALC/VIDAR + +Our team observed new code introduced to STEALC/VIDAR related to the cookie bypass technique around September 20th. These were atypical samples that stood out from previous versions and were implemented as embedded 64-bit PE files along with conditional checks. Encrypted values in the SQLite databases where Chrome stores its data are now prefixed with v20, indicating that the values are now encrypted using application-bound encryption. + +> [STEALC](https://malpedia.caad.fkie.fraunhofer.de/details/win.stealc) was introduced in 2023 and was developed with “heavy inspiration” from other more established stealers such as [RACOON](https://malpedia.caad.fkie.fraunhofer.de/details/win.raccoon) and [VIDAR](https://malpedia.caad.fkie.fraunhofer.de/details/win.vidar). STEALC and VIDAR have continued concurrent development, and in the case of App-Bound Encryption bypasses have settled on the same implementation. + +During the extraction of encrypted data from the databases the malware checks for this prefix. If it begins with ```v20```, a child process is spawned using the embedded PE file in the ```.data``` section of the binary. This program is responsible for extracting unencrypted cookie values residing in one of Chrome's child processes. + +![Embedded PE file](/assets/images/katz-and-mouse-game/image2.png) + +This embedded binary creates a hidden desktop via ```OpenDesktopA``` / ```CreateDesktopA``` then uses ```CreateToolhelp32Snapshot``` to scan and terminate all ```chrome.exe``` processes. A new ```chrome.exe``` process is then started with the new desktop object. Based on the installed version of Chrome, the malware selects a signature pattern for the Chromium feature [CookieMonster](https://www.chromium.org/developers/design-documents/network-stack/cookiemonster/), an internal component used to manage cookies. + +![Signature pattern for ```CookieMonster```](/assets/images/katz-and-mouse-game/image38.png) + +We used the [signature patterns](https://github.com/Meckazin/ChromeKatz/blob/9152004174e9a0b2d092c70ebc75efbf80fa1098/CookieKatz/Main.cpp#L123) to pivot to existing code developed for an offensive security tool called [ChromeKatz](https://github.com/Meckazin/ChromeKatz). At this time, the patterns have been removed from the ChromeKatz repository and replaced with a new technique. Based on our analysis, the malware author appears to have reimplemented ChromeKatz within STEALC in order to bypass the app-bound encryption protection feature. + +Once the malware identifies a matching signature, it enumerates Chrome’s child processes to check for the presence of the ```--utility-sub-type=network.mojom.NetworkService``` command-line flag. This flag indicates that the process is the network service responsible for handling all internet communication. It becomes a prime target as it holds the sensitive data the attacker seeks, as described in MDSec’s [post](https://www.mdsec.co.uk/2021/01/breaking-the-browser-a-tale-of-ipc-credentials-and-backdoors/). It then returns a handle for that specific child process. + +![Enumerating for Chrome’s network service](/assets/images/katz-and-mouse-game/image37.png) + +Next, it enumerates each module in the network service child process to find and retrieve the base address and size of ```chrome.dll``` loaded into memory. STEALC uses [```CredentialKatz::FindDllPattern```](https://github.com/Meckazin/ChromeKatz/blob/767047dcf8f53c70be5e3e0859c5eee3f129d758/CredentialKatz/Memory.cpp#L280) and [```CookieKatz::FindPattern```](https://github.com/Meckazin/ChromeKatz/blob/767047dcf8f53c70be5e3e0859c5eee3f129d758/CookieKatz/Memory.cpp#L435) to locate the CookieMonster instances. There are 2 calls to ```CredentialKatz::FindDllPattern```. + +![Calls to ```CredentialKatz::FindDllPattern```](/assets/images/katz-and-mouse-game/image17.png) + +In the first call to ```CredentialKatz::FindDllPattern```, it tries to locate one of the signature patterns (depending on the victim’s Chrome version) in ```chrome.dll```. Once found, STEALC now has a reference pointer to that memory location where the byte sequence begins which is the function ```net::CookieMonster::~CookieMonster```, destructor of the ```CookieMonster``` class. + +![Byte sequence for ```net::CookieMonster::~CookieMonster``` found in ```chrome.dll```](/assets/images/katz-and-mouse-game/image14.png) + +The second call to ```CredentialKatz::FindDllPattern``` passes in the function address for ```net::CookieMonster::~CookieMonster(void)``` as an argument for the byte sequence search, resulting in STEALC having a pointer to ```CookieMonster```’s Virtual Function Pointer struct. + +![```CookieMonster```’s vtable in ```chrome.dll```](/assets/images/katz-and-mouse-game/image19.png) + +The following method used by STEALC is again, identical to ChromeKatz, where it locates ```CookieMonster``` instances by scanning memory chunks in the ```chrome.dll``` module for pointers referencing the ```CookieMonster``` vtable. Since the vtable is a constant across all objects of a given class, any ```CookieMonster``` object will have the same vtable pointer. When a match is identified, STEALC treats the memory location as a ```CookieMonster``` instance and stores its address in an array. + +![Using ```CookieKatz::FindPattern``` to locate ```CookieMonster``` instances](/assets/images/katz-and-mouse-game/image16.png) + +For each identified ```CookieMonster``` instance, STEALC accesses the internal ```CookieMap``` structure located at an offset of ```+0x30```, and which is a binary tree. Each node within this tree contains pointers to ```CanonicalCookieChrome``` structures. ```CanonicalCookieChrome``` structures hold unencrypted cookie data, making it accessible for extraction. STEALC then initiates a tree traversal by passing the first node into a dedicated traversal function. + +![Initiating ```CookieMap``` tree traversal for each ```CookieMonster``` instance found](/assets/images/katz-and-mouse-game/image20.png) + +For each node, it calls ```ReadProcessMemory``` to access the ```CanonicalCookieChrome``` structure from the target process’s memory, then further processing it in ```jy::GenerateExfilString```. + +![```CookieMap``` traversal subroutine](/assets/images/katz-and-mouse-game/image31.png) + +STEALC formats the extracted cookie data by converting the expiration date to UNIX format and verifying the presence of the ```HttpOnly``` and ```Secure``` flags. It then appends details such as the cookie's name, value, domain, path, and the ```HttpOnly``` and ```Secure``` into a final string for exfiltration. [```OptimizedString```](https://github.com/Meckazin/ChromeKatz/blob/9152004174e9a0b2d092c70ebc75efbf80fa1098/CookieKatz/Memory.cpp#L10) structs are used in place of strings, so string values can either be the string itself, or if the string length is greater than 23, it will point to the address storing the string. + +![Constructing string for data exfiltration](/assets/images/katz-and-mouse-game/image23.png) + +## METASTEALER + +[METASTEALER](https://malpedia.caad.fkie.fraunhofer.de/details/win.metastealer), first observed in 2022, recently upgraded its ability to steal Chrome data, bypassing Google’s latest mitigation efforts. On September 30th, the malware authors announced this update via their Telegram channel, highlighting its enhanced capability to extract sensitive information, including cookies, despite the security changes in Chrome's version ```129+```. + +![METASTEALER announcement and translation](/assets/images/katz-and-mouse-game/image26.png) + +![source: https://x.com/g0njxa/status/1840761619686568319/](/assets/images/katz-and-mouse-game/image28.png) + +The [first sample](https://www.virustotal.com/gui/file/973a9056040af402d6f92f436a287ea164fae09c263f80aba0b8d5366ed9957a) observed in the wild by our team was discovered on September 30th, the same day the authors promoted the update. Despite claims that the malware operates without needing ```Administrator``` privileges, our testing revealed it does require elevated access, as it attempts to impersonate the ```SYSTEM``` token during execution. + +![Code comparison between an old and a new version of the family](/assets/images/katz-and-mouse-game/image11.png) + +As shown in the screenshots above, the ```get_decryption``` method now includes a new Boolean parameter. This value is set to ```TRUE``` if the encrypted data (cookie) begins with the ```v20``` prefix, indicating that the cookie is encrypted using Chrome's latest encryption method. The updated function retains backward compatibility, still supporting the decryption of cookies from older Chrome versions if present on the infected machine. + +The malware then attempts to access the ```Local State``` or ```LocalPrefs.json``` files located in the Chrome profile directory. Both files are JSON formatted and store encryption keys (```encrypted_key```) for older Chrome versions and ```app_bound_encrypted_key``` for newer ones. If the flag is set to ```TRUE```, the malware specifically uses the ```app_bound_encrypted_key``` to decrypt cookies in line with the updated Chrome encryption method. + +![```app_bound_encrypted_key``` extracted from Chrome json file](/assets/images/katz-and-mouse-game/image13.png) + +In this case, the malware first impersonates the ```SYSTEM``` token using a newly introduced class called ```ContextSwitcher```. + +![New class for TOKEN impersonation](/assets/images/katz-and-mouse-game/image35.png) + +It then decrypts the key by creating an instance via the COM of the Chrome service responsible for decryption, named ```GoogleChromeElevationService```, using the CLSID ```708860E0-F641-4611-8895-7D867DD3675B```. Once initialized, it invokes the [```DecryptData```](https://github.com/chromium/chromium/blob/225f82f8025e4f93981310fd33daa71dc972bfa9/chrome/elevation_service/elevator.cc#L155) method to decrypt the ```app_bound_encrypted_key``` key which will be used to decrypt the encrypted cookies. + +![New class ```ComInvoker``` to invoke methods from ```GoogleChromeElevationService``` service](/assets/images/katz-and-mouse-game/image8.png) + +METASTEALER employs a technique similar to the one demonstrated in a [gist](https://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824) shared [on X](https://x.com/snovvcrash/status/1839715912812802162) on September 27th, which may have served as inspiration for the malware authors. Both approaches leverage similar methods to bypass Chrome's encryption mechanisms and extract sensitive data. + +## PHEMEDRONE + +This [open-source stealer](https://malpedia.caad.fkie.fraunhofer.de/details/win.phemedrone_stealer) caught the world’s attention earlier in the year through its usage of a Windows SmartScreen vulnerability (CVE-2023-36025). While its development is still occurring on Telegram, our team found a recent [release](https://www.virustotal.com/gui/file/1067d27007ea862ddd68e90ef68b6d17fa18f9305c09f72bad04d00102a60b8c) (2.3.2) submitted at the end of September including new cookie grabber functionality for Chrome. + +![```README.txt``` within PHEMEDRONE project](/assets/images/katz-and-mouse-game/image10.png) + +The malware first enumerates the different profiles within Chrome, then performs a browser check using function (```BrowserHelpers.NewEncryption```) checking for the Chrome browser with a version greater than or equal to ```127```. + +![Chrome version verification in PHEMEDRONE](/assets/images/katz-and-mouse-game/image27.png) + +If the condition matches, PHEMEDRONE uses a combination of helper functions to extract the cookies. + +![High-level functions used cookie extraction in PHEMEDRONE](/assets/images/katz-and-mouse-game/image34.png) + +By viewing the ```ChromeDevToolsWrapper``` class and its different functions, we can see that PHEMEDRONE sets up a remote debugging session within Chrome to access the cookies. The default port (```9222```) is used along with window-position set to ```-2400```,```-2400``` which is set off-screen preventing any visible window from alerting the victim. + +![New Chrome process in remote debug mode](/assets/images/katz-and-mouse-game/image15.png) + +Next, the malware establishes a WebSocket connection to Chrome’s debugging interface making a request using deprecated Chrome DevTools Protocol method (```Network.getAllCookies```). + +![Chrome DevTools Protocol used to retrieve cookies](/assets/images/katz-and-mouse-game/image24.png) + +The cookies are then returned from the previous request in plaintext, below is a network capture showing this behavior: + +![Cookie data within network capture](/assets/images/katz-and-mouse-game/image32.png) + +## XENOSTEALER + +[XENOSTEALER](https://github.com/moom825/XenoStealer/) is an open-source infostealer hosted on GitHub. It appeared in July 2024 and is under active development at the time of this publication. Notably, the Chrome bypass feature was committed on September 26, 2024. + +The approach taken by XENOSTEALER is similar to that of METASTEALER. It first parses the JSON file under a given Chrome profile to extract the ```app_bound_encrypted_key```. However, the decryption process occurs within a Chrome process. To achieve this, XENOSTEALER launches an instance of ```Chrome.exe```, then injects code using a helper class called [```SharpInjector```](https://github.com/moom825/XenoStealer/blob/d1c7e242183a2c8582c179a1b546f0a5cdff5f75/XenoStealer/Injector/SharpInjector.cs), passing the encrypted key as a parameter. + +The injected code subsequently calls the ```DecryptData``` method from the ```GoogleChromeElevationService``` to obtain the decrypted key. + +![Source code of the injected code](/assets/images/katz-and-mouse-game/image29.png) + +## LUMMA + +In mid-October, the latest version of [LUMMA](https://malpedia.caad.fkie.fraunhofer.de/details/win.lumma) implemented a new method to bypass Chrome cookie protection, as reported by [@g0njxa](https://x.com/g0njxa). + +![](/assets/images/katz-and-mouse-game/image40.png) + +We analyzed a recent version of LUMMA, confirming that it managed to successfully recover the cookie data from the latest version of Google Chrome (```130.0.6723.70```). LUMMA first creates a visible Chrome process via ```Kernel32!CreateProcessW```. + +![Dump of ```CreateProcessW lpApplicationName``` parameter](/assets/images/katz-and-mouse-game/image3.png) + +This activity was followed up in the debugger with multiple calls to ```NtReadVirtualMemory``` where we identified LUMMA searching within the Chrome process for ```chrome.dll```. + +![LUMMA seeks ```chrome.dll``` in Chrome](/assets/images/katz-and-mouse-game/image7.png) + +Once found, the malware copies the ```chrome.dll``` image to its own process memory using ```NtReadVirtualMemory```. In a similar fashion to the ChromeKatz technique, Lumma leverages pattern scanning to target Chrome’s ```CookieMonster``` component. + +![Lumma’s pattern scanning](/assets/images/katz-and-mouse-game/image36.png) + +Lumma uses an obfuscated signature pattern to pinpoint the ```CookieMonster``` functionality: + +``` +3Rf5Zn7oFA2a????k4fAsdxx????l8xX5vJnm47AUJ8uXUv2bA0s34S6AfFA????kdamAY3?PdE????6G????L8v6D8MJ4uq????k70a?oAj7a3????????K3smA????maSd?3l4 +``` + +Below is the YARA rule after de-obfuscation: + +``` +rule lumma_stealer +{ + meta: + author = "Elastic Security Labs" + strings: + $lumma_pattern = { 56 57 48 83 EC 28 89 D7 48 89 CE E8 ?? ?? ?? ?? 85 FF 74 08 48 89 F1 E8 ?? ?? ?? ?? 48 89 F0 48 83 C4 28 5F 5E C3 CC CC CC CC CC CC CC CC CC CC 56 57 48 83 EC 38 48 89 CE 48 8B 05 ?? ?? ?? ?? 48 31 E0 48 89 44 24 ?? 48 8D 79 ?? ?? ?? ?? 28 E8 ?? ?? ?? ?? 48 8B 46 20 48 8B 4E 28 48 8B 96 ?? ?? ?? ?? 4C 8D 44 24 ?? 49 89 10 48 C7 86 ?? ?? ?? ?? ?? ?? ?? ?? 48 89 FA FF 15 ?? ?? ?? ?? 48 8B 4C 24 ?? 48 31 E1} + condition: + all of them +} +``` + +After decoding and searching for the pattern in ```chrome.dll```, this leads to the ```CookieMonster``` destructor ([```net::CookieMonster::~CookieMonster```](https://chromium.googlesource.com/chromium/src/net/+/master/cookies/cookie_monster.cc#657)). + +![Lumma pattern match on ```CookieMonster```](/assets/images/katz-and-mouse-game/image25.png) + +The cookies are then identified in memory and dumped out in clear text from the Chrome process. + +![LUMMA dumping the cookie in clear text from Chrome](/assets/images/katz-and-mouse-game/image21.png) + +Once completed, LUMMA sends out the cookies along with the other requested data as multiple zip files (xor encrypted and base64 encoded) to the C2 server. + +![Received stolen cookies on the C2 side](/assets/images/katz-and-mouse-game/image12.png) + +# Detection + +Below are the following behavioral detections that can be used to identify techniques used by information stealers: + + - [Web Browser Credential Access via Unusual Process](https://github.com/elastic/protections-artifacts/blob/da25aa57994ee265583227dbe6fe02261b65415c/behavior/rules/windows/credential_access_web_browser_credential_access_via_unusual_process.toml#L8) + - [Web Browser Credential Access via Unsigned Process](https://github.com/elastic/protections-artifacts/blob/da25aa57994ee265583227dbe6fe02261b65415c/behavior/rules/windows/credential_access_web_browser_credential_access_via_unsigned_process.toml#L8) + - [Access to Browser Credentials from Suspicious Memory](https://github.com/elastic/protections-artifacts/blob/da25aa57994ee265583227dbe6fe02261b65415c/behavior/rules/windows/credential_access_access_to_browser_credentials_from_suspicious_memory.toml#L8) + - [Failed Access Attempt to Web Browser Files](https://github.com/elastic/protections-artifacts/blob/da25aa57994ee265583227dbe6fe02261b65415c/behavior/rules/windows/credential_access_failed_access_attempt_to_web_browser_files.toml#L8) + - [Browser Debugging from Unusual Parent](https://github.com/elastic/protections-artifacts/blob/da25aa57994ee265583227dbe6fe02261b65415c/behavior/rules/windows/credential_access_browser_debugging_from_unusual_parent.toml#L3) + - [Potential Browser Information Discovery](https://github.com/elastic/protections-artifacts/blob/da25aa57994ee265583227dbe6fe02261b65415c/behavior/rules/windows/discovery_potential_browser_information_discovery.toml#L8) + +Additionally, the following queries can be used for hunting diverse related abnormal behaviors: + +## Cookies access by an unusual process + +This query uses file open events and aggregate accesses by process, then looks for ones that are observed in unique hosts and with a low total access count: + +``` sql +FROM logs-endpoint.events.file-default* +| where event.category == "file" and event.action == "open" and file.name == "Cookies" and file.path like "*Chrome*" +| keep file.path, process.executable, agent.id +| eval process_path = replace(to_lower(process.executable), """c:\\users\\[a-zA-Z0-9\.\-\_\$]+\\""", "c:\\\\users\\\\user\\\\") +| stats agents_count = COUNT_DISTINCT(agent.id), access_count= count(*) by process_path +| where agents_count <= 2 and access_count <=2 +``` + +Below example of matches from diverse information stealers including the updated ones with new Chrome cookies stealing capabilities: + +![ES|QL query results for suspicious browser cookies file access](/assets/images/katz-and-mouse-game/image22.png) + +METASTEALER behavior tends to first terminate all running chrome instances then calls [```CoCreateInstance```](https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-cocreateinstance) to instantiate the Google Chrome [elevation service](https://chromium.googlesource.com/chromium/src/+/main/chrome/elevation_service/), this series of events can be expressed with the following EQL query: + +``` sql +sequence by host.id with maxspan=1s +[process where event.action == "end" and process.name == "chrome.exe"] with runs=5 +[process where event.action == "start" and process.name == "elevation_service.exe"] +``` + +![EQL query results for suspicious browser termination](/assets/images/katz-and-mouse-game/image4.png) + +The previous hunt indicates suspicious agents but doesn't identify the source process. By [enabling registry object access auditing through event 4663](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-4663) on the Chrome Elevation service CLSID registry key ```{708860E0-F641-4611-8895-7D867DD3675B}```, we can detect unusual processes attempting to access that key: + +![Google Chrome Elevation COM registry access](/assets/images/katz-and-mouse-game/image9.png) + +``` sql +FROM logs-system.security-default* | where event.code == "4663" and winlog.event_data.ObjectName == "\\REGISTRY\\MACHINE\\SOFTWARE\\Classes\\CLSID\\{708860E0-F641-4611-8895-7D867DD3675B}" and not winlog.event_data.ProcessName in ("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe") and not winlog.event_data.ProcessName like "C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\*\\\\elevation_service.exe" | stats agents_count = COUNT_DISTINCT(agent.id), access_count= count(*) by winlog.event_data.ProcessName | where agents_count <= 2 and access_count <=2 +``` + +Below is an example of matches on the METASTEALER malware while calling ```CoCreateInstance (CLSID_Elevator)```: + +![ES|QL query results for suspicious access to chrome elevation service registry](/assets/images/katz-and-mouse-game/image39.png) + +The [PHEMEDRONE](https://malpedia.caad.fkie.fraunhofer.de/details/win.phemedrone_stealer) stealer uses the [known](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) browser debugging method to collect cookies via Chromium API, this can be observed in the following screenshot where we can see an instance of NodeJs communicating with a browser instance with debugging enabled over port ```9222```: + +![PHEMEDRONE - network connection to chrome over port ```9222```](/assets/images/katz-and-mouse-game/image33.png) + +The following EQL query can be used to look for unusual processes performing similar behavior: + +``` sql +sequence by host.id, destination.port with maxspan=5s +[network where event.action == "disconnect_received" and + network.direction == "ingress" and + process.executable in~ ("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", +"C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe") and + source.address like "127.*" and destination.address like "127.*"] +[network where event.action == "disconnect_received" and network.direction == "egress" and not + process.executable in~ ("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", +"C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe") and source.address like "127.*" and destination.address like "127.*"] +``` + +![EQL query results for browser debugging activity](/assets/images/katz-and-mouse-game/image1.png) + +## Chrome Browser Spawned from an Unusual Parent + +The STEALC sample that uses ChromeKatz implementation spawns an instance of Google Chrome to load the user default profile, while looking for normal parent executables, it turns out it’s limited to Chrome signed parents and Explorer.exe, the following ES|QL query can be used to find unusual parents: + +``` sql +FROM logs-endpoint.events.process-* +| where event.category == "process" and event.type == "start" and to_lower(process.name) == "chrome.exe" and process.command_line like "*--profile-directory=Default*" +| eval process_parent_path = replace(to_lower(process.parent.executable), """c:\\users\\[a-zA-Z0-9\.\-\_\$]+\\""", "c:\\\\users\\\\user\\\\") +| stats agents_count = COUNT_DISTINCT(agent.id), total_executions = count(*) by process_parent_path +| where agents_count == 1 and total_executions <= 10 +``` + +![ES|QL query results for chrome browser spawned from an unusual parent](/assets/images/katz-and-mouse-game/image18.png) + +## Untrusted Binaries from Chrome Application folder + +Since the Chrome elevation service [trusts](https://github.com/chromium/chromium/blob/main/chrome/elevation_service/caller_validation.cc#L33-L56) binaries running from the Chrome ```program files``` folder, the following queries can be used to hunt for unsigned or untrusted binaries executed or loaded from there: + +### Unsigned DLLs loaded from google chrome application folder + +``` sql +FROM logs-endpoint.events.library* +| where event.category == "library" and event.action == "load" and to_lower(dll.path) like "c:\\\\program files\\\\google\\\\chrome\\\\application\\\\*" and not (dll.code_signature.trusted == true) +| keep process.executable, dll.path, dll.hash.sha256, agent.id +| stats agents_count = COUNT_DISTINCT(agent.id), total_executions = count(*) by process.executable, dll.path, dll.hash.sha256 +| where agents_count == 1 and total_executions <= 10 +``` + +### Unsigned executable launched from google chrome application folder + +``` sql +FROM logs-endpoint.events.process* +| where event.category == "library" and event.type == "start" and (to_lower(process.executable) like "c:\\\\program files\\\\google\\\\chrome\\\\application\\\\*" or to_lower(process.executable) like "c:\\\\scoped_dir\\\\program files\\\\google\\\\chrome\\\\application\\\\*") +and not (process.code_signature.trusted == true and process.code_signature.subject_name == "Goole LLC") +| keep process.executable,process.hash.sha256, agent.id +| stats agents_count = COUNT_DISTINCT(agent.id), total_executions = count(*) by process.executable, process.hash.sha256 +| where agents_count == 1 and total_executions <= 10 +``` + +![ES|QL query results for malicious DLL loaded by Chrome](/assets/images/katz-and-mouse-game/image6.png) + +# Conclusion + +Google has raised the bar implementing new security controls to protect cookie data within Chrome. As expected, this has caused malware developers to develop or integrate their own bypasses. We hope Google will continue to innovate to provide stronger protection for user data. + +Organizations and defenders should consistently monitor for unusual endpoint activity. While these new techniques may be successful, they are also noisy and detectable with the right security instrumentation, processes, and personnel. + +## Stealer Bypasses and MITRE ATT&CK + +Elastic uses the [MITRE ATT&CK](https://attack.mitre.org/) framework to document common tactics, techniques, and procedures that threats use against enterprise networks. + +### Tactics + +Tactics represent the why of a technique or sub-technique. It is the adversary’s tactical goal: the reason for performing an action. + + - [Credential Access](https://attack.mitre.org/tactics/TA0006/) + - [Defense Evasion](https://attack.mitre.org/tactics/TA0005/) + - [Discovery](https://attack.mitre.org/tactics/TA0007/) + - [Execution](https://attack.mitre.org/tactics/TA0002/) + +### Techniques + +Techniques represent how an adversary achieves a tactical goal by performing an action. + + - [Steal Web Session Cookie](https://attack.mitre.org/techniques/T1539/) + - [Process Injection](https://attack.mitre.org/techniques/T1055/) + - [Credentials from Password Stores](https://attack.mitre.org/techniques/T1555/) + - [System Information Discovery](https://attack.mitre.org/techniques/T1082/) + - [Process Discovery](https://attack.mitre.org/techniques/T1057/) + - [Inter-Process Communication: Component Object Model](https://attack.mitre.org/techniques/T1559/001/) + +## YARA + +Elastic Security has created YARA rules to identify this activity. + + - [Windows.Trojan.Stealc](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_Stealc.yar) + - [Windows.Infostealer.PhemedroneStealer](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Infostealer_PhemedroneStealer.yar) + - [Windows.Trojan.MetaStealer](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_MetaStealer.yar) + - [Windows.Trojan.Xeno](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_Xeno.yar) + - [Windows.Trojan.Lumma](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_Lumma.yar) + - [Windows.Infostealer.Generic](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Infostealer_Generic.yar) + +## Observations + +All observables are also available for [download](https://github.com/elastic/labs-releases/tree/main/indicators/app-bound_bypass) in both ECS and STIX format. + +The following observables were discussed in this research. + +| Observable | Type | Name | Reference | +|-----|-----|-----|-----| +| 27e4a3627d7df2b22189dd4bebc559ae1986d49a8f4e35980b428fadb66cf23d | SHA-256 | num.exe | STEALC | +| 08d9d4e6489dc5b05a6caa434fc36ad6c1bd8c8eb08888f61cbed094eac6cb37 | SHA-256 | HardCoreCrack.exe | PHEMEDRONE | +| 43cb70d31daa43d24e5b063f4309281753176698ad2aba9c557d80cf710f9b1d | SHA-256 | Ranginess.exe | METASTEALER | +| 84033def9ffa70c7b77ce9a7f6008600c0145c28fe5ea0e56dfafd8474fb8176 | SHA-256 | | LUMMA | +| b74733d68e95220ab0630a68ddf973b0c959fd421628e639c1b91e465ba9299b | SHA-256 | XenoStealer.exe | XENOSTEALER | + + +## References +The following were referenced throughout the above research: + + - [https://developer.chrome.com/release-notes/127](https://developer.chrome.com/release-notes/127) +- [https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html](https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html) diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/protecting_your_devices_from_information_theft_keylogger_protection_jp.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/protecting_your_devices_from_information_theft_keylogger_protection_jp.md index 7c239d1f48127..6bfc447cff63c 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/protecting_your_devices_from_information_theft_keylogger_protection_jp.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/protecting_your_devices_from_information_theft_keylogger_protection_jp.md @@ -1,7 +1,7 @@ --- title: "情報窃取から端末を守る" slug: "protecting-your-devices-from-information-theft-keylogger-protection-jp" -date: "2020-05-30" +date: "2024-05-30" subtitle: "Windows APIの挙動を用いたキーロガー検知" description: "本記事ではElastic Securityにおいて、エンドポイント保護を担っているElastic Defendに今年(バージョン8.12より)新たに追加された、キーロガーおよびキーロギング検出機能について紹介します。" author: diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/streamlining_security_integrating_amazon_bedrock.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/streamlining_security_integrating_amazon_bedrock.md new file mode 100644 index 0000000000000..9ba2b033a851e --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/streamlining_security_integrating_amazon_bedrock.md @@ -0,0 +1,237 @@ +--- +title: "Streamlining Security: Integrating Amazon Bedrock with Elastic" +slug: "streamlining-security-integrating-amazon-bedrock" +date: "2024-11-14" +description: "This article will guide you through the process of setting up the Amazon Bedrock integration and enabling Elastic's prebuilt detection rules to streamline your security operations." +author: + - slug: shashank-k-s +image: "Security Labs Images 36.jpg" +category: + - slug: security-research +--- + +# Preamble + +In the ever-evolving landscape of cloud computing, maintaining robust security while ensuring compliance is a critical challenge for organizations of all sizes. As businesses increasingly adopt the cloud, the complexity of managing and securing data across various platforms grows exponentially. + +[Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html), with its powerful foundation of machine learning and AI services, offers a scalable, secure environment for organizations to develop and deploy intelligent applications. However, to fully harness the potential of these innovations, it’s essential to implement a streamlined approach to security and compliance. + +Integrating Elastic with Amazon Bedrock can significantly enhance security monitoring and compliance management within your cloud environment. This integration leverages Elastic’s search, observability, and security capabilities to optimize how you manage and secure applications and data hosted on Amazon Bedrock. + +Elastic’s [security information and event management (SIEM) capabilities](https://www.elastic.co/security/siem) can be used to analyze logs and monitor events generated by applications running on Amazon Bedrock. This allows for the detection of potential security threats in real-time and automated response actions to mitigate risks. + +This article will guide you through the process of setting up Amazon Bedrock integration and enabling our prebuilt detection rules to streamline your security operations. We will cover the following key aspects: + + 1. **Prerequisites for Elastic Amazon Bedrock Integration:** Understanding the core requirements for setting up Elastic Amazon Bedrock integration for cloud security. + 2. **Setting Up Amazon Bedrock Integration**: Step-by-step instructions to set up Amazon Bedrock in your existing AWS infrastructure. + 3. **Enabling Prebuilt Security Rules**: How to leverage [prebuilt rules](https://www.elastic.co/guide/en/security/current/rules-ui-management.html) to detect high-confidence policy violations and other security threats. + 4. **Exploring High-Confidence Misconduct Blocks Detection:** An in-depth look at a specific prebuilt rule designed to detect high-confidence misconduct blocks within Amazon Bedrocklogs. + 5. **Demonstrate an Exploit Case Scenario for Amazon Bedrock:** Using a sample python script to simulate interactions with an Amazon Bedrock model for testing exploit scenarios that could trigger Elastic prebuilt detection rules. + +# Prerequisites for Elastic Amazon Bedrock Integration + +## Elastic Integration for Amazon Bedrock + +The Amazon Bedrock integration collects Amazon Bedrock model invocation logs and runtime metrics with Elastic Agent. For a deeper dive on the integration, documentation can be found in our [documentation.](https://www.elastic.co/docs/current/integrations/aws_bedrock) + +Below are the list of prerequisites to have a complete and successful configuration of Amazon Bedrock Elastic Integration: + + * AWS Account Setup + * Elastic Cloud Requirements + * Terraform (Optional) + +### AWS Account Setup + + * **Active AWS Account**: Ensure you have an active AWS account with the appropriate permissions to deploy and manage resources on Amazon Bedrock. + * **Amazon Bedrock Setup**: Confirm that Amazon Bedrock is correctly configured and operational within your AWS environment. This includes setting up AI models, datasets, and other resources necessary for your applications. Refer to [Getting started with Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html) for additional information on the setup. + * **IAM Roles and Permissions**: Create or configure Identity and Access Management (IAM) roles with the necessary permissions to allow Elastic to access Amazon Bedrock resources. These roles should have sufficient privileges to read logs, metrics, and traces from AWS services. Additional details of the requirements can be found in our [AWS documentation](https://www.elastic.co/docs/current/integrations/aws#requirements). + +### Elastic Cloud Requirements + +| [Version](https://www.elastic.co/docs/current/integrations/aws_bedrock#changelog) | 0.7.0 (Beta) | +| :---- | :---- | +| **Compatible Kibana version(s)** | 8.13.0 or higher for integration version 0.2.0 and above. Minimum Kibana Version 8.12.0 | +| [**Supported Serverless project types**](https://www.elastic.co/docs/current/integrations/serverless/support) | Security Observability | +| [**Subscription level**](https://www.elastic.co/subscriptions) | Basic | +| [**Level of support**](https://www.elastic.co/docs/current/integrations/support) | Elastic | + +**Note:** Since the integration is in Beta Release Stage, please enable ***Display Beta Integrations in the browse integration section of the Management pane in your Elastic stack.*** + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image1.png) + +### Terraform + +[Terraform](https://www.terraform.io/) is an open source infrastructure-as-code (IaC) tool created by HashiCorp that allows you to define, provision, and manage cloud and on-premises infrastructure in a consistent and repeatable way. + +This is an optional step, but good to have as the next sections of the article we use this tool to set up the required AWS Infrastructure. Deep dive on installation and docs can be found [here](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli). + +# Setting Up Amazon Bedrock Integration + +In this section of the article, we will walk through the steps to set up Amazon Bedrock integration with Elastic in two parts: + + 1. **Setting Up AWS Infrastructure with Terraform**: In this section, we'll walk through the steps to set up an AWS infrastructure using Terraform. We'll create an S3 bucket, an EC2 instance with the necessary IAM roles and policies to access the S3 bucket, and configure security groups to allow SSH access. This setup is ideal for scenarios where you need an EC2 instance to interact with S3, such as for data processing or storage. + 2. **Elastic Agent and Integration Setup**: In this section, we'll walk through the steps to install Elastic Agent on the AWS EC2 instance and Configure the Amazon Bedrock Integration. + +### Setting Up AWS Infrastructure with Terraform + +The high-level configuration process will involve the following steps: + + 1. Configuring ```providers.tf``` + 2. Configuring ```variables.tf``` + 3. Configuring ```outputs.tf``` + 4. Configuring ```main.tf``` + +The ```providers.tf``` file typically contains the configuration for any Terraform providers you are using in your project. In our example, it includes the configuration for the AWS provider. Here is the [sample content](https://gist.github.com/shashank-elastic/290218cd4e787f65fbcbfd6423a0ca85#file-providers-tf) of our ```providers.tf``` file. The ```profile``` mentioned in the ```providers.tf``` should be configured in the user’s space of the AWS credentials file ```(~/.aws/credentials)```. Refer to [Configuration and credential file settings \- AWS Command Line Interface](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html#cli-configure-files-format-profile), which is also highlighted in the credential section of Elastic’s [AWS documentation](https://www.elastic.co/docs/current/integrations/aws#aws-credentials). + +The ```variables.tf``` file contains the variable definitions used throughout your Terraform configuration. For our scenario, it includes the definition for the aws\_region and resource\_labels. Here is the [sample content](https://gist.github.com/shashank-elastic/290218cd4e787f65fbcbfd6423a0ca85#file-variables-tf) of our ```variables.tf``` file. + +The ```outputs.tf``` file typically contains the output definitions for your Terraform configuration. These outputs can be used to display useful information after your infrastructure is provisioned. Here is the [sample content](https://gist.github.com/shashank-elastic/290218cd4e787f65fbcbfd6423a0ca85#file-outputs-tf) of our ```outputs.tf``` file + +The ```main.tf``` file typically contains the collection of all of these resources such as data sources, S3 bucket and bucket policy, Amazon Bedrock Model Invocation Log configuration, SQS Queue configuration, IAM Role and Policies required by the EC2 instance that would install Elastic Agent and stream logs and Amazon Bedrock Guardrail configuration. Here is the [sample content](https://gist.github.com/shashank-elastic/290218cd4e787f65fbcbfd6423a0ca85#file-main-tf) of our ```main.tf``` file. + +Once the ```main.tf``` is configured according to the requirements we can then initialize, plan and apply the terraform configuration. + +``` +terraform init // initializes the directory and sets up state files in backend +terraform plan // command creates an execution plan +terraform apply // command applies the configuration aka execution step +``` + +To tear down the infrastructure that terraform has previously created one can use the ```terraform destroy``` command. + +Once the infrastructure setup is completed, necessary resource identifiers are provided via ```outputs.tf.``` We can conduct a basic verification of the infrastructure created using the following steps: + + 1. Verify the S3 Bucket created from the Terraform, one can either use aws cli command reference [list-buckets — AWS CLI 1.34.10 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-buckets.html) or navigate via AWS console to verify the same. 2. Verify the SQS Queue created from the terraform, one can either use aws cli command reference [list-queues — AWS CLI 1.34.10 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/sqs/list-queues.html) or navigate via AWS console to verify the same. + 3. Verify the EC2 Instance created from the AWS console and connect to the ec2-instance via [Connect using EC2 Instance Connect \- Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html#ec2-instance-connect-connecting-console) and run ```aws s3 ls example-bucket-name``` to check if the instance has access to the created S3 bucket. + 4. Verify the Amazon Bedrock Guardrail created from the Terraform, once can either use Amazon Bedrock API [ListGuardrails \- Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_ListGuardrails.html) or navigate via AWS console to verify the same. + +### Setting Up Elastic Agent and Integration Setup + +To install Elastic Agent on the AWS EC2 instance and configure the Amazon Bedrock integration, create an agent policy using the guided steps in [Elastic Agent policies | Fleet and Elastic Agent Guide \[8.15\]](https://www.elastic.co/guide/en/fleet/current/agent-policy.html). Then log into to the ec2-instance created in the infrastructure setup steps via [Connect using EC2 Instance Connect \- Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html#ec2-instance-connect-connecting-console), and install the elastic agent using the guided steps in [Install Elastic Agents | Fleet and Elastic Agent Guide \[8.15\]](https://www.elastic.co/guide/en/fleet/current/elastic-agent-installation.html). During the agent installation, remember to select the agent policy created at the beginning of this setup process and use the relevant agent installation method depending on the instance created. Finally, ensure the agent is properly configured and there is incoming data from the agent. + +To configure the Amazon Bedrock integration in the newly-created policy, add the Amazon Bedrock integration using the guided steps: [Add an Elastic Agent integration to a policy](https://www.elastic.co/guide/en/fleet/current/add-integration-to-policy.html). Enable Beta Integrations to use Amazon Bedrock integration as displayed in the image below. + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image4.png) + +Configure the Integration with AWS Access Keys to access the AWS account where Amazon Bedrock is configured. Use the Collect Logs from S3 bucket and specify the Bucket ARN created in the setup step. Please note to use either the S3 Bucket or the SQS Queue URL during the setup and *not both*. Add this integration to the existing policy where the ec2-instance is configured. + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image8.png) + +### Verify Amazon Bedrock Model Invocation Log Ingestions + +Once the Elastic Agent and integration setup is completed, we can conduct a basic verification of the integration to determine if the logs are being ingested as expected by using the following example API call: + +``` +aws bedrock-runtime converse \ +--model-id "anthropic.claude-3-5-sonnet-20240620-v1:0" \ +--messages '[{"role":"user","content":[{"text":"Hello "}]}]' \ +--inference-config '{"maxTokens":2000,"stopSequences":[],"temperature":1,"topP":0.999}' \ +--additional-model-request-fields '{"top_k":250}' \ +--region us-east-1 +``` + +The example API call assumes a working setup with aws cli and there is access for the foundational model [Anthropic Claude Messages API \- Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html). If the user does not have access to the model one can simply request access for models from the model-access page as suggested in [Access Amazon Bedrock foundation models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html), or we can optionally change the API call to any existing model the user can access. + +On successful execution of the above API call, the Amazon Bedrock Model invocation logs are populated and in Kibana ```logs-aws_bedrock.invocation-default``` should be populated with those invocation logs. We can use the following simple ES|QL query to return recently ingested events. + +``` +from logs-aws_bedrock.invocation-* | LIMIT 10 +``` + +# Enable Prebuilt Detection Rules + +To enable prebuilt detection rules, first login to the elastic instance and from the left pane navigation navigate to Security → Rules → Detection rules (SIEM). Filter for “Data Source: Amazon Bedrock” from the tags section. + +Enable the available prebuilt rules. For prebuilt rules, the Setup information contains a helper guide to setup AWS Guardrails for Amazon Bedrock, which is accomplished in the [Setting Up AWS Infrastructure with Terraform](?tab=t.0#bookmark=id.5wbf10usmxhz) step if the example is followed correctly and the terraform has the Amazon Bedrock Guardrail configuration. Please note this setup is vital for some of the rules to generate alerts–we need to ensure the guardrail is set up accordingly if skipped in the infrastructure setup stage. + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image3.png) + +# Exploring High-Confidence Misconduct Blocks Detection + +Let’s simulate a real world scenario in which a user queries a topic denied to the Amazon Bedrock model. Navigate to the Amazon Bedrock section in the Amazon UI Console, and use the left navigation pane to navigate to the Guardrails subsection under Safeguards. Use the sample guardrail created during our setup instructions for this exercise, and use the test option to run a model invocation with the guardrails and query the denied topic configured. + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image6.png) + +Repeat the query at least 6 times as the prebuilt rule is designed to alert on greater than 5 high confidence blocks. When the Alert schedule runs, we can see an alert populate for ```Unusual High Confidence Misconduct Blocks Detected.``` + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image7.png) + +# Demonstrate an Exploit Case Scenario for Amazon Bedrock + +To simulate an Amazon Bedrock Security bypass, we need an exploit simulation script to interact with Amazon Bedrock models. The exploit script example we provide simulates the following attack pattern: + + * Attempts multiple successive requests to use denied model resources within AWS Bedrock + * Generates multiple successive validation exception errors within Amazon Bedrock + * User consistently generates high input token counts, submits numerous requests, and receives large responses that mimic patterns of resource exhaustion + * Combines repeated high-confidence 'BLOCKED' actions coupled with specific violation codes such as 'MISCONDUCT', indicating persistent misuse or attempts to probe the model's ethical boundaries + +```py +class BedrockModelSimulator: + def __init__(self, profile_name, region_name): + // Create a Boto3 Session Client for Ineration + def generate_args_invoke_model(self, model_id, user_message, tokens): // Generate Model Invocation parameters + guardrail_id = <<GUARDRAIL_ID>> + guardrail_version = <<GUARDRAIL_VERSION>> + + guardrail_config = { + "guardrailIdentifier": guardrail_id, + "guardrailVersion": guardrail_version, + "trace": "enabled" + } + conversation = [ + { + "role": "user", + "content": [{"text": user_message}], + } + ] + inference_config = {"maxTokens": tokens, "temperature": 0.7, "topP": 1} + additional_model_request_fields = {} + + kwargs = { + "modelId": model_id, + "messages": conversation, + "inferenceConfig": inference_config, + "additionalModelRequestFields": additional_model_request_fields + "guardrailConfig" : guardrail_config + } + return kwargs + + def invoke_model(self, invocation_arguments): + for _ in range(count): + try: + // Invoke Model With right invocation_arguments + except ClientError as e: + // Error meesage + +def main(): + profile_name = <<AWS Profile>> + region_name = 'us-east-1' + denied_model_id = // Use a denied model + denied_model_user_message = // Sample Message + available_model_id = // Use an available model + validation_exception_user_message = // Sample Message + resource_exploit_user_message = // A very big message for resource exhuastion + denied_topic_user_message = // Sample Message that can query denied topic configured + simulator = BedrockModelSimulator(profile_name, region_name) + denied_model_invocation_arguments = simulator.generate_args_invoke_model(denied_model_id, denied_model_user_message, 200) + simulator.invoke_model(denied_model_invocation_arguments) + validation_exception_invocation_arguments = simulator.generate_args_invoke_model(available_model_id, validation_exception_user_message, 6000) + simulator.invoke_model(validation_exception_invocation_arguments) + resource_exhaustion_invocation_arguments = simulator.generate_args_invoke_available_model(available_model_id, resource_exploit_user_message, 4096) + simulator.invoke_model(resource_exhaustion_invocation_arguments) + denied_topic_invocation_arguments = simulator.generate_args_invoke_available_model_guardrail(available_model_id, denied_topic_user_message, 4096) + simulator.invoke_model(denied_topic_invocation_arguments) + +if __name__ == "__main__": + main() +``` + +**Note:** The GUARDRAIL\_ID and GUARDRAIL\_VERSION can be found in ```outputs.tf``` + +When executed in a controlled environment, the provided script simulates an exploit scenario that would generate detection alerts in Elastic Security. When analyzing these alerts using the Elastic Attack Discovery feature, the script creates attack chains that show the relationships between various alerts, giving analysts a clear understanding of how multiple alerts might be part of a larger attack. + +![](/assets/images/streamlining-security-integrating-amazon-bedrock/image2.png) + +# Conclusion + +Integrating Elastic with Amazon Bedrock empowers organizations to maintain a secure and compliant cloud environment while maximizing the benefits of AI and machine learning. By leveraging Elastic’s advanced security and observability tools, businesses can proactively detect threats, automate compliance reporting, and gain deeper insights into their cloud operations. Increasingly, enterprises rely on opaque data sources and technologies to reveal the most serious threats-- our commitment to transparent security is evident in our open artifacts, integrations, and source code. \ No newline at end of file diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/tricks_and_treats.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/tricks_and_treats.md new file mode 100644 index 0000000000000..d7a98fe2b7258 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/tricks_and_treats.md @@ -0,0 +1,141 @@ +--- +title: "Tricks and Treats: GHOSTPULSE’s new pixel-level deception" +slug: "tricks-and-treats" +date: "2024-10-19" +description: "The updated GHOSTPULSE malware has evolved to embed malicious data directly within pixel structures, making it harder to detect and requiring new analysis and detection techniques." +author: + - slug: salim-bitam +image: "tricks-and-treats.jpg" +category: + - slug: malware-analysis +tags: + - ghostpulse + - lummastealer + - ref8207 +--- + +## Update + +This research covers an update to stage 2 of GHOSTPULSE, [originally disclosed](https://www.elastic.co/security-labs/ghostpulse-haunts-victims-using-defense-evasion-bag-o-tricks#stage-2) by Elastic Security Labs in October 2023. + +## Key takeaways + +1. GHOSTPULSE has shifted from using the IDAT chunk of PNG files to embedding its encrypted configuration and payload within the pixel structure. +1. Recent campaigns involve tricking victims with creative social engineering techniques, such as CAPTCHA validations that trigger malicious commands through Windows keyboard shortcuts. +1. Elastic Security has enhanced its YARA rules and updated the configuration extractor tool to detect and analyze both the old and new versions of GHOSTPULSE. + +## Preamble + +The GHOSTPULSE malware family (also known as HIJACKLOADER or IDATLOADER) has continuously evolved since its discovery in 2023, evading detection with increasingly developed techniques. + +In its earlier iterations, GHOSTPULSE abused the IDAT chunk of PNG files to hide malicious payloads, as detailed in a [previous article from Elastic Security Labs](https://www.elastic.co/security-labs/ghostpulse-haunts-victims-using-defense-evasion-bag-o-tricks). However, recent analysis has uncovered a significant change in its algorithm. Instead of extracting the payload from the IDAT chunk, the latest version of GHOSTPULSE now parses the pixels of the image to retrieve its configuration and payload. This new approach involves embedding malicious data directly within the pixel structure. + +In this research publication, we’ll explore this new pixel-based algorithm and compare it with the previous IDAT chunk technique with updated detection rules. + +## Introduction + +Recently, we've observed several campaigns involving LUMMA STEALER using GHOSTPULSE as its loader, a topic also explored by [HarfangLab](https://harfanglab.io/insidethelab/hijackloader-abusing-genuine-certificates/). These campaigns stand out due to their [creative social engineering tactics](https://www.secureworks.com/blog/fake-human-verification-prompt-delivers-infostealers). Victims are tricked into validating a CAPTCHA, but the website instructs them to execute a series of Windows keyboard shortcuts instead of the usual process. These shortcuts trigger a command copied to the clipboard by malicious JavaScript. This leads to a PowerShell script being executed, initiating the infection chain by downloading and executing a GHOSTPULSE payload. + +![Social engineer lure website](/assets/images/tricks-and-treats/image1.png "Lure website") + +In previous versions of GHOSTPULSE, it was delivered as part of a multi-file package. This package typically contained a benign executable, an infected DLL loaded by the executable, and a PNG file storing the encrypted configuration. + +However, in the latest version, GHOSTPULSE has streamlined its deployment. Now, the entire package consists of a single file—a benign but compromised executable that includes the PNG file within its resources section. + +![Large embedded PNG file in the resources section](/assets/images/tricks-and-treats/image2.png "Large embedded PNG file in the resources section") + +## Technical analysis + +The updated second stage of the malware retains much of its previous structure, including using the same hashing algorithm for resolving Windows API names. However, the most significant change is in how the malware now locates its configuration, which holds both the payload and critical instructions for its deployment. + +The following is a screenshot showing the pseudocode of both implementations: + +![Pseudocode code comparison between old and new algorithm](/assets/images/tricks-and-treats/image4.png "Pseudocode code comparison between old and new algorithm") + +In earlier versions, GHOSTPULSE would parse a PNG file for an encrypted data blob, which was divided into chunks and stored sequentially. The malware’s parsing process was straightforward: it would search for a specific marker within the file—in this case, the IDAT string. Once found, the malware would check for a 4-byte tag that followed the string. The encrypted chunk would be extracted if this tag matched the expected value. This process continues for every occurrence of the IDAT string that comes after until the full encrypted payload is collected. + +In the new version, the encrypted configuration is stored in the pixels of the image. The malware constructs a byte array by extracting each pixel's `RED`, `GREEN`, and `BLUE` (RGB) values sequentially using standard Windows APIs from the [GdiPlus(GDI+)](https://learn.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-gdi-start) library. Once the byte array is built, the malware searches for the start of a structure that contains the encrypted GHOSTPULSE configuration, including the XOR key needed for decryption. It does this by looping through the byte array in 16-byte blocks. For each block, the first 4 bytes represent a CRC32 hash, and the next 12 bytes are the data to be hashed. The malware computes the CRC32 of the 12 bytes and checks if it matches the hash. If a match is found, it extracts the offset of the encrypted GHOSTPULSE configuration, its size, and the 4-byte XOR key, and then XOR decrypts it. + +The following diagram provides a visual breakdown of this process: + +![](/assets/images/tricks-and-treats/image5.png) + +## Updated configuration extractor + +Based on these findings, we have updated our configuration extractor to support both versions of GHOSTPULSE. This tool takes a PNG file as input and outputs the embedded payload. You can find the updated tool in our [labs-releases repository](https://github.com/elastic/labs-releases/tree/main/tools/ghostpulse). + +![](/assets/images/tricks-and-treats/image3.png) + +## Detecting GHOSTPULSE with YARA + +The original [GHOSTPULSE YARA](https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_GhostPulse.yar) rule still prevents the final stage of an infection and is built into Elastic Defend. The updated sample can be detected using the following YARA rules and will be included with Elastic Defend in a future release. + +Elastic Security has updated the GHOSTPULSE YARA rules to identify this activity: + +``` +rule Windows_Trojan_GHOSTPULSE_1 { + meta: + author = "Elastic Security" + creation_date = "2024-10-15" + last_modified = "2024-10-15" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "GHOSTPULSE" + threat_name = "Windows.Trojan.GHOSTPULSE" + license = "Elastic License v2" + + strings: + $stage_1 = { 49 63 D0 42 8B 0C 0A 41 03 CA 89 0C 1A 8B 05 ?? ?? ?? ?? 44 03 C0 8B 05 ?? ?? ?? ?? 44 3B C0 } + $stage_2 = { 48 89 01 48 8B 84 24 D8 00 00 00 48 8B 4C 24 78 8B 49 0C 89 08 C7 44 24 44 00 00 00 00 } + + condition: + any of them +} + +rule Windows_Trojan_GHOSTPULSE_2 { + meta: + author = "Elastic Security" + creation_date = "2024-10-10" + last_modified = "2024-10-10" + os = "Windows" + arch = "x86" + category_type = "Trojan" + family = "GHOSTPULSE" + threat_name = "Windows.Trojan.GHOSTPULSE" + license = "Elastic License v2" + + strings: + $a1 = { 48 83 EC 18 C7 04 24 00 00 00 00 8B 04 24 48 8B 4C 24 20 0F B7 04 41 85 C0 74 0A 8B 04 24 FF C0 89 04 24 EB E6 C7 44 24 08 00 00 00 00 8B 04 24 FF C8 8B C0 48 8B 4C 24 20 0F B7 04 41 83 F8 5C } + + condition: + all of them +} +``` + +## Conclusion + +In summary, the GHOSTPULSE malware family has evolved since its release in 2023, with this recent update marking one of the most significant changes. + +As attackers continue to innovate, defenders must adapt by utilizing updated tools and techniques to mitigate these threats effectively. We are excited to share our newly developed configuration extractor tool, designed to analyze the older and newer versions of GHOSTPULSE. This tool empowers researchers and cybersecurity professionals by providing enhanced capabilities for understanding and combating these evolving threats. As the landscape of cyber threats changes, collaboration, and innovation remain essential for effective protection. + +## Observations + +All observables are also available for [download](https://github.com/elastic/labs-releases/tree/main/indicators/ghostpulse) in both ECS and STIX format. + +The following observables were discussed in this research. + +| Observable | Type | Name | Reference | +|------------------------------------------------------------------|-------------|-----------------|------------------------------------------| +| `57ebf79c384366162cb0f13de0de4fc1300ebb733584e2d8887505f22f877077` | SHA-256 | `Setup.exe` | GHOSTPULSE sample | +| `b54d9db283e6c958697bfc4f97a5dd0ba585bc1d05267569264a2d700f0799ae` | SHA-256 | `Setup_light.exe` | GHOSTPULSE sample | +| `winrar01.b-cdn[.]net` | domain-name | | Infrastructure hosting GHOSTPULSE sample | +| `reinforcenh[.]shop` | domain-name | | LUMMASTEALER C2 | +| `stogeneratmns[.]shop` | domain-name | | LUMMASTEALER C2 | +| `fragnantbui[.]shop` | domain-name | | LUMMASTEALER C2 | +| `drawzhotdog[.]shop` | domain-name | | LUMMASTEALER C2 | +| `vozmeatillu[.]shop` | domain-name | | LUMMASTEALER C2 | +| `offensivedzvju[.]shop` | domain-name | | LUMMASTEALER C2 | +| `ghostreedmnu[.]shop` | domain-name | | LUMMASTEALER C2 | +| `gutterydhowi[.]shop` | domain-name | | LUMMASTEALER C2 | +| `riderratttinow[.]shop` | domain-name | | LUMMASTEALER C2 | \ No newline at end of file diff --git a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/twice_around_the_dance_floor_with_pipedance.md b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/twice_around_the_dance_floor_with_pipedance.md index 4775edad80247..1767d5edd4c94 100644 --- a/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/twice_around_the_dance_floor_with_pipedance.md +++ b/x-pack/plugins/elastic_assistant/server/knowledge_base/security_labs/twice_around_the_dance_floor_with_pipedance.md @@ -230,7 +230,7 @@ PIPEDANCE is designed to conduct covert operations using named pipes and has var ### Detection -- [Suspicious Windows Service Execution](https://github.com/elastic/endpoint-rules/blob/main/rules/privilege_escalation_suspicious_services_child.toml) +- [Suspicious Windows Service Execution](https://github.com/elastic/protections-artifacts/blob/main/behavior/rules/windows/privilege_escalation_suspicious_windows_service_execution.toml) - [NullSessionPipe Registry Modification](https://www.elastic.co/guide/en/security/current/nullsessionpipe-registry-modification.html) - [Potential Lateral Tool Transfer via SMB Share](https://www.elastic.co/guide/en/security/master/potential-lateral-tool-transfer-via-smb-share.html) diff --git a/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/bulk_actions_route.ts b/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/bulk_actions_route.ts index 01e8c9ebf3f08..82c8b4e0148fd 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/bulk_actions_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/bulk_actions_route.ts @@ -6,7 +6,12 @@ */ import moment from 'moment'; -import { AnalyticsServiceSetup, IKibanaResponse, KibanaResponseFactory } from '@kbn/core/server'; +import { + AnalyticsServiceSetup, + AuditLogger, + IKibanaResponse, + KibanaResponseFactory, +} from '@kbn/core/server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { @@ -20,6 +25,11 @@ import { } from '@kbn/elastic-assistant-common'; import { buildRouteValidationWithZod } from '@kbn/elastic-assistant-common/impl/schemas/common'; +import { + AUDIT_OUTCOME, + KnowledgeBaseAuditAction, + knowledgeBaseAuditEvent, +} from '../../../ai_assistant_data_clients/knowledge_base/audit_events'; import { CREATE_KNOWLEDGE_BASE_ENTRY_SUCCESS_EVENT } from '../../../lib/telemetry/event_based_telemetry'; import { performChecks } from '../../helpers'; import { KNOWLEDGE_BASE_ENTRIES_TABLE_MAX_PAGE_SIZE } from '../../../../common/constants'; @@ -62,7 +72,8 @@ const buildBulkResponse = ( deleted = [], skipped = [], }: KnowledgeBaseEntryBulkCrudActionResults & { errors: BulkOperationError[] }, - telemetry: AnalyticsServiceSetup + telemetry: AnalyticsServiceSetup, + auditLogger?: AuditLogger ): IKibanaResponse<KnowledgeBaseEntryBulkCrudActionResponse> => { const numSucceeded = updated.length + created.length + deleted.length; const numSkipped = skipped.length; @@ -90,6 +101,39 @@ const buildBulkResponse = ( sharing: entry.users.length ? 'private' : 'global', ...(entry.type === 'document' ? { source: entry.source } : {}), }); + auditLogger?.log( + knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.CREATE, + id: entry.id, + name: entry.name, + outcome: AUDIT_OUTCOME.SUCCESS, + }) + ); + }); + } + + if (updated.length) { + updated.forEach((entry) => { + auditLogger?.log( + knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.UPDATE, + id: entry.id, + name: entry.name, + outcome: AUDIT_OUTCOME.SUCCESS, + }) + ); + }); + } + + if (deleted.length) { + deleted.forEach((deletedId) => { + auditLogger?.log( + knowledgeBaseAuditEvent({ + action: KnowledgeBaseAuditAction.DELETE, + id: deletedId, + outcome: AUDIT_OUTCOME.SUCCESS, + }) + ); }); } if (numFailed > 0) { @@ -308,7 +352,8 @@ export const bulkActionKnowledgeBaseEntriesRoute = (router: ElasticAssistantPlug skipped: [], errors, }, - ctx.elasticAssistant.telemetry + ctx.elasticAssistant.telemetry, + ctx.elasticAssistant.auditLogger ); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/create_route.ts b/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/create_route.ts index 8a4004e4a236a..cd1216713e18a 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/create_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/knowledge_base/entries/create_route.ts @@ -63,6 +63,7 @@ export const createKnowledgeBaseEntryRoute = (router: ElasticAssistantPluginRout const createResponse = await kbDataClient?.createKnowledgeBaseEntry({ knowledgeBaseEntry: request.body, global: request.body.users != null && request.body.users.length === 0, + auditLogger: ctx.elasticAssistant.auditLogger, telemetry: ctx.elasticAssistant.telemetry, }); diff --git a/x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts b/x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts index 30045b3da8ad9..08ef1bb1828d6 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts @@ -62,7 +62,7 @@ export class RequestContextFactory implements IRequestContextFactory { core: coreContext, actions: startPlugins.actions, - + auditLogger: coreStart.security.audit?.asScoped(request), logger: this.logger, getServerBasePath: () => core.http.basePath.serverBasePath, @@ -94,7 +94,6 @@ export class RequestContextFactory implements IRequestContextFactory { capabilityPath: 'securitySolutionAssistant.*', } ); - return this.assistantService.createAIAssistantKnowledgeBaseDataClient({ spaceId: getSpaceId(), logger: this.logger, diff --git a/x-pack/plugins/elastic_assistant/server/types.ts b/x-pack/plugins/elastic_assistant/server/types.ts index 6158acde679ff..1102d4b7b8441 100755 --- a/x-pack/plugins/elastic_assistant/server/types.ts +++ b/x-pack/plugins/elastic_assistant/server/types.ts @@ -18,7 +18,7 @@ import type { IRouter, KibanaRequest, Logger, - SecurityServiceStart, + AuditLogger, } from '@kbn/core/server'; import type { LlmTasksPluginStart } from '@kbn/llm-tasks-plugin/server'; import { type MlPluginSetup } from '@kbn/ml-plugin/server'; @@ -116,7 +116,6 @@ export interface ElasticAssistantPluginStartDependencies { llmTasks: LlmTasksPluginStart; inference: InferenceServerStart; spaces?: SpacesPluginStart; - security: SecurityServiceStart; licensing: LicensingPluginStart; productDocBase: ProductDocBaseStartContract; } @@ -124,6 +123,7 @@ export interface ElasticAssistantPluginStartDependencies { export interface ElasticAssistantApiRequestHandlerContext { core: CoreRequestHandlerContext; actions: ActionsPluginStart; + auditLogger?: AuditLogger; getRegisteredFeatures: GetRegisteredFeatures; getRegisteredTools: GetRegisteredTools; logger: Logger; diff --git a/x-pack/plugins/enterprise_search/kibana.jsonc b/x-pack/plugins/enterprise_search/kibana.jsonc index 42e4db528a759..1d378a8e95d8d 100644 --- a/x-pack/plugins/enterprise_search/kibana.jsonc +++ b/x-pack/plugins/enterprise_search/kibana.jsonc @@ -3,7 +3,7 @@ "id": "@kbn/enterprise-search-plugin", "owner": "@elastic/search-kibana", // TODO this is currently used from Observability too, must be refactored before solution-specific builds - // see x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx + // see x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx // cc sphilipse "group": "search", "visibility": "private", diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/add_analytics_collections/add_analytics_collection_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/add_analytics_collections/add_analytics_collection_modal.tsx index a13fd20760c11..6008c391239ba 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/add_analytics_collections/add_analytics_collection_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/add_analytics_collections/add_analytics_collection_modal.tsx @@ -41,6 +41,7 @@ export const AddAnalyticsCollectionModal: React.FC<AddAnalyticsCollectionModalPr }) => { const { isLoading, isSuccess, isSystemError, canSubmit } = useValues(AddAnalyticsCollectionLogic); const modalFormId = useGeneratedHtmlId({ prefix: 'createAnalyticsCollection' }); + const modalTitleId = useGeneratedHtmlId({ prefix: 'modalTitleId' }); useEffect(() => { if (isSuccess || isSystemError) { @@ -52,11 +53,12 @@ export const AddAnalyticsCollectionModal: React.FC<AddAnalyticsCollectionModalPr <EuiModal onClose={onClose} maxWidth={minModalWidth} + aria-labelledby={modalTitleId} initialFocus={`[name=${collectionNameField}]`} > <EuiModalHeader> <EuiFlexItem> - <EuiModalHeaderTitle> + <EuiModalHeaderTitle id={modalTitleId}> {i18n.translate('xpack.enterpriseSearch.analytics.collectionsCreate.form.title', { defaultMessage: 'Name your Collection', })} @@ -81,13 +83,17 @@ export const AddAnalyticsCollectionModal: React.FC<AddAnalyticsCollectionModalPr </EuiModalBody> <EuiModalFooter> - <EuiButtonEmpty onClick={onClose}> + <EuiButtonEmpty + data-test-subj="enterpriseSearchAddAnalyticsCollectionModalCancelButton" + onClick={onClose} + > {i18n.translate('xpack.enterpriseSearch.analytics.collectionsCreate.form.cancelButton', { defaultMessage: 'Cancel', })} </EuiButtonEmpty> <EuiButton + data-test-subj="enterpriseSearchAddAnalyticsCollectionModalCreateButton" fill type="submit" form={modalFormId} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/nav.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/nav.tsx index c70971ebc6ece..20bbfe38e5f39 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/nav.tsx @@ -65,20 +65,3 @@ export const useAppSearchNav = () => { // to cause all our navItems to properly render as nav links. return [{ id: '', name: '', items: navItems }]; }; - -// Process App Search side nav items for use in the new Solution Nav -export const cleanAppSearchNavItems = ( - items: Array<EuiSideNavItemType<unknown>> -): Array<EuiSideNavItemType<unknown>> => { - const enginesItem = items.find((item) => item.id === 'engines'); - if (enginesItem && enginesItem.items && enginesItem.items.length > 0) { - const engineChildren = enginesItem.items; - const engineNameItem = engineChildren.find((item) => item.id === 'engineName'); - if (engineNameItem && engineNameItem.renderItem) { - delete engineNameItem.renderItem; - engineNameItem.items = engineChildren.filter((item) => item.id !== 'engineName'); - enginesItem.items = [engineNameItem]; - } - } - return items; -}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx index 35792e2d0cbf9..5168a05c8a376 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx @@ -16,26 +16,15 @@ import { SetAppSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { SendAppSearchTelemetry } from '../../../shared/telemetry'; -import { useAppSearchNav, cleanAppSearchNavItems } from './nav'; +import { useAppSearchNav } from './nav'; export const AppSearchPageTemplate: React.FC< Omit<PageTemplateProps, 'useEndpointHeaderActions'> > = ({ children, pageChrome, pageViewTelemetry, ...pageTemplateProps }) => { const navItems = useAppSearchNav(); - const { getChromeStyle$, updateSideNavDefinition } = useValues(KibanaLogic); + const { getChromeStyle$ } = useValues(KibanaLogic); const chromeStyle = useObservable(getChromeStyle$(), 'classic'); - React.useEffect(() => { - if (chromeStyle === 'classic') return; - const appSearch = cleanAppSearchNavItems(navItems?.[0]?.items); - // We update the new side nav definition with the selected app items - updateSideNavDefinition({ appSearch }); - - return () => { - updateSideNavDefinition({ appSearch: undefined }); - }; - }, [chromeStyle, navItems, updateSideNavDefinition]); - return ( <EnterpriseSearchPageTemplateWrapper {...pageTemplateProps} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx index 93dbc9cea4447..ed3274112db9e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx @@ -19,6 +19,7 @@ import { EuiFlexItem, EuiButton, EuiButtonEmpty, + useGeneratedHtmlId, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -37,6 +38,7 @@ export const SynonymModal: React.FC = () => { const { isModalOpen, modalLoading, activeSynonymSet } = useValues(SynonymsLogic); const { closeModal, createSynonymSet, updateSynonymSet, deleteSynonymSet } = useActions(SynonymsLogic); + const modalTitleId = useGeneratedHtmlId(); const modalTitle = activeSynonymSet ? SYNONYM_UPDATE_TITLE : SYNONYM_CREATE_TITLE; const id = activeSynonymSet?.id || 'createNewSynonymSet'; @@ -46,9 +48,9 @@ export const SynonymModal: React.FC = () => { : (newSynonyms: string[]) => createSynonymSet(newSynonyms); return isModalOpen ? ( - <EuiModal onClose={closeModal}> + <EuiModal onClose={closeModal} aria-labelledby={modalTitleId}> <EuiModalHeader> - <EuiModalHeaderTitle>{modalTitle}</EuiModalHeaderTitle> + <EuiModalHeaderTitle id={modalTitleId}>{modalTitle}</EuiModalHeaderTitle> </EuiModalHeader> <FlashMessages /> <EuiModalBody> @@ -82,7 +84,12 @@ export const SynonymModal: React.FC = () => { )} </EuiFlexItem> <EuiFlexItem grow={false}> - <EuiButtonEmpty onClick={closeModal}>{CANCEL_BUTTON_LABEL}</EuiButtonEmpty> + <EuiButtonEmpty + data-test-subj="enterpriseSearchSynonymModalButton" + onClick={closeModal} + > + {CANCEL_BUTTON_LABEL} + </EuiButtonEmpty> </EuiFlexItem> <EuiFlexItem grow={false}> <EuiButton diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx index b2e3fdc01be03..7fe1ba1e017c6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx @@ -19,13 +19,9 @@ import { import { i18n } from '@kbn/i18n'; import type { ClassicNavItem } from '@kbn/search-navigation/public'; -import { GETTING_STARTED_TITLE, APP_SEARCH_PLUGIN } from '../../../../common/constants'; +import { GETTING_STARTED_TITLE } from '../../../../common/constants'; -import { BuildClassicNavParameters } from '../types'; - -export const buildBaseClassicNavItems = ({ - productAccess, -}: BuildClassicNavParameters): ClassicNavItem[] => { +export const buildBaseClassicNavItems = (): ClassicNavItem[] => { const navItems: ClassicNavItem[] = []; // Home @@ -168,36 +164,5 @@ export const buildBaseClassicNavItems = ({ name: GETTING_STARTED_TITLE, }); - if (productAccess.hasAppSearchAccess || productAccess.hasWorkplaceSearchAccess) { - const entSearchItems: ClassicNavItem[] = []; - if (productAccess.hasAppSearchAccess) { - entSearchItems.push({ - 'data-test-subj': 'searchSideNav-AppSearch', - deepLink: { - link: 'appSearch:engines', - }, - name: APP_SEARCH_PLUGIN.NAME, - id: 'app_search', - }); - } - if (productAccess.hasWorkplaceSearchAccess) { - entSearchItems.push({ - 'data-test-subj': 'searchSideNav-WorkplaceSearch', - deepLink: { - link: 'workplaceSearch', - }, - id: 'workplace_search', - }); - } - navItems.push({ - 'data-test-subj': 'searchSideNav-EnterpriseSearch', - id: 'enterpriseSearch', - items: entSearchItems, - name: i18n.translate('xpack.enterpriseSearch.nav.title', { - defaultMessage: 'Enterprise Search', - }), - }); - } - return navItems; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx index 36bd081021cf3..21b399892269d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx @@ -144,27 +144,6 @@ const baseNavItems = [ ], name: 'Getting started', }, - { - 'data-test-subj': 'searchSideNav-EnterpriseSearch', - id: 'enterpriseSearch', - items: [ - { - 'data-test-subj': 'searchSideNav-AppSearch', - href: '/app/enterprise_search/app_search', - id: 'app_search', - items: undefined, - name: 'App Search', - }, - { - 'data-test-subj': 'searchSideNav-WorkplaceSearch', - href: '/app/enterprise_search/workplace_search', - id: 'workplace_search', - items: undefined, - name: 'Workplace Search', - }, - ], - name: 'Enterprise Search', - }, ]; const mockNavLinks = [ @@ -264,86 +243,6 @@ describe('useEnterpriseSearchContentNav', () => { expect(result.current).toEqual(baseNavItems); }); - - it('excludes legacy products when the user has no access to them', () => { - const noProductAccess: ProductAccess = { - ...DEFAULT_PRODUCT_ACCESS, - hasAppSearchAccess: false, - hasWorkplaceSearchAccess: false, - }; - - setMockValues({ - ...defaultMockValues, - productAccess: noProductAccess, - }); - mockKibanaValues.uiSettings.get.mockReturnValue(false); - - const { result } = renderHook(() => useEnterpriseSearchNav()); - const esNav = result.current; - const legacyESNav = esNav?.find((item) => item.id === 'enterpriseSearch'); - expect(legacyESNav).toBeUndefined(); - }); - - it('excludes App Search when the user has no access to it', () => { - const workplaceSearchProductAccess: ProductAccess = { - ...DEFAULT_PRODUCT_ACCESS, - hasAppSearchAccess: false, - hasWorkplaceSearchAccess: true, - }; - - setMockValues({ - ...defaultMockValues, - productAccess: workplaceSearchProductAccess, - }); - - const { result } = renderHook(() => useEnterpriseSearchNav()); - const esNav = result.current; - const legacyESNav = esNav?.find((item) => item.id === 'enterpriseSearch'); - expect(legacyESNav).not.toBeUndefined(); - expect(legacyESNav).toEqual({ - 'data-test-subj': 'searchSideNav-EnterpriseSearch', - id: 'enterpriseSearch', - items: [ - { - 'data-test-subj': 'searchSideNav-WorkplaceSearch', - href: '/app/enterprise_search/workplace_search', - id: 'workplace_search', - name: 'Workplace Search', - }, - ], - name: 'Enterprise Search', - }); - }); - - it('excludes Workplace Search when the user has no access to it', () => { - const appSearchProductAccess: ProductAccess = { - ...DEFAULT_PRODUCT_ACCESS, - hasWorkplaceSearchAccess: false, - }; - - setMockValues({ - ...defaultMockValues, - productAccess: appSearchProductAccess, - }); - - const { result } = renderHook(() => useEnterpriseSearchNav()); - const esNav = result.current; - const legacyESNav = esNav?.find((item) => item.id === 'enterpriseSearch'); - expect(legacyESNav).not.toBeUndefined(); - expect(legacyESNav).toEqual({ - 'data-test-subj': 'searchSideNav-EnterpriseSearch', - id: 'enterpriseSearch', - items: [ - { - 'data-test-subj': 'searchSideNav-AppSearch', - href: '/app/enterprise_search/app_search', - id: 'app_search', - name: 'App Search', - }, - ], - name: 'Enterprise Search', - }); - }); }); describe('useEnterpriseSearchApplicationNav', () => { @@ -370,7 +269,6 @@ describe('useEnterpriseSearchApplicationNav', () => { 'Build', 'Relevance', 'Getting started', - 'Enterprise Search', ]); const searchItem = navItems?.find((ni) => ni.id === 'build'); expect(searchItem).not.toBeUndefined(); @@ -432,7 +330,6 @@ describe('useEnterpriseSearchApplicationNav', () => { 'Build', 'Relevance', 'Getting started', - 'Enterprise Search', ]); const searchItem = navItems?.find((ni) => ni.id === 'build'); expect(searchItem).not.toBeUndefined(); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx index 8f83b6c73402e..d122cf788fd4f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx @@ -30,19 +30,19 @@ import { generateNavLink } from './nav_link_helpers'; * @returns The Enterprise Search navigation items */ export const useEnterpriseSearchNav = (alwaysReturn = false) => { - const { isSidebarEnabled, productAccess, getNavLinks } = useValues(KibanaLogic); + const { isSidebarEnabled, getNavLinks } = useValues(KibanaLogic); const indicesNavItems = useIndicesNav(); const navItems: Array<EuiSideNavItemTypeEnhanced<unknown>> = useMemo(() => { - const baseNavItems = buildBaseClassicNavItems({ productAccess }); + const baseNavItems = buildBaseClassicNavItems(); const deepLinks = getNavLinks().reduce((links, link) => { links[link.id] = link; return links; }, {} as Record<string, ChromeNavLink | undefined>); return generateSideNavItems(baseNavItems, deepLinks, { search_indices: indicesNavItems }); - }, [productAccess, indicesNavItems]); + }, [indicesNavItems]); if (!isSidebarEnabled && !alwaysReturn) return undefined; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/types.ts b/x-pack/plugins/enterprise_search/public/applications/shared/types.ts index 25fce6c62d05d..83148acd05cc6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/types.ts @@ -8,7 +8,6 @@ import type { AppDeepLinkId, EuiSideNavItemTypeEnhanced } from '@kbn/core-chrome-browser'; import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../../../common/constants'; -import type { ProductAccess } from '../../../common/types'; import { ADD, UPDATE } from './constants/operations'; @@ -81,7 +80,3 @@ export interface GenerateNavLinkFromDeepLinkParameters { link: AppDeepLinkId; shouldShowActiveForSubroutes?: boolean; } - -export interface BuildClassicNavParameters { - productAccess: ProductAccess; -} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx index ed352cd42aa8f..87c70d19351d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx @@ -25,20 +25,9 @@ export const WorkplaceSearchPageTemplate: React.FC<PageTemplateProps> = ({ ...pageTemplateProps }) => { const navItems = useWorkplaceSearchNav(); - const { getChromeStyle$, updateSideNavDefinition } = useValues(KibanaLogic); + const { getChromeStyle$ } = useValues(KibanaLogic); const chromeStyle = useObservable(getChromeStyle$(), 'classic'); - React.useEffect(() => { - if (chromeStyle === 'classic') return; - // We update the new side nav definition with the selected app items - updateSideNavDefinition({ workplaceSearch: navItems?.[0]?.items }); - }, [chromeStyle, navItems, updateSideNavDefinition]); - React.useEffect(() => { - return () => { - updateSideNavDefinition({ workplaceSearch: undefined }); - }; - }, [updateSideNavDefinition]); - return ( <EnterpriseSearchPageTemplateWrapper restrictWidth diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_key_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_key_flyout.tsx index 150778ad7fdbc..18bb73d8d5fd6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_key_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_key_flyout.tsx @@ -23,6 +23,7 @@ import { EuiButton, EuiForm, EuiTitle, + useGeneratedHtmlId, } from '@elastic/eui'; import { CLOSE_BUTTON_LABEL, SAVE_BUTTON_LABEL } from '../../../../shared/constants'; @@ -44,12 +45,20 @@ export const ApiKeyFlyout: React.FC = () => { activeApiTokenRawName: rawName, } = useValues(ApiKeysLogic); + const flyoutTitleId = useGeneratedHtmlId(); + return ( <EuiPortal> - <EuiFlyout onClose={hideApiKeyForm} hideCloseButton ownFocus size="s"> + <EuiFlyout + onClose={hideApiKeyForm} + hideCloseButton + ownFocus + size="s" + aria-labelledby={flyoutTitleId} + > <EuiFlyoutHeader hasBorder> <EuiTitle size="m"> - <h2>{API_KEY_FLYOUT_TITLE}</h2> + <h2 id={flyoutTitleId}>{API_KEY_FLYOUT_TITLE}</h2> </EuiTitle> </EuiFlyoutHeader> <EuiFlyoutBody> @@ -86,7 +95,11 @@ export const ApiKeyFlyout: React.FC = () => { <EuiFlyoutFooter> <EuiFlexGroup justifyContent="spaceBetween"> <EuiFlexItem grow={false}> - <EuiButtonEmpty iconType="cross" onClick={hideApiKeyForm}> + <EuiButtonEmpty + data-test-subj="enterpriseSearchApiKeyFlyoutButton" + iconType="cross" + onClick={hideApiKeyForm} + > {CLOSE_BUTTON_LABEL} </EuiButtonEmpty> </EuiFlexItem> diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_keys_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_keys_list.tsx index 016ab78b3abb4..10f1ca12a6130 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_keys_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/api_keys/components/api_keys_list.tsx @@ -9,7 +9,13 @@ import React from 'react'; import { useActions, useValues } from 'kea'; -import { EuiBasicTable, EuiBasicTableColumn, EuiCopy, EuiConfirmModal } from '@elastic/eui'; +import { + EuiBasicTable, + EuiBasicTableColumn, + EuiCopy, + EuiConfirmModal, + useGeneratedHtmlId, +} from '@elastic/eui'; import { DELETE_BUTTON_LABEL, CANCEL_BUTTON_LABEL } from '../../../../shared/constants'; import { HiddenText } from '../../../../shared/hidden_text'; @@ -32,16 +38,19 @@ export const ApiKeysList: React.FC = () => { const { deleteApiKey, onPaginate, stageTokenNameForDeletion, hideDeleteModal } = useActions(ApiKeysLogic); const { apiTokens, meta, dataLoading, deleteModalVisible } = useValues(ApiKeysLogic); + const modalTitleId = useGeneratedHtmlId(); const deleteModal = ( <EuiConfirmModal title={API_KEYS_CONFIRM_DELETE_TITLE} + titleProps={{ id: modalTitleId }} onCancel={hideDeleteModal} onConfirm={deleteApiKey} cancelButtonText={CANCEL_BUTTON_LABEL} confirmButtonText={DELETE_BUTTON_LABEL} buttonColor="danger" defaultFocusedButton="confirm" + aria-labelledby={modalTitleId} > <p>{API_KEYS_CONFIRM_DELETE_LABEL}</p> </EuiConfirmModal> diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/branding_section.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/branding_section.tsx index 30b450df91c17..33efd2d842220 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/branding_section.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/branding_section.tsx @@ -16,6 +16,7 @@ import { EuiFilePicker, EuiText, EuiSpacer, + useGeneratedHtmlId, } from '@elastic/eui'; import { @@ -71,6 +72,7 @@ export const BrandingSection: React.FC<Props> = ({ const isLogo = imageType === 'logo'; const imageText = isLogo ? LOGO_TEXT : ICON_TEXT; const defaultImage = isLogo ? defaultLogo : defaultIcon; + const confirmationTitleId = useGeneratedHtmlId(); const handleUpload = async (files: FileList | null) => { if (!files || files.length < 1) { @@ -84,6 +86,7 @@ export const BrandingSection: React.FC<Props> = ({ const resetConfirmModal = ( <EuiConfirmModal title={RESET_IMAGE_TITLE} + titleProps={{ id: confirmationTitleId }} onCancel={closeDeleteModal} onConfirm={() => { resetImage(); @@ -93,6 +96,7 @@ export const BrandingSection: React.FC<Props> = ({ confirmButtonText={RESET_DEFAULT_BUTTON_LABEL} buttonColor="danger" defaultFocusedButton="confirm" + aria-labelledby={confirmationTitleId} > <> <p>{isLogo ? RESET_LOGO_DESCRIPTION : RESET_ICON_DESCRIPTION}</p> @@ -137,6 +141,7 @@ export const BrandingSection: React.FC<Props> = ({ <EuiFlexGroup> <EuiFlexItem grow={false}> <EuiButton + data-test-subj="enterpriseSearchBrandingSectionButton" isLoading={buttonLoading} disabled={!stagedImage} color="primary" diff --git a/x-pack/plugins/enterprise_search/public/navigation_tree.ts b/x-pack/plugins/enterprise_search/public/navigation_tree.ts index e235876e11b0a..1485ecd8536f3 100644 --- a/x-pack/plugins/enterprise_search/public/navigation_tree.ts +++ b/x-pack/plugins/enterprise_search/public/navigation_tree.ts @@ -21,11 +21,9 @@ import { SEARCH_APPLICATIONS_PATH } from './applications/applications/routes'; import { SEARCH_INDICES_PATH } from './applications/enterprise_search_content/routes'; export interface DynamicSideNavItems { - appSearch?: Array<EuiSideNavItemType<unknown>>; collections?: Array<EuiSideNavItemType<unknown>>; indices?: Array<EuiSideNavItemType<unknown>>; searchApps?: Array<EuiSideNavItemType<unknown>>; - workplaceSearch?: Array<EuiSideNavItemType<unknown>>; } const title = i18n.translate( @@ -79,7 +77,7 @@ export const getNavigationTreeDefinition = ({ id: 'es', navigationTree$: dynamicItems$.pipe( debounceTime(10), - map(({ appSearch, indices, searchApps, collections, workplaceSearch }) => { + map(({ indices, searchApps, collections }) => { const navTree: NavigationTreeDefinition = { body: [ { @@ -215,50 +213,6 @@ export const getNavigationTreeDefinition = ({ defaultMessage: 'Relevance', }), }, - { - children: [ - { - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith( - prepend('/app/enterprise_search/app_search') - ); - }, - link: 'appSearch:engines', - title: i18n.translate( - 'xpack.enterpriseSearch.searchNav.entsearch.appSearch', - { - defaultMessage: 'App Search', - } - ), - ...(appSearch - ? { - children: appSearch.map(euiItemTypeToNodeDefinition), - isCollapsible: false, - renderAs: 'accordion', - } - : {}), - }, - { - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith( - prepend('/app/enterprise_search/workplace_search') - ); - }, - link: 'workplaceSearch', - ...(workplaceSearch - ? { - children: workplaceSearch.map(euiItemTypeToNodeDefinition), - isCollapsible: false, - renderAs: 'accordion', - } - : {}), - }, - ], - id: 'entsearch', - title: i18n.translate('xpack.enterpriseSearch.searchNav.entsearch', { - defaultMessage: 'Enterprise Search', - }), - }, { children: [{ link: 'maps' }, { link: 'canvas' }, { link: 'graph' }], id: 'otherTools', diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index b483796540ad1..b80af39c40da7 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -54,7 +54,7 @@ import { SEMANTIC_SEARCH_PLUGIN, } from '../common/constants'; import { registerLocators } from '../common/locators'; -import { ClientConfigType, InitialAppData, ProductAccess } from '../common/types'; +import { ClientConfigType, InitialAppData } from '../common/types'; import { hasEnterpriseLicense } from '../common/utils/licensing'; import { ENGINES_PATH } from './applications/app_search/routes'; @@ -575,12 +575,7 @@ export class EnterpriseSearchPlugin implements Plugin { // to the base set of classic side nav items to the search-navigation plugin. import('./applications/shared/layout/base_nav').then(({ buildBaseClassicNavItems }) => { plugins.searchNavigation?.setGetBaseClassicNavItems(() => { - const productAccess: ProductAccess = this.data?.access ?? { - hasAppSearchAccess: false, - hasWorkplaceSearchAccess: false, - }; - - return buildBaseClassicNavItems({ productAccess }); + return buildBaseClassicNavItems(); }); }); diff --git a/x-pack/plugins/features/server/feature_registry.test.ts b/x-pack/plugins/features/server/feature_registry.test.ts index 9ed7a207560b0..15988d213b315 100644 --- a/x-pack/plugins/features/server/feature_registry.test.ts +++ b/x-pack/plugins/features/server/feature_registry.test.ts @@ -57,7 +57,7 @@ describe('FeatureRegistry', () => { app: ['app1'], savedObject: { all: ['space', 'etc', 'telemetry'], - read: ['canvas', 'config', 'config-global', 'url'], + read: ['canvas', 'config', 'config-global', 'url', 'tag'], }, api: ['someApiEndpointTag', 'anotherEndpointTag'], ui: ['allowsFoo', 'showBar', 'showBaz'], @@ -65,7 +65,7 @@ describe('FeatureRegistry', () => { read: { savedObject: { all: [], - read: ['config', 'config-global', 'url', 'telemetry'], + read: ['config', 'config-global', 'url', 'telemetry', 'tag'], }, ui: [], }, @@ -130,7 +130,7 @@ describe('FeatureRegistry', () => { app: ['app1'], savedObject: { all: ['space', 'etc', 'telemetry'], - read: ['canvas', 'config', 'config-global', 'url'], + read: ['canvas', 'config', 'config-global', 'url', 'tag'], }, api: ['someApiEndpointTag', 'anotherEndpointTag'], ui: ['allowsFoo', 'showBar', 'showBaz'], @@ -314,7 +314,7 @@ describe('FeatureRegistry', () => { expect(allPrivilege?.savedObject.all).toEqual(['telemetry']); }); - it(`automatically grants access to config, config-global, url, and telemetry saved objects`, () => { + it(`automatically grants access to config, config-global, url, telemetry and tag saved objects`, () => { const feature: KibanaFeatureConfig = { id: 'test-feature', name: 'Test Feature', @@ -348,16 +348,17 @@ describe('FeatureRegistry', () => { const allPrivilege = result[0].privileges?.all; const readPrivilege = result[0].privileges?.read; - expect(allPrivilege?.savedObject.read).toEqual(['config', 'config-global', 'url']); + expect(allPrivilege?.savedObject.read).toEqual(['config', 'config-global', 'url', 'tag']); expect(readPrivilege?.savedObject.read).toEqual([ 'config', 'config-global', 'telemetry', 'url', + 'tag', ]); }); - it(`automatically grants 'all' access to telemetry and 'read' to [config, config-global, url] saved objects for the reserved privilege`, () => { + it(`automatically grants 'all' access to telemetry and 'read' to [config, config-global, url, tag] saved objects for the reserved privilege`, () => { const feature: KibanaFeatureConfig = { id: 'test-feature', name: 'Test Feature', @@ -388,7 +389,7 @@ describe('FeatureRegistry', () => { const reservedPrivilege = result[0]!.reserved!.privileges[0].privilege; expect(reservedPrivilege.savedObject.all).toEqual(['telemetry']); - expect(reservedPrivilege.savedObject.read).toEqual(['config', 'config-global', 'url']); + expect(reservedPrivilege.savedObject.read).toEqual(['config', 'config-global', 'url', 'tag']); }); it(`does not duplicate the automatic grants if specified on the incoming feature`, () => { @@ -402,14 +403,14 @@ describe('FeatureRegistry', () => { ui: [], savedObject: { all: ['telemetry'], - read: ['config', 'config-global', 'url'], + read: ['config', 'config-global', 'url', 'tag'], }, }, read: { ui: [], savedObject: { all: [], - read: ['config', 'config-global', 'url'], + read: ['config', 'config-global', 'url', 'tag'], }, }, }, @@ -426,11 +427,12 @@ describe('FeatureRegistry', () => { const allPrivilege = result[0].privileges!.all; const readPrivilege = result[0].privileges!.read; expect(allPrivilege?.savedObject.all).toEqual(['telemetry']); - expect(allPrivilege?.savedObject.read).toEqual(['config', 'config-global', 'url']); + expect(allPrivilege?.savedObject.read).toEqual(['config', 'config-global', 'url', 'tag']); expect(readPrivilege?.savedObject.read).toEqual([ 'config', 'config-global', 'url', + 'tag', 'telemetry', ]); }); @@ -518,7 +520,7 @@ describe('FeatureRegistry', () => { name: 'Foo', app: ['app1', 'app2'], savedObject: { - all: ['config', 'config-global', 'space', 'etc'], + all: ['config', 'config-global', 'space', 'tag', 'etc'], read: ['canvas'], }, api: ['someApiEndpointTag', 'anotherEndpointTag'], @@ -2455,7 +2457,7 @@ describe('FeatureRegistry', () => { expect(featureA.privileges).toEqual({ all: { ui: [], - savedObject: { all: ['telemetry'], read: ['config', 'config-global', 'url'] }, + savedObject: { all: ['telemetry'], read: ['config', 'config-global', 'url', 'tag'] }, composedOf: [ { feature: 'featureC', privileges: ['subFeatureCOne'] }, { feature: 'featureD', privileges: ['all'] }, @@ -2463,7 +2465,7 @@ describe('FeatureRegistry', () => { }, read: { ui: [], - savedObject: { all: [], read: ['config', 'config-global', 'telemetry', 'url'] }, + savedObject: { all: [], read: ['config', 'config-global', 'telemetry', 'url', 'tag'] }, composedOf: [{ feature: 'featureD', privileges: ['read'] }], }, }); @@ -2483,12 +2485,12 @@ describe('FeatureRegistry', () => { expect(featureA.privileges).toEqual({ all: { ui: [], - savedObject: { all: ['telemetry'], read: ['config', 'config-global', 'url'] }, + savedObject: { all: ['telemetry'], read: ['config', 'config-global', 'url', 'tag'] }, composedOf: [{ feature: 'featureE', privileges: ['all'] }], }, read: { ui: [], - savedObject: { all: [], read: ['config', 'config-global', 'telemetry', 'url'] }, + savedObject: { all: [], read: ['config', 'config-global', 'telemetry', 'url', 'tag'] }, }, }); }); diff --git a/x-pack/plugins/features/server/feature_registry.ts b/x-pack/plugins/features/server/feature_registry.ts index adeb0f4cc9dab..df01f4d773bcb 100644 --- a/x-pack/plugins/features/server/feature_registry.ts +++ b/x-pack/plugins/features/server/feature_registry.ts @@ -340,6 +340,7 @@ function applyAutomaticAllPrivilegeGrants( 'config', 'config-global', 'url', + 'tag', ]); } }); @@ -356,6 +357,7 @@ function applyAutomaticReadPrivilegeGrants( 'config-global', 'telemetry', 'url', + 'tag', ]); } }); diff --git a/x-pack/plugins/features/server/plugin.test.ts b/x-pack/plugins/features/server/plugin.test.ts index 96062085e577e..b06f9282c5739 100644 --- a/x-pack/plugins/features/server/plugin.test.ts +++ b/x-pack/plugins/features/server/plugin.test.ts @@ -168,6 +168,7 @@ describe('Features Plugin', () => { "config", "config-global", "url", + "tag", ], }, "ui": Array [], @@ -183,6 +184,7 @@ describe('Features Plugin', () => { "config-global", "telemetry", "url", + "tag", ], }, "ui": Array [], diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx index 94bcf380f7086..8ddc2e80b0aa8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { fireEvent, act, waitFor } from '@testing-library/react'; +import { fireEvent, waitFor } from '@testing-library/react'; import type { TestRenderer } from '../../../../../mock'; import { createFleetTestRendererMock } from '../../../../../mock'; @@ -291,23 +291,21 @@ describe('edit package policy page', () => { expect(renderResult.getByDisplayValue('Nginx description')).toBeInTheDocument(); }); - await act(async () => { - fireEvent.click(renderResult.getByText('Change defaults')); - }); + fireEvent.click(renderResult.getByText('Change defaults')); - await act(async () => { - fireEvent.change(renderResult.getByDisplayValue('/var/log/nginx/access.log*'), { - target: { value: '' }, - }); + fireEvent.change(renderResult.getByDisplayValue('/var/log/nginx/access.log*'), { + target: { value: '' }, }); - expect( - renderResult.getByText('Your integration policy has errors. Please fix them before saving.') - ).toBeInTheDocument(); - expect(renderResult.getByText(/Save integration/).closest('button')!).toBeDisabled(); + await waitFor(() => { + expect( + renderResult.getByText('Your integration policy has errors. Please fix them before saving.') + ).toBeInTheDocument(); + expect(renderResult.getByText(/Save integration/).closest('button')!).toBeDisabled(); - renderResult.getAllByRole('link', { name: 'Cancel' }).forEach((btn) => { - expect(btn).toHaveAttribute('href', '/navigate/path'); + renderResult.getAllByRole('link', { name: 'Cancel' }).forEach((btn) => { + expect(btn).toHaveAttribute('href', '/navigate/path'); + }); }); }); @@ -317,32 +315,31 @@ describe('edit package policy page', () => { await waitFor(() => { expect(renderResult.getByText('Collect logs from Nginx instances')).toBeInTheDocument(); }); - act(() => { - fireEvent.click(renderResult.getByRole('switch')); - }); - await act(async () => { - fireEvent.click(renderResult.getByText('Save integration').closest('button')!); - }); + fireEvent.click(renderResult.getByRole('switch')); - const { id, ...restProps } = mockPackagePolicy; - expect(sendUpdatePackagePolicy).toHaveBeenCalledWith('nginx-1', { - ...restProps, - vars: {}, - inputs: [ - { - ...mockPackagePolicy.inputs[0], - enabled: false, - streams: [ - { - ...mockPackagePolicy.inputs[0].streams[0], - enabled: false, - }, - ], - }, - ], + fireEvent.click(renderResult.getByText('Save integration').closest('button')!); + + await waitFor(() => { + const { id, ...restProps } = mockPackagePolicy; + expect(sendUpdatePackagePolicy).toHaveBeenCalledWith('nginx-1', { + ...restProps, + vars: {}, + inputs: [ + { + ...mockPackagePolicy.inputs[0], + enabled: false, + streams: [ + { + ...mockPackagePolicy.inputs[0].streams[0], + enabled: false, + }, + ], + }, + ], + }); + expect(useStartServices().application.navigateToUrl).toHaveBeenCalledWith('/navigate/path'); }); - expect(useStartServices().application.navigateToUrl).toHaveBeenCalledWith('/navigate/path'); }); it('should show out of date error on 409 statusCode on submit', async () => { @@ -353,23 +350,21 @@ describe('edit package policy page', () => { await waitFor(() => { expect(renderResult.getByText('Collect logs from Nginx instances')).toBeInTheDocument(); }); - act(() => { - fireEvent.click(renderResult.getByRole('switch')); - }); + fireEvent.click(renderResult.getByRole('switch')); - await act(async () => { - fireEvent.click(renderResult.getByText('Save integration').closest('button')!); - }); + fireEvent.click(renderResult.getByText('Save integration').closest('button')!); - expect(useStartServices().notifications.toasts.addError).toHaveBeenCalledWith( - { statusCode: 409 }, - { - title: "Error updating 'nginx-1'", - toastMessage: 'Data is out of date. Refresh the page to get the latest policy.', - } - ); + await waitFor(() => { + expect(useStartServices().notifications.toasts.addError).toHaveBeenCalledWith( + { statusCode: 409 }, + { + title: "Error updating 'nginx-1'", + toastMessage: 'Data is out of date. Refresh the page to get the latest policy.', + } + ); - expect(useStartServices().application.navigateToUrl).not.toHaveBeenCalled(); + expect(useStartServices().application.navigateToUrl).not.toHaveBeenCalled(); + }); }); it('should show generic error on other statusCode on submit', async () => { @@ -380,20 +375,19 @@ describe('edit package policy page', () => { await waitFor(() => { expect(renderResult.getByText('Collect logs from Nginx instances')).toBeInTheDocument(); }); - act(() => { - fireEvent.click(renderResult.getByRole('switch')); - }); - await act(async () => { - fireEvent.click(renderResult.getByText('Save integration').closest('button')!); - }); + fireEvent.click(renderResult.getByRole('switch')); + + fireEvent.click(renderResult.getByText('Save integration').closest('button')!); - expect(useStartServices().notifications.toasts.addError).toHaveBeenCalledWith( - { statusCode: 500 }, - { title: "Error updating 'nginx-1'" } - ); + await waitFor(() => { + expect(useStartServices().notifications.toasts.addError).toHaveBeenCalledWith( + { statusCode: 500 }, + { title: "Error updating 'nginx-1'" } + ); - expect(useStartServices().application.navigateToUrl).not.toHaveBeenCalled(); + expect(useStartServices().application.navigateToUrl).not.toHaveBeenCalled(); + }); }); it("throws when both 'package-policy-edit' and 'package-policy-replace-define-step' are defined", async () => { @@ -510,15 +504,12 @@ describe('edit package policy page', () => { await waitFor(() => { expect(renderResult.getByText('Collect logs from Nginx instances')).toBeInTheDocument(); }); - act(() => { - fireEvent.click(renderResult.getByRole('switch')); - }); - await act(async () => { - fireEvent.click(renderResult.getByText('Save integration').closest('button')!); - }); + fireEvent.click(renderResult.getByRole('switch')); - expect(sendUpdatePackagePolicy).toHaveBeenCalled(); + fireEvent.click(renderResult.getByText('Save integration').closest('button')!); + + await waitFor(() => expect(sendUpdatePackagePolicy).toHaveBeenCalled()); }); it('should hide the multiselect agent policies when agent policy is agentless', async () => { @@ -529,9 +520,8 @@ describe('edit package policy page', () => { isLoading: false, }); - await act(async () => { - render(); - }); + render(); + expect(renderResult.queryByTestId('agentPolicyMultiSelect')).not.toBeInTheDocument(); }); @@ -546,9 +536,7 @@ describe('edit package policy page', () => { }); it('should create agent policy with sys monitoring when new agent policy button is clicked', async () => { - await act(async () => { - render(); - }); + render(); await waitFor(() => { expect(renderResult.getByTestId('agentPolicyMultiItem')).toHaveAttribute( @@ -557,35 +545,32 @@ describe('edit package policy page', () => { ); }); - await act(async () => { - fireEvent.click(renderResult.getByTestId('createNewAgentPolicyButton')); - }); + fireEvent.click(renderResult.getByTestId('createNewAgentPolicyButton')); - await act(async () => { - fireEvent.click(renderResult.getByText(/Save integration/).closest('button')!); - }); + fireEvent.click(renderResult.getByText(/Save integration/).closest('button')!); + + fireEvent.click(renderResult.getAllByText(/Save and deploy changes/)[1].closest('button')!); - await act(async () => { - fireEvent.click(renderResult.getAllByText(/Save and deploy changes/)[1].closest('button')!); + await waitFor(() => { + expect(sendCreateAgentPolicy as jest.MockedFunction<any>).toHaveBeenCalledWith( + { + description: '', + monitoring_enabled: ['logs', 'metrics', 'traces'], + name: 'Agent policy 2', + namespace: 'default', + inactivity_timeout: 1209600, + is_protected: false, + }, + { withSysMonitoring: true } + ); + expect(sendUpdatePackagePolicy).toHaveBeenCalledWith( + 'nginx-1', + expect.objectContaining({ + policy_ids: ['agent-policy-1', 'agent-policy-2'], + }) + ); + expect(sendGetAgentStatus).toHaveBeenCalledTimes(1); }); - expect(sendCreateAgentPolicy as jest.MockedFunction<any>).toHaveBeenCalledWith( - { - description: '', - monitoring_enabled: ['logs', 'metrics', 'traces'], - name: 'Agent policy 2', - namespace: 'default', - inactivity_timeout: 1209600, - is_protected: false, - }, - { withSysMonitoring: true } - ); - expect(sendUpdatePackagePolicy).toHaveBeenCalledWith( - 'nginx-1', - expect.objectContaining({ - policy_ids: ['agent-policy-1', 'agent-policy-2'], - }) - ); - expect(sendGetAgentStatus).toHaveBeenCalledTimes(1); }); it('should not remove managed policy when policies are modified', async () => { @@ -613,33 +598,31 @@ describe('edit package policy page', () => { isLoading: false, }); - await act(async () => { - render(); - }); - expect(renderResult.getByTestId('agentPolicyMultiSelect')).toBeInTheDocument(); + render(); - await act(async () => { - renderResult.getByTestId('comboBoxToggleListButton').click(); + await waitFor(() => { + expect(renderResult.getByTestId('agentPolicyMultiSelect')).toBeInTheDocument(); }); - expect(renderResult.queryByText('Agent policy 1')).toBeNull(); + fireEvent.click(renderResult.getByTestId('comboBoxToggleListButton')); - await act(async () => { - fireEvent.click(renderResult.getByText('Fleet Server Policy')); - }); + await waitFor(() => expect(renderResult.queryByText('Agent policy 1')).toBeNull()); - await act(async () => { - fireEvent.click(renderResult.getByText(/Save integration/).closest('button')!); - }); - await act(async () => { - fireEvent.click(renderResult.getAllByText(/Save and deploy changes/)[1].closest('button')!); - }); + fireEvent.click(renderResult.getByText('Fleet Server Policy')); - expect(sendUpdatePackagePolicy).toHaveBeenCalledWith( - 'nginx-1', - expect.objectContaining({ - policy_ids: ['agent-policy-1', 'fleet-server-policy'], - }) + await waitFor(() => Promise.resolve(null)); + + fireEvent.click(renderResult.getByText(/Save integration/).closest('button')!); + + fireEvent.click(renderResult.getAllByText(/Save and deploy changes/)[1].closest('button')!); + + await waitFor(() => + expect(sendUpdatePackagePolicy).toHaveBeenCalledWith( + 'nginx-1', + expect.objectContaining({ + policy_ids: ['agent-policy-1', 'fleet-server-policy'], + }) + ) ); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_export_csv_tour.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_export_csv_tour.tsx new file mode 100644 index 0000000000000..c0e9e4f5427bb --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_export_csv_tour.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiText, EuiTourStep } from '@elastic/eui'; +import React, { useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import type { TOUR_STORAGE_CONFIG } from '../../../../constants'; +import { TOUR_STORAGE_KEYS } from '../../../../constants'; +import { useStartServices } from '../../../../hooks'; + +export const AgentExportCSVTour: React.FC<{}> = () => { + const { storage, uiSettings } = useStartServices(); + + const [tourState, setTourState] = useState({ isOpen: true }); + + const isTourHidden = + uiSettings.get('hideAnnouncements', false) || + ( + storage.get(TOUR_STORAGE_KEYS.AGENT_EXPORT_CSV) as + | TOUR_STORAGE_CONFIG['AGENT_EXPORT_CSV'] + | undefined + )?.active === false; + + const setTourAsHidden = () => { + storage.set(TOUR_STORAGE_KEYS.AGENT_EXPORT_CSV, { + active: false, + } as TOUR_STORAGE_CONFIG['AGENT_EXPORT_CSV']); + }; + + const onFinish = () => { + setTourState({ isOpen: false }); + setTourAsHidden(); + }; + + return ( + <> + <EuiTourStep + content={ + <EuiText> + <FormattedMessage + id="xpack.fleet.agentExportCSVTour.tourContent" + defaultMessage="Once you have selected the agents, click the action menu to download the CSV file." + /> + </EuiText> + } + isStepOpen={!isTourHidden && tourState.isOpen} + onFinish={onFinish} + minWidth={360} + maxWidth={360} + step={1} + stepsTotal={1} + title={ + <FormattedMessage + id="xpack.fleet.agentExportCSVTour.tourTitle" + defaultMessage="Download CSV file" + /> + } + anchorPosition="upLeft" + anchor="#agentListSelectionText" + /> + </> + ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx index 618a7a6b8e112..160e29737bf78 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx @@ -14,6 +14,7 @@ import { SO_SEARCH_LIMIT } from '../../../../constants'; import type { Agent } from '../../../../types'; import type { SelectionMode } from './types'; +import { AgentExportCSVTour } from './agent_export_csv_tour'; const Divider = styled.div` width: 0; @@ -62,7 +63,7 @@ export const AgentsSelectionStatus: React.FunctionComponent<{ <> <EuiFlexGroup gutterSize="s" alignItems="center"> <EuiFlexItem grow={false}> - <EuiText size="xs" color="subdued"> + <EuiText size="xs" color="subdued" id="agentListSelectionText"> {totalAgents > SO_SEARCH_LIMIT ? ( <FormattedMessage id="xpack.fleet.agentBulkActions.totalAgentsWithLimit" @@ -97,6 +98,7 @@ export const AgentsSelectionStatus: React.FunctionComponent<{ </> )} </EuiText> + <AgentExportCSVTour /> </EuiFlexItem> {showSelectionInfoAndOptions ? ( <> diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx index 985e709ba22d0..319c2ee5455d8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx @@ -69,6 +69,12 @@ jest.mock('../../../hooks', () => ({ cloud: {}, data: { dataViews: { getFieldsForWildcard: jest.fn() } }, docLinks: { links: { kibana: { secureSavedObject: 'my-link' } } }, + uiSettings: { + get: jest.fn(), + }, + storage: { + get: jest.fn(), + }, }), useBreadcrumbs: jest.fn(), useLink: jest.fn().mockReturnValue({ getHref: jest.fn() }), diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_export_csv_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_export_csv_modal/index.tsx index 901a90d5dea68..e289f660eb007 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_export_csv_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_export_csv_modal/index.tsx @@ -6,7 +6,7 @@ */ import React, { useState } from 'react'; -import type { EuiBasicTableColumn, EuiSearchBarProps, EuiTableSelectionType } from '@elastic/eui'; +import type { EuiBasicTableColumn, EuiTableSelectionType } from '@elastic/eui'; import { EuiConfirmModal, EuiFlexGroup, @@ -67,12 +67,6 @@ export const AgentExportCSVModal: React.FunctionComponent<Props> = ({ initialSelected: INITIAL_AGENT_FIELDS_TO_EXPORT, }; - const search: EuiSearchBarProps = { - box: { - incremental: true, - }, - }; - return ( <EuiConfirmModal data-test-subj="agentExportCSVModal" @@ -129,7 +123,6 @@ export const AgentExportCSVModal: React.FunctionComponent<Props> = ({ items={items} itemId="field" columns={columns} - search={search} selection={selectionValue} /> </EuiFlexItem> diff --git a/x-pack/plugins/fleet/public/constants/index.ts b/x-pack/plugins/fleet/public/constants/index.ts index 4fbe799aa7337..059bae6ea7bff 100644 --- a/x-pack/plugins/fleet/public/constants/index.ts +++ b/x-pack/plugins/fleet/public/constants/index.ts @@ -54,6 +54,7 @@ export const TOUR_STORAGE_KEYS = { ADD_AGENT_POPOVER: 'fleet.addAgentPopoverTour', INACTIVE_AGENTS: 'fleet.inactiveAgentsTour', GRANULAR_PRIVILEGES: 'fleet.granularPrivileges', + AGENT_EXPORT_CSV: 'fleet.agentExportCSVTour', }; export interface TourConfig { diff --git a/x-pack/plugins/fleet/server/errors/index.ts b/x-pack/plugins/fleet/server/errors/index.ts index ac6eca6b3b97d..af0770b61f180 100644 --- a/x-pack/plugins/fleet/server/errors/index.ts +++ b/x-pack/plugins/fleet/server/errors/index.ts @@ -125,6 +125,8 @@ export class SigningServiceNotFoundError extends FleetNotFoundError {} export class InputNotFoundError extends FleetNotFoundError {} export class OutputNotFoundError extends FleetNotFoundError {} export class PackageNotFoundError extends FleetNotFoundError {} +export class ArchiveNotFoundError extends FleetNotFoundError {} + export class PackagePolicyNotFoundError extends FleetNotFoundError<{ /** The package policy ID that was not found */ packagePolicyId: string; diff --git a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts index 701915d384f47..8ae344cfc6264 100644 --- a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts +++ b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts @@ -105,10 +105,17 @@ export const getFileHandler: FleetRequestHandler< }); } else { const registryResponse = await getFile(pkgName, pkgVersion, filePath); + if (!registryResponse) + return response.custom({ + body: {}, + statusCode: 400, + }); + const headersToProxy: KnownHeaders[] = ['content-type']; const proxiedHeaders = headersToProxy.reduce((headers, knownHeader) => { - const value = registryResponse.headers.get(knownHeader); - if (value !== null) { + const value = registryResponse?.headers.get(knownHeader); + + if (!!value) { headers[knownHeader] = value; } return headers; diff --git a/x-pack/plugins/fleet/server/services/epm/airgapped.ts b/x-pack/plugins/fleet/server/services/epm/airgapped.ts new file mode 100644 index 0000000000000..4507de3ea15eb --- /dev/null +++ b/x-pack/plugins/fleet/server/services/epm/airgapped.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { appContextService } from '..'; + +export const airGappedUtils = () => { + const config = appContextService.getConfig(); + const hasRegistryUrls = config?.registryUrl || config?.registryProxyUrl; + const isAirGapped = config?.isAirGapped; + + const shouldSkipRegistryRequests = isAirGapped && !hasRegistryUrls; + + return { hasRegistryUrls, isAirGapped, shouldSkipRegistryRequests }; +}; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts index 5711c8fcccaf4..c3b0eee26cb5c 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts @@ -925,6 +925,32 @@ owner: elastic`, }); }); + it('should avoid loading archive when isAirGapped == true', async () => { + const mockContract = createAppContextStartContractMock({ isAirGapped: true }); + appContextService.start(mockContract); + + const soClient = savedObjectsClientMock.create(); + soClient.get.mockRejectedValue(SavedObjectsErrorHelpers.createGenericNotFoundError()); + MockRegistry.fetchInfo.mockResolvedValue({ + name: 'my-package', + version: '1.0.0', + assets: [], + } as unknown as RegistryPackage); + + await expect( + getPackageInfo({ + savedObjectsClient: soClient, + pkgName: 'my-package', + pkgVersion: '1.0.0', + }) + ).resolves.toMatchObject({ + latestVersion: '1.0.0', + status: 'not_installed', + }); + + expect(MockRegistry.getPackage).not.toHaveBeenCalled(); + }); + describe('installation status', () => { it('should be not_installed when no package SO exists', async () => { const soClient = savedObjectsClientMock.create(); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.ts index 5b0e3df279cdc..824d3f4b30f72 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.ts @@ -68,6 +68,8 @@ import { auditLoggingService } from '../../audit_logging'; import { getFilteredSearchPackages } from '../filtered_packages'; +import { airGappedUtils } from '../airgapped'; + import { createInstallableFrom } from '.'; import { getPackageAssetsMapCache, @@ -478,7 +480,11 @@ export async function getPackageInfo({ let packageInfo; // We need to get input only packages from source to get all fields // see https://github.com/elastic/package-registry/issues/864 - if (registryInfo && skipArchive && registryInfo.type !== 'input') { + if ( + registryInfo && + (skipArchive || airGappedUtils().shouldSkipRegistryRequests) && + registryInfo.type !== 'input' + ) { packageInfo = registryInfo; // Fix the paths paths = @@ -629,6 +635,7 @@ export async function getPackageFromSource(options: { } catch (err) { if (err instanceof RegistryResponseError && err.status === 404) { res = await Registry.getBundledArchive(pkgName, pkgVersion); + logger.debug(`retrieved bundled package ${pkgName}-${pkgVersion}`); } else { throw err; } @@ -763,7 +770,7 @@ export async function getPackageAssetsMap({ packageInfo: PackageInfo; logger: Logger; ignoreUnverified?: boolean; -}) { +}): Promise<AssetsMap> { const cache = getPackageAssetsMapCache(packageInfo.name, packageInfo.version); if (cache) { return cache; @@ -774,17 +781,22 @@ export async function getPackageAssetsMap({ logger, }); - let assetsMap: AssetsMap | undefined; - if (installedPackageWithAssets?.installation.version !== packageInfo.version) { - // Try to get from registry - const pkg = await Registry.getPackage(packageInfo.name, packageInfo.version, { - ignoreUnverified, - }); - assetsMap = pkg.assetsMap; - } else { - assetsMap = installedPackageWithAssets.assetsMap; - } - setPackageAssetsMapCache(packageInfo.name, packageInfo.version, assetsMap); + try { + let assetsMap: AssetsMap | undefined; + if (installedPackageWithAssets?.installation.version !== packageInfo.version) { + // Try to get from registry + const pkg = await Registry.getPackage(packageInfo.name, packageInfo.version, { + ignoreUnverified, + }); + assetsMap = pkg.assetsMap; + } else { + assetsMap = installedPackageWithAssets.assetsMap; + } + setPackageAssetsMapCache(packageInfo.name, packageInfo.version, assetsMap); - return assetsMap; + return assetsMap; + } catch (error) { + logger.warn(`getPackageAssetsMap error: ${error}`); + throw error; + } } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index ebe5acc35178d..07d7392971d74 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -1354,44 +1354,48 @@ export async function installAssetsForInputPackagePolicy(opts: { `Error while creating index templates: unable to find installed package ${pkgInfo.name}` ); } - if (installedPkgWithAssets.installation.version !== pkgInfo.version) { - const pkg = await Registry.getPackage(pkgInfo.name, pkgInfo.version, { - ignoreUnverified: force, - }); + try { + if (installedPkgWithAssets.installation.version !== pkgInfo.version) { + const pkg = await Registry.getPackage(pkgInfo.name, pkgInfo.version, { + ignoreUnverified: force, + }); - const archiveIterator = createArchiveIteratorFromMap(pkg.assetsMap); - packageInstallContext = { - assetsMap: pkg.assetsMap, - packageInfo: pkg.packageInfo, - paths: pkg.paths, - archiveIterator, - }; - } else { - const archiveIterator = createArchiveIteratorFromMap(installedPkgWithAssets.assetsMap); - packageInstallContext = { - assetsMap: installedPkgWithAssets.assetsMap, - packageInfo: installedPkgWithAssets.packageInfo, - paths: installedPkgWithAssets.paths, - archiveIterator, - }; - } + const archiveIterator = createArchiveIteratorFromMap(pkg.assetsMap); + packageInstallContext = { + assetsMap: pkg.assetsMap, + packageInfo: pkg.packageInfo, + paths: pkg.paths, + archiveIterator, + }; + } else { + const archiveIterator = createArchiveIteratorFromMap(installedPkgWithAssets.assetsMap); + packageInstallContext = { + assetsMap: installedPkgWithAssets.assetsMap, + packageInfo: installedPkgWithAssets.packageInfo, + paths: installedPkgWithAssets.paths, + archiveIterator, + }; + } - await installIndexTemplatesAndPipelines({ - installedPkg: installedPkgWithAssets.installation, - packageInstallContext, - esReferences: installedPkgWithAssets.installation.installed_es || [], - savedObjectsClient: soClient, - esClient, - logger, - onlyForDataStreams: [dataStream], - }); - // Upate ES index patterns - await optimisticallyAddEsAssetReferences( - soClient, - installedPkgWithAssets.installation.name, - [], - generateESIndexPatterns([dataStream]) - ); + await installIndexTemplatesAndPipelines({ + installedPkg: installedPkgWithAssets.installation, + packageInstallContext, + esReferences: installedPkgWithAssets.installation.installed_es || [], + savedObjectsClient: soClient, + esClient, + logger, + onlyForDataStreams: [dataStream], + }); + // Upate ES index patterns + await optimisticallyAddEsAssetReferences( + soClient, + installedPkgWithAssets.installation.name, + [], + generateESIndexPatterns([dataStream]) + ); + } catch (error) { + logger.warn(`installAssetsForInputPackagePolicy error: ${error}`); + } } interface NoPkgArgs { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/package_verification.ts b/x-pack/plugins/fleet/server/services/epm/packages/package_verification.ts index 92068dfcd424d..d95d387322120 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/package_verification.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/package_verification.ts @@ -75,7 +75,7 @@ export async function verifyPackageArchiveSignature({ }: { pkgName: string; pkgVersion: string; - pkgArchiveBuffer: Buffer; + pkgArchiveBuffer: Buffer | undefined; logger: Logger; }): Promise<PackageVerificationResult> { const verificationKey = await getGpgKeyOrUndefined(); @@ -97,6 +97,11 @@ export async function verifyPackageArchiveSignature({ return result; } + if (!pkgArchiveBuffer) { + logger.warn(`Archive not found for package ${pkgName}-${pkgVersion}. Skipping verification.`); + return result; + } + const { isVerified, keyId } = await _verifyPackageSignature({ pkgArchiveBuffer, pkgArchiveSignature, diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.test.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.test.ts index 6de0577e33238..34a474c0900e8 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.test.ts @@ -84,6 +84,7 @@ describe('splitPkgKey', () => { describe('fetch package', () => { afterEach(() => { mockFetchUrl.mockReset(); + mockGetConfig.mockReset(); mockGetBundledPackageByName.mockReset(); }); @@ -100,6 +101,22 @@ describe('fetch package', () => { expect(result).toEqual(registryPackage); }); + it('Should return bundled package when isAirGapped = true', async () => { + mockGetConfig.mockReturnValue({ + isAirGapped: true, + enabled: true, + agents: { enabled: true, elasticsearch: {} }, + }); + const bundledPackage = { name: 'testpkg', version: '1.0.0' }; + const registryPackage = { name: 'testpkg', version: '1.0.1' }; + + mockFetchUrl.mockResolvedValue(JSON.stringify([registryPackage])); + + mockGetBundledPackageByName.mockResolvedValue(bundledPackage); + const result = await fetchMethodToTest('testpkg'); + expect(result).toEqual(bundledPackage); + }); + it('Should return bundled package if bundled package is newer version', async () => { const bundledPackage = { name: 'testpkg', version: '1.0.1' }; const registryPackage = { name: 'testpkg', version: '1.0.0' }; @@ -220,6 +237,15 @@ describe('fetchInfo', () => { expect(e).toBeInstanceOf(PackageNotFoundError); } }); + + it('falls back to bundled package when isAirGapped config == true', async () => { + mockGetConfig.mockReturnValue({ + isAirGapped: true, + }); + + const fetchedInfo = await fetchInfo('test-package', '1.0.0'); + expect(fetchedInfo).toBeTruthy(); + }); }); describe('fetchCategories', () => { @@ -317,6 +343,13 @@ describe('fetchList', () => { expect(callUrl.searchParams.get('capabilities')).toBeNull(); }); + it('does not call registry if isAirGapped == true', async () => { + mockGetConfig.mockReturnValue({ isAirGapped: true }); + mockFetchUrl.mockResolvedValue(JSON.stringify([])); + await fetchList(); + expect(mockFetchUrl).toBeCalledTimes(0); + }); + it('does call registry with kibana.version if not explictly disabled', async () => { mockGetConfig.mockReturnValue({ internal: { diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index 75b9869d0a7c6..3fd0e09578ca7 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -46,6 +46,7 @@ import { RegistryResponseError, PackageFailedVerificationError, PackageUnsupportedMediaTypeError, + ArchiveNotFoundError, } from '../../../errors'; import { getBundledPackageByName } from '../packages/bundled_packages'; @@ -56,6 +57,8 @@ import { verifyPackageArchiveSignature } from '../packages/package_verification' import type { ArchiveIterator } from '../../../../common/types'; +import { airGappedUtils } from '../airgapped'; + import { fetchUrl, getResponse, getResponseStream } from './requests'; import { getRegistryUrl } from './registry_url'; @@ -67,6 +70,15 @@ export const pkgToPkgKey = ({ name, version }: { name: string; version: string } export async function fetchList( params?: GetPackagesRequest['query'] ): Promise<RegistrySearchResults> { + if (airGappedUtils().shouldSkipRegistryRequests) { + appContextService + .getLogger() + .debug( + 'fetchList: isAirGapped enabled and no registryUrl or RegistryProxyUrl configured, skipping registry requests' + ); + return []; + } + const registryUrl = getRegistryUrl(); const url = new URL(`${registryUrl}/search`); if (params) { @@ -106,16 +118,24 @@ async function _fetchFindLatestPackage( } try { - const res = await fetchUrl(url.toString(), 1); - const searchResults: RegistryPackage[] = JSON.parse(res); - - const latestPackageFromRegistry = searchResults[0] ?? null; - - if (bundledPackage && semverGte(bundledPackage.version, latestPackageFromRegistry.version)) { + if (!airGappedUtils().shouldSkipRegistryRequests) { + const res = await fetchUrl(url.toString(), 1); + const searchResults: RegistryPackage[] = JSON.parse(res); + + const latestPackageFromRegistry = searchResults[0] ?? null; + + if ( + bundledPackage && + semverGte(bundledPackage.version, latestPackageFromRegistry.version) + ) { + return bundledPackage; + } + return latestPackageFromRegistry; + } else if (airGappedUtils().shouldSkipRegistryRequests && bundledPackage) { return bundledPackage; + } else { + return null; } - - return latestPackageFromRegistry; } catch (error) { logger.error( `Failed to fetch latest version of ${packageName} from registry: ${error.message}` @@ -169,6 +189,13 @@ export async function fetchInfo( pkgVersion: string ): Promise<RegistryPackage | ArchivePackage> { const registryUrl = getRegistryUrl(); + // if isAirGapped config enabled and bundled package, use the bundled version + if (airGappedUtils().shouldSkipRegistryRequests) { + const archivePackage = await getBundledArchive(pkgName, pkgVersion); + if (archivePackage) { + return archivePackage.packageInfo; + } + } try { // Trailing slash avoids 301 redirect / extra hop const res = await fetchUrl(`${registryUrl}/package/${pkgName}/${pkgVersion}/`).then(JSON.parse); @@ -208,12 +235,20 @@ export async function getFile( pkgName: string, pkgVersion: string, relPath: string -): Promise<Response> { +): Promise<Response | null> { const filePath = `/package/${pkgName}/${pkgVersion}/${relPath}`; return fetchFile(filePath); } -export async function fetchFile(filePath: string): Promise<Response> { +export async function fetchFile(filePath: string): Promise<Response | null> { + if (airGappedUtils().shouldSkipRegistryRequests) { + appContextService + .getLogger() + .debug( + 'fetchFile: isAirGapped enabled and no registryUrl or RegistryProxyUrl configured, skipping registry requests' + ); + return null; + } const registryUrl = getRegistryUrl(); return getResponse(`${registryUrl}${filePath}`); } @@ -264,6 +299,15 @@ function setConstraints(url: URL) { export async function fetchCategories( params?: GetCategoriesRequest['query'] ): Promise<CategorySummaryList> { + if (airGappedUtils().shouldSkipRegistryRequests) { + appContextService + .getLogger() + .debug( + 'fetchCategories: isAirGapped enabled and no registryUrl or RegistryProxyUrl configured, skipping registry requests' + ); + return []; + } + const registryUrl = getRegistryUrl(); const url = new URL(`${registryUrl}/categories`); if (params) { @@ -319,42 +363,52 @@ export async function getPackage( archiveIterator: ArchiveIterator; verificationResult?: PackageVerificationResult; }> { + const logger = appContextService.getLogger(); const verifyPackage = appContextService.getExperimentalFeatures().packageVerification; let packageInfo: ArchivePackage | undefined = getPackageInfo({ name, version }); let verificationResult: PackageVerificationResult | undefined = verifyPackage ? getVerificationResult({ name, version }) : undefined; + try { + const { + archiveBuffer, + archivePath, + verificationResult: latestVerificationResult, + } = await withPackageSpan('Fetch package archive from archive buffer', () => + fetchArchiveBuffer({ + pkgName: name, + pkgVersion: version, + shouldVerify: verifyPackage, + ignoreUnverified: options?.ignoreUnverified, + }) + ); - const { - archiveBuffer, - archivePath, - verificationResult: latestVerificationResult, - } = await withPackageSpan('Fetch package archive from archive buffer', () => - fetchArchiveBuffer({ - pkgName: name, - pkgVersion: version, - shouldVerify: verifyPackage, - ignoreUnverified: options?.ignoreUnverified, - }) - ); - - if (latestVerificationResult) { - verificationResult = latestVerificationResult; - setVerificationResult({ name, version }, latestVerificationResult); - } + if (latestVerificationResult) { + verificationResult = latestVerificationResult; + setVerificationResult({ name, version }, latestVerificationResult); + } - const contentType = ensureContentType(archivePath); - const { paths, assetsMap, archiveIterator } = await unpackBufferToAssetsMap({ - archiveBuffer, - contentType, - useStreaming: options?.useStreaming, - }); + const contentType = ensureContentType(archivePath); + const { paths, assetsMap, archiveIterator } = await unpackBufferToAssetsMap({ + archiveBuffer, + contentType, + useStreaming: options?.useStreaming, + }); - if (!packageInfo) { - packageInfo = await getPackageInfoFromArchiveOrCache(name, version, archiveBuffer, archivePath); - } + if (!packageInfo) { + packageInfo = await getPackageInfoFromArchiveOrCache( + name, + version, + archiveBuffer, + archivePath + ); + } - return { paths, packageInfo, assetsMap, archiveIterator, verificationResult }; + return { paths, packageInfo, assetsMap, archiveIterator, verificationResult }; + } catch (error) { + logger.warn(`getPackage failed with error: ${error}`); + throw error; + } } export async function getPackageFieldsMetadata( @@ -367,36 +421,40 @@ export async function getPackageFieldsMetadata( // Attempt retrieving latest package name and version const latestPackage = await fetchFindLatestPackageOrThrow(packageName); const { name, version } = latestPackage; - - // Attempt retrieving latest package - const resolvedPackage = await getPackage(name, version); - - // We need to collect all the available data streams for the package. - // In case a dataset is specified from the parameter, it will load the fields only for that specific dataset. - // As a fallback case, we'll try to read the fields for all the data streams in the package. - const dataStreamsMap = resolveDataStreamsMap(resolvedPackage.packageInfo.data_streams); - - const { assetsMap } = resolvedPackage; - - const dataStream = datasetName ? dataStreamsMap.get(datasetName) : null; - - if (dataStream) { - // Resolve a single data stream fields when the `datasetName` parameter is specified - return resolveDataStreamFields({ dataStream, assetsMap, excludedFieldsAssets }); - } else { - // Resolve and merge all the integration data streams fields otherwise - return [...dataStreamsMap.values()].reduce( - (packageDataStreamsFields, currentDataStream) => - Object.assign( - packageDataStreamsFields, - resolveDataStreamFields({ - dataStream: currentDataStream, - assetsMap, - excludedFieldsAssets, - }) - ), - {} - ); + try { + // Attempt retrieving latest package + const resolvedPackage = await getPackage(name, version); + + // We need to collect all the available data streams for the package. + // In case a dataset is specified from the parameter, it will load the fields only for that specific dataset. + // As a fallback case, we'll try to read the fields for all the data streams in the package. + const dataStreamsMap = resolveDataStreamsMap(resolvedPackage.packageInfo.data_streams); + + const assetsMap = resolvedPackage.assetsMap; + + const dataStream = datasetName ? dataStreamsMap.get(datasetName) : null; + + if (dataStream) { + // Resolve a single data stream fields when the `datasetName` parameter is specified + return resolveDataStreamFields({ dataStream, assetsMap, excludedFieldsAssets }); + } else { + // Resolve and merge all the integration data streams fields otherwise + return [...dataStreamsMap.values()].reduce( + (packageDataStreamsFields, currentDataStream) => + Object.assign( + packageDataStreamsFields, + resolveDataStreamFields({ + dataStream: currentDataStream, + assetsMap, + excludedFieldsAssets, + }) + ), + {} + ); + } + } catch (error) { + appContextService.getLogger().warn(`getPackageFieldsMetadata error: ${error}`); + throw error; } } @@ -436,22 +494,31 @@ export async function fetchArchiveBuffer({ } const registryUrl = getRegistryUrl(); const archiveUrl = `${registryUrl}${archivePath}`; - const archiveBuffer = await getResponseStream(archiveUrl).then(streamToBuffer); - - if (shouldVerify) { - const verificationResult = await verifyPackageArchiveSignature({ - pkgName, - pkgVersion, - pkgArchiveBuffer: archiveBuffer, - logger, - }); + try { + const archiveBuffer = await getResponseStream(archiveUrl).then(streamToBuffer); + if (!archiveBuffer) { + logger.warn(`Archive Buffer not found`); + throw new ArchiveNotFoundError('Archive Buffer not found'); + } + + if (shouldVerify) { + const verificationResult = await verifyPackageArchiveSignature({ + pkgName, + pkgVersion, + pkgArchiveBuffer: archiveBuffer, + logger, + }); - if (verificationResult.verificationStatus === 'unverified' && !ignoreUnverified) { - throw new PackageFailedVerificationError(pkgName, pkgVersion); + if (verificationResult.verificationStatus === 'unverified' && !ignoreUnverified) { + throw new PackageFailedVerificationError(pkgName, pkgVersion); + } + return { archiveBuffer, archivePath, verificationResult }; } - return { archiveBuffer, archivePath, verificationResult }; + return { archiveBuffer, archivePath }; + } catch (error) { + logger.warn(`fetchArchiveBuffer failed with error: ${error}`); + throw error; } - return { archiveBuffer, archivePath }; } export async function getPackageArchiveSignatureOrUndefined({ @@ -473,9 +540,10 @@ export async function getPackageArchiveSignatureOrUndefined({ } try { - const { body } = await fetchFile(signaturePath); + const res = await fetchFile(signaturePath); - return streamToString(body); + if (res?.body) return streamToString(res.body); + return undefined; } catch (e) { logger.error(`Error retrieving package signature at '${signaturePath}' : ${e}`); return undefined; diff --git a/x-pack/plugins/fleet/server/services/epm/registry/requests.test.ts b/x-pack/plugins/fleet/server/services/epm/registry/requests.test.ts index e4e34d25671f6..367f68f50acd2 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/requests.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/requests.test.ts @@ -5,11 +5,17 @@ * 2.0. */ +import { securityMock } from '@kbn/security-plugin/server/mocks'; +import { loggerMock } from '@kbn/logging-mocks'; + +import type { Logger } from '@kbn/core/server'; + import { RegistryError, RegistryConnectionError, RegistryResponseError } from '../../../errors'; import { appContextService } from '../../app_context'; import { fetchUrl, getResponse } from './requests'; jest.mock('node-fetch'); +jest.mock('../../app_context'); let mockRegistryProxyUrl: string | undefined; jest.mock('./proxy', () => ({ @@ -17,11 +23,9 @@ jest.mock('./proxy', () => ({ getRegistryProxyUrl: () => mockRegistryProxyUrl, })); -jest.mock('../../app_context', () => ({ - appContextService: { - getKibanaVersion: jest.fn(), - getLogger: jest.fn().mockReturnValue({ debug: jest.fn() }), - }, +const mockedAppContextService = appContextService as jest.Mocked<typeof appContextService>; +mockedAppContextService.getSecuritySetup.mockImplementation(() => ({ + ...securityMock.createSetup(), })); const { Response, FetchError } = jest.requireActual('node-fetch'); @@ -29,18 +33,23 @@ const { Response, FetchError } = jest.requireActual('node-fetch'); const fetchMock = require('node-fetch') as jest.Mock; jest.setTimeout(120 * 1000); -describe('Registry request', () => { + +describe('Registry requests', () => { beforeEach(async () => {}); afterEach(async () => { jest.clearAllMocks(); }); + let mockedLogger: jest.Mocked<Logger>; describe('fetch options', () => { beforeEach(() => { fetchMock.mockImplementationOnce(() => Promise.resolve(new Response(''))); - (appContextService.getKibanaVersion as jest.Mock).mockReturnValue('8.0.0'); + mockedAppContextService.getKibanaVersion.mockReturnValue('8.0.0'); + mockedLogger = loggerMock.create(); + mockedAppContextService.getLogger.mockReturnValue(mockedLogger); }); + it('should set User-Agent header including kibana version', async () => { await getResponse(''); @@ -219,5 +228,32 @@ describe('Registry request', () => { expect(fetchMock).toHaveBeenCalledTimes(1); }); }); + + describe('with config.isAirGapped == true', () => { + beforeEach(() => { + mockedLogger = loggerMock.create(); + mockedAppContextService.getLogger.mockReturnValue(mockedLogger); + mockedAppContextService.getConfig.mockReturnValue({ + isAirGapped: true, + enabled: true, + agents: { enabled: true, elasticsearch: {} }, + }); + }); + + it('should not call fetch', async () => { + await getResponse(''); + + expect(fetchMock).toHaveBeenCalledTimes(0); + }); + + it('fetchUrl throws error', async () => { + fetchMock.mockImplementationOnce(() => { + throw new Error('mocked'); + }); + const promise = fetchUrl(''); + await expect(promise).rejects.toThrow(RegistryResponseError); + expect(fetchMock).toHaveBeenCalledTimes(0); + }); + }); }); }); diff --git a/x-pack/plugins/fleet/server/services/epm/registry/requests.ts b/x-pack/plugins/fleet/server/services/epm/registry/requests.ts index 47084b601a27e..a67e01408a1e9 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/requests.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/requests.ts @@ -13,6 +13,8 @@ import { streamToString } from '../streams'; import { appContextService } from '../../app_context'; import { RegistryError, RegistryConnectionError, RegistryResponseError } from '../../../errors'; +import { airGappedUtils } from '../airgapped'; + import { getProxyAgent, getRegistryProxyUrl } from './proxy'; type FailedAttemptErrors = pRetry.FailedAttemptError | FetchError | Error; @@ -20,6 +22,7 @@ type FailedAttemptErrors = pRetry.FailedAttemptError | FetchError | Error; // not sure what to call this function, but we're not exporting it async function registryFetch(url: string) { const response = await fetch(url, getFetchOptions(url)); + if (response.ok) { return response; } else { @@ -34,7 +37,16 @@ async function registryFetch(url: string) { } } -export async function getResponse(url: string, retries: number = 5): Promise<Response> { +export async function getResponse(url: string, retries: number = 5): Promise<Response | null> { + const logger = appContextService.getLogger(); + + if (airGappedUtils().shouldSkipRegistryRequests) { + logger.debug( + 'getResponse: isAirGapped enabled and no registryUrl or RegistryProxyUrl configured, skipping registry requests' + ); + return null; + } + try { // we only want to retry certain failures like network issues // the rest should only try the one time then fail as they do now @@ -72,11 +84,20 @@ export async function getResponseStream( retries?: number ): Promise<NodeJS.ReadableStream> { const res = await getResponse(url, retries); - return res.body; + if (res) { + return res?.body; + } + throw new RegistryResponseError('isAirGapped config enabled, registry not reacheable'); } export async function fetchUrl(url: string, retries?: number): Promise<string> { - return getResponseStream(url, retries).then(streamToString); + const logger = appContextService.getLogger(); + try { + return getResponseStream(url, retries).then(streamToString); + } catch (error) { + logger.warn(`getResponseStream failed with error: ${error}`); + throw error; + } } // node-fetch throws a FetchError for those types of errors and diff --git a/x-pack/plugins/fleet/server/services/register_fields_metadata_extractors.ts b/x-pack/plugins/fleet/server/services/register_fields_metadata_extractors.ts index 9a53c235622bf..a468c20137b38 100644 --- a/x-pack/plugins/fleet/server/services/register_fields_metadata_extractors.ts +++ b/x-pack/plugins/fleet/server/services/register_fields_metadata_extractors.ts @@ -10,6 +10,8 @@ import type { FieldsMetadataServerSetup } from '@kbn/fields-metadata-plugin/serv import type { FleetStartContract, FleetStartDeps } from '../plugin'; +import { appContextService } from '.'; + interface RegistrationDeps { core: CoreSetup<FleetStartDeps, FleetStartContract>; fieldsMetadata: FieldsMetadataServerSetup; @@ -17,12 +19,17 @@ interface RegistrationDeps { export const registerFieldsMetadataExtractors = ({ core, fieldsMetadata }: RegistrationDeps) => { fieldsMetadata.registerIntegrationFieldsExtractor(async ({ integration, dataset }) => { - const [_core, _startDeps, { packageService }] = await core.getStartServices(); + try { + const [_core, _startDeps, { packageService }] = await core.getStartServices(); - return packageService.asInternalUser.getPackageFieldsMetadata({ - packageName: integration, - datasetName: dataset, - }); + return packageService.asInternalUser.getPackageFieldsMetadata({ + packageName: integration, + datasetName: dataset, + }); + } catch (error) { + appContextService.getLogger().warn(`registerIntegrationFieldsExtractor error: ${error}`); + throw error; + } }); fieldsMetadata.registerIntegrationListExtractor(async () => { diff --git a/x-pack/plugins/fleet/server/telemetry/sender.ts b/x-pack/plugins/fleet/server/telemetry/sender.ts index 8fb71683b2c9c..bdecd6cc8d0bf 100644 --- a/x-pack/plugins/fleet/server/telemetry/sender.ts +++ b/x-pack/plugins/fleet/server/telemetry/sender.ts @@ -14,10 +14,10 @@ import axios from 'axios'; import type { InfoResponse, LicenseGetResponse } from '@elastic/elasticsearch/lib/api/types'; -import { appContextService } from '../services'; - import { exhaustMap, Subject, takeUntil, timer } from 'rxjs'; +import { appContextService } from '../services'; + import { TelemetryQueue } from './queue'; import type { FleetTelemetryChannel, FleetTelemetryChannelEvents } from './types'; diff --git a/x-pack/plugins/index_management/common/types/templates.ts b/x-pack/plugins/index_management/common/types/templates.ts index ab4614200c0b5..ffcc27ed08971 100644 --- a/x-pack/plugins/index_management/common/types/templates.ts +++ b/x-pack/plugins/index_management/common/types/templates.ts @@ -51,7 +51,7 @@ export interface TemplateDeserialized { priority?: number; // Composable template only allowAutoCreate: string; order?: number; // Legacy template only - indexMode: IndexMode; + indexMode?: IndexMode; ilmPolicy?: { name: string; }; diff --git a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx index 593655da62fef..4e1901538cb93 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx @@ -271,15 +271,19 @@ export const StepReview: React.FunctionComponent<Props> = React.memo( </EuiDescriptionListDescription> {/* Index mode */} - <EuiDescriptionListTitle data-test-subj="indexModeTitle"> - <FormattedMessage - id="xpack.idxMgmt.templateForm.stepReview.summaryTab.indexModeLabel" - defaultMessage="Index mode" - /> - </EuiDescriptionListTitle> - <EuiDescriptionListDescription data-test-subj="indexModeValue"> - {indexModeLabels[indexMode]} - </EuiDescriptionListDescription> + {indexMode && ( + <> + <EuiDescriptionListTitle data-test-subj="indexModeTitle"> + <FormattedMessage + id="xpack.idxMgmt.templateForm.stepReview.summaryTab.indexModeLabel" + defaultMessage="Index mode" + /> + </EuiDescriptionListTitle> + <EuiDescriptionListDescription data-test-subj="indexModeValue"> + {indexModeLabels[indexMode]} + </EuiDescriptionListDescription> + </> + )} {/* Mappings */} <EuiDescriptionListTitle> diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx index eed3335d01431..6958a32845fe6 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx @@ -226,15 +226,19 @@ export const TabSummary: React.FunctionComponent<Props> = ({ templateDetails }) )} {/* Index mode */} - <EuiDescriptionListTitle> - <FormattedMessage - id="xpack.idxMgmt.templateDetails.stepReview.summaryTab.indexModeLabel" - defaultMessage="Index mode" - /> - </EuiDescriptionListTitle> - <EuiDescriptionListDescription> - {indexModeLabels[indexMode]} - </EuiDescriptionListDescription> + {indexMode && ( + <> + <EuiDescriptionListTitle> + <FormattedMessage + id="xpack.idxMgmt.templateDetails.stepReview.summaryTab.indexModeLabel" + defaultMessage="Index mode" + /> + </EuiDescriptionListTitle> + <EuiDescriptionListDescription> + {indexModeLabels[indexMode]} + </EuiDescriptionListDescription> + </> + )} {/* Allow auto create */} {isLegacy !== true && diff --git a/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts b/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts index cfd9c1d18e610..5bea0c36067c0 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts @@ -13,7 +13,7 @@ export const templateSchema = schema.object({ version: schema.maybe(schema.number()), order: schema.maybe(schema.number()), priority: schema.maybe(schema.number()), - indexMode: schema.string(), + indexMode: schema.maybe(schema.string()), // Not present for legacy templates allowAutoCreate: schema.maybe(schema.string()), template: schema.maybe( diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx index ca4d50958005d..133da383e4e99 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx @@ -6,11 +6,13 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; +import { render, act } from '@testing-library/react'; import { TestProvider } from '../../../mocks/test_provider'; import { CreateIntegrationAssistant } from './create_integration_assistant'; import type { State } from './state'; import { ExperimentalFeaturesService } from '../../../services'; +import { mockReportEvent } from '../../../services/telemetry/mocks/service'; +import { TelemetryEventType } from '../../../services/telemetry/types'; export const defaultInitialState: State = { step: 1, @@ -20,6 +22,7 @@ export const defaultInitialState: State = { hasCelInput: false, result: undefined, }; + const mockInitialState = jest.fn((): State => defaultInitialState); jest.mock('./state', () => ({ ...jest.requireActual('./state'), @@ -39,39 +42,45 @@ const mockCelInputStep = jest.fn(() => <div data-test-subj="celInputStepMock" /> const mockReviewCelStep = jest.fn(() => <div data-test-subj="reviewCelStepMock" />); const mockDeployStep = jest.fn(() => <div data-test-subj="deployStepMock" />); -const mockIsConnectorStepReady = jest.fn(); -const mockIsIntegrationStepReady = jest.fn(); -const mockIsDataStreamStepReady = jest.fn(); -const mockIsReviewStepReady = jest.fn(); -const mockIsCelInputStepReady = jest.fn(); -const mockIsCelReviewStepReady = jest.fn(); +const mockIsConnectorStepReadyToComplete = jest.fn(); +const mockIsIntegrationStepReadyToComplete = jest.fn(); +const mockIsDataStreamStepReadyToComplete = jest.fn(); +const mockIsReviewStepReadyToComplete = jest.fn(); +const mockIsCelInputStepReadyToComplete = jest.fn(); +const mockIsCelReviewStepReadyToComplete = jest.fn(); jest.mock('./steps/connector_step', () => ({ ConnectorStep: () => mockConnectorStep(), - isConnectorStepReady: () => mockIsConnectorStepReady(), + isConnectorStepReadyToComplete: () => mockIsConnectorStepReadyToComplete(), })); jest.mock('./steps/integration_step', () => ({ IntegrationStep: () => mockIntegrationStep(), - isIntegrationStepReady: () => mockIsIntegrationStepReady(), + isIntegrationStepReadyToComplete: () => mockIsIntegrationStepReadyToComplete(), })); jest.mock('./steps/data_stream_step', () => ({ DataStreamStep: () => mockDataStreamStep(), - isDataStreamStepReady: () => mockIsDataStreamStepReady(), + isDataStreamStepReadyToComplete: () => mockIsDataStreamStepReadyToComplete(), })); jest.mock('./steps/review_step', () => ({ ReviewStep: () => mockReviewStep(), - isReviewStepReady: () => mockIsReviewStepReady(), + isReviewStepReadyToComplete: () => mockIsReviewStepReadyToComplete(), })); jest.mock('./steps/cel_input_step', () => ({ CelInputStep: () => mockCelInputStep(), - isCelInputStepReady: () => mockIsCelInputStepReady(), + isCelInputStepReadyToComplete: () => mockIsCelInputStepReadyToComplete(), })); jest.mock('./steps/review_cel_step', () => ({ ReviewCelStep: () => mockReviewCelStep(), - isCelReviewStepReady: () => mockIsCelReviewStepReady(), + isCelReviewStepReadyToComplete: () => mockIsCelReviewStepReadyToComplete(), })); jest.mock('./steps/deploy_step', () => ({ DeployStep: () => mockDeployStep() })); +const mockNavigate = jest.fn(); +jest.mock('../../../common/hooks/use_navigate', () => ({ + ...jest.requireActual('../../../common/hooks/use_navigate'), + useNavigate: () => mockNavigate, +})); + const renderIntegrationAssistant = () => render(<CreateIntegrationAssistant />, { wrapper: TestProvider }); @@ -89,19 +98,116 @@ describe('CreateIntegration', () => { mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 1 }); }); - it('should render connector', () => { + it('shoud report telemetry for assistant open', () => { + renderIntegrationAssistant(); + expect(mockReportEvent).toHaveBeenCalledWith(TelemetryEventType.IntegrationAssistantOpen, { + sessionId: expect.any(String), + }); + }); + + it('should render connector step', () => { const result = renderIntegrationAssistant(); expect(result.queryByTestId('connectorStepMock')).toBeInTheDocument(); }); - it('should call isConnectorStepReady', () => { + it('should call isConnectorStepReadyToComplete', () => { renderIntegrationAssistant(); - expect(mockIsConnectorStepReady).toHaveBeenCalled(); + expect(mockIsConnectorStepReadyToComplete).toHaveBeenCalled(); + }); + + it('should show "Next" on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toHaveTextContent('Next'); + }); + + describe('when connector step is not done', () => { + beforeEach(() => { + mockIsConnectorStepReadyToComplete.mockReturnValue(false); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeDisabled(); + }); + + it('should still enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should still enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + }); + + describe('when connector step is done', () => { + beforeEach(() => { + mockIsConnectorStepReadyToComplete.mockReturnValue(true); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + + it('should enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + describe('when next button is clicked', () => { + beforeEach(() => { + const result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-nextButton').click(); + }); + }); + + it('should report telemetry for connector step completion', () => { + expect(mockReportEvent).toHaveBeenCalledWith( + TelemetryEventType.IntegrationAssistantStepComplete, + { + sessionId: expect.any(String), + step: 1, + stepName: 'Connector Step', + durationMs: expect.any(Number), + sessionElapsedTime: expect.any(Number), + } + ); + }); + }); + }); + + describe('when back button is clicked', () => { + let result: ReturnType<typeof renderIntegrationAssistant>; + beforeEach(() => { + result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-backButton').click(); + }); + }); + + it('should not report telemetry', () => { + expect(mockReportEvent).not.toHaveBeenCalled(); + }); + + it('should navigate to the landing page', () => { + expect(mockNavigate).toHaveBeenCalledWith('landing'); + }); }); }); describe('when step is 2', () => { beforeEach(() => { + mockIsConnectorStepReadyToComplete.mockReturnValue(true); mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 2 }); }); @@ -110,14 +216,109 @@ describe('CreateIntegration', () => { expect(result.queryByTestId('integrationStepMock')).toBeInTheDocument(); }); - it('should call isIntegrationStepReady', () => { + it('should call isIntegrationStepReadyToComplete', () => { renderIntegrationAssistant(); - expect(mockIsIntegrationStepReady).toHaveBeenCalled(); + expect(mockIsIntegrationStepReadyToComplete).toHaveBeenCalled(); + }); + + it('should show "Next" on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toHaveTextContent('Next'); + }); + + describe('when integration step is not done', () => { + beforeEach(() => { + mockIsIntegrationStepReadyToComplete.mockReturnValue(false); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeDisabled(); + }); + + it('should still enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should still enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + }); + + describe('when integration step is done', () => { + beforeEach(() => { + mockIsIntegrationStepReadyToComplete.mockReturnValue(true); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + + it('should enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + describe('when next button is clicked', () => { + beforeEach(() => { + const result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-nextButton').click(); + }); + }); + + it('should report telemetry for integration step completion', () => { + expect(mockReportEvent).toHaveBeenCalledWith( + TelemetryEventType.IntegrationAssistantStepComplete, + { + sessionId: expect.any(String), + step: 2, + stepName: 'Integration Step', + durationMs: expect.any(Number), + sessionElapsedTime: expect.any(Number), + } + ); + }); + }); + }); + + describe('when back button is clicked', () => { + let result: ReturnType<typeof renderIntegrationAssistant>; + beforeEach(() => { + result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-backButton').click(); + }); + }); + + it('should not report telemetry', () => { + expect(mockReportEvent).not.toHaveBeenCalled(); + }); + + it('should show connector step', () => { + expect(result.queryByTestId('connectorStepMock')).toBeInTheDocument(); + }); + + it('should enable the next button', () => { + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); }); }); describe('when step is 3', () => { beforeEach(() => { + mockIsConnectorStepReadyToComplete.mockReturnValue(true); + mockIsIntegrationStepReadyToComplete.mockReturnValue(true); mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 3 }); }); @@ -126,9 +327,116 @@ describe('CreateIntegration', () => { expect(result.queryByTestId('dataStreamStepMock')).toBeInTheDocument(); }); - it('should call isDataStreamStepReady', () => { + it('should call isDataStreamStepReadyToComplete', () => { renderIntegrationAssistant(); - expect(mockIsDataStreamStepReady).toHaveBeenCalled(); + expect(mockIsDataStreamStepReadyToComplete).toHaveBeenCalled(); + }); + + it('should show "Analyze logs" on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toHaveTextContent('Analyze logs'); + }); + + describe('when data stream step is not done', () => { + beforeEach(() => { + mockIsDataStreamStepReadyToComplete.mockReturnValue(false); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeDisabled(); + }); + + it('should still enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should still enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + }); + + describe('when data stream step is done', () => { + beforeEach(() => { + mockIsDataStreamStepReadyToComplete.mockReturnValue(true); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + + it('should enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + describe('when next button is clicked', () => { + beforeEach(() => { + const result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-nextButton').click(); + }); + }); + + it('should report telemetry for data stream step completion', () => { + expect(mockReportEvent).toHaveBeenCalledWith( + TelemetryEventType.IntegrationAssistantStepComplete, + { + sessionId: expect.any(String), + step: 3, + stepName: 'DataStream Step', + durationMs: expect.any(Number), + sessionElapsedTime: expect.any(Number), + } + ); + }); + + it('should show loader on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('generatingLoader')).toBeInTheDocument(); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + // Not sure why there are two buttons when testing. + const nextButton = result + .getAllByTestId('buttonsFooter-nextButton') + .filter((button) => button.textContent !== 'Next')[0]; + expect(nextButton).toBeDisabled(); + }); + }); + }); + + describe('when back button is clicked', () => { + let result: ReturnType<typeof renderIntegrationAssistant>; + beforeEach(() => { + result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-backButton').click(); + }); + }); + + it('should not report telemetry', () => { + expect(mockReportEvent).not.toHaveBeenCalled(); + }); + + it('should show integration step', () => { + expect(result.queryByTestId('integrationStepMock')).toBeInTheDocument(); + }); + + it('should enable the next button', () => { + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); }); }); @@ -142,9 +450,89 @@ describe('CreateIntegration', () => { expect(result.queryByTestId('reviewStepMock')).toBeInTheDocument(); }); - it('should call isReviewStepReady', () => { + it('should call isReviewStepReadyToComplete', () => { renderIntegrationAssistant(); - expect(mockIsReviewStepReady).toHaveBeenCalled(); + expect(mockIsReviewStepReadyToComplete).toHaveBeenCalled(); + }); + + it('should show the "Add to Elastic" on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toHaveTextContent('Add to Elastic'); + }); + + describe('when review step is not done', () => { + beforeEach(() => { + mockIsReviewStepReadyToComplete.mockReturnValue(false); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeDisabled(); + }); + + it('should still enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should still enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + }); + + describe('when review step is done', () => { + beforeEach(() => { + mockIsReviewStepReadyToComplete.mockReturnValue(true); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + + it('should enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + describe('when next button is clicked', () => { + beforeEach(() => { + const result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-nextButton').click(); + }); + }); + + it('should report telemetry for review step completion', () => { + expect(mockReportEvent).toHaveBeenCalledWith( + TelemetryEventType.IntegrationAssistantStepComplete, + { + sessionId: expect.any(String), + step: 4, + stepName: 'Review Step', + durationMs: expect.any(Number), + sessionElapsedTime: expect.any(Number), + } + ); + }); + + it('should show deploy step', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('deployStepMock')).toBeInTheDocument(); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + }); }); }); @@ -157,6 +545,26 @@ describe('CreateIntegration', () => { const result = renderIntegrationAssistant(); expect(result.queryByTestId('deployStepMock')).toBeInTheDocument(); }); + + it('should hide the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('buttonsFooter-backButton')).toBe(null); + }); + + it('should hide the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('buttonsFooter-backButton')).toBe(null); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + it('should show "Close" on the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toHaveTextContent('Close'); + }); }); }); @@ -179,9 +587,107 @@ describe('CreateIntegration with generateCel enabled', () => { expect(result.queryByTestId('celInputStepMock')).toBeInTheDocument(); }); - it('should call isCelInputStepReady', () => { + it('should call isCelInputStepReadyToComplete', () => { renderIntegrationAssistant(); - expect(mockIsCelInputStepReady).toHaveBeenCalled(); + expect(mockIsCelInputStepReadyToComplete).toHaveBeenCalled(); + }); + + it('should show "Generate CEL input configuration" on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toHaveTextContent( + 'Generate CEL input configuration' + ); + }); + + it('should enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + describe('when cel input step is not done', () => { + beforeEach(() => { + mockIsCelInputStepReadyToComplete.mockReturnValue(false); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + // Not sure why there are two buttons when testing. + const nextButton = result + .getAllByTestId('buttonsFooter-nextButton') + .filter((button) => button.textContent !== 'Next')[0]; + expect(nextButton).toBeDisabled(); + }); + }); + + describe('when cel input step is done', () => { + beforeEach(() => { + mockIsCelInputStepReadyToComplete.mockReturnValue(true); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + + describe('when next button is clicked', () => { + beforeEach(() => { + const result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-nextButton').click(); + }); + }); + + it('should report telemetry for cel input step completion', () => { + expect(mockReportEvent).toHaveBeenCalledWith( + TelemetryEventType.IntegrationAssistantStepComplete, + { + sessionId: expect.any(String), + step: 5, + stepName: 'CEL Input Step', + durationMs: expect.any(Number), + sessionElapsedTime: expect.any(Number), + } + ); + }); + + it('should show loader on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('generatingLoader')).toBeInTheDocument(); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + // Not sure why there are two buttons when testing. + const nextButton = result + .getAllByTestId('buttonsFooter-nextButton') + .filter((button) => button.textContent !== 'Next')[0]; + expect(nextButton).toBeDisabled(); + }); + }); + }); + + describe('when back button is clicked', () => { + let result: ReturnType<typeof renderIntegrationAssistant>; + beforeEach(() => { + result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-backButton').click(); + }); + }); + + it('should not report telemetry', () => { + expect(mockReportEvent).not.toHaveBeenCalled(); + }); + + it('should show review step', () => { + expect(result.queryByTestId('reviewStepMock')).toBeInTheDocument(); + }); + + it('should enable the next button', () => { + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); }); }); @@ -194,6 +700,26 @@ describe('CreateIntegration with generateCel enabled', () => { const result = renderIntegrationAssistant(); expect(result.queryByTestId('deployStepMock')).toBeInTheDocument(); }); + + it('should hide the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('buttonsFooter-backButton')).toBe(null); + }); + + it('should hide the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('buttonsFooter-backButton')).toBe(null); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + it('should show "Close" on the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toHaveTextContent('Close'); + }); }); describe('when step is 6', () => { @@ -210,9 +736,89 @@ describe('CreateIntegration with generateCel enabled', () => { expect(result.queryByTestId('reviewCelStepMock')).toBeInTheDocument(); }); - it('should call isReviewCelStepReady', () => { + it('should call isReviewCelStepReadyToComplete', () => { renderIntegrationAssistant(); - expect(mockIsCelReviewStepReady).toHaveBeenCalled(); + expect(mockIsCelReviewStepReadyToComplete).toHaveBeenCalled(); + }); + + it('should show the "Add to Elastic" on the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toHaveTextContent('Add to Elastic'); + }); + + describe('when cel review step is not done', () => { + beforeEach(() => { + mockIsCelReviewStepReadyToComplete.mockReturnValue(false); + }); + + it('should disable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeDisabled(); + }); + + it('should still enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should still enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + }); + + describe('when cel review step is done', () => { + beforeEach(() => { + mockIsCelReviewStepReadyToComplete.mockReturnValue(true); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + + it('should enable the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-backButton')).toBeEnabled(); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + describe('when next button is clicked', () => { + beforeEach(() => { + const result = renderIntegrationAssistant(); + mockReportEvent.mockClear(); + act(() => { + result.getByTestId('buttonsFooter-nextButton').click(); + }); + }); + + it('should report telemetry for review step completion', () => { + expect(mockReportEvent).toHaveBeenCalledWith( + TelemetryEventType.IntegrationAssistantStepComplete, + { + sessionId: expect.any(String), + step: 6, + stepName: 'CEL Review Step', + durationMs: expect.any(Number), + sessionElapsedTime: expect.any(Number), + } + ); + }); + + it('should show deploy step', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('deployStepMock')).toBeInTheDocument(); + }); + + it('should enable the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-nextButton')).toBeEnabled(); + }); + }); }); }); @@ -225,5 +831,25 @@ describe('CreateIntegration with generateCel enabled', () => { const result = renderIntegrationAssistant(); expect(result.queryByTestId('deployStepMock')).toBeInTheDocument(); }); + + it('should hide the back button', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('buttonsFooter-backButton')).toBe(null); + }); + + it('should hide the next button', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('buttonsFooter-backButton')).toBe(null); + }); + + it('should enable the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toBeEnabled(); + }); + + it('should show "Close" on the cancel button', () => { + const result = renderIntegrationAssistant(); + expect(result.getByTestId('buttonsFooter-cancelButton')).toHaveTextContent('Close'); + }); }); }); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx index 72e085e19920a..81cb5a9b3b137 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx @@ -5,31 +5,96 @@ * 2.0. */ -import React, { useReducer, useMemo, useEffect } from 'react'; +import React, { useReducer, useMemo, useEffect, useCallback } from 'react'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { Header } from './header'; import { Footer } from './footer'; -import { ConnectorStep, isConnectorStepReady } from './steps/connector_step'; -import { IntegrationStep, isIntegrationStepReady } from './steps/integration_step'; -import { DataStreamStep, isDataStreamStepReady } from './steps/data_stream_step'; -import { ReviewStep, isReviewStepReady } from './steps/review_step'; -import { CelInputStep, isCelInputStepReady } from './steps/cel_input_step'; -import { ReviewCelStep, isCelReviewStepReady } from './steps/review_cel_step'; +import { useNavigate, Page } from '../../../common/hooks/use_navigate'; +import { ConnectorStep, isConnectorStepReadyToComplete } from './steps/connector_step'; +import { IntegrationStep, isIntegrationStepReadyToComplete } from './steps/integration_step'; +import { DataStreamStep, isDataStreamStepReadyToComplete } from './steps/data_stream_step'; +import { ReviewStep, isReviewStepReadyToComplete } from './steps/review_step'; +import { CelInputStep, isCelInputStepReadyToComplete } from './steps/cel_input_step'; +import { ReviewCelStep, isCelReviewStepReadyToComplete } from './steps/review_cel_step'; import { DeployStep } from './steps/deploy_step'; import { reducer, initialState, ActionsProvider, type Actions } from './state'; import { useTelemetry } from '../telemetry'; import { ExperimentalFeaturesService } from '../../../services'; +const stepNames: Record<number | string, string> = { + 1: 'Connector Step', + 2: 'Integration Step', + 3: 'DataStream Step', + 4: 'Review Step', + cel_input: 'CEL Input Step', + cel_review: 'CEL Review Step', + deploy: 'Deploy Step', +}; + export const CreateIntegrationAssistant = React.memo(() => { const [state, dispatch] = useReducer(reducer, initialState); - + const navigate = useNavigate(); const { generateCel: isGenerateCelEnabled } = ExperimentalFeaturesService.get(); + const celInputStepIndex = isGenerateCelEnabled && state.hasCelInput ? 5 : null; + const celReviewStepIndex = isGenerateCelEnabled && state.celInputResult ? 6 : null; + const deployStepIndex = + celInputStepIndex !== null || celReviewStepIndex !== null || state.step === 7 ? 7 : 5; + + const stepName = + state.step === deployStepIndex + ? stepNames.deploy + : state.step === celReviewStepIndex + ? stepNames.cel_review + : state.step === celInputStepIndex + ? stepNames.cel_input + : state.step in stepNames + ? stepNames[state.step] + : 'Unknown Step'; + const telemetry = useTelemetry(); useEffect(() => { telemetry.reportAssistantOpen(); }, [telemetry]); + const isThisStepReadyToComplete = useMemo(() => { + if (state.step === 1) { + return isConnectorStepReadyToComplete(state); + } else if (state.step === 2) { + return isIntegrationStepReadyToComplete(state); + } else if (state.step === 3) { + return isDataStreamStepReadyToComplete(state); + } else if (state.step === 4) { + return isReviewStepReadyToComplete(state); + } else if (isGenerateCelEnabled && state.step === 5) { + return isCelInputStepReadyToComplete(state); + } else if (isGenerateCelEnabled && state.step === 6) { + return isCelReviewStepReadyToComplete(state); + } + return false; + }, [state, isGenerateCelEnabled]); + + const goBackStep = useCallback(() => { + if (state.step === 1) { + navigate(Page.landing); + } else { + dispatch({ type: 'SET_STEP', payload: state.step - 1 }); + } + }, [navigate, dispatch, state.step]); + + const completeStep = useCallback(() => { + if (!isThisStepReadyToComplete) { + // If the user tries to navigate to the next step without completing the current step. + return; + } + telemetry.reportAssistantStepComplete({ step: state.step, stepName }); + if (state.step === 3 || state.step === celInputStepIndex) { + dispatch({ type: 'SET_IS_GENERATING', payload: true }); + } else { + dispatch({ type: 'SET_STEP', payload: state.step + 1 }); + } + }, [telemetry, state.step, stepName, celInputStepIndex, isThisStepReadyToComplete]); + const actions = useMemo<Actions>( () => ({ setStep: (payload) => { @@ -53,27 +118,11 @@ export const CreateIntegrationAssistant = React.memo(() => { setCelInputResult: (payload) => { dispatch({ type: 'SET_CEL_INPUT_RESULT', payload }); }, + completeStep, }), - [] + [completeStep] ); - const isNextStepEnabled = useMemo(() => { - if (state.step === 1) { - return isConnectorStepReady(state); - } else if (state.step === 2) { - return isIntegrationStepReady(state); - } else if (state.step === 3) { - return isDataStreamStepReady(state); - } else if (state.step === 4) { - return isReviewStepReady(state); - } else if (isGenerateCelEnabled && state.step === 5) { - return isCelInputStepReady(state); - } else if (isGenerateCelEnabled && state.step === 6) { - return isCelReviewStepReady(state); - } - return false; - }, [state, isGenerateCelEnabled]); - return ( <ActionsProvider value={actions}> <KibanaPageTemplate> @@ -95,28 +144,21 @@ export const CreateIntegrationAssistant = React.memo(() => { result={state.result} /> )} - {state.step === 5 && - (isGenerateCelEnabled && state.hasCelInput ? ( - <CelInputStep - integrationSettings={state.integrationSettings} - connector={state.connector} - isGenerating={state.isGenerating} - /> - ) : ( - <DeployStep - integrationSettings={state.integrationSettings} - result={state.result} - connector={state.connector} - /> - ))} - - {isGenerateCelEnabled && state.celInputResult && state.step === 6 && ( + {state.step === celInputStepIndex && ( + <CelInputStep + integrationSettings={state.integrationSettings} + connector={state.connector} + isGenerating={state.isGenerating} + /> + )} + {state.step === celReviewStepIndex && ( <ReviewCelStep isGenerating={state.isGenerating} celInputResult={state.celInputResult} /> )} - {isGenerateCelEnabled && state.step === 7 && ( + + {state.step === deployStepIndex && ( <DeployStep integrationSettings={state.integrationSettings} result={state.result} @@ -126,10 +168,14 @@ export const CreateIntegrationAssistant = React.memo(() => { )} </KibanaPageTemplate.Section> <Footer - currentStep={state.step} isGenerating={state.isGenerating} - hasCelInput={state.hasCelInput} - isNextStepEnabled={isNextStepEnabled} + isAnalyzeStep={state.step === 3} + isAnalyzeCelStep={state.step === celInputStepIndex} + isLastStep={state.step === deployStepIndex} + isNextStepEnabled={isThisStepReadyToComplete && !state.isGenerating} + isNextAddingToElastic={state.step === deployStepIndex - 1} + onBack={goBackStep} + onNext={completeStep} /> </KibanaPageTemplate> </ActionsProvider> diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.test.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.test.tsx index 1ca79210bb19f..1291507e3f62b 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.test.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.test.tsx @@ -6,13 +6,11 @@ */ import React from 'react'; -import { render, act, type RenderResult } from '@testing-library/react'; +import { render, type RenderResult } from '@testing-library/react'; import { TestProvider } from '../../../../mocks/test_provider'; import { Footer } from './footer'; import { ActionsProvider } from '../state'; import { mockActions } from '../mocks/state'; -import { mockReportEvent } from '../../../../services/telemetry/mocks/service'; -import { TelemetryEventType } from '../../../../services/telemetry/types'; import { ExperimentalFeaturesService } from '../../../../services'; const mockNavigate = jest.fn(); @@ -39,15 +37,12 @@ describe('Footer', () => { } as never); }); - describe('when rendered', () => { + describe('when rendered for the most common case', () => { let result: RenderResult; beforeEach(() => { - result = render( - <Footer currentStep={1} isGenerating={false} hasCelInput={false} isNextStepEnabled />, - { - wrapper, - } - ); + result = render(<Footer isNextStepEnabled />, { + wrapper, + }); }); it('should render footer buttons component', () => { expect(result.queryByTestId('buttonsFooter')).toBeInTheDocument(); @@ -65,230 +60,4 @@ describe('Footer', () => { expect(result.queryByTestId('buttonsFooter-nextButton')).toBeInTheDocument(); }); }); - - describe('when step is 1', () => { - let result: RenderResult; - beforeEach(() => { - result = render( - <Footer currentStep={1} isGenerating={false} hasCelInput={false} isNextStepEnabled />, - { - wrapper, - } - ); - }); - - describe('when next button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-nextButton').click(); - }); - }); - - it('should set step 2', () => { - expect(mockActions.setStep).toHaveBeenCalledWith(2); - }); - - it('should report telemetry', () => { - expect(mockReportEvent).toHaveBeenCalledWith( - TelemetryEventType.IntegrationAssistantStepComplete, - { - sessionId: expect.any(String), - step: 1, - stepName: 'Connector Step', - durationMs: expect.any(Number), - sessionElapsedTime: expect.any(Number), - } - ); - }); - }); - - describe('when back button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-backButton').click(); - }); - }); - - it('should navigate to landing', () => { - expect(mockNavigate).toHaveBeenCalledWith('landing'); - }); - }); - }); - - describe('when step is 2', () => { - let result: RenderResult; - beforeEach(() => { - result = render( - <Footer currentStep={2} isGenerating={false} hasCelInput={false} isNextStepEnabled />, - { - wrapper, - } - ); - }); - - describe('when next button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-nextButton').click(); - }); - }); - - it('should set step 3', () => { - expect(mockActions.setStep).toHaveBeenCalledWith(3); - }); - - it('should report telemetry', () => { - expect(mockReportEvent).toHaveBeenCalledWith( - TelemetryEventType.IntegrationAssistantStepComplete, - { - sessionId: expect.any(String), - step: 2, - stepName: 'Integration Step', - durationMs: expect.any(Number), - sessionElapsedTime: expect.any(Number), - } - ); - }); - }); - - describe('when back button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-backButton').click(); - }); - }); - - it('should set step 1', () => { - expect(mockActions.setStep).toHaveBeenCalledWith(1); - }); - }); - }); - - describe('when step is 3', () => { - describe('when it is not generating', () => { - let result: RenderResult; - beforeEach(() => { - result = render( - <Footer currentStep={3} isGenerating={false} hasCelInput={false} isNextStepEnabled />, - { - wrapper, - } - ); - }); - - describe('when next button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-nextButton').click(); - }); - }); - - it('should set step 4', () => { - expect(mockActions.setIsGenerating).toHaveBeenCalledWith(true); - }); - - it('should report telemetry', () => { - expect(mockReportEvent).toHaveBeenCalledWith( - TelemetryEventType.IntegrationAssistantStepComplete, - { - sessionId: expect.any(String), - step: 3, - stepName: 'DataStream Step', - durationMs: expect.any(Number), - sessionElapsedTime: expect.any(Number), - } - ); - }); - }); - - describe('when back button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-backButton').click(); - }); - }); - - it('should set step 2', () => { - expect(mockActions.setStep).toHaveBeenCalledWith(2); - }); - }); - }); - - describe('when it is generating', () => { - let result: RenderResult; - beforeEach(() => { - result = render( - <Footer currentStep={3} isGenerating={true} hasCelInput={false} isNextStepEnabled />, - { - wrapper, - } - ); - }); - - it('should render the loader', () => { - expect(result.queryByTestId('generatingLoader')).toBeInTheDocument(); - }); - }); - }); - - describe('when step is 4', () => { - let result: RenderResult; - beforeEach(() => { - result = render( - <Footer currentStep={4} isGenerating={false} hasCelInput={false} isNextStepEnabled />, - { - wrapper, - } - ); - }); - - describe('when next button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-nextButton').click(); - }); - }); - - it('should set step 5', () => { - expect(mockActions.setStep).toHaveBeenCalledWith(5); - }); - - it('should report telemetry', () => { - expect(mockReportEvent).toHaveBeenCalledWith( - TelemetryEventType.IntegrationAssistantStepComplete, - { - sessionId: expect.any(String), - step: 4, - stepName: 'Review Step', - durationMs: expect.any(Number), - sessionElapsedTime: expect.any(Number), - } - ); - }); - }); - - describe('when back button is clicked', () => { - beforeEach(() => { - act(() => { - result.getByTestId('buttonsFooter-backButton').click(); - }); - }); - - it('should set step 3', () => { - expect(mockActions.setStep).toHaveBeenCalledWith(3); - }); - }); - }); - - describe('when next step is disabled', () => { - let result: RenderResult; - beforeEach(() => { - result = render(<Footer currentStep={1} isGenerating={false} hasCelInput={false} />, { - wrapper, - }); - }); - it('should render next button disabled', () => { - expect(result.queryByTestId('buttonsFooter-nextButton')).toBeDisabled(); - }); - }); }); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.tsx index 839d751e6f380..dfd38517e1609 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/footer/footer.tsx @@ -6,13 +6,10 @@ */ import { EuiLoadingSpinner } from '@elastic/eui'; -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { ButtonsFooter } from '../../../../common/components/buttons_footer'; -import { useNavigate, Page } from '../../../../common/hooks/use_navigate'; -import { useTelemetry } from '../../telemetry'; -import { useActions, type State } from '../state'; +import { type State } from '../state'; import * as i18n from './translations'; -import { ExperimentalFeaturesService } from '../../../../services'; // Generation button for Step 3 const AnalyzeButtonText = React.memo<{ isGenerating: boolean }>(({ isGenerating }) => { @@ -43,61 +40,47 @@ const AnalyzeCelButtonText = React.memo<{ isGenerating: boolean }>(({ isGenerati AnalyzeCelButtonText.displayName = 'AnalyzeCelButtonText'; interface FooterProps { - currentStep: State['step']; - isGenerating: State['isGenerating']; - hasCelInput: State['hasCelInput']; + isGenerating?: State['isGenerating']; + isAnalyzeStep?: boolean; + isAnalyzeCelStep?: boolean; + isLastStep?: boolean; isNextStepEnabled?: boolean; + isNextAddingToElastic?: boolean; + onBack?: () => void; + onNext?: () => void; } export const Footer = React.memo<FooterProps>( - ({ currentStep, isGenerating, hasCelInput, isNextStepEnabled = false }) => { - const telemetry = useTelemetry(); - const { setStep, setIsGenerating } = useActions(); - const navigate = useNavigate(); - - const { generateCel: isGenerateCelEnabled } = ExperimentalFeaturesService.get(); - - const onBack = useCallback(() => { - if (currentStep === 1) { - navigate(Page.landing); - } else { - setStep(currentStep - 1); - } - }, [currentStep, navigate, setStep]); - - const onNext = useCallback(() => { - telemetry.reportAssistantStepComplete({ step: currentStep }); - if (currentStep === 3 || currentStep === 5) { - setIsGenerating(true); - } else { - setStep(currentStep + 1); - } - }, [currentStep, setIsGenerating, setStep, telemetry]); - - const nextButtonText = useMemo(() => { - if (currentStep === 3) { - return <AnalyzeButtonText isGenerating={isGenerating} />; - } - if (currentStep === 4 && (!isGenerateCelEnabled || !hasCelInput)) { - return i18n.ADD_TO_ELASTIC; - } - if (currentStep === 5 && isGenerateCelEnabled && hasCelInput) { - return <AnalyzeCelButtonText isGenerating={isGenerating} />; - } - if (currentStep === 6 && isGenerateCelEnabled) { - return i18n.ADD_TO_ELASTIC; - } - }, [currentStep, isGenerating, hasCelInput, isGenerateCelEnabled]); + ({ + isGenerating = false, + isAnalyzeStep = false, + isAnalyzeCelStep = false, + isLastStep = false, + isNextStepEnabled = false, + isNextAddingToElastic = false, + onBack = () => {}, + onNext = () => {}, + }) => { + const nextButtonText = useMemo( + () => + isNextAddingToElastic ? ( + i18n.ADD_TO_ELASTIC + ) : isAnalyzeStep ? ( + <AnalyzeButtonText isGenerating={isGenerating} /> + ) : isAnalyzeCelStep ? ( + <AnalyzeCelButtonText isGenerating={isGenerating} /> + ) : null, + [isNextAddingToElastic, isAnalyzeStep, isGenerating, isAnalyzeCelStep] + ); - if (currentStep === 7 || (currentStep === 5 && (!isGenerateCelEnabled || !hasCelInput))) { - return <ButtonsFooter cancelButtonText={i18n.CLOSE} />; - } - return ( + return isLastStep ? ( + <ButtonsFooter cancelButtonText={i18n.CLOSE} /> + ) : ( <ButtonsFooter - isNextDisabled={!isNextStepEnabled || isGenerating} + nextButtonText={nextButtonText} + isNextDisabled={!isNextStepEnabled} onBack={onBack} onNext={onNext} - nextButtonText={nextButtonText} /> ); } diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/mocks/state.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/mocks/state.ts index c25a78a35416e..bdae762e83c2b 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/mocks/state.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/mocks/state.ts @@ -435,4 +435,5 @@ export const mockActions: Actions = { setHasCelInput: jest.fn(), setResult: jest.fn(), setCelInputResult: jest.fn(), + completeStep: jest.fn(), }; diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/state.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/state.ts index 1e7b22128843b..17ac3bdd9f90f 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/state.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/state.ts @@ -78,6 +78,7 @@ export interface Actions { setHasCelInput: (payload: State['hasCelInput']) => void; setResult: (payload: State['result']) => void; setCelInputResult: (payload: State['celInputResult']) => void; + completeStep: () => void; } const ActionsContext = createContext<Actions | undefined>(undefined); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/cel_input_step.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/cel_input_step.tsx index b0a0b3194ec33..851ea3f7e6a21 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/cel_input_step.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/cel_input_step.tsx @@ -22,7 +22,7 @@ interface CelInputStepProps { export const CelInputStep = React.memo<CelInputStepProps>( ({ integrationSettings, connector, isGenerating }) => { - const { setIsGenerating, setStep, setCelInputResult } = useActions(); + const { setIsGenerating, setStep, setCelInputResult, completeStep } = useActions(); const onGenerationCompleted = useCallback<OnComplete>( (result: State['celInputResult']) => { @@ -43,7 +43,14 @@ export const CelInputStep = React.memo<CelInputStepProps>( <EuiFlexItem> <StepContentWrapper title={i18n.CEL_INPUT_TITLE} subtitle={i18n.CEL_INPUT_DESCRIPTION}> <EuiPanel hasShadow={false} hasBorder> - <EuiForm component="form" fullWidth> + <EuiForm + component="form" + fullWidth + onSubmit={(e) => { + e.preventDefault(); + completeStep(); + }} + > <ApiDefinitionInput integrationSettings={integrationSettings} /> </EuiForm> </EuiPanel> diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/is_step_ready.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/is_step_ready.ts index 594f4230164ce..fa89ccc3882db 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/is_step_ready.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/cel_input_step/is_step_ready.ts @@ -6,7 +6,7 @@ */ import type { State } from '../../state'; -export const isCelInputStepReady = ({ integrationSettings }: State) => +export const isCelInputStepReadyToComplete = ({ integrationSettings }: State) => Boolean( integrationSettings?.name && integrationSettings?.dataStreamTitle && diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_selector.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_selector.tsx index 4ea33cc8668e3..509a9a3058cf0 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_selector.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_selector.tsx @@ -6,12 +6,18 @@ */ import React from 'react'; -import { useEuiTheme, EuiBadge, EuiFlexGroup, EuiFlexItem, EuiPanel, EuiRadio } from '@elastic/eui'; -import { noop } from 'lodash/fp'; +import { + useEuiTheme, + EuiBadge, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiRadio, + EuiFormFieldset, +} from '@elastic/eui'; import { css } from '@emotion/react'; import { useKibana } from '../../../../../common/hooks/use_kibana'; import type { AIConnector } from '../../types'; -import { useActions } from '../../state'; const useRowCss = () => { const { euiTheme } = useEuiTheme(); @@ -36,54 +42,60 @@ const useRowCss = () => { interface ConnectorSelectorProps { connectors: AIConnector[]; selectedConnectorId: string | undefined; + setConnector: (connector: AIConnector | undefined) => void; } export const ConnectorSelector = React.memo<ConnectorSelectorProps>( - ({ connectors, selectedConnectorId }) => { + ({ connectors, setConnector, selectedConnectorId }) => { const { triggersActionsUi: { actionTypeRegistry }, } = useKibana().services; - const { setConnector } = useActions(); const rowCss = useRowCss(); return ( - <EuiFlexGroup - alignItems="stretch" - direction="column" - gutterSize="s" - data-test-subj="connectorSelector" - > - {connectors.map((connector) => ( - <EuiFlexItem key={connector.id}> - <EuiPanel - key={connector.id} - onClick={() => setConnector(connector)} - hasShadow={false} - hasBorder - paddingSize="l" - css={rowCss} - data-test-subj={`connectorSelector-${connector.id}`} - > - <EuiFlexGroup direction="row" alignItems="center" justifyContent="spaceBetween"> - <EuiFlexItem> - <EuiRadio - label={connector.name} - id={connector.id} - checked={selectedConnectorId === connector.id} - onChange={noop} - data-test-subj={`connectorSelectorRadio-${connector.id}${ - selectedConnectorId === connector.id ? '-selected' : '' - }`} - /> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiBadge color="hollow"> - {actionTypeRegistry.get(connector.actionTypeId).actionTypeTitle} - </EuiBadge> - </EuiFlexItem> - </EuiFlexGroup> - </EuiPanel> - </EuiFlexItem> - ))} - </EuiFlexGroup> + <EuiFormFieldset> + <EuiFlexGroup + alignItems="stretch" + direction="column" + gutterSize="s" + data-test-subj="connectorSelector" + > + {connectors.map((connector) => ( + <EuiFlexItem key={connector.id}> + <EuiPanel + element="button" + type="button" // So that the enter button will not submit the form. + role="radio" + key={connector.id} + onClick={() => setConnector(connector)} + hasShadow={false} + hasBorder + paddingSize="l" + css={rowCss} + data-test-subj={`connectorSelector-${connector.id}`} + > + <EuiFlexGroup direction="row" alignItems="center" justifyContent="spaceBetween"> + <EuiFlexItem> + <EuiRadio + label={connector.name} + id={connector.id} + value={connector.id} + checked={selectedConnectorId === connector.id} + onChange={() => setConnector(connector)} + data-test-subj={`connectorSelectorRadio-${connector.id}${ + selectedConnectorId === connector.id ? '-selected' : '' + }`} + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiBadge color="hollow"> + {actionTypeRegistry.get(connector.actionTypeId).actionTypeTitle} + </EuiBadge> + </EuiFlexItem> + </EuiFlexGroup> + </EuiPanel> + </EuiFlexItem> + ))} + </EuiFlexGroup> + </EuiFormFieldset> ); } ); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_step.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_step.tsx index c2643ffa9e92c..8c7fa66795c81 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_step.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/connector_step.tsx @@ -8,6 +8,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import { useLoadConnectors } from '@kbn/elastic-assistant'; import { + EuiForm, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, @@ -42,7 +43,8 @@ interface ConnectorStepProps { export const ConnectorStep = React.memo<ConnectorStepProps>(({ connector }) => { const { euiTheme } = useEuiTheme(); const { http, notifications } = useKibana().services; - const { setConnector } = useActions(); + const { setConnector, completeStep } = useActions(); + const [connectors, setConnectors] = useState<AIConnector[]>(); const { isLoading, @@ -69,41 +71,56 @@ export const ConnectorStep = React.memo<ConnectorStepProps>(({ connector }) => { const hasConnectors = !isLoading && connectors?.length; return ( - <StepContentWrapper - title={i18n.TITLE} - subtitle={i18n.DESCRIPTION} - right={hasConnectors ? <CreateConnectorPopover onConnectorSaved={onConnectorSaved} /> : null} + <EuiForm + component="form" + fullWidth + onSubmit={(e) => { + e.preventDefault(); + completeStep(); + }} > - <EuiFlexGroup direction="column" alignItems="stretch"> - <EuiFlexItem> - {isLoading ? ( - <EuiLoadingSpinner /> - ) : ( - <> - {hasConnectors ? ( - <ConnectorSelector connectors={connectors} selectedConnectorId={connector?.id} /> - ) : ( - <AuthorizationWrapper canCreateConnectors> - <ConnectorSetup - actionTypeIds={AllowedActionTypeIds} - onConnectorSaved={onConnectorSaved} + <StepContentWrapper + title={i18n.TITLE} + subtitle={i18n.DESCRIPTION} + right={ + hasConnectors ? <CreateConnectorPopover onConnectorSaved={onConnectorSaved} /> : null + } + > + <EuiFlexGroup direction="column" alignItems="stretch"> + <EuiFlexItem> + {isLoading ? ( + <EuiLoadingSpinner /> + ) : ( + <> + {hasConnectors ? ( + <ConnectorSelector + connectors={connectors} + setConnector={setConnector} + selectedConnectorId={connector?.id} /> - </AuthorizationWrapper> - )} - </> - )} - </EuiFlexItem> - </EuiFlexGroup> - <EuiSpacer size="m" /> - <EuiText size="s" color="subdued"> - <EuiFlexGroup direction="row" gutterSize="xs" alignItems="flexStart"> - <EuiFlexItem grow={false} css={{ margin: euiTheme.size.xxs }}> - <EuiIcon type="iInCircle" /> + ) : ( + <AuthorizationWrapper canCreateConnectors> + <ConnectorSetup + actionTypeIds={AllowedActionTypeIds} + onConnectorSaved={onConnectorSaved} + /> + </AuthorizationWrapper> + )} + </> + )} </EuiFlexItem> - <EuiFlexItem>{i18n.SUPPORTED_MODELS_INFO}</EuiFlexItem> </EuiFlexGroup> - </EuiText> - </StepContentWrapper> + <EuiSpacer size="m" /> + <EuiText size="s" color="subdued"> + <EuiFlexGroup direction="row" gutterSize="xs" alignItems="flexStart"> + <EuiFlexItem grow={false} css={{ margin: euiTheme.size.xxs }}> + <EuiIcon type="iInCircle" /> + </EuiFlexItem> + <EuiFlexItem>{i18n.SUPPORTED_MODELS_INFO}</EuiFlexItem> + </EuiFlexGroup> + </EuiText> + </StepContentWrapper> + </EuiForm> ); }); ConnectorStep.displayName = 'ConnectorStep'; diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/is_step_ready.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/is_step_ready.ts index 5b425b0940094..cc09cd2a6c87b 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/is_step_ready.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/connector_step/is_step_ready.ts @@ -7,4 +7,4 @@ import type { State } from '../../state'; -export const isConnectorStepReady = ({ connector }: State) => connector != null; +export const isConnectorStepReadyToComplete = ({ connector }: State) => connector != null; diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/data_stream_step.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/data_stream_step.tsx index 4b505fb7062d6..1bd7b92b2e0cb 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/data_stream_step.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/data_stream_step.tsx @@ -53,8 +53,14 @@ interface DataStreamStepProps { } export const DataStreamStep = React.memo<DataStreamStepProps>( ({ integrationSettings, connector, isGenerating }) => { - const { setIntegrationSettings, setIsGenerating, setHasCelInput, setStep, setResult } = - useActions(); + const { + setIntegrationSettings, + setIsGenerating, + setHasCelInput, + setStep, + setResult, + completeStep, + } = useActions(); const { isLoading: isLoadingPackageNames, packageNames } = useLoadPackageNames(); // this is used to avoid duplicate names const [name, setName] = useState<string>(integrationSettings?.name ?? ''); @@ -150,14 +156,21 @@ export const DataStreamStep = React.memo<DataStreamStepProps>( ); return ( - <EuiFlexGroup direction="column" gutterSize="l" data-test-subj="dataStreamStep"> - <EuiFlexItem> - <StepContentWrapper - title={i18n.INTEGRATION_NAME_TITLE} - subtitle={i18n.INTEGRATION_NAME_DESCRIPTION} - > - <EuiPanel hasShadow={false} hasBorder> - <EuiForm component="form" fullWidth> + <EuiForm + component="form" + fullWidth + onSubmit={(e) => { + e.preventDefault(); + completeStep(); + }} + > + <EuiFlexGroup direction="column" gutterSize="l" data-test-subj="dataStreamStep"> + <EuiFlexItem> + <StepContentWrapper + title={i18n.INTEGRATION_NAME_TITLE} + subtitle={i18n.INTEGRATION_NAME_DESCRIPTION} + > + <EuiPanel hasShadow={false} hasBorder> <EuiFormRow label={i18n.INTEGRATION_NAME_LABEL} helpText={ @@ -176,18 +189,16 @@ export const DataStreamStep = React.memo<DataStreamStepProps>( disabled={isLoadingPackageNames} /> </EuiFormRow> - </EuiForm> - </EuiPanel> - </StepContentWrapper> - </EuiFlexItem> + </EuiPanel> + </StepContentWrapper> + </EuiFlexItem> - <EuiFlexItem> - <StepContentWrapper - title={i18n.DATA_STREAM_TITLE} - subtitle={i18n.DATA_STREAM_DESCRIPTION} - > - <EuiPanel hasShadow={false} hasBorder> - <EuiForm component="form" fullWidth> + <EuiFlexItem> + <StepContentWrapper + title={i18n.DATA_STREAM_TITLE} + subtitle={i18n.DATA_STREAM_DESCRIPTION} + > + <EuiPanel hasShadow={false} hasBorder> <EuiFormRow label={i18n.DATA_STREAM_TITLE_LABEL}> <EuiFieldText name="dataStreamTitle" @@ -228,19 +239,19 @@ export const DataStreamStep = React.memo<DataStreamStepProps>( /> </EuiFormRow> <SampleLogsInput integrationSettings={integrationSettings} /> - </EuiForm> - </EuiPanel> - </StepContentWrapper> - {isGenerating && ( - <GenerationModal - integrationSettings={integrationSettings} - connector={connector} - onComplete={onGenerationCompleted} - onClose={onGenerationClosed} - /> - )} - </EuiFlexItem> - </EuiFlexGroup> + </EuiPanel> + </StepContentWrapper> + {isGenerating && ( + <GenerationModal + integrationSettings={integrationSettings} + connector={connector} + onComplete={onGenerationCompleted} + onClose={onGenerationClosed} + /> + )} + </EuiFlexItem> + </EuiFlexGroup> + </EuiForm> ); } ); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/is_step_ready.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/is_step_ready.ts index 4a40334a72ab2..509ee99b4122f 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/is_step_ready.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/data_stream_step/is_step_ready.ts @@ -6,7 +6,7 @@ */ import type { State } from '../../state'; -export const isDataStreamStepReady = ({ integrationSettings }: State) => +export const isDataStreamStepReadyToComplete = ({ integrationSettings }: State) => Boolean( integrationSettings?.name && integrationSettings?.dataStreamTitle && diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/integration_step.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/integration_step.tsx index dc27abd9529cd..928f4db5f065f 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/integration_step.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/integration_step.tsx @@ -51,7 +51,7 @@ interface IntegrationStepProps { export const IntegrationStep = React.memo<IntegrationStepProps>(({ integrationSettings }) => { const styles = useLayoutStyles(); - const { setIntegrationSettings } = useActions(); + const { setIntegrationSettings, completeStep } = useActions(); const [logoError, setLogoError] = React.useState<string>(); const setIntegrationValues = useCallback( @@ -95,7 +95,14 @@ export const IntegrationStep = React.memo<IntegrationStepProps>(({ integrationSe <EuiPanel paddingSize="none" hasShadow={false} hasBorder data-test-subj="integrationStep"> <EuiFlexGroup direction="row" gutterSize="none"> <EuiFlexItem css={styles.left}> - <EuiForm component="form" fullWidth> + <EuiForm + component="form" + fullWidth + onSubmit={(e) => { + e.preventDefault(); + completeStep(); + }} + > <EuiFormRow label={i18n.TITLE_LABEL}> <EuiFieldText name="title" diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/is_step_ready.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/is_step_ready.ts index 80ef605c981b0..4f40641311671 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/is_step_ready.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/integration_step/is_step_ready.ts @@ -7,5 +7,5 @@ import type { State } from '../../state'; -export const isIntegrationStepReady = ({ integrationSettings }: State) => +export const isIntegrationStepReadyToComplete = ({ integrationSettings }: State) => Boolean(integrationSettings?.title && integrationSettings?.description); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/is_step_ready.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/is_step_ready.ts index 166c40e8e2614..902cdea32d5e0 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/is_step_ready.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/is_step_ready.ts @@ -7,5 +7,5 @@ import type { State } from '../../state'; -export const isCelReviewStepReady = ({ isGenerating, celInputResult }: State) => +export const isCelReviewStepReadyToComplete = ({ isGenerating, celInputResult }: State) => isGenerating === false && celInputResult != null; diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/review_cel_step.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/review_cel_step.tsx index a40fec082894e..85b9980a4a5de 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/review_cel_step.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_cel_step/review_cel_step.tsx @@ -4,9 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { EuiLoadingSpinner, EuiPanel } from '@elastic/eui'; +import { EuiForm, EuiLoadingSpinner, EuiPanel } from '@elastic/eui'; import React from 'react'; -import type { State } from '../../state'; +import { useActions, type State } from '../../state'; import { StepContentWrapper } from '../step_content_wrapper'; import * as i18n from './translations'; import { CelConfigResults } from './cel_config_results'; @@ -17,15 +17,24 @@ interface ReviewCelStepProps { } export const ReviewCelStep = React.memo<ReviewCelStepProps>(({ isGenerating, celInputResult }) => { + const { completeStep } = useActions(); + return ( <StepContentWrapper title={i18n.TITLE} subtitle={i18n.DESCRIPTION}> <EuiPanel hasShadow={false} hasBorder data-test-subj="reviewCelStep"> {isGenerating ? ( <EuiLoadingSpinner size="l" /> ) : ( - <> + <EuiForm + component="form" + fullWidth + onSubmit={(e) => { + e.preventDefault(); + completeStep(); + }} + > <CelConfigResults celInputResult={celInputResult} /> - </> + </EuiForm> )} </EuiPanel> </StepContentWrapper> diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_step/is_step_ready.ts b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_step/is_step_ready.ts index b03215c5e8255..91b9726e03a3e 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_step/is_step_ready.ts +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/steps/review_step/is_step_ready.ts @@ -7,5 +7,5 @@ import type { State } from '../../state'; -export const isReviewStepReady = ({ isGenerating, result }: State) => +export const isReviewStepReadyToComplete = ({ isGenerating, result }: State) => isGenerating === false && result != null; diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/telemetry.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/telemetry.tsx index 39076726b7f9d..04d8a07cd1288 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/telemetry.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/telemetry.tsx @@ -15,20 +15,12 @@ import type { IntegrationSettings, } from './create_integration_assistant/types'; -const stepNames: Record<string, string> = { - '1': 'Connector Step', - '2': 'Integration Step', - '3': 'DataStream Step', - '4': 'Review Step', - '5': 'Deploy Step', -}; - type ReportUploadZipIntegrationComplete = (params: { integrationName?: string; error?: string; }) => void; type ReportAssistantOpen = () => void; -type ReportAssistantStepComplete = (params: { step: number }) => void; +type ReportAssistantStepComplete = (params: { step: number; stepName: string }) => void; type ReportGenerationComplete = (params: { connector: AIConnector; integrationSettings: IntegrationSettings; @@ -92,11 +84,11 @@ export const TelemetryContextProvider = React.memo<PropsWithChildren<{}>>(({ chi }, [telemetry]); const reportAssistantStepComplete = useCallback<ReportAssistantStepComplete>( - ({ step }) => { + ({ step, stepName }) => { telemetry.reportEvent(TelemetryEventType.IntegrationAssistantStepComplete, { sessionId: sessionData.current.sessionId, step, - stepName: stepNames[step.toString()] ?? 'Unknown Step', + stepName, durationMs: Date.now() - stepsData.current.startedAt, sessionElapsedTime: Date.now() - sessionData.current.startedAt, }); diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index cf76df44eefc0..c673c48db6c82 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -17,6 +17,8 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { DataViewPickerProps } from '@kbn/unified-search-plugin/public'; import { getManagedContentBadge } from '@kbn/managed-content-badge'; import moment from 'moment'; +import { EuiCallOut } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; import { LENS_APP_LOCATOR } from '../../common/locator/locator'; import { LENS_APP_NAME } from '../../common/constants'; import { LensAppServices, LensTopNavActions, LensTopNavMenuProps } from './types'; @@ -641,6 +643,26 @@ export const LensTopNavMenu = ({ title: i18n.translate('xpack.lens.app.shareModal.title', { defaultMessage: 'Share this Lens visualization', }), + config: { + link: { + draftModeCallOut: ( + <EuiCallOut + color="warning" + title={ + <FormattedMessage + id="xpack.lens.app.shareModal.draftModeCallout.title" + defaultMessage="Unsaved changes" + /> + } + > + <FormattedMessage + id="xpack.lens.app.shareModal.draftModeCallout.link.warning" + defaultMessage="The copied link resolves to the current state of this visualization. To get a permanent link, make sure to save your Lens visualization first." + /> + </EuiCallOut> + ), + }, + }, }, sharingData, // only want to know about changes when savedObjectURL.href diff --git a/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.test.ts b/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.test.ts index 8719c54f6f1dd..d677e052ae451 100644 --- a/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.test.ts +++ b/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.test.ts @@ -8,11 +8,10 @@ import { getColorMappingTelemetryEvents } from './color_telemetry_helpers'; import { ColorMapping, - EUIAmsterdamColorBlindPalette, - ElasticBrandPalette, DEFAULT_COLOR_MAPPING_CONFIG, DEFAULT_OTHER_ASSIGNMENT_INDEX, } from '@kbn/coloring'; +import { KbnPalette } from '@kbn/palettes'; import { faker } from '@faker-js/faker'; const exampleAssignment = ( @@ -24,7 +23,7 @@ const exampleAssignment = ( type === 'categorical' ? { type: 'categorical', - paletteId: ElasticBrandPalette.id, + paletteId: KbnPalette.ElasticClassic, colorIndex: 0, } : { @@ -57,13 +56,13 @@ const MANUAL_COLOR_MAPPING_CONFIG: ColorMapping.Config = { }, color: { type: 'categorical', - paletteId: ElasticBrandPalette.id, + paletteId: KbnPalette.ElasticClassic, colorIndex: 2, }, touched: true, }, ], - paletteId: ElasticBrandPalette.id, + paletteId: KbnPalette.ElasticClassic, colorMode: { type: 'categorical', }, @@ -74,7 +73,7 @@ const specialAssignmentsPalette: ColorMapping.Config['specialAssignments'] = [ ...DEFAULT_COLOR_MAPPING_CONFIG.specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX], color: { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Kibana7, colorIndex: 0, }, }, @@ -112,7 +111,7 @@ describe('color_telemetry_helpers', () => { }); it('settings (default): unassigned terms loop, default palette returns correct events', () => { expect(getColorMappingTelemetryEvents(DEFAULT_COLOR_MAPPING_CONFIG)).toEqual([ - 'color_mapping_palette_eui_amsterdam_color_blind', + 'color_mapping_palette_default', 'color_mapping_unassigned_terms_loop', ]); }); @@ -126,7 +125,7 @@ describe('color_telemetry_helpers', () => { steps: [ { type: 'categorical', - paletteId: EUIAmsterdamColorBlindPalette.id, + paletteId: KbnPalette.Kibana7, colorIndex: 0, touched: false, }, diff --git a/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.ts b/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.ts index 049caea8fb12e..4f956e54c47f6 100644 --- a/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.ts +++ b/x-pack/plugins/lens/public/lens_ui_telemetry/color_telemetry_helpers.ts @@ -5,8 +5,9 @@ * 2.0. */ -import { ColorMapping, NeutralPalette, DEFAULT_OTHER_ASSIGNMENT_INDEX } from '@kbn/coloring'; +import { ColorMapping, DEFAULT_OTHER_ASSIGNMENT_INDEX } from '@kbn/coloring'; import { isEqual } from 'lodash'; +import { KbnPalette } from '@kbn/palettes'; import { nonNullable } from '../utils'; const COLOR_MAPPING_PREFIX = 'color_mapping_'; @@ -83,8 +84,8 @@ const getUnassignedTermsType = ( : specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX]?.color.type === 'loop' ? 'loop' : specialAssignments[DEFAULT_OTHER_ASSIGNMENT_INDEX]?.color.paletteId === - NeutralPalette.id - ? NeutralPalette.id + KbnPalette.Neutral + ? KbnPalette.Neutral : 'palette' }` : undefined; diff --git a/x-pack/plugins/lens/public/react_embeddable/data_loader.ts b/x-pack/plugins/lens/public/react_embeddable/data_loader.ts index 64b7ca4501b08..ac69b79b42230 100644 --- a/x-pack/plugins/lens/public/react_embeddable/data_loader.ts +++ b/x-pack/plugins/lens/public/react_embeddable/data_loader.ts @@ -6,8 +6,7 @@ */ import type { DefaultInspectorAdapters } from '@kbn/expressions-plugin/common'; -import { fetch$, type FetchContext } from '@kbn/presentation-publishing'; -import { apiPublishesSearchSession } from '@kbn/presentation-publishing/interfaces/fetch/publishes_search_session'; +import { apiPublishesUnifiedSearch, fetch$ } from '@kbn/presentation-publishing'; import { type KibanaExecutionContext } from '@kbn/core/public'; import { BehaviorSubject, @@ -21,6 +20,7 @@ import { map, } from 'rxjs'; import fastIsEqual from 'fast-deep-equal'; +import { pick } from 'lodash'; import { getEditPath } from '../../common/constants'; import type { GetStateType, @@ -54,6 +54,24 @@ type ReloadReason = | 'viewMode' | 'searchContext'; +function getSearchContext(parentApi: unknown) { + const unifiedSearch$ = apiPublishesUnifiedSearch(parentApi) + ? pick(parentApi, 'filters$', 'query$', 'timeslice$', 'timeRange$') + : { + filters$: new BehaviorSubject(undefined), + query$: new BehaviorSubject(undefined), + timeslice$: new BehaviorSubject(undefined), + timeRange$: new BehaviorSubject(undefined), + }; + + return { + filters: unifiedSearch$.filters$.getValue(), + query: unifiedSearch$.query$.getValue(), + timeRange: unifiedSearch$.timeRange$.getValue(), + timeslice: unifiedSearch$.timeslice$?.getValue(), + }; +} + /** * The function computes the expression used to render the panel and produces the necessary props * for the ExpressionWrapper component, binding any outer context to them. @@ -112,16 +130,6 @@ export function loadEmbeddableData( } }; - const unifiedSearch$ = new BehaviorSubject< - Pick<FetchContext, 'query' | 'filters' | 'timeRange' | 'timeslice' | 'searchSessionId'> - >({ - query: undefined, - filters: undefined, - timeRange: undefined, - timeslice: undefined, - searchSessionId: undefined, - }); - async function reload( // make reload easier to debug sourceId: ReloadReason @@ -142,8 +150,6 @@ export function loadEmbeddableData( const currentState = getState(); - const { searchSessionId, ...unifiedSearch } = unifiedSearch$.getValue(); - const getExecutionContext = () => { const parentContext = getParentContext(parentApi); const lastState = getState(); @@ -198,7 +204,7 @@ export function loadEmbeddableData( const searchContext = getMergedSearchContext( currentState, - unifiedSearch, + getSearchContext(parentApi), api.timeRange$, parentApi, services @@ -216,7 +222,7 @@ export function loadEmbeddableData( }, renderMode: getRenderMode(parentApi), services, - searchSessionId, + searchSessionId: api.searchSessionId$.getValue(), abortController: internalApi.expressionAbortController$.getValue(), getExecutionContext, logError: getLogError(getExecutionContext), @@ -259,20 +265,8 @@ export function loadEmbeddableData( } const mergedSubscriptions = merge( - // on data change from the parentApi, reload - fetch$(api).pipe( - tap((data) => { - const searchSessionId = apiPublishesSearchSession(parentApi) ? data.searchSessionId : ''; - unifiedSearch$.next({ - query: data.query, - filters: data.filters, - timeRange: data.timeRange, - timeslice: data.timeslice, - searchSessionId, - }); - }), - map(() => 'searchContext' as ReloadReason) - ), + // on search context change, reload + fetch$(api).pipe(map(() => 'searchContext' as ReloadReason)), // On state change, reload // this is used to refresh the chart on inline editing // just make sure to avoid to rerender if there's no substantial change diff --git a/x-pack/plugins/lens/public/react_embeddable/mocks/index.tsx b/x-pack/plugins/lens/public/react_embeddable/mocks/index.tsx index ca8f489a711aa..30a0920f9557d 100644 --- a/x-pack/plugins/lens/public/react_embeddable/mocks/index.tsx +++ b/x-pack/plugins/lens/public/react_embeddable/mocks/index.tsx @@ -116,6 +116,7 @@ const LensApiMock: LensApi = { disabledActionIds: new BehaviorSubject<string[] | undefined>(undefined), setDisabledActionIds: jest.fn(), rendered$: new BehaviorSubject<boolean>(false), + searchSessionId$: new BehaviorSubject<string | undefined>(undefined), }; const LensSerializedStateMock: LensSerializedState = createEmptyLensState( diff --git a/x-pack/plugins/lens/public/react_embeddable/renderer/lens_custom_renderer_component.tsx b/x-pack/plugins/lens/public/react_embeddable/renderer/lens_custom_renderer_component.tsx index eab54a7fa9f9d..70d59fc7486b2 100644 --- a/x-pack/plugins/lens/public/react_embeddable/renderer/lens_custom_renderer_component.tsx +++ b/x-pack/plugins/lens/public/react_embeddable/renderer/lens_custom_renderer_component.tsx @@ -59,6 +59,7 @@ export function LensRenderer({ filters, timeRange, disabledActions, + searchSessionId, hidePanelTitles, ...props }: LensRendererProps) { @@ -72,6 +73,7 @@ export function LensRenderer({ }, []); const disabledActionIds$ = useObservableVariable(disabledActions); const viewMode$ = useObservableVariable(viewMode); + const searchSessionId$ = useObservableVariable(searchSessionId); const hidePanelTitles$ = useObservableVariable(hidePanelTitles); // Lens API will be set once, but when set trigger a reflow to adopt the latest attributes @@ -136,6 +138,7 @@ export function LensRenderer({ ...props, // forward the unified search context ...searchApi, + searchSessionId$, disabledActionIds: disabledActionIds$, setDisabledActionIds: (ids: string[] | undefined) => disabledActionIds$.next(ids), viewMode: viewMode$, diff --git a/x-pack/plugins/lens/public/react_embeddable/types.ts b/x-pack/plugins/lens/public/react_embeddable/types.ts index c860c543570c1..1a4bf45b11f17 100644 --- a/x-pack/plugins/lens/public/react_embeddable/types.ts +++ b/x-pack/plugins/lens/public/react_embeddable/types.ts @@ -65,6 +65,7 @@ import type { AllowedPartitionOverrides } from '@kbn/expression-partition-vis-pl import type { AllowedXYOverrides } from '@kbn/expression-xy-plugin/common'; import type { Action } from '@kbn/ui-actions-plugin/public'; import { PresentationContainer } from '@kbn/presentation-containers'; +import { PublishesSearchSession } from '@kbn/presentation-publishing/interfaces/fetch/publishes_search_session'; import type { LegacyMetricState } from '../../common'; import type { LensDocument } from '../persistence'; import type { LensInspector } from '../lens_inspector_service'; @@ -364,6 +365,8 @@ export type LensApi = Simplify< PublishesBlockingError & // This is used by dashboard/container to show filters/queries on the panel PublishesUnifiedSearch & + // Forward the search session id + PublishesSearchSession & // Let the container know the loading state PublishesDataLoading & // Let the container know when the rendering has completed rendering diff --git a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.test.ts b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.test.ts index 139c6ced456bc..6ddbaff8d7b60 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.test.ts +++ b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { getKbnPalettes } from '@kbn/palettes'; import { getColorAccessorFn } from './color_mapping_accessor'; jest.mock('@kbn/coloring', () => ({ @@ -15,8 +16,10 @@ jest.mock('@kbn/coloring', () => ({ })); describe('getColorAccessorFn', () => { + const palettes = getKbnPalettes({ name: 'amsterdam', darkMode: false }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any - const getColorAccessor = getColorAccessorFn('{}', {} as any, false); + const getColorAccessor = getColorAccessorFn(palettes, '{}', {} as any, false); it('should return null for null values', () => { expect(getColorAccessor(null)).toBe(null); diff --git a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.ts b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.ts index 116b21bb2245d..7e3d076744d64 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.ts +++ b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_accessor.ts @@ -5,29 +5,20 @@ * 2.0. */ -import { - AVAILABLE_PALETTES, - getColorFactory, - getPalette, - NeutralPalette, - ColorMappingInputCategoricalData, -} from '@kbn/coloring'; +import { getColorFactory, ColorMappingInputCategoricalData } from '@kbn/coloring'; +import { KbnPalettes } from '@kbn/palettes'; import { CellColorFn } from './get_cell_color_fn'; /** * Return a color accessor function for XY charts depending on the split accessors received. */ export function getColorAccessorFn( + palettes: KbnPalettes, colorMapping: string, data: ColorMappingInputCategoricalData, isDarkMode: boolean ): CellColorFn { - const getColor = getColorFactory( - JSON.parse(colorMapping), - getPalette(AVAILABLE_PALETTES, NeutralPalette), - isDarkMode, - data - ); + const getColor = getColorFactory(JSON.parse(colorMapping), palettes, isDarkMode, data); return (value) => { if (value === undefined || value === null) return null; diff --git a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_terms.tsx b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_terms.tsx index 1eec5a4093275..ffc23d68bc54a 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_terms.tsx +++ b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_terms.tsx @@ -21,21 +21,22 @@ import { DEFAULT_COLOR_MAPPING_CONFIG, CategoricalColorMapping, SPECIAL_TOKENS_STRING_CONVERSION, - AVAILABLE_PALETTES, PaletteOutput, PaletteRegistry, CustomPaletteParams, } from '@kbn/coloring'; import { i18n } from '@kbn/i18n'; +import { KbnPalettes } from '@kbn/palettes'; import { trackUiCounterEvents } from '../../lens_ui_telemetry'; import { PalettePicker } from '../palette_picker'; import { PalettePanelContainer } from './palette_panel_container'; -import { getColorStops } from './utils'; +import { getPaletteDisplayColors } from './utils'; interface ColorMappingByTermsProps { isDarkMode: boolean; colorMapping?: ColorMapping.Config; palette?: PaletteOutput<CustomPaletteParams>; + palettes: KbnPalettes; isInlineEditing?: boolean; setPalette: (palette: PaletteOutput) => void; setColorMapping: (colorMapping?: ColorMapping.Config) => void; @@ -48,6 +49,7 @@ export function ColorMappingByTerms({ isDarkMode, colorMapping, palette, + palettes, isInlineEditing, setPalette, setColorMapping, @@ -67,7 +69,13 @@ export function ColorMappingByTerms({ fullWidth > <PalettePanelContainer - palette={getColorStops(paletteService, isDarkMode, palette, colorMapping)} + palette={getPaletteDisplayColors( + paletteService, + palettes, + isDarkMode, + palette, + colorMapping + )} siblingRef={panelRef} title={ useNewColorMapping @@ -119,7 +127,7 @@ export function ColorMappingByTerms({ model={colorMapping ?? { ...DEFAULT_COLOR_MAPPING_CONFIG }} onModelUpdate={setColorMapping} specialTokens={SPECIAL_TOKENS_STRING_CONVERSION} - palettes={AVAILABLE_PALETTES} + palettes={palettes} data={{ type: 'categories', categories, diff --git a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_values.tsx b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_values.tsx index 9e18f6ae149a8..d599062204794 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_values.tsx +++ b/x-pack/plugins/lens/public/shared_components/coloring/color_mapping_by_values.tsx @@ -24,7 +24,7 @@ interface ColorMappingByValuesProps { setPalette: (palette: PaletteOutput<CustomPaletteParams>) => void; paletteService: PaletteRegistry; panelRef: MutableRefObject<HTMLDivElement | null>; - dataBounds?: DataBounds; + dataBounds: DataBounds; } export function ColorMappingByValues<T>({ diff --git a/x-pack/plugins/lens/public/shared_components/coloring/get_cell_color_fn.ts b/x-pack/plugins/lens/public/shared_components/coloring/get_cell_color_fn.ts index bb7e25220f793..f2db77f41b103 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/get_cell_color_fn.ts +++ b/x-pack/plugins/lens/public/shared_components/coloring/get_cell_color_fn.ts @@ -12,12 +12,14 @@ import { getSpecialString, } from '@kbn/coloring'; import { CustomPaletteState } from '@kbn/charts-plugin/common'; +import { KbnPalettes } from '@kbn/palettes'; import { getColorAccessorFn } from './color_mapping_accessor'; export type CellColorFn = (value?: number | string | null) => string | null; export function getCellColorFn( paletteService: PaletteRegistry, + palettes: KbnPalettes, data: ColorMappingInputData, colorByTerms: boolean, isDarkMode: boolean, @@ -37,7 +39,7 @@ export function getCellColorFn( if (colorByTerms && data.type === 'categories') { if (colorMapping) { - return getColorAccessorFn(colorMapping, data, isDarkMode); + return getColorAccessorFn(palettes, colorMapping, data, isDarkMode); } else if (palette) { return (category) => { if (category === undefined || category === null) return null; diff --git a/x-pack/plugins/lens/public/shared_components/coloring/utils.test.ts b/x-pack/plugins/lens/public/shared_components/coloring/utils.test.ts index cc6044fc0f624..27f17f3c72c66 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/utils.test.ts +++ b/x-pack/plugins/lens/public/shared_components/coloring/utils.test.ts @@ -5,53 +5,7 @@ * 2.0. */ -import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; -import { - applyPaletteParams, - findMinMaxByColumnId, - getContrastColor, - shouldColorByTerms, -} from './utils'; - -describe('applyPaletteParams', () => { - const paletteRegistry = chartPluginMock.createPaletteRegistry(); - it('should return a palette stops array only by the name', () => { - expect( - applyPaletteParams( - paletteRegistry, - { name: 'default', type: 'palette', params: { name: 'default' } }, - { min: 0, max: 100 } - ) - ).toEqual([ - // stops are 0 and 50 by with a 20 offset (100 divided by 5 steps) for display - // the mock palette service has only 2 colors so tests are a bit off by that - { color: 'red', stop: 20 }, - { color: 'black', stop: 70 }, - ]); - }); - - it('should return a palette stops array reversed', () => { - expect( - applyPaletteParams( - paletteRegistry, - { name: 'default', type: 'palette', params: { name: 'default', reverse: true } }, - { min: 0, max: 100 } - ) - ).toEqual([ - { color: 'black', stop: 20 }, - { color: 'red', stop: 70 }, - ]); - }); - - it('should pick the default palette from the activePalette object when passed', () => { - expect( - applyPaletteParams(paletteRegistry, { name: 'mocked', type: 'palette' }, { min: 0, max: 100 }) - ).toEqual([ - { color: 'blue', stop: 20 }, - { color: 'yellow', stop: 70 }, - ]); - }); -}); +import { findMinMaxByColumnId, getContrastColor, shouldColorByTerms } from './utils'; describe('getContrastColor', () => { it('should pick the light color when the passed one is dark', () => { diff --git a/x-pack/plugins/lens/public/shared_components/coloring/utils.ts b/x-pack/plugins/lens/public/shared_components/coloring/utils.ts index ae797c1daa6c6..711342c8e5d65 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/utils.ts +++ b/x-pack/plugins/lens/public/shared_components/coloring/utils.ts @@ -23,24 +23,26 @@ import { } from '@kbn/coloring'; import { getOriginalId } from '@kbn/transpose-utils'; import { Datatable, DatatableColumnType } from '@kbn/expressions-plugin/common'; +import { KbnPalettes } from '@kbn/palettes'; import { DataType } from '../../types'; /** * Returns array of colors for provided palette or colorMapping */ -export function getColorStops( +export function getPaletteDisplayColors( paletteService: PaletteRegistry, + palettes: KbnPalettes, isDarkMode: boolean, palette?: PaletteOutput<CustomPaletteParams>, colorMapping?: ColorMapping.Config ): string[] { return colorMapping - ? getColorsFromMapping(isDarkMode, colorMapping) + ? getColorsFromMapping(palettes, isDarkMode, colorMapping) : palette?.name === CUSTOM_PALETTE ? palette?.params?.stops?.map(({ color }) => color) ?? [] : paletteService .get(palette?.name || DEFAULT_FALLBACK_PALETTE) - .getCategoricalColors(10, palette); + .getCategoricalColors(palette?.params?.steps || 10, palette); } /** diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.test.tsx index 738f7edab2a6e..ee8566df52ff0 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.test.tsx @@ -20,6 +20,7 @@ import { ColumnState } from '../../../../common/expressions'; import { capitalize } from 'lodash'; import { I18nProvider } from '@kbn/i18n-react'; import { DatatableColumnType } from '@kbn/expressions-plugin/common'; +import { getKbnPalettes } from '@kbn/palettes'; describe('data table dimension editor', () => { let user: UserEvent; @@ -89,6 +90,7 @@ describe('data table dimension editor', () => { setState: jest.fn(), isDarkMode: false, paletteService: chartPluginMock.createPaletteRegistry(), + palettes: getKbnPalettes({ name: 'amsterdam', darkMode: false }), panelRef: React.createRef(), addLayer: jest.fn(), removeLayer: jest.fn(), diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx index c67cf3cdb9b1a..90c644555d6f6 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx @@ -8,15 +8,22 @@ import React, { useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiSwitch, EuiButtonGroup, htmlIdGenerator } from '@elastic/eui'; -import { PaletteRegistry, getFallbackDataBounds } from '@kbn/coloring'; +import { + CUSTOM_PALETTE, + CustomPaletteParams, + PaletteOutput, + PaletteRegistry, + applyPaletteParams, + getFallbackDataBounds, +} from '@kbn/coloring'; import { getColorCategories } from '@kbn/chart-expressions-common'; import { useDebouncedValue } from '@kbn/visualization-utils'; import { getOriginalId } from '@kbn/transpose-utils'; +import { KbnPalettes } from '@kbn/palettes'; import type { VisualizationDimensionEditorProps } from '../../../types'; import type { DatatableVisualizationState } from '../visualization'; import { - applyPaletteParams, defaultPaletteParams, findMinMaxByColumnId, shouldColorByTerms, @@ -54,6 +61,7 @@ function updateColumn( export type TableDimensionEditorProps = VisualizationDimensionEditorProps<DatatableVisualizationState> & { paletteService: PaletteRegistry; + palettes: KbnPalettes; isDarkMode: boolean; }; @@ -99,14 +107,24 @@ export function TableDimensionEditor(props: TableDimensionEditorProps) { const minMaxByColumnId = findMinMaxByColumnId(columnsToCheck, currentData); const currentMinMax = minMaxByColumnId.get(accessor) ?? getFallbackDataBounds(); - const activePalette = column?.palette ?? { + const activePalette: PaletteOutput<CustomPaletteParams> = { type: 'palette', name: showColorByTerms ? 'default' : defaultPaletteParams.name, + ...column?.palette, + params: { ...column?.palette?.params }, }; // need to tell the helper that the colorStops are required to display const displayStops = applyPaletteParams(props.paletteService, activePalette, currentMinMax); const categories = getColorCategories(currentData?.rows ?? [], accessor, false, [null]); + if (activePalette.name !== CUSTOM_PALETTE && activePalette.params?.stops) { + activePalette.params.stops = applyPaletteParams( + props.paletteService, + activePalette, + currentMinMax + ); + } + return ( <> <EuiFormRow @@ -225,6 +243,7 @@ export function TableDimensionEditor(props: TableDimensionEditorProps) { isDarkMode={isDarkMode} colorMapping={column.colorMapping} palette={activePalette} + palettes={props.palettes} isInlineEditing={isInlineEditing} setPalette={(palette) => { updateColumnState(accessor, { palette }); diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx index f30686a44a6ad..dc6f818eb3519 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx @@ -33,6 +33,8 @@ import { IconChartDatatable } from '@kbn/chart-icons'; import useObservable from 'react-use/lib/useObservable'; import { getColorCategories } from '@kbn/chart-expressions-common'; import { getOriginalId, isTransposeId } from '@kbn/transpose-utils'; +import { CoreTheme } from '@kbn/core/public'; +import { getKbnPalettes } from '@kbn/palettes'; import type { LensTableRowContextMenuEvent } from '../../../types'; import type { FormatFactory } from '../../../../common/types'; import { RowHeightMode } from '../../../../common/types'; @@ -81,10 +83,11 @@ export const DatatableComponent = (props: DatatableRenderProps) => { const dataGridRef = useRef<EuiDataGridRefProps>(null); const isInteractive = props.interactive; - const isDarkMode = useObservable(props.theme.theme$, { + const theme = useObservable<CoreTheme>(props.theme.theme$, { darkMode: false, name: 'amsterdam', - }).darkMode; + }); + const palettes = getKbnPalettes(theme); const [columnConfig, setColumnConfig] = useState({ columns: props.args.columns, @@ -420,9 +423,10 @@ export const DatatableComponent = (props: DatatableRenderProps) => { }; const colorFn = getCellColorFn( props.paletteService, + palettes, data, colorByTerms, - isDarkMode, + theme.darkMode, syncColors, palette, colorMapping @@ -436,16 +440,17 @@ export const DatatableComponent = (props: DatatableRenderProps) => { formatters, columnConfig, DataContext, - isDarkMode, + theme.darkMode, getCellColor, props.args.fitRowToContent ); }, [ formatters, columnConfig, - isDarkMode, + theme.darkMode, props.args.fitRowToContent, props.paletteService, + palettes, firstLocalTable, bucketedColumns, minMaxByColumnId, diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx index 9a94e458c667c..218aa875a3756 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx @@ -27,13 +27,13 @@ import { DatatableColumnFn, DatatableExpressionFunction, } from '../../../common/expressions'; -import { getColorStops } from '../../shared_components/coloring'; +import { getPaletteDisplayColors } from '../../shared_components/coloring'; import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks'; jest.mock('../../shared_components/coloring', () => { return { ...jest.requireActual('../../shared_components/coloring'), - getColorStops: jest.fn().mockReturnValue([]), + getPaletteDisplayColors: jest.fn().mockReturnValue([]), }; }); @@ -438,7 +438,7 @@ describe('Datatable Visualization', () => { let params: VisualizationConfigProps<DatatableVisualizationState>; beforeEach(() => { - (getColorStops as jest.Mock).mockReturnValue(mockStops); + (getPaletteDisplayColors as jest.Mock).mockReturnValue(mockStops); }); describe('rows', () => { @@ -483,7 +483,7 @@ describe('Datatable Visualization', () => { it.each<ColumnState['colorMode']>(['cell', 'text'])( 'should not include palette if colorMode is %s but stops is empty', (colorMode) => { - (getColorStops as jest.Mock).mockReturnValue([]); + (getPaletteDisplayColors as jest.Mock).mockReturnValue([]); params.state.columns[0].colorMode = colorMode; expect(datatableVisualization.getConfiguration(params).groups[0].accessors).toEqual([ { columnId: 'b' }, @@ -532,7 +532,7 @@ describe('Datatable Visualization', () => { it.each<ColumnState['colorMode']>(['cell', 'text'])( 'should not include palette if colorMode is %s but stops is empty', (colorMode) => { - (getColorStops as jest.Mock).mockReturnValue([]); + (getPaletteDisplayColors as jest.Mock).mockReturnValue([]); params.state.columns[0].colorMode = colorMode; expect(datatableVisualization.getConfiguration(params).groups[2].accessors).toEqual([ { columnId: 'b' }, diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx index efe5a39458eed..23d8d432ce2d6 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx @@ -8,8 +8,15 @@ import React from 'react'; import { Ast } from '@kbn/interpreter'; import { i18n } from '@kbn/i18n'; -import { PaletteRegistry, CUSTOM_PALETTE, PaletteOutput, CustomPaletteParams } from '@kbn/coloring'; -import { ThemeServiceStart } from '@kbn/core/public'; +import { CoreTheme, ThemeServiceStart } from '@kbn/core/public'; +import { + PaletteRegistry, + CUSTOM_PALETTE, + PaletteOutput, + CustomPaletteParams, + applyPaletteParams, + getOverridePaletteStops, +} from '@kbn/coloring'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { IconChartDatatable } from '@kbn/chart-icons'; import { getOriginalId } from '@kbn/transpose-utils'; @@ -17,6 +24,7 @@ import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { buildExpression, buildExpressionFunction } from '@kbn/expressions-plugin/common'; import useObservable from 'react-use/lib/useObservable'; import { getSortingCriteria } from '@kbn/sort-predicates'; +import { getKbnPalettes } from '@kbn/palettes'; import type { FormBasedPersistedState } from '../../datasources/form_based/types'; import type { SuggestionRequest, @@ -45,10 +53,9 @@ import { DEFAULT_ROW_HEIGHT, } from './components/constants'; import { - applyPaletteParams, defaultPaletteParams, findMinMaxByColumnId, - getColorStops, + getPaletteDisplayColors, shouldColorByTerms, } from '../../shared_components'; import { getColorMappingTelemetryEvents } from '../../lens_ui_telemetry/color_telemetry_helpers'; @@ -268,7 +275,9 @@ export const getDatatableVisualization = ({ on the Metric dimension in cases where there are no numeric columns **/ getConfiguration({ state, frame }) { - const isDarkMode = kibanaTheme.getTheme().darkMode; + const theme = kibanaTheme.getTheme(); + const palettes = getKbnPalettes(theme); + const { sortedColumns, datasource } = getDatasourceAndSortedColumns( state, frame.datasourceLayers @@ -320,7 +329,13 @@ export const getDatatableVisualization = ({ hidden, collapseFn, } = columnMap[accessor] ?? {}; - const stops = getColorStops(paletteService, isDarkMode, palette, colorMapping); + const stops = getPaletteDisplayColors( + paletteService, + palettes, + theme.darkMode, + palette, + colorMapping + ); const hasColoring = colorMode !== 'none' && stops.length > 0; return { @@ -407,7 +422,13 @@ export const getDatatableVisualization = ({ colorMapping, hidden, } = columnMap[accessor] ?? {}; - const stops = getColorStops(paletteService, isDarkMode, palette, colorMapping); + const stops = getPaletteDisplayColors( + paletteService, + palettes, + theme.darkMode, + palette, + colorMapping + ); const hasColoring = colorMode !== 'none' && stops.length > 0; return { @@ -465,13 +486,19 @@ export const getDatatableVisualization = ({ }; }, DimensionEditorComponent(props) { - const isDarkMode = useObservable(kibanaTheme.theme$, { + const theme = useObservable<CoreTheme>(kibanaTheme.theme$, { darkMode: false, name: 'amsterdam', - }).darkMode; + }); + const palettes = getKbnPalettes(theme); return ( - <TableDimensionEditor {...props} isDarkMode={isDarkMode} paletteService={paletteService} /> + <TableDimensionEditor + {...props} + isDarkMode={theme.darkMode} + palettes={palettes} + paletteService={paletteService} + /> ); }, @@ -556,13 +583,14 @@ export const getDatatableVisualization = ({ columns: columns .filter((c) => !c.collapseFn) .map((column) => { + const stops = getOverridePaletteStops(paletteService, column.palette); const paletteParams = { ...column.palette?.params, // rewrite colors and stops as two distinct arguments - colors: (column.palette?.params?.stops || []).map(({ color }) => color), + colors: stops?.map(({ color }) => color), stops: column.palette?.params?.name === RowHeightMode.custom - ? (column.palette?.params?.stops || []).map(({ stop }) => stop) + ? stops?.map(({ stop }) => stop) : [], reverse: false, // managed at UI level }; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx index fdbe6913d21c9..8c1d3bd96f2d3 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx @@ -8,12 +8,17 @@ import { EuiFormRow, EuiSwitchEvent, EuiSwitch, EuiIcon } from '@elastic/eui'; import React from 'react'; import { i18n } from '@kbn/i18n'; -import { PaletteRegistry, CustomizablePalette, CUSTOM_PALETTE } from '@kbn/coloring'; +import { + PaletteRegistry, + CustomizablePalette, + CUSTOM_PALETTE, + applyPaletteParams, +} from '@kbn/coloring'; import { GaugeTicksPositions, GaugeColorModes } from '@kbn/expression-gauge-plugin/common'; import { getMaxValue, getMinValue } from '@kbn/expression-gauge-plugin/public'; import { TooltipWrapper } from '@kbn/visualization-utils'; import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; -import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; +import { PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; import type { GaugeVisualizationState } from './constants'; import { defaultPaletteParams } from './palette_config'; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/index.ts b/x-pack/plugins/lens/public/visualizations/gauge/index.ts index 870b4f3b6b586..a08d6d43097e7 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/index.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/index.ts @@ -8,7 +8,6 @@ import type { CoreSetup } from '@kbn/core/public'; import type { ChartsPluginSetup } from '@kbn/charts-plugin/public'; import type { EditorFrameSetup } from '../../types'; -import { transparentizePalettes } from './palette_config'; export interface GaugeVisualizationPluginSetupPlugins { editorFrame: EditorFrameSetup; @@ -19,8 +18,8 @@ export class GaugeVisualization { setup(core: CoreSetup, { editorFrame, charts }: GaugeVisualizationPluginSetupPlugins) { editorFrame.registerVisualization(async () => { const { getGaugeVisualization } = await import('../../async_services'); - const palettes = transparentizePalettes(await charts.palettes.getPalettes()); - return getGaugeVisualization({ paletteService: palettes, theme: core.theme }); + const palettes = await charts.palettes.getPalettes(); + return getGaugeVisualization({ paletteService: palettes }); }); } } diff --git a/x-pack/plugins/lens/public/visualizations/gauge/palette_config.test.ts b/x-pack/plugins/lens/public/visualizations/gauge/palette_config.test.ts deleted file mode 100644 index f144a2f9f87f4..0000000000000 --- a/x-pack/plugins/lens/public/visualizations/gauge/palette_config.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { transparentizePalettes } from './palette_config'; -import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; - -const paletteServiceMock = chartPluginMock.createPaletteRegistry(); - -describe('transparentizePalettes', () => { - it('converts all colors to half-transparent', () => { - const newPalettes = transparentizePalettes(paletteServiceMock); - - const singlePalette = newPalettes.get('mocked'); - expect(singlePalette.getCategoricalColors(2)).toEqual(['#0000FF80', '#FFFF0080']); - expect( - singlePalette.getCategoricalColor([ - { - name: 'abc', - rankAtDepth: 0, - totalSeriesAtDepth: 5, - }, - ]) - ).toEqual('#0000FF80'); - - const firstPalette = newPalettes.getAll()[0]; - expect(firstPalette.getCategoricalColors(2)).toEqual(['#FF000080', '#00000080']); - expect( - firstPalette.getCategoricalColor([ - { - name: 'abc', - rankAtDepth: 0, - totalSeriesAtDepth: 5, - }, - ]) - ).toEqual('#00000080'); - }); -}); diff --git a/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx b/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx index a2399c897b39b..3d6bd9c94f01b 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/palette_config.tsx @@ -5,15 +5,8 @@ * 2.0. */ -import { - ChartColorConfiguration, - PaletteDefinition, - PaletteRegistry, - SeriesLayer, - RequiredPaletteParamTypes, -} from '@kbn/coloring'; +import { RequiredPaletteParamTypes } from '@kbn/coloring'; -import chroma from 'chroma-js'; import { defaultPaletteParams as sharedDefaultParams } from '../../shared_components'; export const DEFAULT_PALETTE_NAME = 'temperature'; @@ -29,23 +22,3 @@ export const defaultPaletteParams: RequiredPaletteParamTypes = { steps: DEFAULT_COLOR_STEPS, maxSteps: 5, }; - -export const transparentizePalettes = (palettes: PaletteRegistry) => { - const addAlpha = (c: string | null) => (c ? chroma(c).hex() + `80` : `000000`).toUpperCase(); - const transparentizePalette = (palette: PaletteDefinition<unknown>) => ({ - ...palette, - getCategoricalColor: ( - series: SeriesLayer[], - chartConfiguration?: ChartColorConfiguration, - state?: unknown - ) => addAlpha(palette.getCategoricalColor(series, chartConfiguration, state)), - getCategoricalColors: (size: number, state?: unknown): string[] => - palette.getCategoricalColors(size, state).map(addAlpha), - }); - - return { - ...palettes, - get: (name: string) => transparentizePalette(palettes.get(name)), - getAll: () => palettes.getAll().map((singlePalette) => transparentizePalette(singlePalette)), - }; -}; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts index e5b908a6f4c76..e240b5ef8a51d 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts @@ -13,7 +13,6 @@ import type { DatasourceLayers, OperationDescriptor } from '../../types'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import type { GaugeVisualizationState } from './constants'; -import { themeServiceMock } from '@kbn/core/public/mocks'; function exampleState(): GaugeVisualizationState { return { @@ -25,8 +24,9 @@ function exampleState(): GaugeVisualizationState { }; } -const paletteService = chartPluginMock.createPaletteRegistry(); -const theme = themeServiceMock.createStartContract(); +const deps = { + paletteService: chartPluginMock.createPaletteRegistry(), +}; describe('gauge', () => { let frame: ReturnType<typeof createMockFramePublicAPI>; @@ -37,7 +37,7 @@ describe('gauge', () => { describe('#intialize', () => { test('returns a default state', () => { - expect(getGaugeVisualization({ paletteService, theme }).initialize(() => 'l1')).toEqual({ + expect(getGaugeVisualization(deps).initialize(() => 'l1')).toEqual({ layerId: 'l1', layerType: LayerTypes.DATA, shape: 'horizontalBullet', @@ -47,12 +47,9 @@ describe('gauge', () => { }); test('returns persisted state', () => { - expect( - getGaugeVisualization({ paletteService, theme }).initialize( - () => 'test-layer', - exampleState() - ) - ).toEqual(exampleState()); + expect(getGaugeVisualization(deps).initialize(() => 'test-layer', exampleState())).toEqual( + exampleState() + ); }); }); @@ -89,10 +86,7 @@ describe('gauge', () => { }; expect( - getGaugeVisualization({ - paletteService, - theme, - }).getConfiguration({ state, frame, layerId: 'first' }) + getGaugeVisualization(deps).getConfiguration({ state, frame, layerId: 'first' }) ).toEqual({ groups: [ { @@ -175,10 +169,7 @@ describe('gauge', () => { minAccessor: 'min-accessor', }; expect( - getGaugeVisualization({ - paletteService, - theme, - }).getConfiguration({ state, frame, layerId: 'first' }) + getGaugeVisualization(deps).getConfiguration({ state, frame, layerId: 'first' }) ).toEqual({ groups: [ { @@ -267,10 +258,7 @@ describe('gauge', () => { frame.activeData = undefined; expect( - getGaugeVisualization({ - paletteService, - theme, - }).getConfiguration({ state, frame, layerId: 'first' }) + getGaugeVisualization(deps).getConfiguration({ state, frame, layerId: 'first' }) ).toEqual({ groups: [ { @@ -355,10 +343,7 @@ describe('gauge', () => { maxAccessor: 'max-accessor', }; expect( - getGaugeVisualization({ - paletteService, - theme, - }).setDimension({ + getGaugeVisualization(deps).setDimension({ prevState, layerId: 'first', columnId: 'new-min-accessor', @@ -383,10 +368,7 @@ describe('gauge', () => { }; test('removes metric correctly', () => { expect( - getGaugeVisualization({ - paletteService, - theme, - }).removeDimension({ + getGaugeVisualization(deps).removeDimension({ prevState, layerId: 'first', columnId: 'metric-accessor', @@ -399,10 +381,7 @@ describe('gauge', () => { }); test('removes min correctly', () => { expect( - getGaugeVisualization({ - paletteService, - theme, - }).removeDimension({ + getGaugeVisualization(deps).removeDimension({ prevState, layerId: 'first', columnId: 'min-accessor', @@ -419,12 +398,7 @@ describe('gauge', () => { }); describe('#getSupportedLayers', () => { it('should return a single layer type', () => { - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getSupportedLayers() - ).toHaveLength(1); + expect(getGaugeVisualization(deps).getSupportedLayers()).toHaveLength(1); }); }); describe('#getLayerType', () => { @@ -434,10 +408,7 @@ describe('gauge', () => { minAccessor: 'min-accessor', goalAccessor: 'value-accessor', }; - const instance = getGaugeVisualization({ - paletteService, - theme, - }); + const instance = getGaugeVisualization(deps); expect(instance.getLayerType('test-layer', state)).toEqual(LayerTypes.DATA); expect(instance.getLayerType('foo', state)).toBeUndefined(); }); @@ -465,12 +436,7 @@ describe('gauge', () => { maxAccessor: 'max-accessor', labelMinor: 'Subtitle', }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).toExpression(state, datasourceLayers) - ).toEqual({ + expect(getGaugeVisualization(deps).toExpression(state, datasourceLayers)).toEqual({ type: 'expression', chain: [ { @@ -497,12 +463,7 @@ describe('gauge', () => { layerId: 'first', minAccessor: 'min-accessor', }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).toExpression(state, datasourceLayers) - ).toEqual(null); + expect(getGaugeVisualization(deps).toExpression(state, datasourceLayers)).toEqual(null); }); }); @@ -543,12 +504,8 @@ describe('gauge', () => { }, }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getUserMessages!(localState, { frame }) - ).toMatchInlineSnapshot(` + expect(getGaugeVisualization(deps).getUserMessages!(localState, { frame })) + .toMatchInlineSnapshot(` Array [ Object { "displayLocations": Array [ @@ -587,12 +544,7 @@ describe('gauge', () => { }, }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getUserMessages!(state, { frame }) - ).toHaveLength(0); + expect(getGaugeVisualization(deps).getUserMessages!(state, { frame })).toHaveLength(0); }); it('should warn when minimum value is greater than metric value', () => { frame.activeData = { @@ -610,12 +562,7 @@ describe('gauge', () => { }, }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getUserMessages!(state, { frame }) - ).toHaveLength(1); + expect(getGaugeVisualization(deps).getUserMessages!(state, { frame })).toHaveLength(1); }); it('should warn when metric value is greater than maximum value', () => { @@ -633,12 +580,7 @@ describe('gauge', () => { }, }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getUserMessages!(state, { frame }) - ).toHaveLength(1); + expect(getGaugeVisualization(deps).getUserMessages!(state, { frame })).toHaveLength(1); }); it('should warn when goal value is greater than maximum value', () => { frame.activeData = { @@ -656,12 +598,7 @@ describe('gauge', () => { }, }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getUserMessages!(state, { frame }) - ).toHaveLength(1); + expect(getGaugeVisualization(deps).getUserMessages!(state, { frame })).toHaveLength(1); }); it('should warn when minimum value is greater than goal value', () => { frame.activeData = { @@ -679,12 +616,7 @@ describe('gauge', () => { }, }; - expect( - getGaugeVisualization({ - paletteService, - theme, - }).getUserMessages!(state, { frame }) - ).toHaveLength(1); + expect(getGaugeVisualization(deps).getUserMessages!(state, { frame })).toHaveLength(1); }); }); }); diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx index e1ef2b03e4264..957c1b16cf2b4 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx @@ -7,11 +7,17 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { ThemeServiceStart } from '@kbn/core/public'; import { FormattedMessage } from '@kbn/i18n-react'; import { Ast } from '@kbn/interpreter'; import { buildExpressionFunction, DatatableRow } from '@kbn/expressions-plugin/common'; -import { PaletteRegistry, CustomPaletteParams, CUSTOM_PALETTE } from '@kbn/coloring'; +import { + PaletteRegistry, + CustomPaletteParams, + CUSTOM_PALETTE, + applyPaletteParams, + getOverridePaletteStops, + PaletteOutput, +} from '@kbn/coloring'; import type { GaugeExpressionFunctionDefinition, GaugeShape, @@ -37,7 +43,6 @@ import type { import { getSuggestions } from './suggestions'; import { GROUP_ID, LENS_GAUGE_ID, GaugeVisualizationState } from './constants'; import { GaugeToolbar } from './toolbar_component'; -import { applyPaletteParams } from '../../shared_components'; import { GaugeDimensionEditor } from './dimension_editor'; import { generateId } from '../../id_generator'; import { getAccessorsFromState } from './utils'; @@ -52,7 +57,6 @@ import { interface GaugeVisualizationDeps { paletteService: PaletteRegistry; - theme: ThemeServiceStart; } export const isNumericMetric = (op: OperationMetadata) => @@ -61,12 +65,17 @@ export const isNumericMetric = (op: OperationMetadata) => export const isNumericDynamicMetric = (op: OperationMetadata) => isNumericMetric(op) && !op.isStaticValue; -function computePaletteParams(params: CustomPaletteParams) { +function computePaletteParams( + paletteService: PaletteRegistry, + palette: PaletteOutput<CustomPaletteParams> +) { + const stops = getOverridePaletteStops(paletteService, palette); + return { - ...params, + ...palette.params, // rewrite colors and stops as two distinct arguments - colors: (params?.stops || []).map(({ color }) => color), - stops: params?.name === 'custom' ? (params?.stops || []).map(({ stop }) => stop) : [], + colors: stops?.map(({ color }) => color), + stops: palette.params?.name === 'custom' ? stops?.map(({ stop }) => stop) : [], reverse: false, // managed at UI level }; } @@ -144,7 +153,9 @@ const toExpression = ( shape: state.shape ?? GaugeShapes.HORIZONTAL_BULLET, colorMode: state?.colorMode ?? 'none', palette: state.palette?.params - ? paletteService.get(CUSTOM_PALETTE).toExpression(computePaletteParams(state.palette.params)) + ? paletteService + .get(CUSTOM_PALETTE) + .toExpression(computePaletteParams(paletteService, state.palette)) : undefined, ticksPosition: state.ticksPosition ?? 'auto', labelMinor: state.labelMinor, diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/utils.ts b/x-pack/plugins/lens/public/visualizations/heatmap/utils.ts index fe942dd40427c..66b2a10295016 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/utils.ts +++ b/x-pack/plugins/lens/public/visualizations/heatmap/utils.ts @@ -5,9 +5,9 @@ * 2.0. */ -import type { PaletteRegistry } from '@kbn/coloring'; +import { applyPaletteParams, type PaletteRegistry } from '@kbn/coloring'; import type { Datatable } from '@kbn/expressions-plugin/common'; -import { applyPaletteParams, findMinMaxByColumnId } from '../../shared_components'; +import { findMinMaxByColumnId } from '../../shared_components'; import { DEFAULT_PALETTE_NAME } from './constants'; import type { HeatmapVisualizationState, Palette } from './types'; diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx b/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx index 1fb747427a05d..4dfb17241866f 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx @@ -11,7 +11,13 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { Ast } from '@kbn/interpreter'; import { Position } from '@elastic/charts'; import { IconChartHeatmap } from '@kbn/chart-icons'; -import { CUSTOM_PALETTE, PaletteRegistry, CustomPaletteParams } from '@kbn/coloring'; +import { + CUSTOM_PALETTE, + PaletteRegistry, + CustomPaletteParams, + PaletteOutput, + getOverridePaletteStops, +} from '@kbn/coloring'; import { ThemeServiceStart } from '@kbn/core/public'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; @@ -88,12 +94,17 @@ function getInitialState(): Omit<HeatmapVisualizationState, 'layerId' | 'layerTy }; } -function computePaletteParams(params: CustomPaletteParams) { +function computePaletteParams( + paletteService: PaletteRegistry, + palette: PaletteOutput<CustomPaletteParams> +) { + const stops = getOverridePaletteStops(paletteService, palette); + return { - ...params, + ...palette.params, // rewrite colors and stops as two distinct arguments - colors: (params?.stops || []).map(({ color }) => color), - stops: params?.name === 'custom' ? (params?.stops || []).map(({ stop }) => stop) : [], + colors: stops?.map(({ color }) => color), + stops: palette.params?.name === 'custom' ? stops?.map(({ stop }) => stop) : [], reverse: false, // managed at UI level }; } @@ -349,7 +360,7 @@ export const getHeatmapVisualization = ({ palette: state.palette?.params ? paletteService .get(CUSTOM_PALETTE) - .toExpression(computePaletteParams(state.palette?.params)) + .toExpression(computePaletteParams(paletteService, state.palette)) : paletteService.get(DEFAULT_PALETTE_NAME).toExpression(), legend: buildExpression([legendFn]), gridConfig: buildExpression([gridConfigFn]), @@ -407,7 +418,7 @@ export const getHeatmapVisualization = ({ palette: state.palette?.params ? paletteService .get(CUSTOM_PALETTE) - .toExpression(computePaletteParams(state.palette?.params)) + .toExpression(computePaletteParams(paletteService, state.palette)) : paletteService.get(DEFAULT_PALETTE_NAME).toExpression(), }); diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/legacy_metric/dimension_editor.tsx index c6eccd9a70727..552b5f0a52a3f 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/dimension_editor.tsx @@ -5,13 +5,18 @@ * 2.0. */ import { EuiButtonGroup, EuiFormRow, htmlIdGenerator } from '@elastic/eui'; -import { PaletteRegistry, CustomizablePalette, CUSTOM_PALETTE } from '@kbn/coloring'; +import { + PaletteRegistry, + CustomizablePalette, + CUSTOM_PALETTE, + applyPaletteParams, +} from '@kbn/coloring'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { ColorMode } from '@kbn/charts-plugin/common'; import type { LegacyMetricState } from '../../../common/types'; import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; -import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; +import { PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; import { defaultPaletteParams } from './palette_config'; @@ -54,7 +59,7 @@ export function MetricDimensionEditor( }; // need to tell the helper that the colorStops are required to display - const displayStops = applyPaletteParams(props.paletteService, activePalette, currentMinMax); + const stops = applyPaletteParams(props.paletteService, activePalette, currentMinMax); return ( <> @@ -109,7 +114,7 @@ export function MetricDimensionEditor( // align this initial computation with same format for default // palettes in the panel. This to avoid custom computation issue with metric // fake data range - stops: displayStops.map((v, i, array) => ({ + stops: stops.map((v, i, array) => ({ ...v, stop: currentMinMax.min + (i === 0 ? 0 : array[i - 1].stop), })), @@ -137,7 +142,7 @@ export function MetricDimensionEditor( })} > <PalettePanelContainer - palette={displayStops.map(({ color }) => color)} + palette={stops.map(({ color }) => color)} siblingRef={props.panelRef} isInlineEditing={isInlineEditing} title={i18n.translate('xpack.lens.paletteMetricGradient.label', { diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/index.ts b/x-pack/plugins/lens/public/visualizations/legacy_metric/index.ts index 933bf4dab6ae8..a624172264442 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/index.ts +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/index.ts @@ -20,9 +20,9 @@ export class LegacyMetricVisualization { const { getLegacyMetricVisualization: getMetricVisualization } = await import( '../../async_services' ); - const palettes = await charts.palettes.getPalettes(); + const paletteService = await charts.palettes.getPalettes(); - return getMetricVisualization({ paletteService: palettes, theme: core.theme }); + return getMetricVisualization({ paletteService }); }); } } diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.test.ts index d6a70ddbe7114..faf50074ee8f3 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.test.ts @@ -13,7 +13,7 @@ import { generateId } from '../../id_generator'; import { DatasourcePublicAPI, FramePublicAPI } from '../../types'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { ColorMode } from '@kbn/charts-plugin/common'; -import { themeServiceMock } from '@kbn/core/public/mocks'; +import { CUSTOM_PALETTE } from '@kbn/coloring'; jest.mock('../../id_generator'); @@ -37,7 +37,6 @@ function mockFrame(): FramePublicAPI { const metricVisualization = getLegacyMetricVisualization({ paletteService: chartPluginMock.createPaletteRegistry(), - theme: themeServiceMock.createStartContract(), }); describe('metric_visualization', () => { @@ -128,7 +127,13 @@ describe('metric_visualization', () => { layerType: LayerTypes.DATA, palette: { type: 'palette', - name: 'status', + name: CUSTOM_PALETTE, + params: { + stops: [ + { color: 'blue', stop: 0 }, + { color: 'yellow', stop: 100 }, + ], + }, }, }, layerId: 'l1', @@ -138,7 +143,7 @@ describe('metric_visualization', () => { groups: [ expect.objectContaining({ accessors: expect.arrayContaining([ - { columnId: 'a', triggerIconType: 'colorBy', palette: [] }, + { columnId: 'a', triggerIconType: 'colorBy', palette: ['blue', 'yellow'] }, ]), }), ], diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.tsx b/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.tsx index 35983e52f80da..74f1642cb0965 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/visualization.tsx @@ -7,8 +7,13 @@ import { i18n } from '@kbn/i18n'; import { euiThemeVars } from '@kbn/ui-theme'; import { Ast } from '@kbn/interpreter'; -import { PaletteOutput, PaletteRegistry, CUSTOM_PALETTE, shiftPalette } from '@kbn/coloring'; -import { ThemeServiceStart } from '@kbn/core/public'; +import { + PaletteOutput, + PaletteRegistry, + CUSTOM_PALETTE, + shiftPalette, + getOverridePaletteStops, +} from '@kbn/coloring'; import { ColorMode, CustomPaletteState } from '@kbn/charts-plugin/common'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { IconChartMetric } from '@kbn/chart-icons'; @@ -65,7 +70,7 @@ const toExpression = ( const datasourceExpression = datasourceExpressionsByLayers[state.layerId]; const operation = datasource && datasource.getOperationForColumnId(state.accessor); - const stops = state.palette?.params?.stops || []; + const stops = getOverridePaletteStops(paletteService, state.palette) ?? []; const isCustomPalette = state.palette?.params?.name === CUSTOM_PALETTE; const canColor = operation?.dataType === 'number'; @@ -150,10 +155,8 @@ const toExpression = ( export const getLegacyMetricVisualization = ({ paletteService, - theme, }: { paletteService: PaletteRegistry; - theme: ThemeServiceStart; }): Visualization<LegacyMetricState> => ({ id: 'lnsLegacyMetric', @@ -215,7 +218,8 @@ export const getLegacyMetricVisualization = ({ getConfiguration(props) { const hasColoring = props.state.palette != null; - const stops = props.state.palette?.params?.stops || []; + const stops = getOverridePaletteStops(paletteService, props.state.palette); + return { groups: [ { @@ -236,7 +240,7 @@ export const getLegacyMetricVisualization = ({ { columnId: props.state.accessor, triggerIconType: hasColoring ? 'colorBy' : undefined, - palette: hasColoring ? stops.map(({ color }) => color) : undefined, + palette: hasColoring ? stops?.map(({ color }) => color) : undefined, }, ] : [], @@ -314,7 +318,7 @@ export const getLegacyMetricVisualization = ({ } const hasColoring = state.palette != null; - const stops = state.palette?.params?.stops || []; + const stops = getOverridePaletteStops(paletteService, state.palette); return { layers: [ @@ -324,7 +328,7 @@ export const getLegacyMetricVisualization = ({ chartType: 'metric', ...this.getDescription(state), dimensions, - palette: hasColoring ? stops.map(({ color }) => color) : undefined, + palette: hasColoring ? stops?.map(({ color }) => color) : undefined, }, ], }; diff --git a/x-pack/plugins/lens/public/visualizations/metric/__snapshots__/visualization.test.ts.snap b/x-pack/plugins/lens/public/visualizations/metric/__snapshots__/visualization.test.ts.snap index 2490904751e8c..6306758e256f0 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/__snapshots__/visualization.test.ts.snap +++ b/x-pack/plugins/lens/public/visualizations/metric/__snapshots__/visualization.test.ts.snap @@ -7,7 +7,10 @@ Object { "accessors": Array [ Object { "columnId": "metric-col-id", - "palette": Array [], + "palette": Array [ + "blue", + "yellow", + ], "triggerIconType": "colorBy", }, ], diff --git a/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx index 78fcd67f36431..5d98be54e23ed 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx @@ -24,6 +24,7 @@ import { CustomizablePalette, DEFAULT_MAX_STOP, DEFAULT_MIN_STOP, + applyPaletteParams, } from '@kbn/coloring'; import { getDataBoundsForPalette } from '@kbn/expression-metric-vis-plugin/public'; import { getColumnByAccessor } from '@kbn/visualizations-plugin/common/utils'; @@ -31,7 +32,7 @@ import { css } from '@emotion/react'; import { DebouncedInput, IconSelect } from '@kbn/visualization-ui-components'; import { useDebouncedValue } from '@kbn/visualization-utils'; import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; -import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; +import { PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; import { defaultNumberPaletteParams, defaultPercentagePaletteParams } from './palette_config'; import { DEFAULT_MAX_COLUMNS, getDefaultColor, showingBar } from './visualization'; diff --git a/x-pack/plugins/lens/public/visualizations/metric/to_expression.ts b/x-pack/plugins/lens/public/visualizations/metric/to_expression.ts index 02292a4ddce0a..09e1de6192472 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/to_expression.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/to_expression.ts @@ -5,7 +5,13 @@ * 2.0. */ -import { CustomPaletteParams, CUSTOM_PALETTE, PaletteRegistry } from '@kbn/coloring'; +import { + CustomPaletteParams, + CUSTOM_PALETTE, + PaletteRegistry, + PaletteOutput, + getOverridePaletteStops, +} from '@kbn/coloring'; import type { TrendlineExpressionFunctionDefinition, MetricVisExpressionFunctionDefinition, @@ -23,12 +29,17 @@ import { MetricVisualizationState } from './types'; import { metricStateDefaults } from './constants'; // TODO - deduplicate with gauges? -function computePaletteParams(params: CustomPaletteParams) { +function computePaletteParams( + paletteService: PaletteRegistry, + palette: PaletteOutput<CustomPaletteParams> +) { + const stops = getOverridePaletteStops(paletteService, palette); + return { - ...params, + ...palette.params, // rewrite colors and stops as two distinct arguments - colors: (params?.stops || []).map(({ color }) => color), - stops: params?.name === 'custom' ? (params?.stops || []).map(({ stop }) => stop) : [], + colors: stops?.map(({ color }) => color), + stops: palette.params?.name === 'custom' ? stops?.map(({ stop }) => stop) : [], reverse: false, // managed at UI level }; } @@ -162,7 +173,7 @@ export const toExpression = ( ? [ paletteService .get(CUSTOM_PALETTE) - .toExpression(computePaletteParams(state.palette.params as CustomPaletteParams)), + .toExpression(computePaletteParams(paletteService, state.palette)), ] : [], maxCols: state.maxCols ?? DEFAULT_MAX_COLUMNS, diff --git a/x-pack/plugins/lens/public/visualizations/metric/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/metric/visualization.test.ts index e4011ca8431a3..a696ab47a4871 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/visualization.test.ts @@ -6,7 +6,7 @@ */ import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; -import { CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; +import { CUSTOM_PALETTE, CustomPaletteParams, PaletteOutput } from '@kbn/coloring'; import { ExpressionAstExpression, ExpressionAstFunction } from '@kbn/expressions-plugin/common'; import { euiLightVars, euiThemeVars } from '@kbn/ui-theme'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; @@ -36,9 +36,13 @@ describe('metric visualization', () => { const palette: PaletteOutput<CustomPaletteParams> = { type: 'palette', - name: 'foo', + name: CUSTOM_PALETTE, params: { rangeType: 'percent', + stops: [ + { color: 'blue', stop: 0 }, + { color: 'yellow', stop: 100 }, + ], }, }; @@ -133,7 +137,10 @@ describe('metric visualization', () => { Array [ Object { "columnId": "metric-col-id", - "palette": Array [], + "palette": Array [ + "blue", + "yellow", + ], "triggerIconType": "colorBy", }, ] @@ -183,7 +190,10 @@ describe('metric visualization', () => { Array [ Object { "columnId": "metric-col-id", - "palette": Array [], + "palette": Array [ + "blue", + "yellow", + ], "triggerIconType": "colorBy", }, ] diff --git a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx index 6d3bd42f26cfa..eb16bd36e683e 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { PaletteRegistry } from '@kbn/coloring'; +import { PaletteRegistry, getOverridePaletteStops } from '@kbn/coloring'; import { ThemeServiceStart } from '@kbn/core/public'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { euiLightVars, euiThemeVars } from '@kbn/ui-theme'; @@ -60,6 +60,7 @@ export const metricLabel = i18n.translate('xpack.lens.metric.label', { }); const getMetricLayerConfiguration = ( + paletteService: PaletteRegistry, props: VisualizationConfigProps<MetricVisualizationState> ): { groups: VisualizationDimensionGroupConfig[]; @@ -73,17 +74,20 @@ const getMetricLayerConfiguration = ( const getPrimaryAccessorDisplayConfig = (): Partial<AccessorConfig> => { const hasDynamicColoring = Boolean(isMetricNumeric && props.state.palette); - const stops = props.state.palette?.params?.stops || []; - return hasDynamicColoring - ? { - triggerIconType: 'colorBy', - palette: stops.map(({ color }) => color), - } - : { - triggerIconType: 'color', - color: props.state.color ?? getDefaultColor(props.state, isMetricNumeric), - }; + if (hasDynamicColoring) { + const stops = getOverridePaletteStops(paletteService, props.state.palette); + + return { + triggerIconType: 'colorBy', + palette: stops?.map(({ color }) => color), + }; + } + + return { + triggerIconType: 'color', + color: props.state.color ?? getDefaultColor(props.state, isMetricNumeric), + }; }; const isBucketed = (op: OperationMetadata) => op.isBucketed; @@ -354,7 +358,7 @@ export const getMetricVisualization = ({ getConfiguration(props) { return props.layerId === props.state.layerId - ? getMetricLayerConfiguration(props) + ? getMetricLayerConfiguration(paletteService, props) : getTrendlineLayerConfiguration(props); }, diff --git a/x-pack/plugins/lens/public/visualizations/partition/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/partition/dimension_editor.tsx index 32f8f2e4c972a..21cd550d4f53d 100644 --- a/x-pack/plugins/lens/public/visualizations/partition/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/partition/dimension_editor.tsx @@ -14,17 +14,20 @@ import { PaletteRegistry, ColorMapping, SPECIAL_TOKENS_STRING_CONVERSION, - AVAILABLE_PALETTES, - getColorsFromMapping, } from '@kbn/coloring'; import { ColorPicker } from '@kbn/visualization-ui-components'; import { useDebouncedValue } from '@kbn/visualization-utils'; import { EuiFormRow, EuiFlexGroup, EuiFlexItem, EuiSwitch, EuiText, EuiBadge } from '@elastic/eui'; import { useState, useCallback } from 'react'; import { getColorCategories } from '@kbn/chart-expressions-common'; +import { KbnPalette, KbnPalettes } from '@kbn/palettes'; import { PieVisualizationState } from '../../../common/types'; import { VisualizationDimensionEditorProps } from '../../types'; -import { PalettePanelContainer, PalettePicker } from '../../shared_components'; +import { + PalettePanelContainer, + PalettePicker, + getPaletteDisplayColors, +} from '../../shared_components'; import { CollapseSetting } from '../../shared_components/collapse_setting'; import { getDefaultColorForMultiMetricDimension, @@ -35,6 +38,7 @@ import { trackUiCounterEvents } from '../../lens_ui_telemetry'; type DimensionEditorProps = VisualizationDimensionEditorProps<PieVisualizationState> & { paletteService: PaletteRegistry; + palettes: KbnPalettes; isDarkMode: boolean; }; @@ -118,7 +122,13 @@ export function DimensionEditor(props: DimensionEditorProps) { }) : undefined; - const colors = getColorsFromMapping(props.isDarkMode, currentLayer.colorMapping); + const colors = getPaletteDisplayColors( + props.paletteService, + props.palettes, + props.isDarkMode, + props.state.palette, + currentLayer.colorMapping + ); const table = props.frame.activeData?.[currentLayer.layerId]; const splitCategories = getColorCategories(table?.rows ?? [], props.accessor); @@ -183,7 +193,7 @@ export function DimensionEditor(props: DimensionEditorProps) { isDarkMode={props.isDarkMode} model={currentLayer.colorMapping ?? { ...DEFAULT_COLOR_MAPPING_CONFIG }} onModelUpdate={(model: ColorMapping.Config) => setColorMapping(model)} - palettes={AVAILABLE_PALETTES} + palettes={props.palettes} data={{ type: 'categories', categories: splitCategories, @@ -209,6 +219,7 @@ export function DimensionEditor(props: DimensionEditorProps) { {showColorPicker && ( <ColorPicker {...props} + swatches={props.palettes.get(KbnPalette.Default).colors(10)} overwriteColor={currentLayer.colorsByDimension?.[props.accessor]} defaultColor={getDefaultColorForMultiMetricDimension({ layer: currentLayer, diff --git a/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx b/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx index 8d44fec4e96e4..b564f6dbd7d4d 100644 --- a/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx @@ -14,13 +14,14 @@ import { PaletteRegistry, getColorsFromMapping, } from '@kbn/coloring'; -import { ThemeServiceStart } from '@kbn/core/public'; +import { CoreTheme, ThemeServiceStart } from '@kbn/core/public'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { EuiSpacer } from '@elastic/eui'; import { PartitionVisConfiguration } from '@kbn/visualizations-plugin/common/convert_to_lens'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { AccessorConfig } from '@kbn/visualization-ui-components'; import useObservable from 'react-use/lib/useObservable'; +import { getKbnPalettes } from '@kbn/palettes'; import type { FormBasedPersistedState } from '../../datasources/form_based/types'; import type { Visualization, @@ -201,8 +202,10 @@ export const getPieVisualization = ({ kibanaTheme.theme$ .subscribe({ next(theme) { + const palettes = getKbnPalettes(theme); + colors = state.layers[0]?.colorMapping - ? getColorsFromMapping(theme.darkMode, state.layers[0].colorMapping) + ? getColorsFromMapping(palettes, theme.darkMode, state.layers[0].colorMapping) : paletteService .get(state.palette?.name || 'default') .getCategoricalColors(10, state.palette?.params); @@ -494,11 +497,19 @@ export const getPieVisualization = ({ }; }, DimensionEditorComponent(props) { - const isDarkMode = useObservable(kibanaTheme.theme$, { + const theme = useObservable<CoreTheme>(kibanaTheme.theme$, { darkMode: false, name: 'amsterdam', - }).darkMode; - return <DimensionEditor {...props} paletteService={paletteService} isDarkMode={isDarkMode} />; + }); + const palettes = getKbnPalettes(theme); + return ( + <DimensionEditor + {...props} + paletteService={paletteService} + palettes={palettes} + isDarkMode={theme.darkMode} + /> + ); }, DimensionEditorDataExtraComponent(props) { return <DimensionDataExtraEditor {...props} paletteService={paletteService} />; diff --git a/x-pack/plugins/lens/public/visualizations/tagcloud/tagcloud_visualization.tsx b/x-pack/plugins/lens/public/visualizations/tagcloud/tagcloud_visualization.tsx index b457926fe373d..16ba1ecf61b75 100644 --- a/x-pack/plugins/lens/public/visualizations/tagcloud/tagcloud_visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/tagcloud/tagcloud_visualization.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { ThemeServiceStart } from '@kbn/core/public'; +import { CoreTheme, ThemeServiceStart } from '@kbn/core/public'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import type { ExpressionTagcloudFunctionDefinition } from '@kbn/expression-tagcloud-plugin/common'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; @@ -20,6 +20,7 @@ import { PaletteRegistry, getColorsFromMapping } from '@kbn/coloring'; import { IconChartTagcloud } from '@kbn/chart-icons'; import { SystemPaletteExpressionFunctionDefinition } from '@kbn/charts-plugin/common'; import useObservable from 'react-use/lib/useObservable'; +import { getKbnPalettes } from '@kbn/palettes'; import type { OperationMetadata, Visualization } from '../..'; import { getColorMappingDefaults } from '../../utils'; import type { TagcloudState } from './types'; @@ -122,7 +123,8 @@ export const getTagcloudVisualization = ({ kibanaTheme.theme$ .subscribe({ next(theme) { - colors = getColorsFromMapping(theme.darkMode, state.colorMapping); + const palettes = getKbnPalettes(theme); + colors = getColorsFromMapping(palettes, theme.darkMode, state.colorMapping); }, }) .unsubscribe(); @@ -294,15 +296,18 @@ export const getTagcloudVisualization = ({ }, DimensionEditorComponent(props) { - const isDarkMode: boolean = useObservable(kibanaTheme.theme$, { + const theme = useObservable<CoreTheme>(kibanaTheme.theme$, { darkMode: false, name: 'amsterdam', - }).darkMode; + }); + const palettes = getKbnPalettes(theme); + if (props.groupId === TAG_GROUP_ID) { return ( <TagsDimensionEditor - isDarkMode={isDarkMode} + isDarkMode={theme.darkMode} paletteService={paletteService} + palettes={palettes} state={props.state} setState={props.setState} frame={props.frame} diff --git a/x-pack/plugins/lens/public/visualizations/tagcloud/tags_dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/tagcloud/tags_dimension_editor.tsx index 4e28701fd677a..5dea1057c3712 100644 --- a/x-pack/plugins/lens/public/visualizations/tagcloud/tags_dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/tagcloud/tags_dimension_editor.tsx @@ -13,21 +13,25 @@ import { ColorMapping, SPECIAL_TOKENS_STRING_CONVERSION, PaletteOutput, - AVAILABLE_PALETTES, - getColorsFromMapping, } from '@kbn/coloring'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFlexItem, EuiSwitch, EuiFormRow, EuiText, EuiBadge } from '@elastic/eui'; import { useState, MutableRefObject, useCallback } from 'react'; import { useDebouncedValue } from '@kbn/visualization-utils'; import { getColorCategories } from '@kbn/chart-expressions-common'; +import { KbnPalettes } from '@kbn/palettes'; import type { TagcloudState } from './types'; -import { PalettePanelContainer, PalettePicker } from '../../shared_components'; +import { + PalettePanelContainer, + PalettePicker, + getPaletteDisplayColors, +} from '../../shared_components'; import { FramePublicAPI } from '../../types'; import { trackUiCounterEvents } from '../../lens_ui_telemetry'; interface Props { paletteService: PaletteRegistry; + palettes: KbnPalettes; state: TagcloudState; setState: (state: TagcloudState) => void; frame: FramePublicAPI; @@ -42,6 +46,7 @@ export function TagsDimensionEditor({ setState, panelRef, isDarkMode, + palettes, paletteService, isInlineEditing, }: Props) { @@ -52,7 +57,13 @@ export function TagsDimensionEditor({ }); const [useNewColorMapping, setUseNewColorMapping] = useState(state.colorMapping ? true : false); - const colors = getColorsFromMapping(isDarkMode, state.colorMapping); + const colors = getPaletteDisplayColors( + paletteService, + palettes, + isDarkMode, + state.palette, + state.colorMapping + ); const table = frame.activeData?.[state.layerId]; const splitCategories = getColorCategories(table?.rows ?? [], state.tagAccessor); @@ -136,7 +147,7 @@ export function TagsDimensionEditor({ isDarkMode={isDarkMode} model={state.colorMapping ?? { ...DEFAULT_COLOR_MAPPING_CONFIG }} onModelUpdate={(model: ColorMapping.Config) => setColorMapping(model)} - palettes={AVAILABLE_PALETTES} + palettes={palettes} data={{ type: 'categories', categories: splitCategories, diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx index e2c6ce25bd2e3..ecb3c16fb6dda 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx @@ -224,7 +224,7 @@ describe('xy_visualization', () => { "colorMode": Object { "type": "categorical", }, - "paletteId": "eui_amsterdam_color_blind", + "paletteId": "default", "specialAssignments": Array [ Object { "color": Object { diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index a01c26ece9c13..ceba71c4d4f35 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import type { PaletteRegistry } from '@kbn/coloring'; import { IconChartBarReferenceLine, IconChartBarAnnotations } from '@kbn/chart-icons'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; -import { CoreStart, SavedObjectReference, ThemeServiceStart } from '@kbn/core/public'; +import { CoreStart, CoreTheme, SavedObjectReference, ThemeServiceStart } from '@kbn/core/public'; import { EventAnnotationServiceType } from '@kbn/event-annotation-plugin/public'; import { getAnnotationAccessor } from '@kbn/event-annotation-components'; import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; @@ -29,6 +29,7 @@ import { getColorsFromMapping } from '@kbn/coloring'; import useObservable from 'react-use/lib/useObservable'; import { EuiPopover, EuiSelectable } from '@elastic/eui'; import { ToolbarButton } from '@kbn/shared-ux-button-toolbar'; +import { getKbnPalettes } from '@kbn/palettes'; import { generateId } from '../../id_generator'; import { isDraggedDataViewField, @@ -466,14 +467,14 @@ export const getXyVisualization = ({ kibanaTheme.theme$ .subscribe({ next(theme) { - colors = getColorsFromMapping(theme.darkMode, layer.colorMapping); + const palettes = getKbnPalettes(theme); + colors = getColorsFromMapping(palettes, theme.darkMode, layer.colorMapping); }, }) .unsubscribe(); } else { - colors = paletteService - .get(dataLayer.palette?.name || 'default') - .getCategoricalColors(10, dataLayer.palette?.params); + const palette = paletteService.get(dataLayer.palette?.name || 'default'); + colors = palette.getCategoricalColors(10, dataLayer.palette?.params); } return { @@ -742,17 +743,18 @@ export const getXyVisualization = ({ paletteService, }; - const isDarkMode: boolean = useObservable(kibanaTheme.theme$, { + const theme = useObservable<CoreTheme>(kibanaTheme.theme$, { darkMode: false, name: 'amsterdam', - }).darkMode; + }); + const palettes = getKbnPalettes(theme); const layer = props.state.layers.find((l) => l.layerId === props.layerId)!; const dimensionEditor = isReferenceLayer(layer) ? ( - <ReferenceLinePanel {...allProps} /> + <ReferenceLinePanel {...allProps} palettes={palettes} /> ) : isAnnotationsLayer(layer) ? ( <AnnotationsPanel {...allProps} dataViewsService={dataViewsService} /> ) : ( - <DataDimensionEditor {...allProps} isDarkMode={isDarkMode} /> + <DataDimensionEditor {...allProps} palettes={palettes} isDarkMode={theme.darkMode} /> ); return dimensionEditor; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.test.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.test.tsx index 08a83ef7e0176..42224fa5f0506 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.test.tsx @@ -18,6 +18,7 @@ import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { EuiColorPicker } from '@elastic/eui'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { act } from 'react-dom/test-utils'; +import { getKbnPalettes } from '@kbn/palettes'; describe('XY Config panels', () => { let frame: FramePublicAPI; @@ -63,6 +64,7 @@ describe('XY Config panels', () => { }} formatFactory={jest.fn()} paletteService={chartPluginMock.createPaletteRegistry()} + palettes={getKbnPalettes({ name: 'amsterdam', darkMode: false })} panelRef={React.createRef()} addLayer={jest.fn()} removeLayer={jest.fn()} @@ -91,6 +93,7 @@ describe('XY Config panels', () => { state={state} formatFactory={jest.fn()} paletteService={chartPluginMock.createPaletteRegistry()} + palettes={getKbnPalettes({ name: 'amsterdam', darkMode: false })} panelRef={React.createRef()} addLayer={jest.fn()} removeLayer={jest.fn()} @@ -140,6 +143,7 @@ describe('XY Config panels', () => { state={state} formatFactory={jest.fn()} paletteService={chartPluginMock.createPaletteRegistry()} + palettes={getKbnPalettes({ name: 'amsterdam', darkMode: false })} panelRef={React.createRef()} addLayer={jest.fn()} removeLayer={jest.fn()} @@ -186,6 +190,7 @@ describe('XY Config panels', () => { state={state} formatFactory={jest.fn()} paletteService={chartPluginMock.createPaletteRegistry()} + palettes={getKbnPalettes({ name: 'amsterdam', darkMode: false })} panelRef={React.createRef()} addLayer={jest.fn()} removeLayer={jest.fn()} @@ -239,6 +244,7 @@ describe('XY Config panels', () => { state={state} formatFactory={jest.fn()} paletteService={chartPluginMock.createPaletteRegistry()} + palettes={getKbnPalettes({ name: 'amsterdam', darkMode: false })} panelRef={React.createRef()} addLayer={jest.fn()} removeLayer={jest.fn()} @@ -292,6 +298,7 @@ describe('XY Config panels', () => { state={state} formatFactory={jest.fn()} paletteService={chartPluginMock.createPaletteRegistry()} + palettes={getKbnPalettes({ name: 'amsterdam', darkMode: false })} panelRef={React.createRef()} addLayer={jest.fn()} removeLayer={jest.fn()} diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx index f06f2d861d865..994e254bea954 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx @@ -14,6 +14,7 @@ import { EuiButtonGroup, EuiFormRow, htmlIdGenerator } from '@elastic/eui'; import { PaletteRegistry, ColorMapping, PaletteOutput } from '@kbn/coloring'; import { getColorCategories } from '@kbn/chart-expressions-common'; import type { ValuesType } from 'utility-types'; +import { KbnPalette, KbnPalettes } from '@kbn/palettes'; import type { VisualizationDimensionEditorProps } from '../../../types'; import { State, XYState, XYDataLayerConfig, YConfig, YAxisMode } from '../types'; import { FormatFactory } from '../../../../common/types'; @@ -45,6 +46,7 @@ export function DataDimensionEditor( props: VisualizationDimensionEditorProps<State> & { formatFactory: FormatFactory; paletteService: PaletteRegistry; + palettes: KbnPalettes; isDarkMode: boolean; } ) { @@ -144,6 +146,7 @@ export function DataDimensionEditor( setPalette={setPalette} setColorMapping={setColorMapping} paletteService={props.paletteService} + palettes={props.palettes} panelRef={props.panelRef} categories={splitCategories} /> @@ -165,6 +168,7 @@ export function DataDimensionEditor( overwriteColor={overwriteColor} defaultColor={assignedColor} disabledMessage={disabledMessage} + swatches={props.palettes.get(KbnPalette.Default).colors(10)} setConfig={setConfig} /> diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx index cd9bb66443998..e36e19dd80c20 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx @@ -17,6 +17,7 @@ import { TextDecorationSetting, } from '@kbn/visualization-ui-components'; import { useDebouncedValue } from '@kbn/visualization-utils'; +import { KbnPalette, KbnPalettes } from '@kbn/palettes'; import { referenceLineIconsSet } from '../../../../shared_components/icon_set'; import type { VisualizationDimensionEditorProps } from '../../../../types'; import { State, XYState, XYReferenceLineLayerConfig, YConfig } from '../../types'; @@ -32,6 +33,7 @@ export const ReferenceLinePanel = ( props: VisualizationDimensionEditorProps<State> & { formatFactory: FormatFactory; paletteService: PaletteRegistry; + palettes: KbnPalettes; } ) => { const { state, setState, layerId, accessor } = props; @@ -98,6 +100,7 @@ export const ReferenceLinePanel = ( defaultColor={defaultReferenceLineColor} setConfig={setConfig} disableHelpTooltip + swatches={props.palettes.get(KbnPalette.Default).colors(10)} label={i18n.translate('xpack.lens.xyChart.lineColor.label', { defaultMessage: 'Color', })} diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx index d39a1a410d6aa..c3275a5e643f0 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx @@ -88,6 +88,7 @@ export const MissingValuesOptions: React.FC<MissingValuesOptionProps> = ({ {fittingFunction && fittingFunction !== FittingFunctions.NONE && ( <> <EuiFormRow + fullWidth display="columnCompressed" label={i18n.translate('xpack.lens.xyChart.endValuesLabel', { defaultMessage: 'End values', @@ -117,6 +118,7 @@ export const MissingValuesOptions: React.FC<MissingValuesOptionProps> = ({ /> </EuiFormRow> <EuiFormRow + fullWidth label={i18n.translate('xpack.lens.xyChart.missingValuesStyle', { defaultMessage: 'Show as dotted line', })} diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 39ec693856441..ca1a9b8fd0b16 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -114,6 +114,7 @@ "@kbn/es-types", "@kbn/esql-datagrid", "@kbn/transpose-utils", + "@kbn/palettes", "@kbn/core-application-browser", "@kbn/core-chrome-browser", "@kbn/core-capabilities-common", diff --git a/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_item.test.ts b/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_item.test.ts index 7cb2311c5e10a..95ca6285f0d74 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_item.test.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_item.test.ts @@ -5,14 +5,10 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; -import * as api from '@kbn/securitysolution-list-api'; -import { PersistHookProps } from '@kbn/securitysolution-io-ts-list-types'; -import { - ReturnPersistExceptionItem, - usePersistExceptionItem, -} from '@kbn/securitysolution-list-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { coreMock } from '@kbn/core/public/mocks'; +import { usePersistExceptionItem } from '@kbn/securitysolution-list-hooks'; +import * as api from '@kbn/securitysolution-list-api/src/api'; import { ENTRIES_WITH_IDS } from '../../../common/constants.mock'; import { getCreateExceptionListItemSchemaMock } from '../../../common/schemas/request/create_exception_list_item_schema.mock'; @@ -20,16 +16,22 @@ import { getUpdateExceptionListItemSchemaMock } from '../../../common/schemas/re import { getExceptionListItemSchemaMock } from '../../../common/schemas/response/exception_list_item_schema.mock'; const mockKibanaHttpService = coreMock.createStart().http; -jest.mock('@kbn/securitysolution-list-api'); // TODO: Port this test over to packages/kbn-securitysolution-list-hooks/src/use_persist_exception_item/index.test.ts once the other mocks are added to the kbn package system describe('usePersistExceptionItem', () => { + let addExceptionListItemSpy: jest.SpyInstance<ReturnType<typeof api.addEndpointExceptionList>>; + let updateExceptionListItemSpy: jest.SpyInstance<ReturnType<typeof api.updateExceptionListItem>>; const onError = jest.fn(); + beforeAll(() => { + addExceptionListItemSpy = jest.spyOn(api, 'addExceptionListItem'); + updateExceptionListItemSpy = jest.spyOn(api, 'updateExceptionListItem'); + }); + beforeEach(() => { - jest.spyOn(api, 'addExceptionListItem').mockResolvedValue(getExceptionListItemSchemaMock()); - jest.spyOn(api, 'updateExceptionListItem').mockResolvedValue(getExceptionListItemSchemaMock()); + addExceptionListItemSpy.mockResolvedValue(getExceptionListItemSchemaMock()); + updateExceptionListItemSpy.mockResolvedValue(getExceptionListItemSchemaMock()); }); afterEach(() => { @@ -37,7 +39,7 @@ describe('usePersistExceptionItem', () => { }); test('initializes hook', async () => { - const { result } = renderHook<PersistHookProps, ReturnPersistExceptionItem>(() => + const { result } = renderHook(() => usePersistExceptionItem({ http: mockKibanaHttpService, onError }) ); @@ -45,101 +47,106 @@ describe('usePersistExceptionItem', () => { }); test('"isLoading" is "true" when exception item is being saved', async () => { - await act(async () => { - const { result, rerender, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionItem - >(() => usePersistExceptionItem({ http: mockKibanaHttpService, onError })); + const { result } = renderHook(() => + usePersistExceptionItem({ http: mockKibanaHttpService, onError }) + ); - await waitForNextUpdate(); + await waitFor(() => + expect(result.current).toEqual([{ isLoading: false, isSaved: false }, result.current[1]]) + ); + + act(() => { result.current[1](getCreateExceptionListItemSchemaMock()); - rerender(); + }); - expect(result.current).toEqual([{ isLoading: true, isSaved: false }, result.current[1]]); + expect(result.current).toEqual([{ isLoading: true, isSaved: false }, result.current[1]]); + + await waitFor(() => { + expect(addExceptionListItemSpy).toHaveBeenCalled(); + expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]); }); }); test('"isSaved" is "true" when exception item saved successfully', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionItem - >(() => usePersistExceptionItem({ http: mockKibanaHttpService, onError })); + const { result } = renderHook(() => + usePersistExceptionItem({ http: mockKibanaHttpService, onError }) + ); - await waitForNextUpdate(); + act(() => { result.current[1](getCreateExceptionListItemSchemaMock()); - await waitForNextUpdate(); - - expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]); }); + + await waitFor(() => + expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]) + ); }); test('it invokes "updateExceptionListItem" when payload has "id"', async () => { - const addExceptionListItem = jest.spyOn(api, 'addExceptionListItem'); - const updateExceptionListItem = jest.spyOn(api, 'updateExceptionListItem'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionItem - >(() => usePersistExceptionItem({ http: mockKibanaHttpService, onError })); - - await waitForNextUpdate(); + const { result } = renderHook(() => + usePersistExceptionItem({ http: mockKibanaHttpService, onError }) + ); + + await waitFor(() => new Promise((resolve) => resolve(null))); + + act(() => { // NOTE: Take note here passing in an exception item where it's // entries have been enriched with ids to ensure that they get stripped // before the call goes through result.current[1]({ ...getUpdateExceptionListItemSchemaMock(), entries: ENTRIES_WITH_IDS }); - await waitForNextUpdate(); + }); + await waitFor(() => { expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]); - expect(addExceptionListItem).not.toHaveBeenCalled(); - expect(updateExceptionListItem).toHaveBeenCalledWith({ - http: mockKibanaHttpService, - listItem: getUpdateExceptionListItemSchemaMock(), - signal: new AbortController().signal, - }); + }); + + expect(addExceptionListItemSpy).not.toHaveBeenCalled(); + expect(updateExceptionListItemSpy).toHaveBeenCalledWith({ + http: mockKibanaHttpService, + listItem: getUpdateExceptionListItemSchemaMock(), + signal: expect.any(AbortSignal), }); }); test('it invokes "addExceptionListItem" when payload does not have "id"', async () => { - const updateExceptionListItem = jest.spyOn(api, 'updateExceptionListItem'); - const addExceptionListItem = jest.spyOn(api, 'addExceptionListItem'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionItem - >(() => usePersistExceptionItem({ http: mockKibanaHttpService, onError })); - - await waitForNextUpdate(); + const { result } = renderHook(() => + usePersistExceptionItem({ http: mockKibanaHttpService, onError }) + ); + + await waitFor(() => new Promise((resolve) => resolve(null))); + + act(() => { // NOTE: Take note here passing in an exception item where it's // entries have been enriched with ids to ensure that they get stripped // before the call goes through result.current[1]({ ...getCreateExceptionListItemSchemaMock(), entries: ENTRIES_WITH_IDS }); - await waitForNextUpdate(); + }); + await waitFor(() => { expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]); - expect(updateExceptionListItem).not.toHaveBeenCalled(); - expect(addExceptionListItem).toHaveBeenCalledWith({ - http: mockKibanaHttpService, - listItem: getCreateExceptionListItemSchemaMock(), - signal: new AbortController().signal, - }); + }); + + expect(updateExceptionListItemSpy).not.toHaveBeenCalled(); + expect(addExceptionListItemSpy).toHaveBeenCalledWith({ + http: mockKibanaHttpService, + listItem: getCreateExceptionListItemSchemaMock(), + signal: expect.any(AbortSignal), }); }); test('"onError" callback is invoked and "isSaved" is "false" when api call fails', async () => { const error = new Error('persist rule failed'); - jest.spyOn(api, 'addExceptionListItem').mockRejectedValue(error); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionItem - >(() => usePersistExceptionItem({ http: mockKibanaHttpService, onError })); + addExceptionListItemSpy.mockRejectedValue(error); - await waitForNextUpdate(); - result.current[1](getCreateExceptionListItemSchemaMock()); - await waitForNextUpdate(); + const { result } = renderHook(() => + usePersistExceptionItem({ http: mockKibanaHttpService, onError }) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + act(() => { + result.current[1](getCreateExceptionListItemSchemaMock()); + }); + await waitFor(() => { expect(result.current).toEqual([{ isLoading: false, isSaved: false }, result.current[1]]); expect(onError).toHaveBeenCalledWith(error); }); diff --git a/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_list.test.ts b/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_list.test.ts index 09257c489a895..c27888b6d8cc6 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_list.test.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/persist_exception_list.test.ts @@ -5,13 +5,9 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import * as api from '@kbn/securitysolution-list-api'; -import { PersistHookProps } from '@kbn/securitysolution-io-ts-list-types'; -import { - ReturnPersistExceptionList, - usePersistExceptionList, -} from '@kbn/securitysolution-list-hooks'; +import { usePersistExceptionList } from '@kbn/securitysolution-list-hooks'; import { coreMock } from '@kbn/core/public/mocks'; import { getCreateExceptionListSchemaMock } from '../../../common/schemas/request/create_exception_list_schema.mock'; @@ -37,7 +33,7 @@ describe('usePersistExceptionList', () => { }); test('initializes hook', async () => { - const { result } = renderHook<PersistHookProps, ReturnPersistExceptionList>(() => + const { result } = renderHook(() => usePersistExceptionList({ http: mockKibanaHttpService, onError }) ); @@ -45,46 +41,48 @@ describe('usePersistExceptionList', () => { }); test('"isLoading" is "true" when exception item is being saved', async () => { - await act(async () => { - const { result, rerender, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionList - >(() => usePersistExceptionList({ http: mockKibanaHttpService, onError })); - await waitForNextUpdate(); + const { result, rerender } = renderHook(() => + usePersistExceptionList({ http: mockKibanaHttpService, onError }) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + act(() => { result.current[1](getCreateExceptionListSchemaMock()); - rerender(); - - expect(result.current).toEqual([{ isLoading: true, isSaved: false }, result.current[1]]); }); + rerender(); + + expect(result.current).toEqual([{ isLoading: true, isSaved: false }, result.current[1]]); }); test('"isSaved" is "true" when exception item saved successfully', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionList - >(() => usePersistExceptionList({ http: mockKibanaHttpService, onError })); - await waitForNextUpdate(); - result.current[1](getCreateExceptionListSchemaMock()); - await waitForNextUpdate(); + const { result } = renderHook(() => + usePersistExceptionList({ http: mockKibanaHttpService, onError }) + ); - expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]); + await waitFor(() => new Promise((resolve) => resolve(null))); + + act(() => { + result.current[1](getCreateExceptionListSchemaMock()); }); + + await waitFor(() => + expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]) + ); }); test('it invokes "updateExceptionList" when payload has "id"', async () => { const addException = jest.spyOn(api, 'addExceptionList'); const updateException = jest.spyOn(api, 'updateExceptionList'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionList - >(() => usePersistExceptionList({ http: mockKibanaHttpService, onError })); + const { result } = renderHook(() => + usePersistExceptionList({ http: mockKibanaHttpService, onError }) + ); + + await waitFor(() => new Promise((resolve) => resolve(null))); - await waitForNextUpdate(); + act(() => { result.current[1](getUpdateExceptionListSchemaMock()); - await waitForNextUpdate(); + }); + await waitFor(() => { expect(result.current).toEqual([{ isLoading: false, isSaved: true }, result.current[1]]); expect(addException).not.toHaveBeenCalled(); expect(updateException).toHaveBeenCalled(); @@ -95,15 +93,14 @@ describe('usePersistExceptionList', () => { const error = new Error('persist rule failed'); jest.spyOn(api, 'addExceptionList').mockRejectedValue(error); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - PersistHookProps, - ReturnPersistExceptionList - >(() => usePersistExceptionList({ http: mockKibanaHttpService, onError })); - await waitForNextUpdate(); + const { result } = renderHook(() => + usePersistExceptionList({ http: mockKibanaHttpService, onError }) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + act(() => { result.current[1](getCreateExceptionListSchemaMock()); - await waitForNextUpdate(); - + }); + await waitFor(() => { expect(result.current).toEqual([{ isLoading: false, isSaved: false }, result.current[1]]); expect(onError).toHaveBeenCalledWith(error); }); diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts b/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts index 55c8ebde7cebd..a980261ba5f86 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts @@ -5,9 +5,9 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import * as api from '@kbn/securitysolution-list-api'; -import { ExceptionsApi, useApi } from '@kbn/securitysolution-list-hooks'; +import { useApi } from '@kbn/securitysolution-list-hooks'; import type { AddExceptionListItemProps, ApiCallByIdProps, @@ -16,7 +16,6 @@ import type { UpdateExceptionListItemProps, } from '@kbn/securitysolution-io-ts-list-types'; import { coreMock } from '@kbn/core/public/mocks'; -import { HttpStart } from '@kbn/core/public'; import { ENTRIES_WITH_IDS } from '../../../common/constants.mock'; import { getUpdateExceptionListItemSchemaMock } from '../../../common/schemas/request/update_exception_list_item_schema.mock'; @@ -51,54 +50,50 @@ describe('useApi', () => { .spyOn(api, 'deleteExceptionListItemById') .mockResolvedValue(payload); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = payload; + const { id, namespace_type: namespaceType } = payload; + await act(async () => { await result.current.deleteExceptionItem({ id, namespaceType, onError: jest.fn(), onSuccess: onSuccessMock, }); + }); - const expected: ApiCallByIdProps = { - http: mockKibanaHttpService, - id, - namespaceType, - signal: new AbortController().signal, - }; + const expected: ApiCallByIdProps = { + http: mockKibanaHttpService, + id, + namespaceType, + signal: new AbortController().signal, + }; - expect(spyOnDeleteExceptionListItemById).toHaveBeenCalledWith(expected); - expect(onSuccessMock).toHaveBeenCalled(); - }); + expect(spyOnDeleteExceptionListItemById).toHaveBeenCalledWith(expected); + expect(onSuccessMock).toHaveBeenCalled(); }); test('invokes "onError" callback if "deleteExceptionListItemById" fails', async () => { const mockError = new Error('failed to delete item'); jest.spyOn(api, 'deleteExceptionListItemById').mockRejectedValue(mockError); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = getExceptionListItemSchemaMock(); + const { id, namespace_type: namespaceType } = getExceptionListItemSchemaMock(); + await act(async () => { await result.current.deleteExceptionItem({ id, namespaceType, onError: onErrorMock, onSuccess: jest.fn(), }); - - expect(onErrorMock).toHaveBeenCalledWith(mockError); }); + + expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); @@ -110,54 +105,50 @@ describe('useApi', () => { .spyOn(api, 'deleteExceptionListById') .mockResolvedValue(payload); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = payload; + const { id, namespace_type: namespaceType } = payload; + await act(async () => { await result.current.deleteExceptionList({ id, namespaceType, onError: jest.fn(), onSuccess: onSuccessMock, }); + }); - const expected: ApiCallByIdProps = { - http: mockKibanaHttpService, - id, - namespaceType, - signal: new AbortController().signal, - }; + const expected: ApiCallByIdProps = { + http: mockKibanaHttpService, + id, + namespaceType, + signal: new AbortController().signal, + }; - expect(spyOnDeleteExceptionListById).toHaveBeenCalledWith(expected); - expect(onSuccessMock).toHaveBeenCalled(); - }); + expect(spyOnDeleteExceptionListById).toHaveBeenCalledWith(expected); + expect(onSuccessMock).toHaveBeenCalled(); }); test('invokes "onError" callback if "deleteExceptionListById" fails', async () => { const mockError = new Error('failed to delete item'); jest.spyOn(api, 'deleteExceptionListById').mockRejectedValue(mockError); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = getExceptionListSchemaMock(); + const { id, namespace_type: namespaceType } = getExceptionListSchemaMock(); + await act(async () => { await result.current.deleteExceptionList({ id, namespaceType, onError: onErrorMock, onSuccess: jest.fn(), }); - - expect(onErrorMock).toHaveBeenCalledWith(mockError); }); + + expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); @@ -169,58 +160,54 @@ describe('useApi', () => { .spyOn(api, 'fetchExceptionListItemById') .mockResolvedValue(payload); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = payload; + const { id, namespace_type: namespaceType } = payload; + await act(async () => { await result.current.getExceptionItem({ id, namespaceType, onError: jest.fn(), onSuccess: onSuccessMock, }); - - const expected: ApiCallByIdProps = { - http: mockKibanaHttpService, - id, - namespaceType, - signal: new AbortController().signal, - }; - const expectedExceptionListItem = { - ...getExceptionListItemSchemaMock(), - entries: ENTRIES_WITH_IDS, - }; - - expect(spyOnFetchExceptionListItemById).toHaveBeenCalledWith(expected); - expect(onSuccessMock).toHaveBeenCalledWith(expectedExceptionListItem); }); + + const expected: ApiCallByIdProps = { + http: mockKibanaHttpService, + id, + namespaceType, + signal: new AbortController().signal, + }; + const expectedExceptionListItem = { + ...getExceptionListItemSchemaMock(), + entries: ENTRIES_WITH_IDS, + }; + + expect(spyOnFetchExceptionListItemById).toHaveBeenCalledWith(expected); + expect(onSuccessMock).toHaveBeenCalledWith(expectedExceptionListItem); }); test('invokes "onError" callback if "fetchExceptionListItemById" fails', async () => { const mockError = new Error('failed to delete item'); jest.spyOn(api, 'fetchExceptionListItemById').mockRejectedValue(mockError); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = getExceptionListSchemaMock(); + const { id, namespace_type: namespaceType } = getExceptionListSchemaMock(); + await act(async () => { await result.current.getExceptionItem({ id, namespaceType, onError: onErrorMock, onSuccess: jest.fn(), }); - - expect(onErrorMock).toHaveBeenCalledWith(mockError); }); + + expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); @@ -232,54 +219,50 @@ describe('useApi', () => { .spyOn(api, 'fetchExceptionListById') .mockResolvedValue(payload); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = payload; + const { id, namespace_type: namespaceType } = payload; + await act(async () => { await result.current.getExceptionList({ id, namespaceType, onError: jest.fn(), onSuccess: onSuccessMock, }); + }); - const expected: ApiCallByIdProps = { - http: mockKibanaHttpService, - id, - namespaceType, - signal: new AbortController().signal, - }; + const expected: ApiCallByIdProps = { + http: mockKibanaHttpService, + id, + namespaceType, + signal: new AbortController().signal, + }; - expect(spyOnFetchExceptionListById).toHaveBeenCalledWith(expected); - expect(onSuccessMock).toHaveBeenCalled(); - }); + expect(spyOnFetchExceptionListById).toHaveBeenCalledWith(expected); + expect(onSuccessMock).toHaveBeenCalled(); }); test('invokes "onError" callback if "fetchExceptionListById" fails', async () => { const mockError = new Error('failed to delete item'); jest.spyOn(api, 'fetchExceptionListById').mockRejectedValue(mockError); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { id, namespace_type: namespaceType } = getExceptionListSchemaMock(); + const { id, namespace_type: namespaceType } = getExceptionListSchemaMock(); + await act(async () => { await result.current.getExceptionList({ id, namespaceType, onError: onErrorMock, onSuccess: jest.fn(), }); - - expect(onErrorMock).toHaveBeenCalledWith(mockError); }); + + expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); @@ -291,12 +274,10 @@ describe('useApi', () => { .spyOn(api, 'fetchExceptionListsItemsByListIds') .mockResolvedValue(output); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.getExceptionListsItems({ lists: [ { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, @@ -311,28 +292,28 @@ describe('useApi', () => { showDetectionsListsOnly: false, showEndpointListsOnly: false, }); + }); - const expected: ApiCallByListIdProps = { - http: mockKibanaHttpService, - listIds: ['list_id'], - namespaceTypes: ['single'], - pagination: { - page: 1, - perPage: 1, - total: 0, - }, - signal: new AbortController().signal, - }; - - expect(spyOnFetchExceptionListsItemsByListIds).toHaveBeenCalledWith(expected); - expect(onSuccessMock).toHaveBeenCalledWith({ - exceptions: [{ ...getExceptionListItemSchemaMock(), entries: ENTRIES_WITH_IDS }], - pagination: { - page: 1, - perPage: 1, - total: 1, - }, - }); + const expected: ApiCallByListIdProps = { + http: mockKibanaHttpService, + listIds: ['list_id'], + namespaceTypes: ['single'], + pagination: { + page: 1, + perPage: 1, + total: 0, + }, + signal: new AbortController().signal, + }; + + expect(spyOnFetchExceptionListsItemsByListIds).toHaveBeenCalledWith(expected); + expect(onSuccessMock).toHaveBeenCalledWith({ + exceptions: [{ ...getExceptionListItemSchemaMock(), entries: ENTRIES_WITH_IDS }], + pagination: { + page: 1, + perPage: 1, + total: 1, + }, }); }); @@ -343,12 +324,10 @@ describe('useApi', () => { .spyOn(api, 'fetchExceptionListsItemsByListIds') .mockResolvedValue(output); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.getExceptionListsItems({ lists: [ { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, @@ -363,16 +342,16 @@ describe('useApi', () => { showDetectionsListsOnly: false, showEndpointListsOnly: true, }); + }); - expect(spyOnFetchExceptionListsItemsByListIds).not.toHaveBeenCalled(); - expect(onSuccessMock).toHaveBeenCalledWith({ - exceptions: [], - pagination: { - page: 0, - perPage: 20, - total: 0, - }, - }); + expect(spyOnFetchExceptionListsItemsByListIds).not.toHaveBeenCalled(); + expect(onSuccessMock).toHaveBeenCalledWith({ + exceptions: [], + pagination: { + page: 0, + perPage: 20, + total: 0, + }, }); }); @@ -380,12 +359,10 @@ describe('useApi', () => { const mockError = new Error('failed to delete item'); jest.spyOn(api, 'fetchExceptionListsItemsByListIds').mockRejectedValue(mockError); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.getExceptionListsItems({ lists: [ { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, @@ -400,9 +377,9 @@ describe('useApi', () => { showDetectionsListsOnly: false, showEndpointListsOnly: false, }); - - expect(onErrorMock).toHaveBeenCalledWith(mockError); }); + + expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); @@ -414,24 +391,22 @@ describe('useApi', () => { .spyOn(api, 'addExceptionListItem') .mockResolvedValue(payload); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.addExceptionListItem({ listItem: itemToCreate, }); + }); - const expected: AddExceptionListItemProps = { - http: mockKibanaHttpService, - listItem: getCreateExceptionListItemSchemaMock(), - signal: new AbortController().signal, - }; + const expected: AddExceptionListItemProps = { + http: mockKibanaHttpService, + listItem: getCreateExceptionListItemSchemaMock(), + signal: new AbortController().signal, + }; - expect(spyOnFetchExceptionListItemById).toHaveBeenCalledWith(expected); - }); + expect(spyOnFetchExceptionListItemById).toHaveBeenCalledWith(expected); }); }); @@ -443,24 +418,22 @@ describe('useApi', () => { .spyOn(api, 'updateExceptionListItem') .mockResolvedValue(payload); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.updateExceptionListItem({ listItem: itemToUpdate, }); + }); - const expected: UpdateExceptionListItemProps = { - http: mockKibanaHttpService, - listItem: getUpdateExceptionListItemSchemaMock(), - signal: new AbortController().signal, - }; + const expected: UpdateExceptionListItemProps = { + http: mockKibanaHttpService, + listItem: getUpdateExceptionListItemSchemaMock(), + signal: new AbortController().signal, + }; - expect(spyOnUpdateExceptionListItem).toHaveBeenCalledWith(expected); - }); + expect(spyOnUpdateExceptionListItem).toHaveBeenCalledWith(expected); }); }); @@ -471,12 +444,10 @@ describe('useApi', () => { .spyOn(api, 'duplicateExceptionList') .mockResolvedValue(getExceptionListSchemaMock()); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.duplicateExceptionList({ includeExpiredExceptions: false, listId: 'my_list', @@ -484,30 +455,28 @@ describe('useApi', () => { onError: jest.fn(), onSuccess: onSuccessMock, }); + }); - const expected: DuplicateExceptionListProps = { - http: mockKibanaHttpService, - includeExpiredExceptions: false, - listId: 'my_list', - namespaceType: 'single', - signal: new AbortController().signal, - }; + const expected: DuplicateExceptionListProps = { + http: mockKibanaHttpService, + includeExpiredExceptions: false, + listId: 'my_list', + namespaceType: 'single', + signal: new AbortController().signal, + }; - expect(spyOnDuplicateExceptionList).toHaveBeenCalledWith(expected); - expect(onSuccessMock).toHaveBeenCalled(); - }); + expect(spyOnDuplicateExceptionList).toHaveBeenCalledWith(expected); + expect(onSuccessMock).toHaveBeenCalled(); }); test('invokes "onError" callback if "duplicateExceptionList" fails', async () => { const mockError = new Error('failed to duplicate item'); jest.spyOn(api, 'duplicateExceptionList').mockRejectedValue(mockError); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<HttpStart, ExceptionsApi>(() => - useApi(mockKibanaHttpService) - ); - await waitForNextUpdate(); + const { result } = renderHook(() => useApi(mockKibanaHttpService)); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { await result.current.duplicateExceptionList({ includeExpiredExceptions: false, listId: 'my_list', @@ -515,9 +484,9 @@ describe('useApi', () => { onError: onErrorMock, onSuccess: jest.fn(), }); - - expect(onErrorMock).toHaveBeenCalledWith(mockError); }); + + expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); }); diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_lists.test.ts b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_lists.test.ts index 0148feff83d58..6c684d199e538 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_lists.test.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_lists.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import type { ExceptionListSchema, UseExceptionListsProps, @@ -32,66 +32,53 @@ describe('useExceptionLists', () => { }); test('initializes hook', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseExceptionListsProps, - ReturnExceptionLists - >(() => - useExceptionLists({ - errorMessage: 'Uh oh', - filterOptions: {}, - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single', 'agnostic'], - notifications: mockKibanaNotificationsService, - }) - ); - await waitForNextUpdate(); - - expect(result.current).toEqual([ - true, - [], - { + const { result } = renderHook<ReturnExceptionLists, UseExceptionListsProps>(() => + useExceptionLists({ + errorMessage: 'Uh oh', + filterOptions: {}, + http: mockKibanaHttpService, + initialPagination: { page: 1, perPage: 20, total: 0, }, - expect.any(Function), - expect.any(Function), - { field: 'created_at', order: 'desc' }, - expect.any(Function), - ]); - }); + namespaceTypes: ['single', 'agnostic'], + notifications: mockKibanaNotificationsService, + }) + ); + + expect(result.current).toEqual([ + true, + [], + { + page: 1, + perPage: 20, + total: 0, + }, + expect.any(Function), + expect.any(Function), + { field: 'created_at', order: 'desc' }, + expect.any(Function), + ]); }); test('fetches exception lists', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseExceptionListsProps, - ReturnExceptionLists - >(() => - useExceptionLists({ - errorMessage: 'Uh oh', - filterOptions: {}, - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single', 'agnostic'], - notifications: mockKibanaNotificationsService, - }) - ); - // NOTE: First `waitForNextUpdate` is initialization - // Second call applies the params - await waitForNextUpdate(); - await waitForNextUpdate(); + const { result } = renderHook(() => + useExceptionLists({ + errorMessage: 'Uh oh', + filterOptions: {}, + http: mockKibanaHttpService, + initialPagination: { + page: 1, + perPage: 20, + total: 0, + }, + namespaceTypes: ['single', 'agnostic'], + notifications: mockKibanaNotificationsService, + }) + ); + await waitFor(() => { const expectedListItemsResult: ExceptionListSchema[] = getFoundExceptionListSchemaMock().data; expect(result.current).toEqual([ @@ -113,27 +100,23 @@ describe('useExceptionLists', () => { test('does not fetch specific list id if it is added to the hideLists array', async () => { const spyOnfetchExceptionLists = jest.spyOn(api, 'fetchExceptionLists'); - await act(async () => { - const { waitForNextUpdate } = renderHook<UseExceptionListsProps, ReturnExceptionLists>(() => - useExceptionLists({ - errorMessage: 'Uh oh', - filterOptions: {}, - hideLists: ['listId-1'], - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single', 'agnostic'], - notifications: mockKibanaNotificationsService, - }) - ); - // NOTE: First `waitForNextUpdate` is initialization - // Second call applies the params - await waitForNextUpdate(); - await waitForNextUpdate(); + renderHook(() => + useExceptionLists({ + errorMessage: 'Uh oh', + filterOptions: {}, + hideLists: ['listId-1'], + http: mockKibanaHttpService, + initialPagination: { + page: 1, + perPage: 20, + total: 0, + }, + namespaceTypes: ['single', 'agnostic'], + notifications: mockKibanaNotificationsService, + }) + ); + await waitFor(() => expect(spyOnfetchExceptionLists).toHaveBeenCalledWith({ filters: '(not exception-list.attributes.list_id: listId-1* AND not exception-list-agnostic.attributes.list_id: listId-1*)', @@ -142,37 +125,33 @@ describe('useExceptionLists', () => { pagination: { page: 1, perPage: 20 }, signal: new AbortController().signal, sort: { field: 'created_at', order: 'desc' }, - }); - }); + }) + ); }); test('applies filters to query', async () => { const spyOnfetchExceptionLists = jest.spyOn(api, 'fetchExceptionLists'); - await act(async () => { - const { waitForNextUpdate } = renderHook<UseExceptionListsProps, ReturnExceptionLists>(() => - useExceptionLists({ - errorMessage: 'Uh oh', - filterOptions: { - created_by: 'Moi', - name: 'Sample Endpoint', - }, - hideLists: ['listId-1'], - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single', 'agnostic'], - notifications: mockKibanaNotificationsService, - }) - ); - // NOTE: First `waitForNextUpdate` is initialization - // Second call applies the params - await waitForNextUpdate(); - await waitForNextUpdate(); + renderHook(() => + useExceptionLists({ + errorMessage: 'Uh oh', + filterOptions: { + created_by: 'Moi', + name: 'Sample Endpoint', + }, + hideLists: ['listId-1'], + http: mockKibanaHttpService, + initialPagination: { + page: 1, + perPage: 20, + total: 0, + }, + namespaceTypes: ['single', 'agnostic'], + notifications: mockKibanaNotificationsService, + }) + ); + await waitFor(() => expect(spyOnfetchExceptionLists).toHaveBeenCalledWith({ filters: '(exception-list.attributes.created_by:Moi OR exception-list-agnostic.attributes.created_by:Moi) AND (exception-list.attributes.name.text:Sample Endpoint OR exception-list-agnostic.attributes.name.text:Sample Endpoint) AND (not exception-list.attributes.list_id: listId-1* AND not exception-list-agnostic.attributes.list_id: listId-1*)', @@ -184,47 +163,60 @@ describe('useExceptionLists', () => { field: 'created_at', order: 'desc', }, - }); - }); + }) + ); }); test('fetches a new exception list and its items when props change', async () => { const spyOnfetchExceptionLists = jest.spyOn(api, 'fetchExceptionLists'); - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook< - UseExceptionListsProps, - ReturnExceptionLists - >( - ({ errorMessage, filterOptions, http, initialPagination, namespaceTypes, notifications }) => - useExceptionLists({ - errorMessage, - filterOptions, - http, - initialPagination, - namespaceTypes, - notifications, - }), - { - initialProps: { - errorMessage: 'Uh oh', - filterOptions: {}, - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single'], - notifications: mockKibanaNotificationsService, + const { rerender } = renderHook<ReturnExceptionLists, UseExceptionListsProps>( + ({ errorMessage, filterOptions, http, initialPagination, namespaceTypes, notifications }) => + useExceptionLists({ + errorMessage, + filterOptions, + http, + initialPagination, + namespaceTypes, + notifications, + }), + { + initialProps: { + errorMessage: 'Uh oh', + filterOptions: {}, + http: mockKibanaHttpService, + initialPagination: { + page: 1, + perPage: 20, + total: 0, }, - } - ); - // NOTE: First `waitForNextUpdate` is initialization - // Second call applies the params - await waitForNextUpdate(); - await waitForNextUpdate(); + namespaceTypes: ['single' as const], + notifications: mockKibanaNotificationsService, + }, + } + ); - rerender({ + await waitFor(() => new Promise((resolve) => resolve(null))); + + rerender({ + errorMessage: 'Uh oh', + filterOptions: {}, + http: mockKibanaHttpService, + initialPagination: { + page: 1, + perPage: 20, + total: 0, + }, + namespaceTypes: ['single' as const, 'agnostic' as const], + notifications: mockKibanaNotificationsService, + }); + + await waitFor(() => expect(spyOnfetchExceptionLists).toHaveBeenCalledTimes(2)); + }); + + test('fetches list when refreshExceptionList callback invoked', async () => { + const spyOnfetchExceptionLists = jest.spyOn(api, 'fetchExceptionLists'); + const { result } = renderHook<ReturnExceptionLists, UseExceptionListsProps>(() => + useExceptionLists({ errorMessage: 'Uh oh', filterOptions: {}, http: mockKibanaHttpService, @@ -235,49 +227,18 @@ describe('useExceptionLists', () => { }, namespaceTypes: ['single', 'agnostic'], notifications: mockKibanaNotificationsService, - }); - // NOTE: Only need one call here because hook already initilaized - await waitForNextUpdate(); + }) + ); - expect(spyOnfetchExceptionLists).toHaveBeenCalledTimes(2); - }); - }); - - test('fetches list when refreshExceptionList callback invoked', async () => { - const spyOnfetchExceptionLists = jest.spyOn(api, 'fetchExceptionLists'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseExceptionListsProps, - ReturnExceptionLists - >(() => - useExceptionLists({ - errorMessage: 'Uh oh', - filterOptions: {}, - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single', 'agnostic'], - notifications: mockKibanaNotificationsService, - }) - ); - // NOTE: First `waitForNextUpdate` is initialization - // Second call applies the params - await waitForNextUpdate(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); - expect(typeof result.current[3]).toEqual('function'); + expect(typeof result.current[3]).toEqual('function'); - if (result.current[4] != null) { - result.current[4](); - } - // NOTE: Only need one call here because hook already initilaized - await waitForNextUpdate(); + if (result.current[4] != null) { + result.current[4](); + } - expect(spyOnfetchExceptionLists).toHaveBeenCalledTimes(2); - }); + await waitFor(() => expect(spyOnfetchExceptionLists).toHaveBeenCalledTimes(2)); }); test('invokes notifications service if "fetchExceptionLists" fails', async () => { @@ -285,26 +246,22 @@ describe('useExceptionLists', () => { const spyOnfetchExceptionLists = jest .spyOn(api, 'fetchExceptionLists') .mockRejectedValue(mockError); - await act(async () => { - const { waitForNextUpdate } = renderHook<UseExceptionListsProps, ReturnExceptionLists>(() => - useExceptionLists({ - errorMessage: 'Uh oh', - filterOptions: {}, - http: mockKibanaHttpService, - initialPagination: { - page: 1, - perPage: 20, - total: 0, - }, - namespaceTypes: ['single', 'agnostic'], - notifications: mockKibanaNotificationsService, - }) - ); - // NOTE: First `waitForNextUpdate` is initialization - // Second call applies the params - await waitForNextUpdate(); - await waitForNextUpdate(); + renderHook(() => + useExceptionLists({ + errorMessage: 'Uh oh', + filterOptions: {}, + http: mockKibanaHttpService, + initialPagination: { + page: 1, + perPage: 20, + total: 0, + }, + namespaceTypes: ['single', 'agnostic'], + notifications: mockKibanaNotificationsService, + }) + ); + await waitFor(() => { expect(mockKibanaNotificationsService.toasts.addError).toHaveBeenCalledWith(mockError, { title: 'Uh oh', }); diff --git a/x-pack/plugins/lists/public/lists/hooks/use_create_list_index.test.ts b/x-pack/plugins/lists/public/lists/hooks/use_create_list_index.test.ts index 3e91e9b269830..7021d49940f26 100644 --- a/x-pack/plugins/lists/public/lists/hooks/use_create_list_index.test.ts +++ b/x-pack/plugins/lists/public/lists/hooks/use_create_list_index.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { useCreateListIndex } from '@kbn/securitysolution-list-hooks'; import * as Api from '@kbn/securitysolution-list-api'; import { httpServiceMock } from '@kbn/core/public/mocks'; @@ -28,52 +28,49 @@ describe('useCreateListIndex', () => { }); it('should call Api.createListIndex when start() executes', async () => { - const { result, waitForNextUpdate } = renderHook(() => useCreateListIndex({ http: httpMock }), { + const { result } = renderHook(() => useCreateListIndex({ http: httpMock }), { wrapper: queryWrapper, }); act(() => { result.current.start(); }); - await waitForNextUpdate(); - - expect(Api.createListIndex).toHaveBeenCalledWith(expect.objectContaining({ http: httpMock })); + await waitFor(() => + expect(Api.createListIndex).toHaveBeenCalledWith(expect.objectContaining({ http: httpMock })) + ); }); it('should call onError callback when Api.createListIndex fails', async () => { const onError = jest.fn(); jest.spyOn(Api, 'createListIndex').mockRejectedValue(new Error('Mocked error')); - const { result, waitForNextUpdate } = renderHook( - () => useCreateListIndex({ http: httpMock, onError }), - { wrapper: queryWrapper } - ); + const { result } = renderHook(() => useCreateListIndex({ http: httpMock, onError }), { + wrapper: queryWrapper, + }); act(() => { result.current.start(); }); - await waitForNextUpdate(); - - expect(onError).toHaveBeenCalledWith(new Error('Mocked error'), undefined, undefined); + await waitFor(() => + expect(onError).toHaveBeenCalledWith(new Error('Mocked error'), undefined, undefined) + ); }); it('should not invalidate read index query on failure', async () => { jest.spyOn(Api, 'createListIndex').mockRejectedValue(new Error('Mocked error')); const invalidateQueriesSpy = jest.spyOn(queryClient, 'invalidateQueries'); - const { result, waitForNextUpdate } = renderHook(() => useCreateListIndex({ http: httpMock }), { + const { result } = renderHook(() => useCreateListIndex({ http: httpMock }), { wrapper: queryWrapper, }); act(() => { result.current.start(); }); - await waitForNextUpdate(); - - expect(invalidateQueriesSpy).not.toHaveBeenCalled(); + await waitFor(() => expect(invalidateQueriesSpy).not.toHaveBeenCalled()); }); it('should invalidate read index query on success', async () => { - const { result, waitForNextUpdate } = renderHook(() => useCreateListIndex({ http: httpMock }), { + const { result } = renderHook(() => useCreateListIndex({ http: httpMock }), { wrapper: queryWrapper, }); const invalidateQueriesSpy = jest.spyOn(queryClient, 'invalidateQueries'); @@ -81,8 +78,8 @@ describe('useCreateListIndex', () => { act(() => { result.current.start(); }); - await waitForNextUpdate(); - - expect(invalidateQueriesSpy).toHaveBeenCalledWith(['detectionEngine', 'listIndex']); + await waitFor(() => + expect(invalidateQueriesSpy).toHaveBeenCalledWith(['detectionEngine', 'listIndex']) + ); }); }); diff --git a/x-pack/plugins/lists/public/lists/hooks/use_delete_list.test.ts b/x-pack/plugins/lists/public/lists/hooks/use_delete_list.test.ts index aac604a89bc8a..7a339f3e12a4a 100644 --- a/x-pack/plugins/lists/public/lists/hooks/use_delete_list.test.ts +++ b/x-pack/plugins/lists/public/lists/hooks/use_delete_list.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { useDeleteList } from '@kbn/securitysolution-list-hooks'; import * as Api from '@kbn/securitysolution-list-api'; import { httpServiceMock } from '@kbn/core/public/mocks'; @@ -25,14 +25,14 @@ describe('useDeleteList', () => { }); it('invokes Api.deleteList', async () => { - const { result, waitForNextUpdate } = renderHook(() => useDeleteList()); + const { result } = renderHook(() => useDeleteList()); act(() => { result.current.start({ http: httpMock, id: 'list' }); }); - await waitForNextUpdate(); - - expect(Api.deleteList).toHaveBeenCalledWith( - expect.objectContaining({ http: httpMock, id: 'list' }) + await waitFor(() => + expect(Api.deleteList).toHaveBeenCalledWith( + expect.objectContaining({ http: httpMock, id: 'list' }) + ) ); }); }); diff --git a/x-pack/plugins/lists/public/lists/hooks/use_export_list.test.ts b/x-pack/plugins/lists/public/lists/hooks/use_export_list.test.ts index 4977d585fe43b..8f08ad5c8bd03 100644 --- a/x-pack/plugins/lists/public/lists/hooks/use_export_list.test.ts +++ b/x-pack/plugins/lists/public/lists/hooks/use_export_list.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { useExportList } from '@kbn/securitysolution-list-hooks'; import * as Api from '@kbn/securitysolution-list-api'; import { httpServiceMock } from '@kbn/core/public/mocks'; @@ -23,14 +23,14 @@ describe('useExportList', () => { }); it('invokes Api.exportList', async () => { - const { result, waitForNextUpdate } = renderHook(() => useExportList()); + const { result } = renderHook(() => useExportList()); act(() => { result.current.start({ http: httpMock, listId: 'list' }); }); - await waitForNextUpdate(); - - expect(Api.exportList).toHaveBeenCalledWith( - expect.objectContaining({ http: httpMock, listId: 'list' }) + await waitFor(() => + expect(Api.exportList).toHaveBeenCalledWith( + expect.objectContaining({ http: httpMock, listId: 'list' }) + ) ); }); }); diff --git a/x-pack/plugins/lists/public/lists/hooks/use_import_list.test.ts b/x-pack/plugins/lists/public/lists/hooks/use_import_list.test.ts index 4a1557e94fe79..d56478a0321be 100644 --- a/x-pack/plugins/lists/public/lists/hooks/use_import_list.test.ts +++ b/x-pack/plugins/lists/public/lists/hooks/use_import_list.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { useImportList } from '@kbn/securitysolution-list-hooks'; import * as Api from '@kbn/securitysolution-list-api'; import { httpServiceMock } from '@kbn/core/public/mocks'; @@ -32,7 +32,7 @@ describe('useImportList', () => { it('invokes Api.importList', async () => { const fileMock = 'my file' as unknown as File; - const { result, waitForNextUpdate } = renderHook(() => useImportList()); + const { result } = renderHook(() => useImportList()); act(() => { result.current.start({ @@ -42,21 +42,21 @@ describe('useImportList', () => { type: 'keyword', }); }); - await waitForNextUpdate(); - - expect(Api.importList).toHaveBeenCalledWith( - expect.objectContaining({ - file: fileMock, - listId: 'my_list_id', - type: 'keyword', - }) + await waitFor(() => + expect(Api.importList).toHaveBeenCalledWith( + expect.objectContaining({ + file: fileMock, + listId: 'my_list_id', + type: 'keyword', + }) + ) ); }); it('populates result with the response of Api.importList', async () => { const fileMock = 'my file' as unknown as File; - const { result, waitForNextUpdate } = renderHook(() => useImportList()); + const { result } = renderHook(() => useImportList()); act(() => { result.current.start({ @@ -66,15 +66,13 @@ describe('useImportList', () => { type: 'keyword', }); }); - await waitForNextUpdate(); - - expect(result.current.result).toEqual(getListResponseMock()); + await waitFor(() => expect(result.current.result).toEqual(getListResponseMock())); }); it('error is populated if importList rejects', async () => { const fileMock = 'my file' as unknown as File; (Api.importList as jest.Mock).mockRejectedValue(new Error('whoops')); - const { result, waitForNextUpdate } = renderHook(() => useImportList()); + const { result } = renderHook(() => useImportList()); act(() => { result.current.start({ @@ -85,9 +83,9 @@ describe('useImportList', () => { }); }); - await waitForNextUpdate(); - - expect(result.current.result).toBeUndefined(); - expect(result.current.error).toEqual(new Error('whoops')); + await waitFor(() => { + expect(result.current.result).toBeUndefined(); + expect(result.current.error).toEqual(new Error('whoops')); + }); }); }); diff --git a/x-pack/plugins/lists/public/lists/hooks/use_read_list_index.test.ts b/x-pack/plugins/lists/public/lists/hooks/use_read_list_index.test.ts index dc57825d9acfa..643ac2df5b05b 100644 --- a/x-pack/plugins/lists/public/lists/hooks/use_read_list_index.test.ts +++ b/x-pack/plugins/lists/public/lists/hooks/use_read_list_index.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { useReadListIndex } from '@kbn/securitysolution-list-hooks'; import * as Api from '@kbn/securitysolution-list-api'; import { httpServiceMock } from '@kbn/core/public/mocks'; @@ -30,16 +30,11 @@ describe.skip('useReadListIndex', () => { }); it('should call Api.readListIndex when is enabled', async () => { - const { waitForNextUpdate } = renderHook( - () => useReadListIndex({ http: httpMock, isEnabled: true }), - { - wrapper: queryWrapper, - } - ); - - await waitForNextUpdate(); + renderHook(() => useReadListIndex({ http: httpMock, isEnabled: true }), { + wrapper: queryWrapper, + }); - expect(Api.readListIndex).toHaveBeenCalled(); + await waitFor(() => expect(Api.readListIndex).toHaveBeenCalled()); }); it('should not call Api.readListIndex when is not enabled', async () => { @@ -54,15 +49,10 @@ describe.skip('useReadListIndex', () => { const onError = jest.fn(); jest.spyOn(Api, 'readListIndex').mockRejectedValue(new Error('Mocked error')); - const { waitForNextUpdate } = renderHook( - () => useReadListIndex({ http: httpMock, isEnabled: true, onError }), - { - wrapper: queryWrapper, - } - ); - - await waitForNextUpdate(); + renderHook(() => useReadListIndex({ http: httpMock, isEnabled: true, onError }), { + wrapper: queryWrapper, + }); - expect(onError).toHaveBeenCalledWith(new Error('Mocked error')); + await waitFor(() => expect(onError).toHaveBeenCalledWith(new Error('Mocked error'))); }); }); diff --git a/x-pack/plugins/logstash/kibana.jsonc b/x-pack/plugins/logstash/kibana.jsonc index 83665c1ed344e..2242e6254fffc 100644 --- a/x-pack/plugins/logstash/kibana.jsonc +++ b/x-pack/plugins/logstash/kibana.jsonc @@ -4,7 +4,7 @@ "owner": [ "@elastic/logstash" ], - "group": "observability", + "group": "platform", "visibility": "private", "plugin": { "id": "logstash", diff --git a/x-pack/plugins/monitoring/kibana.jsonc b/x-pack/plugins/monitoring/kibana.jsonc index 5ba71cdc96ee3..31c4d9f4e10d9 100644 --- a/x-pack/plugins/monitoring/kibana.jsonc +++ b/x-pack/plugins/monitoring/kibana.jsonc @@ -4,7 +4,7 @@ "owner": [ "@elastic/stack-monitoring" ], - "group": "observability", + "group": "platform", "visibility": "private", "plugin": { "id": "monitoring", @@ -23,7 +23,6 @@ "share" ], "optionalPlugins": [ - "infra", "usageCollection", "home", "cloud", diff --git a/x-pack/plugins/monitoring/public/components/logs/__snapshots__/logs.test.js.snap b/x-pack/plugins/monitoring/public/components/logs/__snapshots__/logs.test.js.snap index 91b3dea5ab049..36ebe98fb014d 100644 --- a/x-pack/plugins/monitoring/public/components/logs/__snapshots__/logs.test.js.snap +++ b/x-pack/plugins/monitoring/public/components/logs/__snapshots__/logs.test.js.snap @@ -12,7 +12,9 @@ exports[`Logs should render a link to filter by cluster uuid 1`] = ` id="xpack.monitoring.logs.listing.linkText" values={ Object { - "link": <EuiLink> + "link": <EuiLink + href="http://localhost:5601/app/discover" + > Discover </EuiLink>, } @@ -34,7 +36,9 @@ exports[`Logs should render a link to filter by cluster uuid and index uuid 1`] id="xpack.monitoring.logs.listing.linkText" values={ Object { - "link": <EuiLink> + "link": <EuiLink + href="http://localhost:5601/app/discover" + > Discover </EuiLink>, } @@ -56,7 +60,9 @@ exports[`Logs should render a link to filter by cluster uuid and node uuid 1`] = id="xpack.monitoring.logs.listing.linkText" values={ Object { - "link": <EuiLink> + "link": <EuiLink + href="http://localhost:5601/app/discover" + > Discover </EuiLink>, } @@ -284,7 +290,9 @@ exports[`Logs should render normally 1`] = ` id="xpack.monitoring.logs.listing.linkText" values={ Object { - "link": <EuiLink> + "link": <EuiLink + href="http://localhost:5601/app/discover" + > Discover </EuiLink>, } diff --git a/x-pack/plugins/monitoring/public/components/logs/logs.js b/x-pack/plugins/monitoring/public/components/logs/logs.js index 82fdac6ea1f0d..ab897423ff056 100644 --- a/x-pack/plugins/monitoring/public/components/logs/logs.js +++ b/x-pack/plugins/monitoring/public/components/logs/logs.js @@ -111,7 +111,7 @@ const clusterColumns = [ }, ]; -function getLogsUiLink(clusterUuid, nodeId, indexUuid, sharePlugin, logsIndices) { +function getDiscoverLink(clusterUuid, nodeId, indexUuid, sharePlugin, logsIndices) { const params = []; if (clusterUuid) { params.push(`elasticsearch.cluster.uuid:${clusterUuid}`); @@ -126,6 +126,10 @@ function getLogsUiLink(clusterUuid, nodeId, indexUuid, sharePlugin, logsIndices) const filter = params.join(' and '); const discoverLocator = sharePlugin.url.locators.get('DISCOVER_APP_LOCATOR'); + if (!discoverLocator) { + return; + } + const base = discoverLocator.getRedirectUrl({ dataViewSpec: { id: logsIndices, @@ -175,7 +179,7 @@ export class LogsContent extends PureComponent { } renderCallout() { - const { capabilities: uiCapabilities, infra, kibanaServices } = Legacy.shims; + const { capabilities: uiCapabilities, kibanaServices } = Legacy.shims; const show = uiCapabilities.discover && uiCapabilities.discover.show; const { @@ -190,8 +194,9 @@ export class LogsContent extends PureComponent { if (!enabled || !show) { return null; } + const discoverLink = getDiscoverLink(clusterUuid, nodeId, indexUuid, sharePlugin, logsIndices); - return infra ? ( + return discoverLink ? ( <EuiCallOut size="m" title={i18n.translate('xpack.monitoring.logs.listing.calloutTitle', { @@ -205,9 +210,7 @@ export class LogsContent extends PureComponent { defaultMessage="Visit {link} to dive deeper." values={{ link: ( - <EuiLink - href={getLogsUiLink(clusterUuid, nodeId, indexUuid, sharePlugin, logsIndices)} - > + <EuiLink href={discoverLink}> {i18n.translate('xpack.monitoring.logs.listing.calloutLinkText', { defaultMessage: 'Discover', })} diff --git a/x-pack/plugins/monitoring/public/components/logs/logs.test.js b/x-pack/plugins/monitoring/public/components/logs/logs.test.js index 9d3f68c854505..50e850400cc06 100644 --- a/x-pack/plugins/monitoring/public/components/logs/logs.test.js +++ b/x-pack/plugins/monitoring/public/components/logs/logs.test.js @@ -15,7 +15,6 @@ jest.mock('../../legacy_shims', () => ({ shims: { getBasePath: () => '', capabilities: { discover: { show: true } }, - infra: {}, }, }, })); @@ -24,7 +23,9 @@ const sharePlugin = { url: { locators: { get: () => { - return sharePluginMock.createLocator(); + const locatorMock = sharePluginMock.createLocator(); + locatorMock.getRedirectUrl.mockReturnValue('http://localhost:5601/app/discover'); + return locatorMock; }, }, }, diff --git a/x-pack/plugins/monitoring/public/legacy_shims.ts b/x-pack/plugins/monitoring/public/legacy_shims.ts index 32322a2b4f7ac..b2b5cafedfb69 100644 --- a/x-pack/plugins/monitoring/public/legacy_shims.ts +++ b/x-pack/plugins/monitoring/public/legacy_shims.ts @@ -22,7 +22,6 @@ import { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui- import { TypeRegistry } from '@kbn/triggers-actions-ui-plugin/public/application/type_registry'; import { ActionTypeModel, RuleTypeModel } from '@kbn/triggers-actions-ui-plugin/public/types'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; -import type { InfraClientStartExports } from '@kbn/infra-plugin/public'; import { MonitoringStartPluginDependencies, LegacyMonitoringStartPluginDependencies, @@ -74,7 +73,6 @@ export interface IShims { usageCollection: UsageCollectionSetup; kibanaServices: CoreStart & { usageCollection: UsageCollectionSetup }; appMountParameters: AppMountParameters; - infra?: InfraClientStartExports; } export class Legacy { @@ -87,7 +85,6 @@ export class Legacy { triggersActionsUi, usageCollection, appMountParameters, - infra, }: LegacyMonitoringStartPluginDependencies) { this._shims = { toastNotifications: core.notifications.toasts, @@ -146,7 +143,6 @@ export class Legacy { usageCollection, }, appMountParameters, - infra, }; } diff --git a/x-pack/plugins/monitoring/public/plugin.ts b/x-pack/plugins/monitoring/public/plugin.ts index 02033d839e1ae..b526a37ceb6de 100644 --- a/x-pack/plugins/monitoring/public/plugin.ts +++ b/x-pack/plugins/monitoring/public/plugin.ts @@ -111,7 +111,6 @@ export class MonitoringPlugin usageCollection: plugins.usageCollection, appMountParameters: params, dataViews: pluginsStart.dataViews, - infra: pluginsStart.infra, }; Legacy.init({ @@ -126,7 +125,6 @@ export class MonitoringPlugin usageCollection: deps.usageCollection, appMountParameters: deps.appMountParameters, dataViews: deps.dataViews, - infra: deps.infra, share: deps.share, }); diff --git a/x-pack/plugins/monitoring/public/types.ts b/x-pack/plugins/monitoring/public/types.ts index 1df9894ca9327..93598557ee58f 100644 --- a/x-pack/plugins/monitoring/public/types.ts +++ b/x-pack/plugins/monitoring/public/types.ts @@ -15,7 +15,6 @@ export type { MLJobs } from '../server/lib/elasticsearch/get_ml_jobs'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { DashboardStart } from '@kbn/dashboard-plugin/public'; import { FleetStart } from '@kbn/fleet-plugin/public'; -import type { InfraClientStartExports } from '@kbn/infra-plugin/public'; import { SharePluginStart } from '@kbn/share-plugin/public'; import { ReactNode } from 'react'; @@ -27,7 +26,6 @@ export interface MonitoringStartPluginDependencies { dataViews: DataViewsPublicPluginStart; dashboard?: DashboardStart; fleet?: FleetStart; - infra?: InfraClientStartExports; share: SharePluginStart; } diff --git a/x-pack/plugins/monitoring/server/lib/setup/collection/get_collection_status.test.ts b/x-pack/plugins/monitoring/server/lib/setup/collection/get_collection_status.test.ts index ce03cc5aecf3b..efdcde6d1f937 100644 --- a/x-pack/plugins/monitoring/server/lib/setup/collection/get_collection_status.test.ts +++ b/x-pack/plugins/monitoring/server/lib/setup/collection/get_collection_status.test.ts @@ -6,7 +6,6 @@ */ import { featuresPluginMock } from '@kbn/features-plugin/server/mocks'; -import { infraPluginMock } from '@kbn/infra-plugin/server/mocks'; import { loggerMock } from '@kbn/logging-mocks'; import { usageCollectionPluginMock } from '@kbn/usage-collection-plugin/server/mocks'; import { configSchema, createConfig } from '../../../config'; @@ -37,7 +36,6 @@ const mockReq = ( plugins: { usageCollection: usageCollectionSetup, features: featuresPluginMock.createSetup(), - infra: infraPluginMock.createSetupContract(), }, }, }, diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts index 593f3c9b2b4ab..61253d93dbebf 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts @@ -26,7 +26,6 @@ export function enableAlertsRoute(server: MonitoringCore, npRoute: RouteDependen async (context, request, response) => { try { const alertingContext = await context.alerting; - const infraContext = await context.infra; const actionContext = await context.actions; const alerts = RulesFactory.getAll(); @@ -39,7 +38,7 @@ export function enableAlertsRoute(server: MonitoringCore, npRoute: RouteDependen if (!isSufficientlySecure || !hasPermanentEncryptionKey) { server.log.info( - `Skipping rule creation for "${infraContext.spaceId}" space; Stack Monitoring rules require API keys to be enabled and an encryption key to be configured.` + `Skipping rule creation; Stack Monitoring rules require API keys to be enabled and an encryption key to be configured.` ); return response.ok({ body: { @@ -90,9 +89,7 @@ export function enableAlertsRoute(server: MonitoringCore, npRoute: RouteDependen alerts.map((alert) => alert.createIfDoesNotExist(rulesClient, actionsClient, actions)) ); - server.log.info( - `Created ${createdAlerts.length} alerts for "${infraContext.spaceId}" space` - ); + server.log.info(`Created ${createdAlerts.length} alerts`); return response.ok({ body: { createdAlerts } }); } catch (err) { diff --git a/x-pack/plugins/monitoring/server/types.ts b/x-pack/plugins/monitoring/server/types.ts index 14ef949b93949..ea15ce98117e5 100644 --- a/x-pack/plugins/monitoring/server/types.ts +++ b/x-pack/plugins/monitoring/server/types.ts @@ -25,7 +25,6 @@ import type { import type { AlertingApiRequestHandlerContext } from '@kbn/alerting-plugin/server'; import type { RacApiRequestHandlerContext } from '@kbn/rule-registry-plugin/server'; import { AlertingServerSetup, AlertingServerStart } from '@kbn/alerting-plugin/server'; -import { InfraPluginSetup, InfraRequestHandlerContext } from '@kbn/infra-plugin/server'; import { LicensingPluginStart } from '@kbn/licensing-plugin/server'; import { FeaturesPluginSetup } from '@kbn/features-plugin/server'; import { EncryptedSavedObjectsPluginSetup } from '@kbn/encrypted-saved-objects-plugin/server'; @@ -51,14 +50,12 @@ export interface PluginsSetup { usageCollection?: UsageCollectionSetup; features: FeaturesPluginSetup; alerting?: AlertingServerSetup; - infra: InfraPluginSetup; cloud?: CloudSetup; } export type RequestHandlerContextMonitoringPlugin = CustomRequestHandlerContext<{ actions?: ActionsApiRequestHandlerContext; alerting?: AlertingApiRequestHandlerContext; - infra: InfraRequestHandlerContext; ruleRegistry?: RacApiRequestHandlerContext; }>; diff --git a/x-pack/plugins/monitoring/tsconfig.json b/x-pack/plugins/monitoring/tsconfig.json index 56063b3e06ceb..75676ed06e3c4 100644 --- a/x-pack/plugins/monitoring/tsconfig.json +++ b/x-pack/plugins/monitoring/tsconfig.json @@ -17,7 +17,6 @@ "@kbn/cloud-plugin", "@kbn/encrypted-saved-objects-plugin", "@kbn/features-plugin", - "@kbn/infra-plugin", "@kbn/licensing-plugin", "@kbn/triggers-actions-ui-plugin", "@kbn/expect", diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/exploratory_view.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/exploratory_view.ts index 877c13e93c373..99324d0fa921d 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/exploratory_view.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/exploratory_view.ts @@ -6,7 +6,7 @@ */ import { journey, step, before } from '@elastic/synthetics'; -import { recordVideo } from '../record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { createExploratoryViewUrl } from '../../public/components/shared/exploratory_view/configurations/exploratory_view_url'; import { loginToKibana, TIMEOUT_60_SEC, waitForLoadingToFinish } from '../utils'; diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/single_metric.journey.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/single_metric.journey.ts index 6fcdb71ccffa2..23f847784308f 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/single_metric.journey.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/single_metric.journey.ts @@ -6,7 +6,7 @@ */ import { journey, step, before } from '@elastic/synthetics'; -import { recordVideo } from '../record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { createExploratoryViewUrl } from '../../public/components/shared/exploratory_view/configurations/exploratory_view_url'; import { loginToKibana, TIMEOUT_60_SEC, waitForLoadingToFinish } from '../utils'; diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/step_duration.journey.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/step_duration.journey.ts index 86291929afcc3..861f4036b9ec0 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/step_duration.journey.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/e2e/journeys/step_duration.journey.ts @@ -6,10 +6,10 @@ */ import { journey, step } from '@elastic/synthetics'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import moment from 'moment'; -import { recordVideo } from '../record_video'; import { createExploratoryViewUrl } from '../../public/components/shared/exploratory_view/configurations/exploratory_view_url'; -import { byTestId, loginToKibana, TIMEOUT_60_SEC, waitForLoadingToFinish } from '../utils'; +import { loginToKibana, TIMEOUT_60_SEC, waitForLoadingToFinish } from '../utils'; journey('Step Duration series', async ({ page, params }) => { recordVideo(page); @@ -56,7 +56,8 @@ journey('Step Duration series', async ({ page, params }) => { await page.click('[aria-label="Remove report metric"]'); await page.click('button:has-text("Select report metric")'); await page.click('button:has-text("Step duration")'); - await page.click(byTestId('seriesBreakdown')); + await page.waitForSelector('[data-test-subj=seriesBreakdown]'); + await page.getByTestId('seriesBreakdown').click(); await page.click('button[role="option"]:has-text("Step name")'); await page.click('.euiComboBox__inputWrap'); await page.click('[role="combobox"][placeholder="Search Monitor name"]'); diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/parse_args_params.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/parse_args_params.ts deleted file mode 100644 index 41100ba2ec295..0000000000000 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/parse_args_params.ts +++ /dev/null @@ -1,33 +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 yargs from 'yargs'; - -const { argv } = yargs(process.argv.slice(2)) - .option('headless', { - default: true, - type: 'boolean', - description: 'Start in headless mode', - }) - .option('bail', { - default: false, - type: 'boolean', - description: 'Pause on error', - }) - .option('watch', { - default: false, - type: 'boolean', - description: 'Runs the server in watch mode, restarting on changes', - }) - .option('grep', { - default: undefined, - type: 'string', - description: 'run only journeys with a name or tags that matches the glob', - }) - .help(); - -export { argv }; diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/record_video.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/record_video.ts deleted file mode 100644 index 23bcdfb643e72..0000000000000 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/record_video.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import fs from 'fs'; -import Runner from '@elastic/synthetics/dist/core/runner'; -import { after, Page } from '@elastic/synthetics'; - -const SYNTHETICS_RUNNER = Symbol.for('SYNTHETICS_RUNNER'); - -// @ts-ignore -export const runner: Runner = global[SYNTHETICS_RUNNER]; - -export const recordVideo = (page: Page, postfix = '') => { - after(async () => { - try { - const videoFilePath = await page.video()?.path(); - const pathToVideo = videoFilePath?.replace('.journeys/videos/', '').replace('.webm', ''); - const newVideoPath = videoFilePath?.replace( - pathToVideo!, - postfix ? runner.currentJourney!.name + `-${postfix}` : runner.currentJourney!.name - ); - fs.renameSync(videoFilePath!, newVideoPath!); - } catch (e) { - // eslint-disable-next-line no-console - console.log('Error while renaming video file', e); - } - }); -}; diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_run.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_run.ts index 70a290ce9900a..32a3c7d011a1b 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_run.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_run.ts @@ -6,8 +6,8 @@ */ import { FtrConfigProviderContext } from '@kbn/test'; import path from 'path'; -import { SyntheticsRunner } from './synthetics_runner'; -import { argv } from './parse_args_params'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { SyntheticsRunner, argv } from '@kbn/observability-synthetics-test-data'; const { headless, grep, bail: pauseOnError } = argv; @@ -24,13 +24,12 @@ async function runE2ETests({ readConfigFile }: FtrConfigProviderContext) { }); await syntheticsRunner.setup(); - - await syntheticsRunner.loadTestData(path.join(__dirname, '../../ux/e2e/fixtures/'), [ - 'rum_8.0.0', - 'rum_test_data', - ]); await syntheticsRunner.loadTestData( - path.join(__dirname, '../../synthetics/e2e/fixtures/es_archiver/'), + `${REPO_ROOT}/x-pack/plugins/observability_solution/ux/e2e/fixtures/`, + ['rum_8.0.0', 'rum_test_data'] + ); + await syntheticsRunner.loadTestData( + `${REPO_ROOT}/x-pack/plugins/observability_solution/synthetics/e2e/fixtures/es_archiver/`, ['full_heartbeat', 'browser'] ); await syntheticsRunner.loadTestFiles(async () => { diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_runner.ts b/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_runner.ts deleted file mode 100644 index bc6222774f055..0000000000000 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/synthetics_runner.ts +++ /dev/null @@ -1,155 +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. - */ - -/* eslint-disable no-console */ - -import Url from 'url'; -import { run as syntheticsRun } from '@elastic/synthetics'; -import { PromiseType } from 'utility-types'; -import { createApmUsers } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/create_apm_users'; - -import { EsArchiver } from '@kbn/es-archiver'; -import { esArchiverUnload } from './tasks/es_archiver'; -import { TestReporter } from './test_reporter'; - -export interface ArgParams { - headless: boolean; - match?: string; - pauseOnError: boolean; -} - -export class SyntheticsRunner { - public getService: any; - public kibanaUrl: string; - private elasticsearchUrl: string; - - public testFilesLoaded: boolean = false; - - public params: ArgParams; - - private loadTestFilesCallback?: (reload?: boolean) => Promise<void>; - - constructor(getService: any, params: ArgParams) { - this.getService = getService; - this.kibanaUrl = this.getKibanaUrl(); - this.elasticsearchUrl = this.getElasticsearchUrl(); - this.params = params; - } - - async setup() { - await this.createTestUsers(); - } - - async createTestUsers() { - await createApmUsers({ - elasticsearch: { node: this.elasticsearchUrl, username: 'elastic', password: 'changeme' }, - kibana: { hostname: this.kibanaUrl }, - }); - } - - async loadTestFiles(callback: (reload?: boolean) => Promise<void>, reload = false) { - console.log('Loading test files'); - await callback(reload); - this.loadTestFilesCallback = callback; - this.testFilesLoaded = true; - console.log('Successfully loaded test files'); - } - - async loadTestData(e2eDir: string, dataArchives: string[]) { - try { - console.log('Loading esArchiver...'); - - const esArchiver: EsArchiver = this.getService('esArchiver'); - - const promises = dataArchives.map((archive) => { - if (archive === 'synthetics_data') { - return esArchiver.load(e2eDir + archive, { - docsOnly: true, - skipExisting: true, - }); - } - return esArchiver.load(e2eDir + archive, { skipExisting: true }); - }); - - await Promise.all([...promises]); - } catch (e) { - console.log(e); - } - } - - getKibanaUrl() { - const config = this.getService('config'); - - return Url.format({ - protocol: config.get('servers.kibana.protocol'), - hostname: config.get('servers.kibana.hostname'), - port: config.get('servers.kibana.port'), - }); - } - - getElasticsearchUrl() { - const config = this.getService('config'); - - return Url.format({ - protocol: config.get('servers.elasticsearch.protocol'), - hostname: config.get('servers.elasticsearch.hostname'), - port: config.get('servers.elasticsearch.port'), - }); - } - - async run() { - if (!this.testFilesLoaded) { - throw new Error('Test files not loaded'); - } - const { headless, match, pauseOnError } = this.params; - const noOfRuns = process.env.NO_OF_RUNS ? Number(process.env.NO_OF_RUNS) : 1; - console.log(`Running ${noOfRuns} times`); - let results: PromiseType<ReturnType<typeof syntheticsRun>> = {}; - for (let i = 0; i < noOfRuns; i++) { - results = await syntheticsRun({ - params: { kibanaUrl: this.kibanaUrl, getService: this.getService }, - playwrightOptions: { - headless, - chromiumSandbox: false, - timeout: 60 * 1000, - viewport: { - height: 900, - width: 1600, - }, - recordVideo: { - dir: '.journeys/videos', - }, - }, - grepOpts: { match: match === 'undefined' ? '' : match }, - pauseOnError, - screenshots: 'only-on-failure', - reporter: TestReporter, - }); - if (noOfRuns > 1) { - // need to reload again since runner resets the journeys - await this.loadTestFiles(this.loadTestFilesCallback!, true); - } - } - - await this.assertResults(results); - } - - assertResults(results: PromiseType<ReturnType<typeof syntheticsRun>>) { - Object.entries(results).forEach(([_journey, result]) => { - if (result.status !== 'succeeded') { - process.exitCode = 1; - process.exit(); - } - }); - } - - cleanUp() { - console.log('Removing esArchiver...'); - esArchiverUnload('full_heartbeat'); - esArchiverUnload('browser'); - } -} diff --git a/x-pack/plugins/observability_solution/exploratory_view/e2e/tsconfig.json b/x-pack/plugins/observability_solution/exploratory_view/e2e/tsconfig.json index 93a315a3e7a6b..aaa9e0b70577a 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/e2e/tsconfig.json +++ b/x-pack/plugins/observability_solution/exploratory_view/e2e/tsconfig.json @@ -6,5 +6,9 @@ "outDir": "target/types", "types": ["node"] }, - "kbn_references": ["@kbn/test", "@kbn/apm-plugin", "@kbn/es-archiver"] + "kbn_references": [ + "@kbn/test", + "@kbn/repo-info", + "@kbn/observability-synthetics-test-data", + ] } diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_date_picker.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_date_picker.ts index e6b69c1ddca8f..4cb20bfc4f3d5 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_date_picker.ts +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_date_picker.ts @@ -52,8 +52,9 @@ export function useDatePicker({ (newDateRange: TimeRange) => { setUrlState({ dateRange: newDateRange }); setParsedDateRange(parseDateRange(newDateRange)); + updateSearchSessionId(); }, - [setUrlState] + [setUrlState, updateSearchSessionId] ); const onRefresh = useCallback( @@ -62,12 +63,10 @@ export function useDatePicker({ if (autoRefreshEnabled) { autoRefreshTick$.next(null); } else { - updateSearchSessionId(); + setDateRange(newDateRange); } - - setDateRange(newDateRange); }, - [autoRefreshEnabled, autoRefreshTick$, setDateRange, updateSearchSessionId] + [autoRefreshEnabled, autoRefreshTick$, setDateRange] ); const setAutoRefresh = useCallback( diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_unified_search.ts b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_unified_search.ts index 6feefd399a829..291f95554e89c 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_unified_search.ts +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/hooks/use_unified_search.ts @@ -53,7 +53,11 @@ export const useUnifiedSearch = () => { const { data: { - query: { filterManager: filterManagerService, queryString: queryStringService }, + query: { + filterManager: filterManagerService, + queryString: queryStringService, + timefilter: timeFilterService, + }, }, telemetry, } = services; @@ -68,29 +72,33 @@ export const useUnifiedSearch = () => { const onFiltersChange = useCallback( (filters: Filter[]) => { setSearch({ type: 'SET_FILTERS', filters }); + updateSearchSessionId(); }, - [setSearch] + [setSearch, updateSearchSessionId] ); const onPanelFiltersChange = useCallback( (panelFilters: Filter[]) => { setSearch({ type: 'SET_PANEL_FILTERS', panelFilters }); + updateSearchSessionId(); }, - [setSearch] + [setSearch, updateSearchSessionId] ); const onLimitChange = useCallback( (limit: number) => { setSearch({ type: 'SET_LIMIT', limit }); + updateSearchSessionId(); }, - [setSearch] + [setSearch, updateSearchSessionId] ); const onDateRangeChange = useCallback( (dateRange: StringDateRange) => { setSearch({ type: 'SET_DATE_RANGE', dateRange }); + updateSearchSessionId(); }, - [setSearch] + [setSearch, updateSearchSessionId] ); const onQueryChange = useCallback( @@ -99,19 +107,19 @@ export const useUnifiedSearch = () => { setError(null); validateQuery(query); setSearch({ type: 'SET_QUERY', query }); + updateSearchSessionId(); } catch (err) { setError(err); } }, - [validateQuery, setSearch] + [validateQuery, setSearch, updateSearchSessionId] ); const onSubmit = useCallback( ({ dateRange }: { dateRange: TimeRange }) => { onDateRangeChange(dateRange); - updateSearchSessionId(); }, - [onDateRangeChange, updateSearchSessionId] + [onDateRangeChange] ); const getDateRangeAsTimestamp = useCallback(() => { @@ -168,6 +176,16 @@ export const useUnifiedSearch = () => { .subscribe() ); + subscription.add( + timeFilterService.timefilter + .getTimeUpdate$() + .pipe( + map(() => timeFilterService.timefilter.getTime()), + tap((dateRange) => onDateRangeChange(dateRange)) + ) + .subscribe() + ); + subscription.add( queryStringService .getUpdates$() @@ -181,7 +199,14 @@ export const useUnifiedSearch = () => { return () => { subscription.unsubscribe(); }; - }, [filterManagerService, queryStringService, onQueryChange, onFiltersChange]); + }, [ + filterManagerService, + queryStringService, + onQueryChange, + onFiltersChange, + timeFilterService.timefilter, + onDateRangeChange, + ]); // Track telemetry event on query/filter/date changes useEffect(() => { diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entity_actions/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entity_actions/index.tsx index 691ba4388ac63..6b31f877f10af 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entity_actions/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entity_actions/index.tsx @@ -24,17 +24,18 @@ export const EntityActions = ({ entity, setShowActions }: Props) => { ? `inventoryEntityActionsButton-${entity.entityDisplayName}` : 'inventoryEntityActionsButton'; - const { getDiscoverEntitiesRedirectUrl, isEntityDefinitionLoading } = useDiscoverRedirect(entity); + const { getDiscoverEntitiesRedirectUrl, isEntityDefinitionIndexPatternsLoading } = + useDiscoverRedirect(entity); const discoverUrl = getDiscoverEntitiesRedirectUrl(); const actions: React.ReactElement[] = []; - if (!discoverUrl && !isEntityDefinitionLoading) { + if (!discoverUrl && !isEntityDefinitionIndexPatternsLoading) { setShowActions(false); return null; } - if (!isEntityDefinitionLoading) { + if (!isEntityDefinitionIndexPatternsLoading) { actions.push( <EuiContextMenuItem data-test-subj="inventoryEntityActionExploreInDiscover" @@ -65,7 +66,7 @@ export const EntityActions = ({ entity, setShowActions }: Props) => { iconType="boxesHorizontal" color="text" onClick={togglePopover} - isLoading={isEntityDefinitionLoading} + isLoading={isEntityDefinitionIndexPatternsLoading} /> } closePopover={closePopover} diff --git a/x-pack/plugins/observability_solution/inventory/public/hooks/use_discover_redirect.ts b/x-pack/plugins/observability_solution/inventory/public/hooks/use_discover_redirect.ts index dc9f5bf4a4740..2855df8e4dd3f 100644 --- a/x-pack/plugins/observability_solution/inventory/public/hooks/use_discover_redirect.ts +++ b/x-pack/plugins/observability_solution/inventory/public/hooks/use_discover_redirect.ts @@ -7,23 +7,22 @@ import { useCallback, useMemo } from 'react'; import type { InventoryEntity } from '../../common/entities'; import { useAdHocDataView } from './use_adhoc_data_view'; -import { useFetchEntityDefinition } from './use_fetch_entity_definition'; +import { useFetchEntityDefinitionIndexPattern } from './use_fetch_entity_definition_index_patterns'; import { useKibana } from './use_kibana'; export const useDiscoverRedirect = (entity: InventoryEntity) => { const { services: { share, application, entityManager }, } = useKibana(); - const { entityDefinitions, isEntityDefinitionLoading } = useFetchEntityDefinition( - entity.entityDefinitionId - ); + const { entityDefinitionIndexPatterns, isEntityDefinitionIndexPatternsLoading } = + useFetchEntityDefinitionIndexPattern(entity.entityType); const title = useMemo( () => - !isEntityDefinitionLoading && entityDefinitions && entityDefinitions?.length > 0 - ? entityDefinitions[0]?.indexPatterns?.join(',') + !isEntityDefinitionIndexPatternsLoading && (entityDefinitionIndexPatterns ?? []).length > 0 + ? entityDefinitionIndexPatterns[0].join() : '', - [entityDefinitions, isEntityDefinitionLoading] + [entityDefinitionIndexPatterns, isEntityDefinitionIndexPatternsLoading] ); const { dataView } = useAdHocDataView(title); @@ -54,5 +53,5 @@ export const useDiscoverRedirect = (entity: InventoryEntity) => { entityManager.entityClient, ]); - return { getDiscoverEntitiesRedirectUrl, isEntityDefinitionLoading }; + return { getDiscoverEntitiesRedirectUrl, isEntityDefinitionIndexPatternsLoading }; }; diff --git a/x-pack/plugins/observability_solution/inventory/public/hooks/use_fetch_entity_definition.ts b/x-pack/plugins/observability_solution/inventory/public/hooks/use_fetch_entity_definition.ts deleted file mode 100644 index 9f6a0232891b2..0000000000000 --- a/x-pack/plugins/observability_solution/inventory/public/hooks/use_fetch_entity_definition.ts +++ /dev/null @@ -1,27 +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 { useAbortableAsync } from '@kbn/observability-utils-browser/hooks/use_abortable_async'; -import { useKibana } from './use_kibana'; - -export const useFetchEntityDefinition = (id: string) => { - const { - services: { entityManager }, - } = useKibana(); - - const { value, loading } = useAbortableAsync( - ({ signal }) => { - return entityManager.entityClient.getEntityDefinition(id); - }, - [entityManager.entityClient, id] - ); - - return { - entityDefinitions: value?.definitions, - isEntityDefinitionLoading: loading, - }; -}; diff --git a/x-pack/plugins/observability_solution/inventory/public/hooks/use_fetch_entity_definition_index_patterns.ts b/x-pack/plugins/observability_solution/inventory/public/hooks/use_fetch_entity_definition_index_patterns.ts new file mode 100644 index 0000000000000..127c95b532749 --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/hooks/use_fetch_entity_definition_index_patterns.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useInventoryAbortableAsync } from './use_inventory_abortable_async'; +import { useKibana } from './use_kibana'; + +export const useFetchEntityDefinitionIndexPattern = (type: string) => { + const { + services: { inventoryAPIClient }, + } = useKibana(); + + const { value = { definitionIndexPatterns: [] }, loading } = useInventoryAbortableAsync( + ({ signal }) => { + return inventoryAPIClient.fetch('GET /internal/inventory/entity/definitions/sources', { + params: { + query: { + type, + }, + }, + signal, + }); + }, + [inventoryAPIClient] + ); + + return { + entityDefinitionIndexPatterns: value?.definitionIndexPatterns, + isEntityDefinitionIndexPatternsLoading: loading, + }; +}; diff --git a/x-pack/plugins/observability_solution/inventory/server/routes/entity_definition/get_entity_definitions.ts b/x-pack/plugins/observability_solution/inventory/server/routes/entity_definition/get_entity_definitions.ts new file mode 100644 index 0000000000000..7db85de7c460b --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/server/routes/entity_definition/get_entity_definitions.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import * as t from 'io-ts'; +import { createInventoryServerRoute } from '../create_inventory_server_route'; + +export const getEntityDefinitionSourceIndexPatternsByType = createInventoryServerRoute({ + endpoint: 'GET /internal/inventory/entity/definitions/sources', + params: t.type({ + query: t.type({ + type: t.string, + }), + }), + options: { + tags: ['access:inventory'], + }, + async handler({ context, params, request, plugins }) { + const [_coreContext, entityManagerStart] = await Promise.all([ + context.core, + plugins.entityManager.start(), + ]); + const { type } = params.query; + const entityManagerClient = await entityManagerStart.getScopedClient({ request }); + + const entityDefinitionsSource = await entityManagerClient.v2.readSourceDefinitions({ type }); + + return { + definitionIndexPatterns: entityDefinitionsSource.map( + (definition) => definition.index_patterns, + [] + ), + }; + }, +}); + +export const entityDefinitionsRoutes = { + ...getEntityDefinitionSourceIndexPatternsByType, +}; diff --git a/x-pack/plugins/observability_solution/inventory/server/routes/get_global_inventory_route_repository.ts b/x-pack/plugins/observability_solution/inventory/server/routes/get_global_inventory_route_repository.ts index 598b69db90e5a..5a808ea9cc2cb 100644 --- a/x-pack/plugins/observability_solution/inventory/server/routes/get_global_inventory_route_repository.ts +++ b/x-pack/plugins/observability_solution/inventory/server/routes/get_global_inventory_route_repository.ts @@ -6,11 +6,13 @@ */ import { entitiesRoutes } from './entities/route'; +import { entityDefinitionsRoutes } from './entity_definition/get_entity_definitions'; import { hasDataRoutes } from './has_data/route'; export function getGlobalInventoryServerRouteRepository() { return { ...entitiesRoutes, + ...entityDefinitionsRoutes, ...hasDataRoutes, }; } diff --git a/x-pack/plugins/observability_solution/inventory/tsconfig.json b/x-pack/plugins/observability_solution/inventory/tsconfig.json index 561ca62eaf97e..54b6336ab3be2 100644 --- a/x-pack/plugins/observability_solution/inventory/tsconfig.json +++ b/x-pack/plugins/observability_solution/inventory/tsconfig.json @@ -51,6 +51,9 @@ "@kbn/rule-data-utils", "@kbn/spaces-plugin", "@kbn/cloud-plugin", + "@kbn/observability-utils-browser", + "@kbn/observability-utils-server", + "@kbn/observability-utils-common", "@kbn/storybook", "@kbn/dashboard-plugin", "@kbn/deeplinks-analytics", diff --git a/x-pack/plugins/observability_solution/investigate_app/.storybook/get_mock_investigate_app_services.tsx b/x-pack/plugins/observability_solution/investigate_app/.storybook/get_mock_investigate_app_services.tsx index 42ccc20d52a71..d0e9e936dd598 100644 --- a/x-pack/plugins/observability_solution/investigate_app/.storybook/get_mock_investigate_app_services.tsx +++ b/x-pack/plugins/observability_solution/investigate_app/.storybook/get_mock_investigate_app_services.tsx @@ -17,6 +17,7 @@ import { SearchBar, IUnifiedSearchPluginServices } from '@kbn/unified-search-plu import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { merge } from 'lodash'; import { Storage } from '@kbn/kibana-utils-plugin/public'; +import { of } from 'rxjs'; import type { EsqlQueryMeta } from '../public/services/esql'; import type { InvestigateAppServices } from '../public/services/types'; import { InvestigateAppKibanaContext } from '../public/hooks/use_kibana'; @@ -54,6 +55,10 @@ export function getMockInvestigateAppContext(): DeeplyMockedKeys<InvestigateAppK }), }, charts: {} as any, + investigateAppRepositoryClient: { + fetch: jest.fn().mockImplementation(() => Promise.resolve()), + stream: jest.fn().mockImplementation(() => of()) as any, + }, }; const core = coreMock.createStart(); diff --git a/x-pack/plugins/observability_solution/investigate_app/kibana.jsonc b/x-pack/plugins/observability_solution/investigate_app/kibana.jsonc index e105cacf75d05..eb69c6f9ea534 100644 --- a/x-pack/plugins/observability_solution/investigate_app/kibana.jsonc +++ b/x-pack/plugins/observability_solution/investigate_app/kibana.jsonc @@ -2,8 +2,8 @@ "type": "plugin", "id": "@kbn/investigate-app-plugin", "owner": "@elastic/obs-ux-management-team", - "group": "observability", "visibility": "private", + "group": "observability", "plugin": { "id": "investigateApp", "server": true, @@ -24,14 +24,22 @@ "observability", "licensing", "ruleRegistry", + "inference", + "alerting", + "spaces", + "slo", + "apmDataAccess", "usageCollection" ], + "optionalPlugins": [ + "observabilityAIAssistant", + "observabilityAIAssistantApp" + ], "requiredBundles": [ "esql", "kibanaReact", "kibanaUtils" ], - "optionalPlugins": ["observabilityAIAssistant"], "extraPublicDirs": [] } } diff --git a/x-pack/plugins/observability_solution/investigate_app/public/api/index.ts b/x-pack/plugins/observability_solution/investigate_app/public/api/index.ts index af02f4a15e740..21f3251bd0d34 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/api/index.ts +++ b/x-pack/plugins/observability_solution/investigate_app/public/api/index.ts @@ -11,7 +11,7 @@ import type { ReturnOf, RouteRepositoryClient, } from '@kbn/server-route-repository'; -import { formatRequest } from '@kbn/server-route-repository-utils/src/format_request'; +import { createRepositoryClient } from '@kbn/server-route-repository-client'; import type { InvestigateAppServerRouteRepository } from '../../server'; type FetchOptions = Omit<HttpFetchOptions, 'body'> & { @@ -25,15 +25,15 @@ export type InvestigateAppAPIClientOptions = Omit< signal: AbortSignal | null; }; -export type InvestigateAppAPIClient = RouteRepositoryClient< +export type InvestigateAppRepositoryClient = RouteRepositoryClient< InvestigateAppServerRouteRepository, InvestigateAppAPIClientOptions ->['fetch']; +>; -export type AutoAbortedInvestigateAppAPIClient = RouteRepositoryClient< +export type AutoAbortedInvestigateAppRepositoryClient = RouteRepositoryClient< InvestigateAppServerRouteRepository, Omit<InvestigateAppAPIClientOptions, 'signal'> ->['fetch']; +>; export type InvestigateAppAPIEndpoint = keyof InvestigateAppServerRouteRepository; @@ -45,19 +45,6 @@ export type APIReturnType<TEndpoint extends InvestigateAppAPIEndpoint> = ReturnO export type InvestigateAppAPIClientRequestParamsOf<TEndpoint extends InvestigateAppAPIEndpoint> = ClientRequestParamsOf<InvestigateAppServerRouteRepository, TEndpoint>; -export function createCallInvestigateAppAPI(core: CoreStart | CoreSetup) { - return ((endpoint, options) => { - const { params } = options as unknown as { - params?: Partial<Record<string, any>>; - }; - - const { method, pathname, version } = formatRequest(endpoint, params?.path); - - return core.http[method](pathname, { - ...options, - body: params && params.body ? JSON.stringify(params.body) : undefined, - query: params?.query, - version, - }); - }) as InvestigateAppAPIClient; +export function createInvestigateAppRepositoryClient(core: CoreStart | CoreSetup) { + return createRepositoryClient(core) as InvestigateAppRepositoryClient; } diff --git a/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/assistant_hypothesis/assistant_hypothesis.tsx b/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/assistant_hypothesis/assistant_hypothesis.tsx index f63cbb9c01618..cf993e53790cb 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/assistant_hypothesis/assistant_hypothesis.tsx +++ b/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/assistant_hypothesis/assistant_hypothesis.tsx @@ -4,19 +4,22 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import dedent from 'dedent'; -import { - ALERT_RULE_PARAMETERS, - ALERT_START, - ALERT_RULE_CATEGORY, - ALERT_REASON, -} from '@kbn/rule-data-utils'; import { i18n } from '@kbn/i18n'; -import { EntityWithSource } from '@kbn/investigation-shared'; -import React, { useCallback } from 'react'; +import type { RootCauseAnalysisEvent } from '@kbn/observability-ai-server/root_cause_analysis'; +import { EcsFieldsResponse } from '@kbn/rule-registry-plugin/common'; +import React, { useState, useRef, useEffect } from 'react'; +import { omit } from 'lodash'; +import { + ALERT_FLAPPING_HISTORY, + ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_RULE_EXECUTION_UUID, + EVENT_ACTION, + EVENT_KIND, +} from '@kbn/rule-registry-plugin/common/technical_rule_data_field_names'; +import { isRequestAbortedError } from '@kbn/server-route-repository-client'; import { useKibana } from '../../../../hooks/use_kibana'; import { useInvestigation } from '../../contexts/investigation_context'; -import { useFetchEntities } from '../../../../hooks/use_fetch_entities'; +import { useUpdateInvestigation } from '../../../../hooks/use_update_investigation'; export interface InvestigationContextualInsight { key: string; @@ -25,98 +28,177 @@ export interface InvestigationContextualInsight { } export function AssistantHypothesis({ investigationId }: { investigationId: string }) { - const { alert } = useInvestigation(); const { + alert, + globalParams: { timeRange }, + investigation, + } = useInvestigation(); + const { + core: { notifications }, + services: { investigateAppRepositoryClient }, dependencies: { start: { - observabilityAIAssistant: { - ObservabilityAIAssistantContextualInsight, - getContextualInsightMessages, - }, + observabilityAIAssistant: { useGenAIConnectors }, + observabilityAIAssistantApp: { RootCauseAnalysisContainer }, }, }, } = useKibana(); - const { data: entitiesData } = useFetchEntities({ - investigationId, - serviceName: alert?.['service.name'] ? `${alert?.['service.name']}` : undefined, - serviceEnvironment: alert?.['service.environment'] - ? `${alert?.['service.environment']}` - : undefined, - hostName: alert?.['host.name'] ? `${alert?.['host.name']}` : undefined, - containerId: alert?.['container.id'] ? `${alert?.['container.id']}` : undefined, - }); - - const getAlertContextMessages = useCallback(async () => { - if (!getContextualInsightMessages || !alert) { - return []; + + const { mutateAsync: updateInvestigation } = useUpdateInvestigation(); + + const { loading: loadingConnector, selectedConnector } = useGenAIConnectors(); + + const serviceName = alert?.['service.name'] as string | undefined; + + const [events, setEvents] = useState<RootCauseAnalysisEvent[]>([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState<Error | undefined>(undefined); + + const controllerRef = useRef(new AbortController()); + + useEffect(() => { + if (investigation?.rootCauseAnalysis) { + setEvents(investigation.rootCauseAnalysis.events); } + }, [investigation?.rootCauseAnalysis]); + + const [completeInBackground, setCompleteInBackground] = useState(true); + + const runRootCauseAnalysis = ({ + alert: nonNullishAlert, + connectorId, + serviceName: nonNullishServiceName, + }: { + alert: EcsFieldsResponse; + connectorId: string; + serviceName: string; + }) => { + const rangeFrom = timeRange.from; + + const rangeTo = timeRange.to; - const entities = entitiesData?.entities ?? []; - - const entityContext = entities?.length - ? ` - Alerts can optionally be associated with entities. Entities can be services, hosts, containers, or other resources. Entities can have metrics associated with them. - - The alert that triggered this investigation is associated with the following entities: ${entities - .map((entity, index) => { - return dedent(` - ## Entity ${index + 1}: - ${formatEntityMetrics(entity)}; - `); - }) - .join('/n/n')}` - : ''; - - return getContextualInsightMessages({ - message: `I am investigating a failure in my system. I was made aware of the failure by an alert and I am trying to understand the root cause of the issue.`, - instructions: dedent( - `I'm an SRE. I am investigating a failure in my system. I was made aware of the failure via an alert. Your current task is to help me identify the root cause of the failure in my system. - - The rule that triggered the alert is a ${ - alert[ALERT_RULE_CATEGORY] - } rule. The alert started at ${alert[ALERT_START]}. The alert reason is ${ - alert[ALERT_REASON] - }. The rule parameters are ${JSON.stringify(ALERT_RULE_PARAMETERS)}. - - ${entityContext} - - Based on the alert details, suggest a root cause and next steps to mitigate the issue. - - I do not have the alert details or entity details in front of me, so be sure to repeat the alert reason (${ - alert[ALERT_REASON] - }), when the alert was triggered (${ - alert[ALERT_START] - }), and the entity metrics in your response. - - When displaying the entity metrics, please convert the metrics to a human-readable format. For example, convert "logRate" to "Log Rate" and "errorRate" to "Error Rate". - ` - ), - }); - }, [alert, getContextualInsightMessages, entitiesData?.entities]); - - if (!ObservabilityAIAssistantContextualInsight) { + setLoading(true); + + setError(undefined); + + setEvents([]); + + investigateAppRepositoryClient + .stream('POST /internal/observability/investigation/root_cause_analysis', { + params: { + body: { + investigationId, + connectorId, + context: `The user is investigating an alert for the ${serviceName} service, + and wants to find the root cause. Here is the alert: + + ${JSON.stringify(sanitizeAlert(nonNullishAlert))}`, + rangeFrom, + rangeTo, + serviceName: nonNullishServiceName, + completeInBackground, + }, + }, + signal: controllerRef.current.signal, + }) + .subscribe({ + next: (event) => { + setEvents((prev) => { + return prev.concat(event.event); + }); + }, + error: (nextError) => { + if (!isRequestAbortedError(nextError)) { + notifications.toasts.addError(nextError, { + title: i18n.translate( + 'xpack.investigateApp.assistantHypothesis.failedToLoadAnalysis', + { + defaultMessage: `Failed to load analysis`, + } + ), + }); + setError(nextError); + } else { + setError( + new Error( + i18n.translate('xpack.investigateApp.assistantHypothesis.analysisAborted', { + defaultMessage: `Analysis was aborted`, + }) + ) + ); + } + + setLoading(false); + }, + complete: () => { + setLoading(false); + }, + }); + }; + + if (!serviceName) { return null; } - return alert && entitiesData ? ( - <ObservabilityAIAssistantContextualInsight - title={i18n.translate( - 'xpack.investigateApp.assistantHypothesis.observabilityAIAssistantContextualInsight.helpMeInvestigateThisLabel', - { defaultMessage: 'Help me investigate this failure' } - )} - messages={getAlertContextMessages} + return ( + <RootCauseAnalysisContainer + events={events} + loading={loading || loadingConnector} + completeInBackground={completeInBackground} + onCompleteInBackgroundClick={() => { + setCompleteInBackground(() => !completeInBackground); + }} + onStopAnalysisClick={() => { + controllerRef.current.abort(); + controllerRef.current = new AbortController(); + }} + onClearAnalysisClick={() => { + setEvents([]); + if (investigation?.rootCauseAnalysis) { + updateInvestigation({ + investigationId, + payload: { + rootCauseAnalysis: { + events: [], + }, + }, + }); + } + }} + onResetAnalysisClick={() => { + controllerRef.current.abort(); + controllerRef.current = new AbortController(); + if (alert && selectedConnector && serviceName) { + runRootCauseAnalysis({ + alert, + connectorId: selectedConnector, + serviceName, + }); + } + }} + error={error} + onStartAnalysisClick={() => { + if (alert && selectedConnector && serviceName) { + runRootCauseAnalysis({ + alert, + connectorId: selectedConnector, + serviceName, + }); + } + }} /> - ) : null; + ); +} + +function sanitizeAlert(alert: EcsFieldsResponse) { + return omit( + alert, + ALERT_RULE_EXECUTION_TIMESTAMP, + '_index', + ALERT_FLAPPING_HISTORY, + EVENT_ACTION, + EVENT_KIND, + ALERT_RULE_EXECUTION_UUID, + '@timestamp' + ); } -const formatEntityMetrics = (entity: EntityWithSource): string => { - const entityMetrics = Object.entries(entity.metrics) - .map(([key, value]) => `${key}: ${value}`) - .join(', '); - const entitySources = entity.sources.map((source) => source.dataStream).join(', '); - return dedent(` - Entity name: ${entity.display_name}; - Entity type: ${entity.type}; - Entity metrics: ${entityMetrics}; - Entity data streams: ${entitySources} - `); -}; diff --git a/x-pack/plugins/observability_solution/investigate_app/public/plugin.tsx b/x-pack/plugins/observability_solution/investigate_app/public/plugin.tsx index 5ec88f9d72468..92c94cef94521 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/plugin.tsx +++ b/x-pack/plugins/observability_solution/investigate_app/public/plugin.tsx @@ -27,6 +27,7 @@ import type { InvestigateAppSetupDependencies, InvestigateAppStartDependencies, } from './types'; +import { createInvestigateAppRepositoryClient, InvestigateAppRepositoryClient } from './api'; const getCreateEsqlService = once(() => import('./services/esql').then((m) => m.createEsqlService)); @@ -41,6 +42,7 @@ export class InvestigateAppPlugin { logger: Logger; config: ConfigSchema; + repositoryClient!: InvestigateAppRepositoryClient; constructor(context: PluginInitializerContext<ConfigSchema>) { this.logger = context.logger.get(); @@ -51,6 +53,8 @@ export class InvestigateAppPlugin coreSetup: CoreSetup<InvestigateAppStartDependencies, InvestigateAppPublicStart>, pluginsSetup: InvestigateAppSetupDependencies ): InvestigateAppPublicSetup { + this.repositoryClient = createInvestigateAppRepositoryClient(coreSetup); + coreSetup.application.register({ id: INVESTIGATE_APP_ID, title: i18n.translate('xpack.investigateApp.appTitle', { @@ -93,6 +97,7 @@ export class InvestigateAppPlugin lens: pluginsStart.lens, }), charts: pluginsStart.charts, + investigateAppRepositoryClient: this.repositoryClient, }; ReactDOM.render( @@ -127,6 +132,7 @@ export class InvestigateAppPlugin start: pluginsStart, }, services: { + investigateAppRepositoryClient: this.repositoryClient, esql: createEsqlService({ data: pluginsStart.data, dataViews: pluginsStart.dataViews, diff --git a/x-pack/plugins/observability_solution/investigate_app/public/services/types.ts b/x-pack/plugins/observability_solution/investigate_app/public/services/types.ts index 257ed5a7aeaca..04a2a7d063e9f 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/services/types.ts +++ b/x-pack/plugins/observability_solution/investigate_app/public/services/types.ts @@ -7,8 +7,10 @@ import { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { EsqlService } from './esql'; +import type { InvestigateAppRepositoryClient } from '../api'; export interface InvestigateAppServices { esql: EsqlService; charts: ChartsPluginStart; + investigateAppRepositoryClient: InvestigateAppRepositoryClient; } diff --git a/x-pack/plugins/observability_solution/investigate_app/public/types.ts b/x-pack/plugins/observability_solution/investigate_app/public/types.ts index a2d7b5227a201..da81bcdbc0c92 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/types.ts +++ b/x-pack/plugins/observability_solution/investigate_app/public/types.ts @@ -8,6 +8,10 @@ import type { ObservabilityAIAssistantPublicSetup, ObservabilityAIAssistantPublicStart, } from '@kbn/observability-ai-assistant-plugin/public'; +import type { + ObservabilityAIAssistantAppPublicSetup, + ObservabilityAIAssistantAppPublicStart, +} from '@kbn/observability-ai-assistant-app-plugin/public'; import { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; @@ -43,6 +47,7 @@ export interface InvestigateAppSetupDependencies { investigate: InvestigatePublicSetup; observabilityShared: ObservabilitySharedPluginSetup; observabilityAIAssistant: ObservabilityAIAssistantPublicSetup; + observabilityAIAssistantApp: ObservabilityAIAssistantAppPublicSetup; lens: LensPublicSetup; dataViews: DataViewsPublicPluginSetup; data: DataPublicPluginSetup; @@ -58,6 +63,7 @@ export interface InvestigateAppStartDependencies { investigate: InvestigatePublicStart; observabilityShared: ObservabilitySharedPluginStart; observabilityAIAssistant: ObservabilityAIAssistantPublicStart; + observabilityAIAssistantApp: ObservabilityAIAssistantAppPublicStart; lens: LensPublicStart; dataViews: DataViewsPublicPluginStart; data: DataPublicPluginStart; diff --git a/x-pack/plugins/observability_solution/investigate_app/server/routes/get_global_investigate_app_server_route_repository.ts b/x-pack/plugins/observability_solution/investigate_app/server/routes/get_global_investigate_app_server_route_repository.ts index 494e13efcba95..1728e6b69b7d3 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/routes/get_global_investigate_app_server_route_repository.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/routes/get_global_investigate_app_server_route_repository.ts @@ -15,18 +15,19 @@ import { findInvestigationsParamsSchema, getAllInvestigationStatsParamsSchema, getAllInvestigationTagsParamsSchema, + getEntitiesParamsSchema, + GetEntitiesResponse, + getEventsParamsSchema, + GetEventsResponse, getInvestigationItemsParamsSchema, getInvestigationNotesParamsSchema, getInvestigationParamsSchema, updateInvestigationItemParamsSchema, updateInvestigationNoteParamsSchema, updateInvestigationParamsSchema, - getEventsParamsSchema, - GetEventsResponse, - getEntitiesParamsSchema, - GetEntitiesResponse, } from '@kbn/investigation-shared'; import { ScopedAnnotationsClient } from '@kbn/observability-plugin/server'; +import { createEntitiesESClient } from '../clients/create_entities_es_client'; import { createInvestigation } from '../services/create_investigation'; import { createInvestigationItem } from '../services/create_investigation_item'; import { createInvestigationNote } from '../services/create_investigation_note'; @@ -34,20 +35,20 @@ import { deleteInvestigation } from '../services/delete_investigation'; import { deleteInvestigationItem } from '../services/delete_investigation_item'; import { deleteInvestigationNote } from '../services/delete_investigation_note'; import { findInvestigations } from '../services/find_investigations'; +import { AlertsClient, getAlertsClient } from '../services/get_alerts_client'; +import { getAllInvestigationStats } from '../services/get_all_investigation_stats'; import { getAllInvestigationTags } from '../services/get_all_investigation_tags'; +import { getEntitiesWithSource } from '../services/get_entities'; +import { getAlertEvents, getAnnotationEvents } from '../services/get_events'; import { getInvestigation } from '../services/get_investigation'; import { getInvestigationItems } from '../services/get_investigation_items'; import { getInvestigationNotes } from '../services/get_investigation_notes'; import { investigationRepositoryFactory } from '../services/investigation_repository'; import { updateInvestigation } from '../services/update_investigation'; -import { getAlertEvents, getAnnotationEvents } from '../services/get_events'; -import { AlertsClient, getAlertsClient } from '../services/get_alerts_client'; import { updateInvestigationItem } from '../services/update_investigation_item'; import { updateInvestigationNote } from '../services/update_investigation_note'; import { createInvestigateAppServerRoute } from './create_investigate_app_server_route'; -import { getAllInvestigationStats } from '../services/get_all_investigation_stats'; -import { getEntitiesWithSource } from '../services/get_entities'; -import { createEntitiesESClient } from '../clients/create_entities_es_client'; +import { rootCauseAnalysisRoute } from './rca/route'; const createInvestigationRoute = createInvestigateAppServerRoute({ endpoint: 'POST /api/observability/investigations 2023-10-31', @@ -400,6 +401,7 @@ export function getGlobalInvestigateAppServerRouteRepository() { ...getEntitiesRoute, ...getAllInvestigationStatsRoute, ...getAllInvestigationTagsRoute, + ...rootCauseAnalysisRoute, }; } diff --git a/x-pack/plugins/observability_solution/investigate_app/server/routes/rca/route.ts b/x-pack/plugins/observability_solution/investigate_app/server/routes/rca/route.ts new file mode 100644 index 0000000000000..c4b71d7faa4b9 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate_app/server/routes/rca/route.ts @@ -0,0 +1,163 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Observable, catchError, from, of, share, switchMap, toArray } from 'rxjs'; +import { ServerSentEventBase } from '@kbn/sse-utils'; +import { + RootCauseAnalysisEvent, + runRootCauseAnalysis, +} from '@kbn/observability-ai-server/root_cause_analysis'; +import { z } from '@kbn/zod'; +import datemath from '@elastic/datemath'; +import { OBSERVABILITY_LOGS_DATA_ACCESS_LOG_SOURCES_ID } from '@kbn/management-settings-ids'; +import { createObservabilityEsClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { preconditionFailed } from '@hapi/boom'; +import { createInvestigateAppServerRoute } from '../create_investigate_app_server_route'; +import { investigationRepositoryFactory } from '../../services/investigation_repository'; + +export const rootCauseAnalysisRoute = createInvestigateAppServerRoute({ + endpoint: 'POST /internal/observability/investigation/root_cause_analysis', + options: { + tags: [], + }, + params: z.object({ + body: z.object({ + investigationId: z.string(), + rangeFrom: z.string(), + rangeTo: z.string(), + serviceName: z.string(), + context: z.string(), + connectorId: z.string(), + completeInBackground: z.boolean().optional(), + }), + }), + handler: async ({ + params, + plugins, + request, + context: requestContext, + logger, + }): Promise<Observable<ServerSentEventBase<'event', { event: RootCauseAnalysisEvent }>>> => { + const { + body: { + investigationId, + context, + rangeFrom, + rangeTo, + serviceName, + connectorId, + completeInBackground, + }, + } = params; + + if (!plugins.observabilityAIAssistant) { + throw preconditionFailed('Observability AI Assistant plugin is not available'); + } + + const start = datemath.parse(rangeFrom)?.valueOf()!; + const end = datemath.parse(rangeTo)?.valueOf()!; + + const coreContext = await requestContext.core; + + const coreEsClient = coreContext.elasticsearch.client.asCurrentUser; + const soClient = coreContext.savedObjects.client; + const uiSettingsClient = coreContext.uiSettings.client; + + const repository = investigationRepositoryFactory({ soClient, logger }); + + const esClient = createObservabilityEsClient({ + client: coreEsClient, + logger, + plugin: 'investigateApp', + }); + + const [ + investigation, + rulesClient, + alertsClient, + inferenceClient, + observabilityAIAssistantClient, + spaceId = 'default', + apmIndices, + logSources, + sloSummaryIndices, + ] = await Promise.all([ + repository.findById(investigationId), + (await plugins.alerting.start()).getRulesClientWithRequest(request), + (await plugins.ruleRegistry.start()).getRacClientWithRequest(request), + (await plugins.inference.start()).getClient({ request }), + plugins + .observabilityAIAssistant!.start() + .then((observabilityAIAssistantStart) => + observabilityAIAssistantStart.service.getClient({ request, scopes: ['observability'] }) + ), + (await plugins.spaces?.start())?.spacesService.getSpaceId(request), + plugins.apmDataAccess.setup.getApmIndices(soClient), + uiSettingsClient.get(OBSERVABILITY_LOGS_DATA_ACCESS_LOG_SOURCES_ID) as Promise<string[]>, + (await plugins.slo.start()).getSloClientWithRequest(request).getSummaryIndices(), + ]); + + const next$ = runRootCauseAnalysis({ + alertsClient, + connectorId, + start, + end, + esClient, + inferenceClient, + indices: { + logs: logSources, + traces: [apmIndices.span, apmIndices.error, apmIndices.transaction], + sloSummaries: sloSummaryIndices, + }, + rulesClient, + observabilityAIAssistantClient, + serviceName, + spaceId, + context, + logger, + }).pipe( + switchMap((event) => { + return of({ + type: 'event' as const, + event, + }); + }) + ); + + if (completeInBackground) { + const shared$ = next$.pipe(share()); + + shared$ + .pipe( + toArray(), + catchError(() => { + return of(); + }), + switchMap((events) => { + return from( + repository.save({ + ...investigation, + rootCauseAnalysis: { + events: events.map(({ event }) => event), + }, + }) + ); + }) + ) + .subscribe({ + error: (error) => { + logger.error(`Failed to update investigation: ${error.message}`); + logger.error(error); + }, + }); + + return shared$; + } + + return next$; + }, +}); diff --git a/x-pack/plugins/observability_solution/investigate_app/server/types.ts b/x-pack/plugins/observability_solution/investigate_app/server/types.ts index 8803221000d5b..705339dfbf2e9 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/types.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/types.ts @@ -5,11 +5,23 @@ * 2.0. */ -import { ObservabilityPluginSetup } from '@kbn/observability-plugin/server'; -import { +import type { ObservabilityPluginSetup } from '@kbn/observability-plugin/server'; +import type { RuleRegistryPluginSetupContract, RuleRegistryPluginStartContract, } from '@kbn/rule-registry-plugin/server'; +import type { AlertingServerSetup, AlertingServerStart } from '@kbn/alerting-plugin/server/plugin'; +import type { SLOServerStart, SLOServerSetup } from '@kbn/slo-plugin/server'; +import type { InferenceServerStart, InferenceServerSetup } from '@kbn/inference-plugin/server'; +import type { SpacesPluginSetup, SpacesPluginStart } from '@kbn/spaces-plugin/server'; +import type { + ApmDataAccessPluginStart, + ApmDataAccessPluginSetup, +} from '@kbn/apm-data-access-plugin/server'; +import type { + ObservabilityAIAssistantServerStart, + ObservabilityAIAssistantServerSetup, +} from '@kbn/observability-ai-assistant-plugin/server'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; /* eslint-disable @typescript-eslint/no-empty-interface*/ @@ -19,11 +31,23 @@ export interface ConfigSchema {} export interface InvestigateAppSetupDependencies { observability: ObservabilityPluginSetup; ruleRegistry: RuleRegistryPluginSetupContract; + slo: SLOServerSetup; + alerting: AlertingServerSetup; + inference: InferenceServerSetup; + spaces?: SpacesPluginSetup; + apmDataAccess: ApmDataAccessPluginSetup; + observabilityAIAssistant?: ObservabilityAIAssistantServerSetup; usageCollection: UsageCollectionSetup; } export interface InvestigateAppStartDependencies { ruleRegistry: RuleRegistryPluginStartContract; + slo: SLOServerStart; + alerting: AlertingServerStart; + inference: InferenceServerStart; + spaces?: SpacesPluginStart; + apmDataAccess: ApmDataAccessPluginStart; + observabilityAIAssistant?: ObservabilityAIAssistantServerStart; } export interface InvestigateAppServerSetup {} diff --git a/x-pack/plugins/observability_solution/investigate_app/tsconfig.json b/x-pack/plugins/observability_solution/investigate_app/tsconfig.json index bc67b591a57b8..1bce5cad1c796 100644 --- a/x-pack/plugins/observability_solution/investigate_app/tsconfig.json +++ b/x-pack/plugins/observability_solution/investigate_app/tsconfig.json @@ -17,57 +17,67 @@ ".storybook/**/*.js" ], "kbn_references": [ - "@kbn/core", - "@kbn/react-kibana-context-theme", - "@kbn/shared-ux-link-redirect-app", - "@kbn/kibana-react-plugin", - "@kbn/i18n", - "@kbn/embeddable-plugin", - "@kbn/observability-ai-assistant-plugin", - "@kbn/lens-plugin", "@kbn/esql", - "@kbn/esql-utils", - "@kbn/data-plugin", - "@kbn/es-types", - "@kbn/field-types", - "@kbn/expressions-plugin", - "@kbn/deeplinks-observability", - "@kbn/logging", + "@kbn/core", "@kbn/data-views-plugin", - "@kbn/observability-shared-plugin", - "@kbn/config-schema", - "@kbn/investigate-plugin", - "@kbn/dataset-quality-plugin", - "@kbn/utility-types-jest", - "@kbn/content-management-plugin", + "@kbn/expressions-plugin", "@kbn/kibana-utils-plugin", - "@kbn/visualization-utils", + "@kbn/utility-types-jest", + "@kbn/es-types", + "@kbn/data-plugin", + "@kbn/embeddable-plugin", "@kbn/unified-search-plugin", - "@kbn/es-query", + "@kbn/kibana-react-plugin", "@kbn/server-route-repository", - "@kbn/security-plugin", - "@kbn/ui-actions-plugin", - "@kbn/server-route-repository-utils", - "@kbn/core-saved-objects-server", - "@kbn/rule-registry-plugin", + "@kbn/server-route-repository-client", + "@kbn/react-kibana-context-theme", + "@kbn/shared-ux-link-redirect-app", "@kbn/shared-ux-router", + "@kbn/i18n", "@kbn/investigation-shared", - "@kbn/core-security-common", - "@kbn/saved-objects-finder-plugin", - "@kbn/presentation-containers", + "@kbn/lens-plugin", + "@kbn/rule-registry-plugin", + "@kbn/security-plugin", + "@kbn/rule-data-utils", + "@kbn/investigate-plugin", + "@kbn/observability-utils-browser", "@kbn/lens-embeddable-utils", "@kbn/i18n-react", - "@kbn/zod", - "@kbn/observability-plugin", - "@kbn/licensing-plugin", - "@kbn/rule-data-utils", + "@kbn/es-query", + "@kbn/saved-objects-finder-plugin", + "@kbn/presentation-containers", + "@kbn/observability-ai-server", + "@kbn/charts-plugin", + "@kbn/observability-shared-plugin", + "@kbn/core-security-common", + "@kbn/deeplinks-observability", + "@kbn/logging", + "@kbn/esql-utils", + "@kbn/observability-ai-assistant-plugin", + "@kbn/observability-ai-assistant-app-plugin", + "@kbn/content-management-plugin", + "@kbn/dataset-quality-plugin", + "@kbn/ui-actions-plugin", + "@kbn/field-types", "@kbn/entities-schema", - "@kbn/core-elasticsearch-server", + "@kbn/observability-plugin", + "@kbn/config-schema", + "@kbn/visualization-utils", + "@kbn/usage-collection-plugin", "@kbn/calculate-auto", "@kbn/ml-random-sampler-utils", - "@kbn/charts-plugin", - "@kbn/observability-utils-browser", - "@kbn/usage-collection-plugin", + "@kbn/zod", "@kbn/inference-common", + "@kbn/core-elasticsearch-server", + "@kbn/sse-utils", + "@kbn/management-settings-ids", + "@kbn/observability-utils-server", + "@kbn/licensing-plugin", + "@kbn/core-saved-objects-server", + "@kbn/alerting-plugin", + "@kbn/slo-plugin", + "@kbn/inference-plugin", + "@kbn/spaces-plugin", + "@kbn/apm-data-access-plugin", ], } diff --git a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/highlights.ts b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/highlights.ts index e8019c58d6000..dedf3ced27f28 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/highlights.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/highlights.ts @@ -12,6 +12,7 @@ import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; import { schema } from '@kbn/config-schema'; +import { i18n } from '@kbn/i18n'; import { logEntriesV1 } from '../../../common/http_api'; import { throwErrors } from '../../../common/runtime_types'; @@ -33,6 +34,20 @@ export const initLogEntriesHighlightsRoute = ({ framework, logEntries }: LogsSha { version: '1', validate: { request: { body: escapeHatch } }, + options: { + deprecated: { + documentationUrl: '', + severity: 'warning', + message: i18n.translate( + 'xpack.logsShared.deprecations.postLogEntriesHighlightsRoute.message', + { + defaultMessage: + 'Given the deprecation of the LogStream feature, this API will not return reliable data in upcoming versions of Kibana.', + } + ), + reason: { type: 'deprecate' }, + }, + }, }, async (requestContext, request, response) => { const payload = pipe( diff --git a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary.ts b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary.ts index 2ac889ab9ffdf..68c9d5ea0e166 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary.ts @@ -12,6 +12,7 @@ import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; import { schema } from '@kbn/config-schema'; +import { i18n } from '@kbn/i18n'; import { logEntriesV1 } from '../../../common/http_api'; import { throwErrors } from '../../../common/runtime_types'; @@ -36,6 +37,20 @@ export const initLogEntriesSummaryRoute = ({ { version: '1', validate: { request: { body: escapeHatch } }, + options: { + deprecated: { + documentationUrl: '', + severity: 'warning', + message: i18n.translate( + 'xpack.logsShared.deprecations.postLogEntriesSummaryRoute.message', + { + defaultMessage: + 'Given the deprecation of the LogStream feature, this API will not return reliable data in upcoming versions of Kibana.', + } + ), + reason: { type: 'deprecate' }, + }, + }, }, async (requestContext, request, response) => { const payload = pipe( diff --git a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary_highlights.ts b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary_highlights.ts index b4093f1d6543b..b8f030b91b715 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary_highlights.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_entries/summary_highlights.ts @@ -12,6 +12,7 @@ import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; import { schema } from '@kbn/config-schema'; +import { i18n } from '@kbn/i18n'; import { logEntriesV1 } from '../../../common/http_api'; import { throwErrors } from '../../../common/runtime_types'; @@ -35,6 +36,20 @@ export const initLogEntriesSummaryHighlightsRoute = ({ { version: '1', validate: { request: { body: escapeHatch } }, + options: { + deprecated: { + documentationUrl: '', + severity: 'warning', + message: i18n.translate( + 'xpack.logsShared.deprecations.postLogEntriesSummaryHighlightsRoute.message', + { + defaultMessage: + 'Given the deprecation of the LogStream feature, this API will not return reliable data in upcoming versions of Kibana.', + } + ), + reason: { type: 'deprecate' }, + }, + }, }, async (requestContext, request, response) => { const payload = pipe( diff --git a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/get_log_view.ts b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/get_log_view.ts index 9370c18243b51..16ca40ac2d6d8 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/get_log_view.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/get_log_view.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { i18n } from '@kbn/i18n'; import { logViewsV1 } from '../../../common/http_api'; import { LOG_VIEW_URL } from '../../../common/http_api/log_views'; import { createValidationFunction } from '../../../common/runtime_types'; @@ -30,6 +31,17 @@ export const initGetLogViewRoute = ({ params: createValidationFunction(logViewsV1.getLogViewRequestParamsRT), }, }, + options: { + deprecated: { + documentationUrl: '', + severity: 'warning', + message: i18n.translate('xpack.logsShared.deprecations.getLogViewRoute.message', { + defaultMessage: + 'Given the deprecation of the LogStream feature, this API will not have any effect configuring upcoming versions of Kibana.', + }), + reason: { type: 'deprecate' }, + }, + }, }, async (_requestContext, request, response) => { const { logViewId } = request.params; diff --git a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/put_log_view.ts b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/put_log_view.ts index 95e37bff52f87..c2ba33867d067 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/put_log_view.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/routes/log_views/put_log_view.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { i18n } from '@kbn/i18n'; import { logViewsV1 } from '../../../common/http_api'; import { LOG_VIEW_URL } from '../../../common/http_api/log_views'; import { createValidationFunction } from '../../../common/runtime_types'; @@ -26,6 +27,17 @@ export const initPutLogViewRoute = ({ framework, getStartServices }: LogsSharedB body: createValidationFunction(logViewsV1.putLogViewRequestPayloadRT), }, }, + options: { + deprecated: { + documentationUrl: '', + severity: 'warning', + message: i18n.translate('xpack.logsShared.deprecations.putLogViewRoute.message', { + defaultMessage: + 'Given the deprecation of the LogStream feature, this API will not have any effect configuring upcoming versions of Kibana.', + }), + reason: { type: 'deprecate' }, + }, + }, }, async (_requestContext, request, response) => { const { logViewId } = request.params; diff --git a/x-pack/plugins/observability_solution/logs_shared/server/services/log_entries/log_entries_service.ts b/x-pack/plugins/observability_solution/logs_shared/server/services/log_entries/log_entries_service.ts index 61810c47ff8d2..a1cfab1c24eb1 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/services/log_entries/log_entries_service.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/services/log_entries/log_entries_service.ts @@ -22,10 +22,20 @@ export class LogEntriesService { setupDeps: LogEntriesServiceSetupDeps ) { void core.getStartServices().then(([, startDeps, selfStartDeps]) => { + /** + * @deprecated + * + * Given the deprecation of the LogStream feature, this API will not return reliable data in upcoming versions of Kibana. + */ setupDeps.data.search.registerSearchStrategy( LOG_ENTRIES_SEARCH_STRATEGY, logEntriesSearchStrategyProvider({ ...setupDeps, ...startDeps, ...selfStartDeps }) ); + /** + * @deprecated + * + * Given the deprecation of the LogStream feature, this API will not return reliable data in upcoming versions of Kibana. + */ setupDeps.data.search.registerSearchStrategy( LOG_ENTRY_SEARCH_STRATEGY, logEntrySearchStrategyProvider({ ...setupDeps, ...startDeps, ...selfStartDeps }) diff --git a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts index 94ff0139414f0..e275a89e18b3a 100644 --- a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts +++ b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.test.ts @@ -59,15 +59,18 @@ describe('getViewInAppUrl', () => { }; expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); - expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ - dataset: args.dataViewId, - timeRange: returnedTimeRange, - filters: [], - query: { - query: 'mockedFilter and mockedCountFilter', - language: 'kuery', + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: args.dataViewId, + timeRange: returnedTimeRange, + filters: [], + query: { + query: 'mockedFilter and mockedCountFilter', + language: 'kuery', + }, }, - }); + {} + ); }); it('should call getRedirectUrl with only count filter', () => { @@ -85,15 +88,18 @@ describe('getViewInAppUrl', () => { }; expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); - expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ - dataset: undefined, - timeRange: returnedTimeRange, - filters: [], - query: { - query: 'mockedCountFilter', - language: 'kuery', + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: undefined, + timeRange: returnedTimeRange, + filters: [], + query: { + query: 'mockedCountFilter', + language: 'kuery', + }, }, - }); + {} + ); }); it('should call getRedirectUrl with only filter', () => { @@ -111,15 +117,18 @@ describe('getViewInAppUrl', () => { }; expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); - expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ - dataset: undefined, - timeRange: returnedTimeRange, - filters: [], - query: { - query: 'mockedFilter', - language: 'kuery', + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: undefined, + timeRange: returnedTimeRange, + filters: [], + query: { + query: 'mockedFilter', + language: 'kuery', + }, }, - }); + {} + ); }); it('should call getRedirectUrl with empty query if metrics and filter are not not provided', () => { @@ -130,15 +139,18 @@ describe('getViewInAppUrl', () => { }; expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); - expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ - dataset: undefined, - timeRange: returnedTimeRange, - filters: [], - query: { - query: '', - language: 'kuery', + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: undefined, + timeRange: returnedTimeRange, + filters: [], + query: { + query: '', + language: 'kuery', + }, }, - }); + {} + ); }); it('should call getRedirectUrl with empty if there are multiple metrics', () => { @@ -161,15 +173,18 @@ describe('getViewInAppUrl', () => { }; expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); - expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ - dataset: undefined, - timeRange: returnedTimeRange, - filters: [], - query: { - query: '', - language: 'kuery', + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: undefined, + timeRange: returnedTimeRange, + filters: [], + query: { + query: '', + language: 'kuery', + }, }, - }); + {} + ); }); it('should call getRedirectUrl with filters if group and searchConfiguration filter are provided', () => { @@ -217,33 +232,67 @@ describe('getViewInAppUrl', () => { }; expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); - expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith({ - dataset: undefined, - timeRange: returnedTimeRange, - filters: [ - { - meta: {}, - query: { - term: { - field: { - value: 'justTesting', + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: undefined, + timeRange: returnedTimeRange, + filters: [ + { + meta: {}, + query: { + term: { + field: { + value: 'justTesting', + }, }, }, }, - }, - { - meta: {}, - query: { - match_phrase: { - 'host.name': 'host-1', + { + meta: {}, + query: { + match_phrase: { + 'host.name': 'host-1', + }, }, }, + ], + query: { + query: 'mockedFilter', + language: 'kuery', + }, + }, + {} + ); + }); + + it('should call getRedirectUrl with spaceId', () => { + const spaceId = 'mockedSpaceId'; + const args: GetViewInAppUrlArgs = { + metrics: [ + { + name: 'A', + aggType: Aggregators.COUNT, + filter: 'mockedCountFilter', }, ], - query: { - query: 'mockedFilter', - language: 'kuery', + logsExplorerLocator, + startedAt, + endedAt, + spaceId, + }; + + expect(getViewInAppUrl(args)).toBe('mockedGetRedirectUrl'); + expect(logsExplorerLocator.getRedirectUrl).toHaveBeenCalledWith( + { + dataset: undefined, + timeRange: returnedTimeRange, + filters: [], + query: { + query: 'mockedCountFilter', + language: 'kuery', + }, }, - }); + { spaceId } + ); }); }); diff --git a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.ts b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.ts index 5411eff43bc3d..0d6095f6b520f 100644 --- a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.ts +++ b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/get_view_in_app_url.ts @@ -22,6 +22,7 @@ export interface GetViewInAppUrlArgs { logsExplorerLocator?: LocatorPublic<LogsExplorerLocatorParams>; metrics?: CustomThresholdExpressionMetric[]; startedAt?: string; + spaceId?: string; } export const getViewInAppUrl = ({ @@ -32,6 +33,7 @@ export const getViewInAppUrl = ({ metrics = [], searchConfiguration, startedAt = new Date().toISOString(), + spaceId, }: GetViewInAppUrlArgs) => { if (!logsExplorerLocator) return ''; @@ -56,10 +58,13 @@ export const getViewInAppUrl = ({ query.query = searchConfigurationQuery; } - return logsExplorerLocator?.getRedirectUrl({ - dataset, - timeRange, - query, - filters: [...searchConfigurationFilters, ...groupFilters], - }); + return logsExplorerLocator?.getRedirectUrl( + { + dataset, + timeRange, + query, + filters: [...searchConfigurationFilters, ...groupFilters], + }, + { spaceId } + ); }; diff --git a/x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/rule_condition_chart.tsx b/x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/rule_condition_chart.tsx index 2a9fa2c295274..02dc7bc1f51d9 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/rule_condition_chart.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/rule_condition_chart.tsx @@ -138,19 +138,21 @@ export function RuleConditionChart({ const errorDiv = document.querySelector('.lnsEmbeddedError'); if (errorDiv) { const paragraphElements = errorDiv.querySelectorAll('p'); - if (!paragraphElements || paragraphElements.length < 2) return; + if (!paragraphElements) return; paragraphElements[0].innerText = i18n.translate( 'xpack.observability.ruleCondition.chart.error_equation.title', { defaultMessage: 'An error occurred while rendering the chart', } ); - paragraphElements[1].innerText = i18n.translate( - 'xpack.observability.ruleCondition.chart.error_equation.description', - { - defaultMessage: 'Check the rule equation.', - } - ); + if (paragraphElements.length > 1) { + paragraphElements[1].innerText = i18n.translate( + 'xpack.observability.ruleCondition.chart.error_equation.description', + { + defaultMessage: 'Check the rule equation.', + } + ); + } } }); }, [chartLoading, attributes]); diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts index b8dff520ff119..fb5aef4e3ddcb 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts @@ -38,6 +38,7 @@ const initialRuleState: TestRuleState = { }; const fakeLogger = <Meta extends LogMeta = LogMeta>(msg: string, meta?: Meta) => {}; +const MOCKED_SPACE_ID = 'mockedSpaceId'; const logger = { trace: fakeLogger, @@ -90,7 +91,7 @@ const mockOptions = { }, trackedAlertsRecovered: {}, }, - spaceId: '', + spaceId: MOCKED_SPACE_ID, rule: { id: '', name: '', @@ -1563,7 +1564,7 @@ describe('The custom threshold alert type', () => { expect(services.alertsClient.setAlertData).toBeCalledTimes(1); expect(services.alertsClient.setAlertData).toBeCalledWith({ context: { - alertDetailsUrl: 'http://localhost:5601/app/observability/alerts/uuid-a', + alertDetailsUrl: `http://localhost:5601/s/${MOCKED_SPACE_ID}/app/observability/alerts/uuid-a`, viewInAppUrl: 'mockedViewInApp', group: [ { @@ -1584,6 +1585,7 @@ describe('The custom threshold alert type', () => { }); expect(getViewInAppUrl).lastCalledWith({ dataViewId: 'c34a7c79-a88b-4b4a-ad19-72f6d24104e4', + spaceId: MOCKED_SPACE_ID, groups: [ { field: 'host.name', @@ -1800,7 +1802,7 @@ describe('The custom threshold alert type', () => { await execute(true); const recentAlert = getLastReportedAlert(instanceID); expect(recentAlert?.context).toEqual({ - alertDetailsUrl: 'http://localhost:5601/app/observability/alerts/uuid-*', + alertDetailsUrl: `http://localhost:5601/s/${MOCKED_SPACE_ID}/app/observability/alerts/uuid-*`, reason: 'Average test.metric.3 reported no data in the last 1m', timestamp: STARTED_AT_MOCK_DATE.toISOString(), value: ['[NO DATA]', null], @@ -3438,6 +3440,7 @@ describe('The custom threshold alert type', () => { const execute = (alertOnNoData: boolean, sourceId: string = 'default') => executor({ ...mockOptions, + spaceId: '', services, params: { ...mockOptions.params, diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts index 591e8062d5ca7..72c9795122dc8 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts @@ -285,6 +285,7 @@ export const createCustomThresholdExecutor = ({ metrics: alertResults.length === 1 ? alertResults[0][group].metrics : [], searchConfiguration: params.searchConfiguration, startedAt: indexedStartedAt, + spaceId, }), ...additionalContext, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/jest.config.js b/x-pack/plugins/observability_solution/observability_ai_assistant/jest.config.js deleted file mode 100644 index b684a6126e537..0000000000000 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/jest.config.js +++ /dev/null @@ -1,25 +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. - */ - -module.exports = { - preset: '@kbn/test', - rootDir: '../../../..', - roots: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant/public', - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant/common', - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant/server', - ], - setupFiles: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant/.storybook/jest_setup.js', - ], - collectCoverage: true, - collectCoverageFrom: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant/{common,public,server}/**/*.{js,ts,tsx}', - ], - - coverageReporters: ['html'], -}; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/jest.config.js b/x-pack/plugins/observability_solution/observability_ai_assistant_app/jest.config.js deleted file mode 100644 index 7e3fb9e750448..0000000000000 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/jest.config.js +++ /dev/null @@ -1,25 +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. - */ - -module.exports = { - preset: '@kbn/test', - rootDir: '../../../..', - roots: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_app/public', - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_app/common', - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_app/server', - ], - setupFiles: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/jest_setup.js', - ], - collectCoverage: true, - collectCoverageFrom: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_app/{common,public,server}/**/*.{js,ts,tsx}', - ], - - coverageReporters: ['html'], -}; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc b/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc index 655ccc396d3fe..033d72a02427f 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc @@ -1,10 +1,7 @@ { "type": "test-helper", "id": "@kbn/observability-onboarding-e2e", - "owner": [ - "@elastic/obs-ux-logs-team", - "@elastic/obs-ux-onboarding-team" - ], + "owner": ["@elastic/obs-ux-logs-team"], "group": "observability", "visibility": "private", "devOnly": true diff --git a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc index 8c24f5376a4bb..b1c3856839f99 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc @@ -1,10 +1,7 @@ { "type": "plugin", "id": "@kbn/observability-onboarding-plugin", - "owner": [ - "@elastic/obs-ux-logs-team", - "@elastic/obs-ux-onboarding-team" - ], + "owner": ["@elastic/obs-ux-logs-team"], "group": "observability", "visibility": "private", "plugin": { diff --git a/x-pack/plugins/observability_solution/profiling/public/index.tsx b/x-pack/plugins/observability_solution/profiling/public/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/profiling/public/index.tsx rename to x-pack/plugins/observability_solution/profiling/public/index.ts diff --git a/x-pack/plugins/observability_solution/profiling/public/plugin.tsx b/x-pack/plugins/observability_solution/profiling/public/plugin.ts similarity index 73% rename from x-pack/plugins/observability_solution/profiling/public/plugin.tsx rename to x-pack/plugins/observability_solution/profiling/public/plugin.ts index fca4f8dcb4c6b..752b9c92a2195 100644 --- a/x-pack/plugins/observability_solution/profiling/public/plugin.tsx +++ b/x-pack/plugins/observability_solution/profiling/public/plugin.ts @@ -7,6 +7,7 @@ import { AppMountParameters, + AppUpdater, CoreSetup, CoreStart, DEFAULT_APP_CATEGORIES, @@ -15,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { NavigationSection } from '@kbn/observability-shared-plugin/public'; import type { Location } from 'history'; -import { BehaviorSubject, combineLatest, from, map } from 'rxjs'; +import { BehaviorSubject, combineLatest, from, map, take } from 'rxjs'; import { OBLT_PROFILING_APP_ID } from '@kbn/deeplinks-observability'; import { registerEmbeddables } from './embeddables/register_embeddables'; import { getServices } from './services'; @@ -64,29 +65,47 @@ export class ProfilingPlugin ]; const kuerySubject = new BehaviorSubject<string>(''); + const appUpdater$ = new BehaviorSubject<AppUpdater>(() => ({})); const section$ = combineLatest([from(coreSetup.getStartServices()), kuerySubject]).pipe( map(([[coreStart], kuery]) => { if (coreStart.application.capabilities.profiling.show) { - const sections: NavigationSection[] = [ - { - label: i18n.translate('xpack.profiling.navigation.sectionLabel', { - defaultMessage: 'Universal Profiling', - }), - entries: links.map((link) => { - return { - app: OBLT_PROFILING_APP_ID, - label: link.title, - path: `${link.path}?kuery=${kuery ?? ''}`, - matchPath: (path) => { - return path.startsWith(link.path); - }, - }; - }), - sortKey: 700, - }, - ]; - return sections; + let isSidebarEnabled = true; + coreStart.chrome + .getChromeStyle$() + .pipe(take(1)) + .subscribe((style) => (isSidebarEnabled = style === 'classic')); + + if (isSidebarEnabled) { + // classic navigation + const sections: NavigationSection[] = [ + { + label: i18n.translate('xpack.profiling.navigation.sectionLabel', { + defaultMessage: 'Universal Profiling', + }), + entries: links.map((link) => { + return { + app: OBLT_PROFILING_APP_ID, + label: link.title, + path: kuery ? `${link.path}?kuery=${kuery}` : link.path, + matchPath: (path) => { + return path.startsWith(link.path); + }, + }; + }), + sortKey: 700, + }, + ]; + return sections; + } else { + // solution navigation + appUpdater$.next(() => ({ + deepLinks: links.map((link) => ({ + ...link, + path: kuery ? `${link.path}?kuery=${encodeURIComponent(kuery)}` : link.path, + })), + })); + } } return []; }) @@ -103,6 +122,7 @@ export class ProfilingPlugin appRoute: '/app/profiling', category: DEFAULT_APP_CATEGORIES.observability, deepLinks: links, + updater$: appUpdater$, async mount({ element, history, theme$, setHeaderActionMenu }: AppMountParameters) { const [coreStart, pluginsStart] = await coreSetup.getStartServices(); diff --git a/x-pack/plugins/observability_solution/slo/e2e/page_objects/slo_app.tsx b/x-pack/plugins/observability_solution/slo/e2e/page_objects/slo_app.tsx index 5310bffb03d92..a859c789b4e37 100644 --- a/x-pack/plugins/observability_solution/slo/e2e/page_objects/slo_app.tsx +++ b/x-pack/plugins/observability_solution/slo/e2e/page_objects/slo_app.tsx @@ -7,7 +7,7 @@ import { Page } from '@elastic/synthetics'; import { loginPageProvider } from '@kbn/synthetics-e2e/page_objects/login'; import { utilsPageProvider } from '@kbn/synthetics-e2e/page_objects/utils'; -import { recordVideo } from '@kbn/synthetics-e2e/helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; export function sloAppPageProvider({ page, kibanaUrl }: { page: Page; kibanaUrl: string }) { page.setDefaultTimeout(60 * 1000); diff --git a/x-pack/plugins/observability_solution/slo/e2e/synthetics_run.ts b/x-pack/plugins/observability_solution/slo/e2e/synthetics_run.ts index 642b7ef4cff23..0d32aae207e4e 100644 --- a/x-pack/plugins/observability_solution/slo/e2e/synthetics_run.ts +++ b/x-pack/plugins/observability_solution/slo/e2e/synthetics_run.ts @@ -5,7 +5,7 @@ * 2.0. */ import { FtrConfigProviderContext } from '@kbn/test'; -import { SyntheticsRunner, argv } from '@kbn/synthetics-e2e'; +import { SyntheticsRunner, argv } from '@kbn/observability-synthetics-test-data'; const { headless, grep, bail: pauseOnError } = argv; diff --git a/x-pack/plugins/observability_solution/slo/e2e/tsconfig.json b/x-pack/plugins/observability_solution/slo/e2e/tsconfig.json index 6c4be7e101a02..68203a4db6013 100644 --- a/x-pack/plugins/observability_solution/slo/e2e/tsconfig.json +++ b/x-pack/plugins/observability_solution/slo/e2e/tsconfig.json @@ -12,5 +12,6 @@ "@kbn/ftr-common-functional-services", "@kbn/data-forge", "@kbn/synthetics-e2e", + "@kbn/observability-synthetics-test-data", ] } diff --git a/x-pack/plugins/observability_solution/slo/server/client/index.ts b/x-pack/plugins/observability_solution/slo/server/client/index.ts new file mode 100644 index 0000000000000..277aeb71399b1 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/server/client/index.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { + ElasticsearchClient, + KibanaRequest, + SavedObjectsClientContract, +} from '@kbn/core/server'; +import { castArray, once } from 'lodash'; +import { getListOfSummaryIndices, getSloSettings } from '../services/slo_settings'; + +export interface SloClient { + getSummaryIndices(): Promise<string[]>; +} + +export function getSloClientWithRequest({ + esClient, + soClient, +}: { + request: KibanaRequest; + esClient: ElasticsearchClient; + soClient: SavedObjectsClientContract; +}): SloClient { + const getListOfSummaryIndicesOnce = once(async () => { + const settings = await getSloSettings(soClient); + + const { indices } = await getListOfSummaryIndices(esClient, settings); + + return castArray(indices); + }); + + return { + getSummaryIndices: async () => { + return await getListOfSummaryIndicesOnce(); + }, + }; +} diff --git a/x-pack/plugins/observability_solution/slo/server/index.ts b/x-pack/plugins/observability_solution/slo/server/index.ts index 76806ac4d16cd..b38956141137d 100644 --- a/x-pack/plugins/observability_solution/slo/server/index.ts +++ b/x-pack/plugins/observability_solution/slo/server/index.ts @@ -16,6 +16,10 @@ export async function plugin(ctx: PluginInitializerContext<SLOConfig>) { return new SLOPlugin(ctx); } +export type { SloClient } from './client'; + +export type { SLOServerSetup, SLOServerStart } from './types'; + export const config: PluginConfigDescriptor<SLOConfig> = { schema: configSchema, exposeToBrowser: { diff --git a/x-pack/plugins/observability_solution/slo/server/plugin.ts b/x-pack/plugins/observability_solution/slo/server/plugin.ts index 99cd4a2230a94..e7b25fe06ef32 100644 --- a/x-pack/plugins/observability_solution/slo/server/plugin.ts +++ b/x-pack/plugins/observability_solution/slo/server/plugin.ts @@ -9,6 +9,7 @@ import { CoreSetup, CoreStart, DEFAULT_APP_CATEGORIES, + KibanaRequest, Logger, Plugin, PluginInitializerContext, @@ -36,6 +37,7 @@ import type { SLOServerSetup, SLOServerStart, } from './types'; +import { getSloClientWithRequest } from './client'; const sloRuleTypes = [SLO_BURN_RATE_RULE_TYPE_ID]; @@ -179,6 +181,14 @@ export class SLOPlugin ?.start(plugins.taskManager, internalSoClient, internalEsClient) .catch(() => {}); - return {}; + return { + getSloClientWithRequest: (request: KibanaRequest) => { + return getSloClientWithRequest({ + request, + soClient: core.savedObjects.getScopedClient(request), + esClient: internalEsClient, + }); + }, + }; } } diff --git a/x-pack/plugins/observability_solution/slo/server/types.ts b/x-pack/plugins/observability_solution/slo/server/types.ts index 9a40547820182..5ec6e2c51e902 100644 --- a/x-pack/plugins/observability_solution/slo/server/types.ts +++ b/x-pack/plugins/observability_solution/slo/server/types.ts @@ -21,14 +21,17 @@ import { TaskManagerStartContract, } from '@kbn/task-manager-plugin/server'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; +import type { KibanaRequest } from '@kbn/core/server'; +import type { SloClient } from './client'; export type { SLOConfig } from '../common/config'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface SLOServerSetup {} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface SLOServerStart {} +export interface SLOServerStart { + getSloClientWithRequest: (request: KibanaRequest) => SloClient; +} export interface SLOPluginSetupDependencies { alerting: AlertingServerSetup; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/config.ts b/x-pack/plugins/observability_solution/synthetics/e2e/config.ts index 8e1e97e5c1d37..ff04a6d7bf166 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/config.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/config.ts @@ -10,8 +10,8 @@ import { CA_CERT_PATH } from '@kbn/dev-utils'; import { get } from 'lodash'; import { commonFunctionalServices } from '@kbn/ftr-common-functional-services'; import { commonFunctionalUIServices } from '@kbn/ftr-common-functional-ui-services'; +import { readKibanaConfig } from '@kbn/observability-synthetics-test-data'; -import { readKibanaConfig } from './tasks/read_kibana_config'; const MANIFEST_KEY = 'xpack.uptime.service.manifestUrl'; const SERVICE_PASSWORD = 'xpack.uptime.service.password'; const SERVICE_USERNAME = 'xpack.uptime.service.username'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/helpers/test_reporter.ts b/x-pack/plugins/observability_solution/synthetics/e2e/helpers/test_reporter.ts deleted file mode 100644 index 198a038ec027f..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/e2e/helpers/test_reporter.ts +++ /dev/null @@ -1,229 +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 { Journey, Step } from '@elastic/synthetics/dist/dsl'; -import { Reporter, ReporterOptions } from '@elastic/synthetics'; -import { - JourneyEndResult, - JourneyStartResult, - StepEndResult, -} from '@elastic/synthetics/dist/common_types'; - -import { yellow, green, cyan, red, bold } from 'chalk'; - -// eslint-disable-next-line no-console -const log = console.log; - -import { performance } from 'perf_hooks'; -import * as fs from 'fs'; -import { gatherScreenshots } from '@elastic/synthetics/dist/reporters/json'; -import { CACHE_PATH } from '@elastic/synthetics/dist/helpers'; -import { join } from 'path'; - -function renderError(error: any) { - let output = ''; - const outer = indent(''); - const inner = indent(outer); - const container = outer + '---\n'; - output += container; - let stack = error.stack; - if (stack) { - output += inner + 'stack: |-\n'; - stack = rewriteErrorStack(stack, findPWLogsIndexes(stack)); - const lines = String(stack).split('\n'); - for (const line of lines) { - output += inner + ' ' + line + '\n'; - } - } - output += container; - return red(output); -} - -function renderDuration(durationMs: number) { - return Number(durationMs).toFixed(0); -} - -export class TestReporter implements Reporter { - metrics = { - succeeded: 0, - failed: 0, - skipped: 0, - }; - - journeys: Map<string, Array<StepEndResult & { name: string }>> = new Map(); - - constructor(options: ReporterOptions = {}) {} - - onJourneyStart(journey: Journey, {}: JourneyStartResult) { - if (process.env.CI) { - this.write(`\n--- Journey: ${journey.name}`); - } else { - this.write(bold(`\n Journey: ${journey.name}`)); - } - } - - onStepEnd(journey: Journey, step: Step, result: StepEndResult) { - const { status, end, start, error } = result; - const message = `${symbols[status]} Step: '${step.name}' ${status} (${renderDuration( - (end - start) * 1000 - )} ms)`; - this.write(indent(message)); - if (error) { - this.write(renderError(error)); - } - this.metrics[status]++; - if (!this.journeys.has(journey.name)) { - this.journeys.set(journey.name, []); - } - this.journeys.get(journey.name)?.push({ name: step.name, ...result }); - } - - async onJourneyEnd(journey: Journey, { error, start, end, status }: JourneyEndResult) { - const { failed, succeeded, skipped } = this.metrics; - const total = failed + succeeded + skipped; - if (total === 0 && error) { - this.write(renderError(error)); - } - const message = `${symbols[status]} Took (${renderDuration(end - start)} seconds)`; - this.write(message); - - await fs.promises.mkdir('.journeys/failed_steps', { recursive: true }); - - await gatherScreenshots(join(CACHE_PATH, 'screenshots'), async (screenshot) => { - const { data, step } = screenshot; - - if (status === 'failed') { - await (async () => { - await fs.promises.writeFile(join('.journeys/failed_steps/', `${step.name}.jpg`), data, { - encoding: 'base64', - }); - })(); - } - }); - } - - onEnd() { - const failedJourneys = Array.from(this.journeys.entries()).filter(([, steps]) => - steps.some((step) => step.status === 'failed') - ); - - if (failedJourneys.length > 0) { - failedJourneys.forEach(([journeyName, steps]) => { - if (process.env.CI) { - const name = red(`Journey: ${journeyName} 🥵`); - this.write(`\n+++ ${name}`); - steps.forEach((stepResult) => { - const { status, end, start, error, name: stepName } = stepResult; - const message = `${symbols[status]} Step: '${stepName}' ${status} (${renderDuration( - (end - start) * 1000 - )} ms)`; - this.write(indent(message)); - if (error) { - this.write(renderError(error)); - } - }); - } - }); - } - - const successfulJourneys = Array.from(this.journeys.entries()).filter(([, steps]) => - steps.every((step) => step.status === 'succeeded') - ); - - successfulJourneys.forEach(([journeyName, steps]) => { - try { - fs.unlinkSync('.journeys/videos/' + journeyName + '.webm'); - } catch (e) { - // eslint-disable-next-line no-console - console.log( - 'Failed to delete video file for path ' + '.journeys/videos/' + journeyName + '.webm' - ); - } - }); - - const { failed, succeeded, skipped } = this.metrics; - const total = failed + succeeded + skipped; - - let message = '\n'; - if (total === 0) { - message = 'No tests found!'; - message += ` (${renderDuration(now())} ms) \n`; - this.write(message); - return; - } - - message += succeeded > 0 ? green(` ${succeeded} passed`) : ''; - message += failed > 0 ? red(` ${failed} failed`) : ''; - message += skipped > 0 ? cyan(` ${skipped} skipped`) : ''; - message += ` (${renderDuration(now() / 1000)} seconds) \n`; - this.write(message); - } - - write(message: any) { - if (typeof message === 'object') { - message = JSON.stringify(message); - } - log(message + '\n'); - } -} - -const SEPARATOR = '\n'; - -function indent(lines: string, tab = ' ') { - return lines.replace(/^/gm, tab); -} - -const NO_UTF8_SUPPORT = process.platform === 'win32'; -const symbols = { - warning: yellow(NO_UTF8_SUPPORT ? '!' : '⚠'), - skipped: cyan('-'), - progress: cyan('>'), - succeeded: green(NO_UTF8_SUPPORT ? 'ok' : '✓'), - failed: red(NO_UTF8_SUPPORT ? 'x' : '✖'), -}; - -function now() { - return performance.now(); -} - -function findPWLogsIndexes(msgOrStack: string): [number, number] { - let startIndex = 0; - let endIndex = 0; - if (!msgOrStack) { - return [startIndex, endIndex]; - } - const lines = String(msgOrStack).split(SEPARATOR); - const logStart = /[=]{3,} logs [=]{3,}/; - const logEnd = /[=]{10,}/; - lines.forEach((line, index) => { - if (logStart.test(line)) { - startIndex = index; - } else if (logEnd.test(line)) { - endIndex = index; - } - }); - return [startIndex, endIndex]; -} - -function rewriteErrorStack(stack: string, indexes: [number, number]) { - const [start, end] = indexes; - /** - * Do not rewrite if its not a playwright error - */ - if (start === 0 && end === 0) { - return stack; - } - const linesToKeep = start + 3; - if (start > 0 && linesToKeep < end) { - const lines = stack.split(SEPARATOR); - return lines - .slice(0, linesToKeep) - .concat(...lines.slice(end)) - .join(SEPARATOR); - } - return stack; -} diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/index.ts b/x-pack/plugins/observability_solution/synthetics/e2e/index.ts index f0e9b5e8b760c..faec8474541d9 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/index.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/index.ts @@ -5,7 +5,5 @@ * 2.0. */ -export { SyntheticsRunner } from './helpers/synthetics_runner'; -export { argv } from './helpers/parse_args_params'; export { loginPageProvider } from './page_objects/login'; export { utilsPageProvider } from './page_objects/utils'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/data_retention.journey.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/data_retention.journey.ts index 1dd2fe3a44aed..4640e2adf9eee 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/data_retention.journey.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/data_retention.journey.ts @@ -7,7 +7,7 @@ import { journey, step, expect, Page } from '@elastic/synthetics'; import { RetryService } from '@kbn/ftr-common-functional-services'; -import { recordVideo } from '../../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { syntheticsAppPageProvider } from '../page_objects/synthetics_app'; import { byTestId, assertText } from '../../helpers/utils'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/project_api_keys.journey.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/project_api_keys.journey.ts index 44cfcbebc6616..2c1a873b0db53 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/project_api_keys.journey.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/project_api_keys.journey.ts @@ -7,7 +7,7 @@ import { journey, step, expect, before } from '@elastic/synthetics'; import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; -import { recordVideo } from '../../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; journey('ProjectAPIKeys', async ({ page }) => { recordVideo(page); diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/page_objects/synthetics_app.tsx b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/page_objects/synthetics_app.tsx index f9eb448615de8..2f3d0099192f4 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/page_objects/synthetics_app.tsx +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/page_objects/synthetics_app.tsx @@ -7,7 +7,7 @@ import { expect, Page } from '@elastic/synthetics'; import { RetryService } from '@kbn/ftr-common-functional-services'; import { FormMonitorType } from '@kbn/synthetics-plugin/common/runtime_types/monitor_management'; -import { recordVideo } from '../../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { loginPageProvider } from '../../page_objects/login'; import { utilsPageProvider } from '../../page_objects/utils'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/synthetics_run.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/synthetics_run.ts index 3624c03c5f1f0..4f097c6926872 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/synthetics_run.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/synthetics_run.ts @@ -4,10 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { SyntheticsRunner, argv } from '@kbn/observability-synthetics-test-data'; import { FtrConfigProviderContext } from '@kbn/test'; import path from 'path'; -import { argv } from '../helpers/parse_args_params'; -import { SyntheticsRunner } from '../helpers/synthetics_runner'; const { headless, grep, bail: pauseOnError } = argv; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/tasks/es_archiver.ts b/x-pack/plugins/observability_solution/synthetics/e2e/tasks/es_archiver.ts deleted file mode 100644 index bbb66b19f5a5e..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/e2e/tasks/es_archiver.ts +++ /dev/null @@ -1,37 +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 Path from 'path'; -import { execSync } from 'child_process'; - -const ES_ARCHIVE_DIR = './fixtures/es_archiver'; - -// Otherwise execSync would inject NODE_TLS_REJECT_UNAUTHORIZED=0 and node would abort if used over https -const NODE_TLS_REJECT_UNAUTHORIZED = '1'; - -export const esArchiverLoad = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - execSync( - `node ../../../../scripts/es_archiver load "${path}" --config ../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverUnload = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - execSync( - `node ../../../../scripts/es_archiver unload "${path}" --config ../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverResetKibana = () => { - execSync( - `node ../../../../scripts/es_archiver empty-kibana-index --config ../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json b/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json index 7584c000a76fa..7a98afb3a6faf 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json +++ b/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json @@ -12,10 +12,7 @@ "@kbn/dev-utils", "@kbn/ux-plugin/e2e", "@kbn/ftr-common-functional-services", - "@kbn/apm-plugin", - "@kbn/es-archiver", "@kbn/synthetics-plugin", - "@kbn/repo-info", "@kbn/observability-synthetics-test-data", "@kbn/ftr-common-functional-ui-services" ] diff --git a/x-pack/plugins/observability_solution/synthetics/server/queries/query_monitor_status.ts b/x-pack/plugins/observability_solution/synthetics/server/queries/query_monitor_status.ts deleted file mode 100644 index 5ccb33fb491fd..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/server/queries/query_monitor_status.ts +++ /dev/null @@ -1,300 +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 times from 'lodash/times'; -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { cloneDeep, intersection } from 'lodash'; -import { SavedObjectsFindResult } from '@kbn/core-saved-objects-api-server'; -import { MsearchMultisearchBody } from '@elastic/elasticsearch/lib/api/types'; - -import { isStatusEnabled } from '../../common/runtime_types/monitor_management/alert_config'; -import { FINAL_SUMMARY_FILTER } from '../../common/constants/client_defaults'; -import { - ConfigKey, - EncryptedSyntheticsMonitorAttributes, - OverviewPing, - OverviewStatus, - OverviewStatusMetaData, -} from '../../common/runtime_types'; -import { createEsParams, SyntheticsEsClient } from '../lib'; - -const DEFAULT_MAX_ES_BUCKET_SIZE = 10000; - -const fields = [ - '@timestamp', - 'summary', - 'monitor', - 'observer', - 'config_id', - 'error', - 'agent', - 'url', - 'state', - 'tags', -]; - -const getStatusQuery = ({ - idSize, - idsToQuery, - range, - monitorLocationIds, -}: { - idSize: number; - monitorLocationIds: string[]; - range: { from: string; to: string }; - idsToQuery: string[]; -}) => { - const params = createEsParams({ - body: { - size: 0, - query: { - bool: { - filter: [ - FINAL_SUMMARY_FILTER, - { - range: { - '@timestamp': { - gte: range.from, - lte: range.to, - }, - }, - }, - { - terms: { - 'monitor.id': idsToQuery, - }, - }, - ] as QueryDslQueryContainer[], - }, - }, - aggs: { - id: { - terms: { - field: 'monitor.id', - size: idSize, - }, - aggs: { - location: { - terms: { - field: 'observer.name', - size: monitorLocationIds.length || 100, - }, - aggs: { - status: { - top_hits: { - size: 1, - sort: [ - { - '@timestamp': { - order: 'desc', - }, - }, - ], - _source: { - includes: fields, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }); - - if (monitorLocationIds.length > 0) { - params.body.query?.bool?.filter.push({ - terms: { - 'observer.name': monitorLocationIds, - }, - }); - } - return params; -}; - -type StatusQueryParams = ReturnType<typeof getStatusQuery>; -type OverviewStatusResponse = Omit< - OverviewStatus, - | 'disabledCount' - | 'allMonitorsCount' - | 'disabledMonitorsCount' - | 'projectMonitorsCount' - | 'disabledMonitorQueryIds' - | 'allIds' ->; - -export async function queryMonitorStatus({ - esClient, - monitorLocationIds, - range, - monitorQueryIds, - monitorLocationsMap, - monitorQueryIdToConfigIdMap, - monitors, -}: { - esClient: SyntheticsEsClient; - monitorLocationIds: string[]; - range: { from: string; to: string }; - monitorQueryIds: string[]; - monitorLocationsMap: Record<string, string[]>; - monitorQueryIdToConfigIdMap: Record<string, string>; - monitors: Array<SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>>; -}): Promise<OverviewStatusResponse> { - const idSize = Math.trunc(DEFAULT_MAX_ES_BUCKET_SIZE / monitorLocationIds.length || 1); - const pageCount = Math.ceil(monitorQueryIds.length / idSize); - let up = 0; - let down = 0; - const upConfigs: Record<string, OverviewStatusMetaData> = {}; - const downConfigs: Record<string, OverviewStatusMetaData> = {}; - const monitorsWithoutData = new Map(Object.entries(cloneDeep(monitorLocationsMap))); - const pendingConfigs: Record<string, OverviewStatusMetaData> = {}; - const disabledConfigs: Record<string, OverviewStatusMetaData> = {}; - - monitors - .filter((monitor) => !monitor.attributes[ConfigKey.ENABLED]) - .forEach((monitor) => { - const monitorQueryId = monitor.attributes[ConfigKey.MONITOR_QUERY_ID]; - monitor.attributes[ConfigKey.LOCATIONS]?.forEach((location) => { - disabledConfigs[`${monitorQueryIdToConfigIdMap[monitorQueryId]}-${location.id}`] = { - configId: `${monitorQueryIdToConfigIdMap[monitorQueryId]}`, - monitorQueryId, - status: 'disabled', - locationId: location.id, - locationLabel: location.label, - ...getMonitorMeta(monitor), - }; - }); - }); - - const queries: MsearchMultisearchBody[] = times(pageCount).map((i) => { - const idsToQuery = (monitorQueryIds as string[]).slice(i * idSize, i * idSize + idSize); - return getStatusQuery({ - idSize, - monitorLocationIds, - range, - idsToQuery, - }).body; - }); - - if (queries.length) { - const { responses } = await esClient.msearch<StatusQueryParams, OverviewPing>( - queries, - 'getCurrentStatusOverview' - ); - - responses.forEach((result) => { - result.aggregations?.id.buckets.forEach(({ location, key: queryId }) => { - const locationSummaries = location.buckets.map(({ status, key: locationName }) => { - const ping = status.hits.hits[0]._source; - return { location: locationName, ping }; - }); - - const monitor = monitors.find((m) => m.attributes[ConfigKey.MONITOR_QUERY_ID] === queryId)!; - - // discard any locations that are not in the monitorLocationsMap for the given monitor as well as those which are - // in monitorLocationsMap but not in listOfLocations - const monLocations = monitorLocationsMap?.[queryId]; - const monQueriedLocations = intersection(monLocations, monitorLocationIds); - monQueriedLocations?.forEach((monLocation) => { - const locationSummary = locationSummaries.find( - (summary) => summary.location === monLocation - ); - - if (locationSummary) { - const { ping } = locationSummary; - const downCount = ping.summary?.down ?? 0; - const upCount = ping.summary?.up ?? 0; - const configId = ping.config_id; - const monitorQueryId = ping.monitor.id; - - const meta = { - ping, - configId, - monitorQueryId, - locationId: monLocation, - timestamp: ping['@timestamp'], - locationLabel: ping.observer.geo!.name!, - ...getMonitorMeta(monitor), - }; - - if (downCount > 0) { - down += 1; - downConfigs[`${configId}-${monLocation}`] = { - ...meta, - status: 'down', - }; - } else if (upCount > 0) { - up += 1; - upConfigs[`${configId}-${monLocation}`] = { - ...meta, - status: 'up', - }; - } - const monitorsMissingData = monitorsWithoutData.get(monitorQueryId) || []; - monitorsWithoutData.set( - monitorQueryId, - monitorsMissingData?.filter((loc) => loc !== monLocation) - ); - if (!monitorsWithoutData.get(monitorQueryId)?.length) { - monitorsWithoutData.delete(monitorQueryId); - } - } - }); - }); - }); - } - - // identify the remaining monitors without data, to determine pending monitors - for (const [queryId, locs] of monitorsWithoutData) { - const monitor = monitors.find((m) => m.attributes[ConfigKey.MONITOR_QUERY_ID] === queryId)!; - locs.forEach((loc) => { - pendingConfigs[`${monitorQueryIdToConfigIdMap[queryId]}-${loc}`] = { - configId: `${monitorQueryIdToConfigIdMap[queryId]}`, - monitorQueryId: queryId, - status: 'unknown', - locationId: loc, - locationLabel: monitor.attributes[ConfigKey.LOCATIONS]?.find( - (location) => location.id === loc - )?.label!, - name: monitor.attributes[ConfigKey.NAME], - schedule: monitor.attributes[ConfigKey.SCHEDULE].number, - tags: monitor.attributes[ConfigKey.TAGS], - isEnabled: monitor.attributes[ConfigKey.ENABLED], - type: monitor.attributes[ConfigKey.MONITOR_TYPE], - projectId: monitor.attributes[ConfigKey.PROJECT_ID], - isStatusAlertEnabled: isStatusEnabled(monitor.attributes[ConfigKey.ALERT_CONFIG]), - updated_at: monitor.updated_at, - }; - }); - } - - return { - up, - down, - pending: Object.values(pendingConfigs).length, - upConfigs, - downConfigs, - pendingConfigs, - enabledMonitorQueryIds: monitorQueryIds, - disabledConfigs, - }; -} - -const getMonitorMeta = (monitor: SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>) => { - return { - name: monitor.attributes[ConfigKey.NAME], - schedule: monitor.attributes[ConfigKey.SCHEDULE].number, - tags: monitor.attributes[ConfigKey.TAGS], - isEnabled: monitor.attributes[ConfigKey.ENABLED], - type: monitor.attributes[ConfigKey.MONITOR_TYPE], - projectId: monitor.attributes[ConfigKey.PROJECT_ID], - isStatusAlertEnabled: isStatusEnabled(monitor.attributes[ConfigKey.ALERT_CONFIG]), - updated_at: monitor.updated_at, - spaceId: monitor.namespaces?.[0], - }; -}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.test.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.test.ts deleted file mode 100644 index a3ddc0079d460..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.test.ts +++ /dev/null @@ -1,1291 +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 { SavedObjectsFindResult } from '@kbn/core-saved-objects-api-server'; -import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { periodToMs } from './overview_status'; -import { queryMonitorStatus } from '../../queries/query_monitor_status'; -import { getStatus } from './overview_status'; -import times from 'lodash/times'; -import * as monitorsFns from '../../saved_objects/synthetics_monitor/get_all_monitors'; -import { EncryptedSyntheticsMonitorAttributes } from '../../../common/runtime_types'; -import { RouteContext } from '../types'; -import { getUptimeESMockClient } from '../../queries/test_helpers'; - -import * as commonLibs from '../common'; -import { SyntheticsServerSetup } from '../../types'; -import { mockEncryptedSO } from '../../synthetics_service/utils/mocks'; -import { savedObjectsServiceMock } from '@kbn/core-saved-objects-server-mocks'; -import { loggerMock } from '@kbn/logging-mocks'; -import * as allLocationsFn from '../../synthetics_service/get_all_locations'; -const allLocations: any = [ - { - id: 'us_central_qa', - label: 'US Central QA', - }, - { - id: 'us_central', - label: 'North America - US Central', - }, -]; -jest.spyOn(allLocationsFn, 'getAllLocations').mockResolvedValue({ - publicLocations: allLocations, - privateLocations: [], - allLocations, -}); - -jest.mock('../../saved_objects/synthetics_monitor/get_all_monitors', () => ({ - ...jest.requireActual('../../saved_objects/synthetics_monitor/get_all_monitors'), - getAllMonitors: jest.fn(), -})); - -jest.spyOn(commonLibs, 'getMonitors').mockResolvedValue({ - per_page: 10, - saved_objects: [ - { - id: 'mon-1', - attributes: { - enabled: false, - locations: [{ id: 'us-east1' }, { id: 'us-west1' }, { id: 'japan' }], - }, - }, - { - id: 'mon-2', - attributes: { - enabled: true, - locations: [{ id: 'us-east1' }, { id: 'us-west1' }, { id: 'japan' }], - schedule: { - number: '10', - unit: 'm', - }, - }, - }, - ], -} as any); - -describe('current status route', () => { - const logger = loggerMock.create(); - - const serverMock: SyntheticsServerSetup = { - logger, - config: { - service: { - username: 'dev', - password: '12345', - manifestUrl: 'http://localhost:8080/api/manifest', - }, - }, - spaces: { - spacesService: { - getSpaceId: jest.fn().mockReturnValue('test-space'), - }, - }, - encryptedSavedObjects: mockEncryptedSO(), - coreStart: { - savedObjects: savedObjectsServiceMock.createStartContract(), - }, - } as unknown as SyntheticsServerSetup; - - describe('periodToMs', () => { - it('returns 0 for unsupported unit type', () => { - // @ts-expect-error Providing invalid value to test handler in function - expect(periodToMs({ number: '10', unit: 'rad' })).toEqual(0); - }); - it('converts seconds', () => { - expect(periodToMs({ number: '10', unit: 's' })).toEqual(10_000); - }); - it('converts minutes', () => { - expect(periodToMs({ number: '1', unit: 'm' })).toEqual(60_000); - }); - it('converts hours', () => { - expect(periodToMs({ number: '1', unit: 'h' })).toEqual(3_600_000); - }); - }); - - const testMonitors = [ - { - attributes: { - id: 'id1', - type: 'browser', - enabled: true, - name: 'test monitor 1', - project_id: 'project-id', - tags: ['tag-1', 'tag-2'], - schedule: { - number: '1', - unit: 'm', - }, - }, - }, - { - attributes: { - id: 'id2', - enabled: true, - type: 'browser', - name: 'test monitor 2', - project_id: 'project-id', - tags: ['tag-1', 'tag-2'], - schedule: { - number: '1', - unit: 'm', - }, - }, - }, - ]; - - describe('queryMonitorStatus', () => { - it('parses expected agg fields', async () => { - const { esClient, syntheticsEsClient } = getUptimeESMockClient(); - esClient.msearch.mockResponseOnce({ - responses: [ - getEsResponse([ - { - key: 'id1', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:08:16.724Z', - monitor: { - status: 'up', - id: 'id1', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id1', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - { - key: 'id2', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:09:16.724Z', - monitor: { - status: 'up', - id: 'id2', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - { - key: 'Europe - Germany', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:19:16.724Z', - monitor: { - status: 'down', - id: 'id2', - }, - summary: { - down: 1, - up: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Europe - Germany', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - ]), - ], - took: 605, - }); - expect( - await queryMonitorStatus({ - esClient: syntheticsEsClient, - monitorLocationIds: ['Europe - Germany', 'Asia/Pacific - Japan'], - range: { from: 'now-1d', to: 'now' }, - monitorQueryIds: ['id1', 'id2'], - monitorLocationsMap: { - id1: ['Asia/Pacific - Japan'], - id2: ['Europe - Germany', 'Asia/Pacific - Japan'], - }, - monitorQueryIdToConfigIdMap: { - id1: 'id1', - id2: 'id2', - }, - monitors: testMonitors as any, - }) - ).toMatchInlineSnapshot(` - Object { - "disabledConfigs": Object {}, - "down": 1, - "downConfigs": Object { - "id2-Europe - Germany": Object { - "configId": "id2", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Europe - Germany", - "locationLabel": "Europe - Germany", - "monitorQueryId": "id2", - "name": "test monitor 2", - "ping": Object { - "@timestamp": "2022-09-15T16:19:16.724Z", - "config_id": "id2", - "monitor": Object { - "id": "id2", - "status": "down", - }, - "observer": Object { - "geo": Object { - "name": "Europe - Germany", - }, - }, - "summary": Object { - "down": 1, - "up": 0, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "down", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:19:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - }, - "enabledMonitorQueryIds": Array [ - "id1", - "id2", - ], - "pending": 0, - "pendingConfigs": Object {}, - "up": 2, - "upConfigs": Object { - "id1-Asia/Pacific - Japan": Object { - "configId": "id1", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": "Asia/Pacific - Japan", - "monitorQueryId": "id1", - "name": "test monitor 1", - "ping": Object { - "@timestamp": "2022-09-15T16:08:16.724Z", - "config_id": "id1", - "monitor": Object { - "id": "id1", - "status": "up", - }, - "observer": Object { - "geo": Object { - "name": "Asia/Pacific - Japan", - }, - }, - "summary": Object { - "down": 0, - "up": 1, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "up", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:08:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - "id2-Asia/Pacific - Japan": Object { - "configId": "id2", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": "Asia/Pacific - Japan", - "monitorQueryId": "id2", - "name": "test monitor 2", - "ping": Object { - "@timestamp": "2022-09-15T16:09:16.724Z", - "config_id": "id2", - "monitor": Object { - "id": "id2", - "status": "up", - }, - "observer": Object { - "geo": Object { - "name": "Asia/Pacific - Japan", - }, - }, - "summary": Object { - "down": 0, - "up": 1, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "up", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:09:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - }, - } - `); - }); - - it('handles limits with multiple requests', async () => { - const { esClient, syntheticsEsClient } = getUptimeESMockClient(); - esClient.msearch.mockResponseOnce({ - responses: [ - getEsResponse([ - { - key: 'id1', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:08:16.724Z', - monitor: { - status: 'up', - id: 'id1', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id1', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - { - key: 'id2', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:09:16.724Z', - monitor: { - status: 'up', - id: 'id2', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - { - key: 'Europe - Germany', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:19:16.724Z', - monitor: { - status: 'down', - id: 'id2', - }, - summary: { - up: 0, - down: 1, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Europe - Germany', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - ]), - ], - took: 605, - }); - - /** - * By passing the function a location count of 10k, it forces the query to paginate once, - * so we are able to test that the function properly iterates through a "large" list of IDs/locations. - * - * The expectation here is we will send the test client two separate "requests", one for each of the two IDs. - */ - const concernedLocations = [ - 'Asia/Pacific - Japan', - 'Europe - Germany', - 'Asia/Pacific - Japan', - ]; - expect( - await queryMonitorStatus({ - esClient: syntheticsEsClient, - monitorLocationIds: [ - ...concernedLocations, - ...times(9997).map((n) => 'Europe - Germany' + n), - ], - - range: { from: 'now-24h', to: 'now' }, - monitorQueryIds: ['id1', 'id2'], - monitorLocationsMap: { - id1: [concernedLocations[0]], - id2: [concernedLocations[1], concernedLocations[2]], - }, - monitorQueryIdToConfigIdMap: { - id1: 'id1', - id2: 'id2', - }, - monitors: testMonitors as any, - }) - ).toMatchInlineSnapshot(` - Object { - "disabledConfigs": Object {}, - "down": 1, - "downConfigs": Object { - "id2-Europe - Germany": Object { - "configId": "id2", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Europe - Germany", - "locationLabel": "Europe - Germany", - "monitorQueryId": "id2", - "name": "test monitor 2", - "ping": Object { - "@timestamp": "2022-09-15T16:19:16.724Z", - "config_id": "id2", - "monitor": Object { - "id": "id2", - "status": "down", - }, - "observer": Object { - "geo": Object { - "name": "Europe - Germany", - }, - }, - "summary": Object { - "down": 1, - "up": 0, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "down", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:19:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - }, - "enabledMonitorQueryIds": Array [ - "id1", - "id2", - ], - "pending": 0, - "pendingConfigs": Object {}, - "up": 2, - "upConfigs": Object { - "id1-Asia/Pacific - Japan": Object { - "configId": "id1", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": "Asia/Pacific - Japan", - "monitorQueryId": "id1", - "name": "test monitor 1", - "ping": Object { - "@timestamp": "2022-09-15T16:08:16.724Z", - "config_id": "id1", - "monitor": Object { - "id": "id1", - "status": "up", - }, - "observer": Object { - "geo": Object { - "name": "Asia/Pacific - Japan", - }, - }, - "summary": Object { - "down": 0, - "up": 1, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "up", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:08:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - "id2-Asia/Pacific - Japan": Object { - "configId": "id2", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": "Asia/Pacific - Japan", - "monitorQueryId": "id2", - "name": "test monitor 2", - "ping": Object { - "@timestamp": "2022-09-15T16:09:16.724Z", - "config_id": "id2", - "monitor": Object { - "id": "id2", - "status": "up", - }, - "observer": Object { - "geo": Object { - "name": "Asia/Pacific - Japan", - }, - }, - "summary": Object { - "down": 0, - "up": 1, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "up", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:09:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - }, - } - `); - expect(esClient.msearch).toHaveBeenCalledTimes(1); - // These assertions are to ensure that we are paginating through the IDs we use for filtering - expect( - // @ts-expect-error mock search is not lining up with expected type - esClient.msearch.mock.calls[0][0].searches[1].query.bool.filter[2].terms['monitor.id'] - ).toEqual(['id1']); - expect( - // @ts-expect-error mock search is not lining up with expected type - esClient.msearch.mock.calls[0][0].searches[3].query.bool.filter[2].terms['monitor.id'] - ).toEqual(['id2']); - }); - - it('handles pending configs', async () => { - const { esClient, syntheticsEsClient } = getUptimeESMockClient(); - esClient.msearch.mockResponseOnce({ - responses: [ - getEsResponse([ - { - key: 'id1', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:08:16.724Z', - monitor: { - status: 'up', - id: 'id1', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id1', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - { - key: 'id2', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:09:16.724Z', - monitor: { - status: 'up', - id: 'id2', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - { - key: 'Europe - Germany', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:19:16.724Z', - monitor: { - status: 'down', - id: 'id2', - }, - summary: { - down: 1, - up: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Europe - Germany', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - ]), - ], - took: 605, - }); - expect( - await queryMonitorStatus({ - esClient: syntheticsEsClient, - monitorLocationIds: ['Europe - Germany', 'Asia/Pacific - Japan'], - range: { from: 'now-12h', to: 'now' }, - monitorQueryIds: ['id1', 'id2', 'project-monitor-id', 'id4'], - monitorLocationsMap: { - id1: ['Asia/Pacific - Japan'], - id2: ['Europe - Germany', 'Asia/Pacific - Japan'], - 'project-monitor-id': ['Europe - Germany', 'Asia/Pacific - Japan'], - id4: ['Europe - Germany', 'Asia/Pacific - Japan'], - }, - monitorQueryIdToConfigIdMap: { - id1: 'id1', - id2: 'id2', - 'project-monitor-id': 'id3', - id4: 'id4', - }, - monitors: [ - ...testMonitors, - { - attributes: { - id: 'id4', - enabled: true, - type: 'browser', - name: 'test monitor 4', - project_id: 'project-id', - tags: ['tag-1', 'tag-2'], - schedule: { - number: '1', - unit: 'm', - }, - }, - }, - { - attributes: { - id: 'project-monitor-id', - enabled: true, - type: 'browser', - name: 'test monitor 3', - project_id: 'project-id', - tags: ['tag-1', 'tag-2'], - schedule: { - number: '1', - unit: 'm', - }, - }, - }, - ] as any, - }) - ).toMatchInlineSnapshot(` - Object { - "disabledConfigs": Object {}, - "down": 1, - "downConfigs": Object { - "id2-Europe - Germany": Object { - "configId": "id2", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Europe - Germany", - "locationLabel": "Europe - Germany", - "monitorQueryId": "id2", - "name": "test monitor 2", - "ping": Object { - "@timestamp": "2022-09-15T16:19:16.724Z", - "config_id": "id2", - "monitor": Object { - "id": "id2", - "status": "down", - }, - "observer": Object { - "geo": Object { - "name": "Europe - Germany", - }, - }, - "summary": Object { - "down": 1, - "up": 0, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "down", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:19:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - }, - "enabledMonitorQueryIds": Array [ - "id1", - "id2", - "project-monitor-id", - "id4", - ], - "pending": 4, - "pendingConfigs": Object { - "id3-Asia/Pacific - Japan": Object { - "configId": "id3", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": undefined, - "monitorQueryId": "project-monitor-id", - "name": "test monitor 3", - "projectId": "project-id", - "schedule": "1", - "status": "unknown", - "tags": Array [ - "tag-1", - "tag-2", - ], - "type": "browser", - "updated_at": undefined, - }, - "id3-Europe - Germany": Object { - "configId": "id3", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Europe - Germany", - "locationLabel": undefined, - "monitorQueryId": "project-monitor-id", - "name": "test monitor 3", - "projectId": "project-id", - "schedule": "1", - "status": "unknown", - "tags": Array [ - "tag-1", - "tag-2", - ], - "type": "browser", - "updated_at": undefined, - }, - "id4-Asia/Pacific - Japan": Object { - "configId": "id4", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": undefined, - "monitorQueryId": "id4", - "name": "test monitor 4", - "projectId": "project-id", - "schedule": "1", - "status": "unknown", - "tags": Array [ - "tag-1", - "tag-2", - ], - "type": "browser", - "updated_at": undefined, - }, - "id4-Europe - Germany": Object { - "configId": "id4", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Europe - Germany", - "locationLabel": undefined, - "monitorQueryId": "id4", - "name": "test monitor 4", - "projectId": "project-id", - "schedule": "1", - "status": "unknown", - "tags": Array [ - "tag-1", - "tag-2", - ], - "type": "browser", - "updated_at": undefined, - }, - }, - "up": 2, - "upConfigs": Object { - "id1-Asia/Pacific - Japan": Object { - "configId": "id1", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": "Asia/Pacific - Japan", - "monitorQueryId": "id1", - "name": "test monitor 1", - "ping": Object { - "@timestamp": "2022-09-15T16:08:16.724Z", - "config_id": "id1", - "monitor": Object { - "id": "id1", - "status": "up", - }, - "observer": Object { - "geo": Object { - "name": "Asia/Pacific - Japan", - }, - }, - "summary": Object { - "down": 0, - "up": 1, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "up", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:08:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - "id2-Asia/Pacific - Japan": Object { - "configId": "id2", - "isEnabled": true, - "isStatusAlertEnabled": false, - "locationId": "Asia/Pacific - Japan", - "locationLabel": "Asia/Pacific - Japan", - "monitorQueryId": "id2", - "name": "test monitor 2", - "ping": Object { - "@timestamp": "2022-09-15T16:09:16.724Z", - "config_id": "id2", - "monitor": Object { - "id": "id2", - "status": "up", - }, - "observer": Object { - "geo": Object { - "name": "Asia/Pacific - Japan", - }, - }, - "summary": Object { - "down": 0, - "up": 1, - }, - }, - "projectId": "project-id", - "schedule": "1", - "spaceId": undefined, - "status": "up", - "tags": Array [ - "tag-1", - "tag-2", - ], - "timestamp": "2022-09-15T16:09:16.724Z", - "type": "browser", - "updated_at": undefined, - }, - }, - } - `); - }); - }); - - describe('getStatus', () => { - it.each([ - [['US Central QA'], 1], - [['North America - US Central'], 1], - [['North America - US Central', 'US Central QA'], 2], - [undefined, 2], - ])('handles disabled count when using location filters', async (locations, disabledCount) => { - jest.spyOn(monitorsFns, 'getAllMonitors').mockResolvedValue([ - { - type: 'synthetics-monitor', - id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', - attributes: { - enabled: false, - schedule: { - number: '3', - unit: 'm', - }, - config_id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', - locations: [ - { - color: 'default', - isServiceManaged: true, - label: 'US Central QA', - id: 'us_central_qa', - }, - { - isServiceManaged: true, - label: 'North America - US Central', - id: 'us_central', - }, - ], - origin: 'project', - id: 'a-test2-default', - }, - references: [], - migrationVersion: { - 'synthetics-monitor': '8.6.0', - }, - coreMigrationVersion: '8.0.0', - updated_at: '2023-02-28T14:31:37.641Z', - created_at: '2023-02-28T14:31:37.641Z', - version: 'Wzg0MzkzLDVd', - namespaces: ['default'], - score: null, - sort: ['a', 3013], - } as unknown as SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>, - ]); - const { esClient, syntheticsEsClient } = getUptimeESMockClient(); - esClient.msearch.mockResponseOnce({ - responses: [ - getEsResponse([ - { - key: 'id1', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:08:16.724Z', - monitor: { - status: 'up', - id: 'id1', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id1', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - { - key: 'id2', - location: { - buckets: [ - { - key: 'Asia/Pacific - Japan', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:09:16.724Z', - monitor: { - status: 'up', - id: 'id2', - }, - summary: { - up: 1, - down: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Asia/Pacific - Japan', - }, - }, - }, - }, - ], - }, - }, - }, - { - key: 'Europe - Germany', - status: { - hits: { - hits: [ - { - _source: { - '@timestamp': '2022-09-15T16:19:16.724Z', - monitor: { - status: 'down', - id: 'id2', - }, - summary: { - down: 1, - up: 0, - }, - config_id: 'id2', - observer: { - geo: { - name: 'Europe - Germany', - }, - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - ]), - ], - took: 605, - }); - const result = await getStatus( - { - syntheticsEsClient, - savedObjectsClient: savedObjectsClientMock.create(), - server: serverMock, - } as unknown as RouteContext, - { - locations, - } - ); - expect(result).toEqual( - expect.objectContaining({ - disabledCount, - }) - ); - }); - - it.each([ - [['US Central QA'], 1], - [['North America - US Central'], 1], - [['North America - US Central', 'US Central QA'], 2], - [undefined, 2], - ])('handles pending count when using location filters', async (locations, pending) => { - jest.spyOn(monitorsFns, 'getAllMonitors').mockResolvedValue([ - { - type: 'synthetics-monitor', - id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', - attributes: { - enabled: true, - schedule: { - number: '3', - unit: 'm', - }, - config_id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', - locations: [ - { - color: 'default', - isServiceManaged: true, - label: 'US Central QA', - id: 'us_central_qa', - }, - { - isServiceManaged: true, - label: 'North America - US Central', - id: 'us_central', - }, - ], - origin: 'project', - id: 'a-test2-default', - }, - references: [], - migrationVersion: { - 'synthetics-monitor': '8.6.0', - }, - coreMigrationVersion: '8.0.0', - updated_at: '2023-02-28T14:31:37.641Z', - created_at: '2023-02-28T14:31:37.641Z', - version: 'Wzg0MzkzLDVd', - namespaces: ['default'], - score: null, - sort: ['a', 3013], - } as unknown as SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>, - ]); - const { esClient, syntheticsEsClient } = getUptimeESMockClient(); - esClient.msearch.mockResponseOnce({ responses: [getEsResponse([])], took: 605 }); - expect( - await getStatus( - { - syntheticsEsClient, - savedObjectsClient: savedObjectsClientMock.create(), - } as unknown as RouteContext, - { - locations, - } - ) - ).toEqual( - expect.objectContaining({ - pending, - }) - ); - }); - }); -}); - -function getEsResponse(buckets: any[]) { - return { - took: 605, - timed_out: false, - _shards: { - total: 3, - successful: 3, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, - aggregations: { - id: { - buckets, - }, - }, - }; -} diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.ts index 8fa52f98592cb..fb3ff320c8cf6 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status.ts @@ -4,126 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { intersection } from 'lodash'; -import datemath, { Unit } from '@kbn/datemath'; -import moment from 'moment'; -import { RouteContext, SyntheticsRestApiRouteFactory } from '../types'; -import { ConfigKey, OverviewStatusState } from '../../../common/runtime_types'; -import { - getAllMonitors, - processMonitors, -} from '../../saved_objects/synthetics_monitor/get_all_monitors'; -import { queryMonitorStatus } from '../../queries/query_monitor_status'; +import { OverviewStatusService } from './overview_status_service'; +import { SyntheticsRestApiRouteFactory } from '../types'; +import { OverviewStatusState } from '../../../common/runtime_types'; import { SYNTHETICS_API_URLS } from '../../../common/constants'; -import { getMonitorFilters, OverviewStatusSchema, OverviewStatusQuery } from '../common'; - -/** - * Helper function that converts a monitor's schedule to a value to use to generate - * an appropriate look-back window for snapshot count. - * @param schedule a number/unit pair that represents how often a configured monitor runs - * @returns schedule interval in ms - */ -export function periodToMs(schedule: { number: string; unit: Unit }) { - if (Object.keys(datemath.unitsMap).indexOf(schedule.unit) === -1) return 0; - - return parseInt(schedule.number, 10) * datemath.unitsMap[schedule.unit].base; -} - -/** - * Multi-stage function that first queries all the user's saved object monitor configs. - * - * Subsequently, fetch the status for each monitor per location in the data streams. - * @returns The counts of up/down/disabled monitor by location, and a map of each monitor:location status. - */ -export async function getStatus(context: RouteContext, params: OverviewStatusQuery) { - const { syntheticsEsClient, savedObjectsClient } = context; - - const { query, scopeStatusByLocation = true, showFromAllSpaces } = params; - - /** - * Walk through all monitor saved objects, bucket IDs by disabled/enabled status. - * - * Track max period to make sure the snapshot query should reach back far enough to catch - * latest ping for all enabled monitors. - */ - - const { filtersStr, locationFilter: queryLocations } = await getMonitorFilters({ - ...params, - context, - }); - - const allMonitors = await getAllMonitors({ - soClient: savedObjectsClient, - showFromAllSpaces, - search: query ? `${query}*` : undefined, - filter: filtersStr, - fields: [ - ConfigKey.ENABLED, - ConfigKey.LOCATIONS, - ConfigKey.MONITOR_QUERY_ID, - ConfigKey.CONFIG_ID, - ConfigKey.SCHEDULE, - ConfigKey.MONITOR_SOURCE_TYPE, - ConfigKey.MONITOR_TYPE, - ConfigKey.NAME, - ConfigKey.TAGS, - ConfigKey.PROJECT_ID, - ConfigKey.ALERT_CONFIG, - ], - }); - - const { - enabledMonitorQueryIds, - disabledMonitorQueryIds, - allIds, - disabledCount, - maxPeriod, - monitorLocationIds, - monitorLocationsMap, - disabledMonitorsCount, - projectMonitorsCount, - monitorQueryIdToConfigIdMap, - } = processMonitors(allMonitors, queryLocations); - - // Account for locations filter - const listOfLocationAfterFilter = - queryLocations && scopeStatusByLocation - ? intersection(monitorLocationIds, queryLocations) - : monitorLocationIds; - - const range = { - from: moment().subtract(maxPeriod, 'milliseconds').subtract(20, 'minutes').toISOString(), - to: 'now', - }; - - const { up, down, pending, upConfigs, downConfigs, pendingConfigs, disabledConfigs } = - await queryMonitorStatus({ - range, - monitors: allMonitors, - monitorLocationsMap, - monitorQueryIdToConfigIdMap, - esClient: syntheticsEsClient, - monitorLocationIds: listOfLocationAfterFilter, - monitorQueryIds: enabledMonitorQueryIds, - }); - - return { - allIds, - allMonitorsCount: allMonitors.length, - disabledMonitorsCount, - projectMonitorsCount, - enabledMonitorQueryIds, - disabledMonitorQueryIds, - disabledCount, - up, - down, - pending, - upConfigs, - downConfigs, - pendingConfigs, - disabledConfigs, - }; -} +import { OverviewStatusSchema } from '../common'; export const createGetCurrentStatusRoute: SyntheticsRestApiRouteFactory = () => ({ method: 'GET', @@ -132,9 +17,7 @@ export const createGetCurrentStatusRoute: SyntheticsRestApiRouteFactory = () => query: OverviewStatusSchema, }, handler: async (routeContext): Promise<OverviewStatusState> => { - const { request } = routeContext; - - const params = request.query as OverviewStatusQuery; - return await getStatus(routeContext, params); + const statusOverview = new OverviewStatusService(routeContext); + return await statusOverview.getOverviewStatus(); }, }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status_service.test.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status_service.test.ts new file mode 100644 index 0000000000000..677f499b2a722 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status_service.test.ts @@ -0,0 +1,793 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { SavedObjectsFindResult } from '@kbn/core-saved-objects-api-server'; +import * as monitorsFns from '../../saved_objects/synthetics_monitor/get_all_monitors'; +import { EncryptedSyntheticsMonitorAttributes } from '../../../common/runtime_types'; +import { getUptimeESMockClient } from '../../queries/test_helpers'; + +import * as commonLibs from '../common'; +import * as allLocationsFn from '../../synthetics_service/get_all_locations'; +import { OverviewStatusService, SUMMARIES_PAGE_SIZE } from './overview_status_service'; +import times from 'lodash/times'; +import { flatten } from 'lodash'; +const japanLoc = { + id: 'asia_japan', + label: 'Asia/Pacific - Japan', +}; + +const germanyLoc = { + id: 'europe_germany', + label: 'Europe - Germany', +}; + +const allLocations: any = [japanLoc, germanyLoc]; +jest.spyOn(allLocationsFn, 'getAllLocations').mockResolvedValue({ + publicLocations: allLocations, + privateLocations: [], + allLocations, +}); + +jest.mock('../../saved_objects/synthetics_monitor/get_all_monitors', () => ({ + ...jest.requireActual('../../saved_objects/synthetics_monitor/get_all_monitors'), + getAllMonitors: jest.fn(), +})); + +jest.spyOn(commonLibs, 'getMonitors').mockResolvedValue({ + per_page: 10, + saved_objects: [ + { + id: 'mon-1', + attributes: { + enabled: false, + locations: [{ id: 'us-east1' }, { id: 'us-west1' }, { id: 'japan' }], + }, + }, + { + id: 'mon-2', + attributes: { + enabled: true, + locations: [{ id: 'us-east1' }, { id: 'us-west1' }, { id: 'japan' }], + schedule: { + number: '10', + unit: 'm', + }, + }, + }, + ], +} as any); + +describe('current status route', () => { + const testMonitors = [ + { + attributes: { + config_id: 'id1', + id: 'id1', + type: 'browser', + enabled: true, + name: 'test monitor 1', + project_id: 'project-id', + tags: ['tag-1', 'tag-2'], + schedule: { + number: '1', + unit: 'm', + }, + locations: [japanLoc], + }, + }, + { + attributes: { + id: 'id2', + config_id: 'id2', + enabled: true, + type: 'browser', + name: 'test monitor 2', + project_id: 'project-id', + tags: ['tag-1', 'tag-2'], + schedule: { + number: '1', + unit: 'm', + }, + locations: allLocations, + }, + }, + ]; + + describe('OverviewStatusService', () => { + it('parses expected agg fields', async () => { + const { esClient, syntheticsEsClient } = getUptimeESMockClient(); + + esClient.search.mockResponseOnce( + getEsResponse({ + buckets: [ + { + key: { + monitorId: 'id1', + locationId: japanLoc.id, + }, + status: { + key: japanLoc.id, + top: [ + { + metrics: { + 'monitor.status': 'up', + }, + sort: ['2022-09-15T16:19:16.724Z'], + }, + ], + }, + }, + { + key: { + monitorId: 'id2', + locationId: japanLoc.id, + }, + status: { + key: japanLoc.id, + top: [ + { + metrics: { + 'monitor.status': 'up', + }, + sort: ['2022-09-15T16:19:16.724Z'], + }, + ], + }, + }, + { + key: { + monitorId: 'id2', + locationId: germanyLoc.id, + }, + status: { + key: germanyLoc.id, + top: [ + { + metrics: { + 'monitor.status': 'down', + }, + sort: ['2022-09-15T16:19:16.724Z'], + }, + ], + }, + }, + ], + }) + ); + const routeContext: any = { + request: {}, + syntheticsEsClient, + }; + + const overviewStatusService = new OverviewStatusService(routeContext); + overviewStatusService.getMonitorConfigs = jest.fn().mockResolvedValue(testMonitors as any); + expect(await overviewStatusService.getOverviewStatus()).toMatchInlineSnapshot(` + Object { + "allIds": Array [ + "id1", + "id2", + ], + "allMonitorsCount": 2, + "disabledConfigs": Object {}, + "disabledCount": 0, + "disabledMonitorQueryIds": Array [], + "disabledMonitorsCount": 0, + "down": 1, + "downConfigs": Object { + "id2-europe_germany": Object { + "configId": "id2", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "europe_germany", + "locationLabel": "Europe - Germany", + "monitorQueryId": "id2", + "name": "test monitor 2", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "down", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": "2022-09-15T16:19:16.724Z", + "type": "browser", + "updated_at": undefined, + }, + }, + "enabledMonitorQueryIds": Array [ + "id1", + "id2", + ], + "pending": 0, + "pendingConfigs": Object {}, + "projectMonitorsCount": 0, + "up": 2, + "upConfigs": Object { + "id1-asia_japan": Object { + "configId": "id1", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "asia_japan", + "locationLabel": "Asia/Pacific - Japan", + "monitorQueryId": "id1", + "name": "test monitor 1", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "up", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": "2022-09-15T16:19:16.724Z", + "type": "browser", + "updated_at": undefined, + }, + "id2-asia_japan": Object { + "configId": "id2", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "asia_japan", + "locationLabel": "Asia/Pacific - Japan", + "monitorQueryId": "id2", + "name": "test monitor 2", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "up", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": "2022-09-15T16:19:16.724Z", + "type": "browser", + "updated_at": undefined, + }, + }, + } + `); + }); + + it('handles limits with multiple requests', async () => { + const { esClient, syntheticsEsClient } = getUptimeESMockClient(); + esClient.search.mockResponseOnce( + getEsResponse({ + after: {}, + buckets: flatten( + times(SUMMARIES_PAGE_SIZE).map(() => [ + { + key: { + monitorId: 'id1', + locationId: japanLoc.id, + }, + status: { + key: japanLoc.id, + top: [ + { + metrics: { + 'monitor.status': 'up', + }, + sort: ['2022-09-15T16:19:16.724Z'], + }, + ], + }, + }, + { + key: { + monitorId: 'id2', + locationId: japanLoc.id, + }, + status: { + key: japanLoc.id, + top: [ + { + metrics: { + 'monitor.status': 'up', + }, + sort: ['2022-09-15T16:19:16.724Z'], + }, + ], + }, + }, + { + key: { + monitorId: 'id2', + locationId: germanyLoc.id, + }, + status: { + key: germanyLoc.id, + top: [ + { + metrics: { + 'monitor.status': 'down', + }, + sort: ['2022-09-15T16:19:16.724Z'], + }, + ], + }, + }, + ]) + ), + }) + ); + + const routeContext: any = { + request: {}, + syntheticsEsClient, + }; + + const overviewStatusService = new OverviewStatusService(routeContext); + overviewStatusService.getMonitorConfigs = jest.fn().mockResolvedValue(testMonitors as any); + + expect(await overviewStatusService.getOverviewStatus()).toMatchInlineSnapshot(` + Object { + "allIds": Array [ + "id1", + "id2", + ], + "allMonitorsCount": 2, + "disabledConfigs": Object {}, + "disabledCount": 0, + "disabledMonitorQueryIds": Array [], + "disabledMonitorsCount": 0, + "down": 1, + "downConfigs": Object { + "id2-europe_germany": Object { + "configId": "id2", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "europe_germany", + "locationLabel": "Europe - Germany", + "monitorQueryId": "id2", + "name": "test monitor 2", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "down", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": "2022-09-15T16:19:16.724Z", + "type": "browser", + "updated_at": undefined, + }, + }, + "enabledMonitorQueryIds": Array [ + "id1", + "id2", + ], + "pending": 0, + "pendingConfigs": Object {}, + "projectMonitorsCount": 0, + "up": 2, + "upConfigs": Object { + "id1-asia_japan": Object { + "configId": "id1", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "asia_japan", + "locationLabel": "Asia/Pacific - Japan", + "monitorQueryId": "id1", + "name": "test monitor 1", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "up", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": "2022-09-15T16:19:16.724Z", + "type": "browser", + "updated_at": undefined, + }, + "id2-asia_japan": Object { + "configId": "id2", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "asia_japan", + "locationLabel": "Asia/Pacific - Japan", + "monitorQueryId": "id2", + "name": "test monitor 2", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "up", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": "2022-09-15T16:19:16.724Z", + "type": "browser", + "updated_at": undefined, + }, + }, + } + `); + expect(esClient.search).toHaveBeenCalledTimes(2); + }); + + it('handles pending configs', async () => { + const { esClient, syntheticsEsClient } = getUptimeESMockClient(); + esClient.search.mockResponseOnce( + getEsResponse({ + buckets: [], + }) + ); + const routeContext: any = { + request: {}, + syntheticsEsClient, + }; + + const overviewStatusService = new OverviewStatusService(routeContext); + overviewStatusService.getMonitorConfigs = jest.fn().mockResolvedValue(testMonitors as any); + expect(await overviewStatusService.getOverviewStatus()).toMatchInlineSnapshot(` + Object { + "allIds": Array [ + "id1", + "id2", + ], + "allMonitorsCount": 2, + "disabledConfigs": Object {}, + "disabledCount": 0, + "disabledMonitorQueryIds": Array [], + "disabledMonitorsCount": 0, + "down": 0, + "downConfigs": Object {}, + "enabledMonitorQueryIds": Array [ + "id1", + "id2", + ], + "pending": 3, + "pendingConfigs": Object { + "id1-asia_japan": Object { + "configId": "id1", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "asia_japan", + "locationLabel": "Asia/Pacific - Japan", + "monitorQueryId": "id1", + "name": "test monitor 1", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "unknown", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": undefined, + "type": "browser", + "updated_at": undefined, + }, + "id2-asia_japan": Object { + "configId": "id2", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "asia_japan", + "locationLabel": "Asia/Pacific - Japan", + "monitorQueryId": "id2", + "name": "test monitor 2", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "unknown", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": undefined, + "type": "browser", + "updated_at": undefined, + }, + "id2-europe_germany": Object { + "configId": "id2", + "isEnabled": true, + "isStatusAlertEnabled": false, + "locationId": "europe_germany", + "locationLabel": "Europe - Germany", + "monitorQueryId": "id2", + "name": "test monitor 2", + "projectId": "project-id", + "schedule": "1", + "spaceId": undefined, + "status": "unknown", + "tags": Array [ + "tag-1", + "tag-2", + ], + "timestamp": undefined, + "type": "browser", + "updated_at": undefined, + }, + }, + "projectMonitorsCount": 0, + "up": 0, + "upConfigs": Object {}, + } + `); + }); + }); + + describe('getStatus', () => { + jest.spyOn(allLocationsFn, 'getAllLocations').mockResolvedValue({ + publicLocations: allLocations, + privateLocations: [], + allLocations: [ + { + id: 'us_central_qa', + label: 'US Central QA', + }, + { + id: 'us_central', + label: 'North America - US Central', + }, + ] as any, + }); + + it.each([ + [['US Central QA'], 1], + [['North America - US Central'], 1], + [['North America - US Central', 'US Central QA'], 2], + [undefined, 2], + ])('handles disabled count when using location filters', async (locations, disabledCount) => { + jest.spyOn(monitorsFns, 'getAllMonitors').mockResolvedValue([ + { + type: 'synthetics-monitor', + id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', + attributes: { + enabled: false, + schedule: { + number: '3', + unit: 'm', + }, + config_id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', + locations: [ + { + isServiceManaged: true, + label: 'US Central QA', + id: 'us_central_qa', + }, + { + isServiceManaged: true, + label: 'North America - US Central', + id: 'us_central', + }, + ], + origin: 'project', + id: 'a-test2-default', + }, + references: [], + migrationVersion: { + 'synthetics-monitor': '8.6.0', + }, + coreMigrationVersion: '8.0.0', + updated_at: '2023-02-28T14:31:37.641Z', + created_at: '2023-02-28T14:31:37.641Z', + version: 'Wzg0MzkzLDVd', + namespaces: ['default'], + score: null, + sort: ['a', 3013], + } as unknown as SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>, + ]); + const { esClient, syntheticsEsClient } = getUptimeESMockClient(); + esClient.msearch.mockResponseOnce({ + responses: [ + getEsResponse({ + buckets: [ + { + key: 'id1', + location: { + buckets: [ + { + key: 'Asia/Pacific - Japan', + status: { + hits: { + hits: [ + { + _source: { + '@timestamp': '2022-09-15T16:08:16.724Z', + monitor: { + status: 'up', + id: 'id1', + }, + summary: { + up: 1, + down: 0, + }, + config_id: 'id1', + observer: { + geo: { + name: 'Asia/Pacific - Japan', + }, + }, + }, + }, + ], + }, + }, + }, + ], + }, + }, + { + key: 'id2', + location: { + buckets: [ + { + key: 'Asia/Pacific - Japan', + status: { + hits: { + hits: [ + { + _source: { + '@timestamp': '2022-09-15T16:09:16.724Z', + monitor: { + status: 'up', + id: 'id2', + }, + summary: { + up: 1, + down: 0, + }, + config_id: 'id2', + observer: { + geo: { + name: 'Asia/Pacific - Japan', + }, + }, + }, + }, + ], + }, + }, + }, + { + key: 'Europe - Germany', + status: { + hits: { + hits: [ + { + _source: { + '@timestamp': '2022-09-15T16:19:16.724Z', + monitor: { + status: 'down', + id: 'id2', + }, + summary: { + down: 1, + up: 0, + }, + config_id: 'id2', + observer: { + geo: { + name: 'Europe - Germany', + }, + }, + }, + }, + ], + }, + }, + }, + ], + }, + }, + ], + }), + ], + took: 605, + }); + + const overviewStatusService = new OverviewStatusService({ + request: { + query: { + locations, + }, + }, + syntheticsEsClient, + } as any); + + const result = await overviewStatusService.getOverviewStatus(); + + expect(result).toEqual( + expect.objectContaining({ + disabledCount, + }) + ); + }); + + it.each([ + [['US Central QA'], 1], + [['North America - US Central'], 1], + [['North America - US Central', 'US Central QA'], 2], + [undefined, 2], + ])('handles pending count when using location filters', async (locations, pending) => { + jest.spyOn(monitorsFns, 'getAllMonitors').mockResolvedValue([ + { + type: 'synthetics-monitor', + id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', + attributes: { + enabled: true, + schedule: { + number: '3', + unit: 'm', + }, + config_id: 'a9a94f2f-47ba-4fe2-afaa-e5cd29b281f1', + locations: [ + { + isServiceManaged: true, + label: 'US Central QA', + id: 'us_central_qa', + }, + { + isServiceManaged: true, + label: 'North America - US Central', + id: 'us_central', + }, + ], + origin: 'project', + id: 'a-test2-default', + }, + references: [], + migrationVersion: { + 'synthetics-monitor': '8.6.0', + }, + coreMigrationVersion: '8.0.0', + updated_at: '2023-02-28T14:31:37.641Z', + created_at: '2023-02-28T14:31:37.641Z', + version: 'Wzg0MzkzLDVd', + namespaces: ['default'], + score: null, + sort: ['a', 3013], + } as unknown as SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>, + ]); + const { esClient, syntheticsEsClient } = getUptimeESMockClient(); + esClient.search.mockResponseOnce( + getEsResponse({ + buckets: [], + }) + ); + + const overviewStatusService = new OverviewStatusService({ + request: { + query: { + locations, + }, + }, + syntheticsEsClient, + } as any); + + const result = await overviewStatusService.getOverviewStatus(); + + expect(result.pending).toEqual(pending); + }); + }); +}); + +function getEsResponse({ buckets, after }: { buckets: any[]; after?: any }) { + return { + took: 605, + timed_out: false, + _shards: { + total: 3, + successful: 3, + skipped: 0, + failed: 0, + }, + hits: { + hits: [], + }, + aggregations: { + monitors: { + buckets, + after_key: after, + }, + }, + }; +} diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status_service.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status_service.ts new file mode 100644 index 0000000000000..5ff8a870db9de --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/overview_status_service.ts @@ -0,0 +1,363 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import moment from 'moment/moment'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { SavedObjectsFindResult } from '@kbn/core-saved-objects-api-server'; +import { isEmpty } from 'lodash'; +import { withApmSpan } from '@kbn/apm-data-access-plugin/server/utils/with_apm_span'; +import { asMutableArray } from '../../../common/utils/as_mutable_array'; +import { getMonitorFilters, OverviewStatusQuery } from '../common'; +import { + getAllMonitors, + processMonitors, +} from '../../saved_objects/synthetics_monitor/get_all_monitors'; +import { ConfigKey } from '../../../common/constants/monitor_management'; +import { RouteContext } from '../types'; +import { + EncryptedSyntheticsMonitorAttributes, + OverviewStatusMetaData, +} from '../../../common/runtime_types'; +import { isStatusEnabled } from '../../../common/runtime_types/monitor_management/alert_config'; +import { + FINAL_SUMMARY_FILTER, + getRangeFilter, + getTimespanFilter, +} from '../../../common/constants/client_defaults'; + +type LocationStatus = Array<{ + status: string; + locationId: string; + timestamp: string; +}>; + +export const SUMMARIES_PAGE_SIZE = 5000; + +export class OverviewStatusService { + filterData: { + locationFilter?: string[] | string; + filtersStr?: string; + } = {}; + constructor( + private readonly routeContext: RouteContext<Record<string, any>, OverviewStatusQuery> + ) {} + + async getOverviewStatus() { + const { request } = this.routeContext; + const queryParams = request.query as OverviewStatusQuery; + + this.filterData = await getMonitorFilters({ + ...queryParams, + context: this.routeContext, + }); + + const [allConfigs, statusResult] = await Promise.all([ + this.getMonitorConfigs(), + this.getQueryResult(), + ]); + + const { up, down, pending, upConfigs, downConfigs, pendingConfigs, disabledConfigs } = + this.processOverviewStatus(allConfigs, statusResult); + + const { + enabledMonitorQueryIds, + disabledMonitorQueryIds, + allIds, + disabledCount, + disabledMonitorsCount, + projectMonitorsCount, + } = processMonitors(allConfigs, this.filterData?.locationFilter); + + return { + allIds, + allMonitorsCount: allConfigs.length, + disabledMonitorsCount, + projectMonitorsCount, + enabledMonitorQueryIds, + disabledMonitorQueryIds, + disabledCount, + up, + down, + pending, + upConfigs, + downConfigs, + pendingConfigs, + disabledConfigs, + }; + } + + getEsDataFilters() { + const { spaceId, request } = this.routeContext; + const params = request.query || {}; + const { + scopeStatusByLocation = true, + tags, + monitorTypes, + projects, + showFromAllSpaces, + } = params; + const { locationFilter } = this.filterData; + const getTermFilter = (field: string, value: string | string[] | undefined) => { + if (!value || isEmpty(value)) { + return []; + } + if (Array.isArray(value)) { + return [ + { + terms: { + [field]: value, + }, + }, + ]; + } + return [ + { + term: { + [field]: value, + }, + }, + ]; + }; + const filters: QueryDslQueryContainer[] = [ + ...(showFromAllSpaces ? [] : [{ term: { 'meta.space_id': spaceId } }]), + ...getTermFilter('monitor.type', monitorTypes), + ...getTermFilter('tags', tags), + ...getTermFilter('monitor.project.id', projects), + ]; + + if (scopeStatusByLocation && !isEmpty(locationFilter) && locationFilter) { + filters.push({ + terms: { + 'observer.name': locationFilter, + }, + }); + } + return filters; + } + + async getQueryResult() { + return withApmSpan('monitor_status_data', async () => { + const range = { + // max monitor schedule period is 4 hours, 20 minute subtraction is to be on safe side + from: moment().subtract(4, 'hours').subtract(20, 'minutes').toISOString(), + to: 'now', + }; + + let hasMoreData = true; + const monitorByIds = new Map<string, LocationStatus>(); + let afterKey: any; + let count = 0; + + do { + const result = await this.routeContext.syntheticsEsClient.search( + { + body: { + size: 0, + query: { + bool: { + filter: [ + FINAL_SUMMARY_FILTER, + getRangeFilter({ from: range.from, to: range.to }), + getTimespanFilter({ from: 'now-15m', to: 'now' }), + ...this.getEsDataFilters(), + ] as QueryDslQueryContainer[], + }, + }, + aggs: { + monitors: { + composite: { + size: SUMMARIES_PAGE_SIZE, + sources: asMutableArray([ + { + monitorId: { + terms: { + field: 'monitor.id', + }, + }, + }, + { + locationId: { + terms: { + field: 'observer.name', + }, + }, + }, + ] as const), + after: afterKey, + }, + aggs: { + status: { + top_metrics: { + metrics: { + field: 'monitor.status', + }, + sort: { + '@timestamp': 'desc', + }, + }, + }, + }, + }, + }, + }, + }, + 'getCurrentStatusOverview' + count + ); + count += 1; + const data = result.body.aggregations?.monitors; + + hasMoreData = (data?.buckets ?? []).length >= SUMMARIES_PAGE_SIZE; + afterKey = data?.after_key; + + data?.buckets.forEach(({ status: statusAgg, key: bKey }) => { + const monitorId = String(bKey.monitorId); + const locationId = String(bKey.locationId); + const status = String(statusAgg.top?.[0].metrics?.['monitor.status']); + const timestamp = String(statusAgg.top[0].sort[0]); + if (!monitorByIds.has(String(monitorId))) { + monitorByIds.set(monitorId, []); + } + monitorByIds.get(monitorId)?.push({ status, locationId, timestamp }); + }); + } while (hasMoreData && afterKey); + return monitorByIds; + }); + } + + processOverviewStatus( + monitors: Array<SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>>, + statusData: Map<string, LocationStatus> + ) { + let up = 0; + let down = 0; + const upConfigs: Record<string, OverviewStatusMetaData> = {}; + const downConfigs: Record<string, OverviewStatusMetaData> = {}; + const pendingConfigs: Record<string, OverviewStatusMetaData> = {}; + const disabledConfigs: Record<string, OverviewStatusMetaData> = {}; + + const enabledMonitors = monitors.filter((monitor) => monitor.attributes[ConfigKey.ENABLED]); + const disabledMonitors = monitors.filter((monitor) => !monitor.attributes[ConfigKey.ENABLED]); + + const queryLocIds = this.filterData?.locationFilter; + + disabledMonitors.forEach((monitor) => { + const monitorQueryId = monitor.attributes[ConfigKey.MONITOR_QUERY_ID]; + const meta = this.getMonitorMeta(monitor); + monitor.attributes[ConfigKey.LOCATIONS]?.forEach((location) => { + disabledConfigs[`${meta.configId}-${location.id}`] = { + monitorQueryId, + status: 'disabled', + locationId: location.id, + locationLabel: location.label, + ...meta, + }; + }); + }); + + enabledMonitors.forEach((monitor) => { + const monitorId = monitor.attributes[ConfigKey.MONITOR_QUERY_ID]; + const monitorStatus = statusData.get(monitorId); + + // discard any locations that are not in the monitorLocationsMap for the given monitor as well as those which are + // in monitorLocationsMap but not in listOfLocations + const monLocations = monitor.attributes[ConfigKey.LOCATIONS]; + monLocations?.forEach((monLocation) => { + if (!isEmpty(queryLocIds) && !queryLocIds?.includes(monLocation.id)) { + // filter out location provided via query + return; + } + const locData = monitorStatus?.find((loc) => loc.locationId === monLocation.id); + const meta = { + monitorQueryId: monitorId, + locationId: monLocation.id, + timestamp: locData?.timestamp, + locationLabel: monLocation.label, + ...this.getMonitorMeta(monitor), + }; + const monLocId = `${meta.configId}-${monLocation.id}`; + if (locData) { + if (locData.status === 'down') { + down += 1; + downConfigs[monLocId] = { + ...meta, + status: 'down', + }; + } else if (locData.status === 'up') { + up += 1; + upConfigs[monLocId] = { + ...meta, + status: 'up', + }; + } + } else { + pendingConfigs[monLocId] = { + status: 'unknown', + ...meta, + }; + } + }); + }); + + return { + up, + down, + pending: Object.values(pendingConfigs).length, + upConfigs, + downConfigs, + pendingConfigs, + disabledConfigs, + }; + } + + async getMonitorConfigs() { + const { savedObjectsClient, request } = this.routeContext; + const { query, showFromAllSpaces } = request.query || {}; + /** + * Walk through all monitor saved objects, bucket IDs by disabled/enabled status. + * + * Track max period to make sure the snapshot query should reach back far enough to catch + * latest ping for all enabled monitors. + */ + + const { filtersStr } = this.filterData; + + return await getAllMonitors({ + soClient: savedObjectsClient, + showFromAllSpaces, + search: query ? `${query}*` : '', + filter: filtersStr, + fields: [ + ConfigKey.ENABLED, + ConfigKey.LOCATIONS, + ConfigKey.MONITOR_QUERY_ID, + ConfigKey.CONFIG_ID, + ConfigKey.SCHEDULE, + ConfigKey.MONITOR_SOURCE_TYPE, + ConfigKey.MONITOR_TYPE, + ConfigKey.NAME, + ConfigKey.TAGS, + ConfigKey.PROJECT_ID, + ConfigKey.ALERT_CONFIG, + ], + }); + } + + getMonitorMeta(monitor: SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>) { + return { + name: monitor.attributes[ConfigKey.NAME], + configId: monitor.attributes[ConfigKey.CONFIG_ID], + schedule: monitor.attributes[ConfigKey.SCHEDULE].number, + tags: monitor.attributes[ConfigKey.TAGS], + isEnabled: monitor.attributes[ConfigKey.ENABLED], + type: monitor.attributes[ConfigKey.MONITOR_TYPE], + projectId: monitor.attributes[ConfigKey.PROJECT_ID], + isStatusAlertEnabled: isStatusEnabled(monitor.attributes[ConfigKey.ALERT_CONFIG]), + updated_at: monitor.updated_at, + spaceId: monitor.namespaces?.[0], + }; + } +} diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/utils.test.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/utils.test.ts new file mode 100644 index 0000000000000..fef2927d7bd3a --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/utils.test.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { periodToMs } from './utils'; + +describe('periodToMs', () => { + it('returns 0 for unsupported unit type', () => { + // @ts-expect-error Providing invalid value to test handler in function + expect(periodToMs({ number: '10', unit: 'rad' })).toEqual(0); + }); + + it('converts seconds', () => { + expect(periodToMs({ number: '10', unit: 's' })).toEqual(10_000); + }); + + it('converts minutes', () => { + expect(periodToMs({ number: '1', unit: 'm' })).toEqual(60_000); + }); + + it('converts hours', () => { + expect(periodToMs({ number: '1', unit: 'h' })).toEqual(3_600_000); + }); +}); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/utils.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/utils.ts new file mode 100644 index 0000000000000..d02509a70e562 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/overview_status/utils.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. + */ + +/** + * Helper function that converts a monitor's schedule to a value to use to generate + * an appropriate look-back window for snapshot count. + * @param schedule a number/unit pair that represents how often a configured monitor runs + * @returns schedule interval in ms + */ +import datemath, { Unit } from '@kbn/datemath'; + +export function periodToMs(schedule: { number: string; unit: Unit }) { + if (Object.keys(datemath.unitsMap).indexOf(schedule.unit) === -1) return 0; + + return parseInt(schedule.number, 10) * datemath.unitsMap[schedule.unit].base; +} diff --git a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_monitor/get_all_monitors.ts b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_monitor/get_all_monitors.ts index 8cae1ef32a8c3..ebf034d9eb7fb 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_monitor/get_all_monitors.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_monitor/get_all_monitors.ts @@ -11,8 +11,9 @@ import { SavedObjectsFindResult, } from '@kbn/core-saved-objects-api-server'; import { intersection } from 'lodash'; +import { withApmSpan } from '@kbn/apm-data-access-plugin/server/utils'; +import { periodToMs } from '../../routes/overview_status/utils'; import { syntheticsMonitorType } from '../../../common/types/saved_objects'; -import { periodToMs } from '../../routes/overview_status/overview_status'; import { ConfigKey, EncryptedSyntheticsMonitorAttributes, @@ -34,26 +35,28 @@ export const getAllMonitors = async ({ filter?: string; showFromAllSpaces?: boolean; } & Pick<SavedObjectsFindOptions, 'sortField' | 'sortOrder' | 'fields' | 'searchFields'>) => { - const finder = soClient.createPointInTimeFinder<EncryptedSyntheticsMonitorAttributes>({ - type: syntheticsMonitorType, - perPage: 1000, - search, - sortField, - sortOrder, - fields, - filter, - searchFields, - ...(showFromAllSpaces && { namespaces: ['*'] }), - }); + return withApmSpan('get_all_monitors', async () => { + const finder = soClient.createPointInTimeFinder<EncryptedSyntheticsMonitorAttributes>({ + type: syntheticsMonitorType, + perPage: 5000, + search, + sortField, + sortOrder, + fields, + filter, + searchFields, + ...(showFromAllSpaces && { namespaces: ['*'] }), + }); - const hits: Array<SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>> = []; - for await (const result of finder.find()) { - hits.push(...result.saved_objects); - } + const hits: Array<SavedObjectsFindResult<EncryptedSyntheticsMonitorAttributes>> = []; + for await (const result of finder.find()) { + hits.push(...result.saved_objects); + } - finder.close().catch(() => {}); + finder.close().catch(() => {}); - return hits; + return hits; + }); }; export const processMonitors = ( @@ -86,13 +89,13 @@ export const processMonitors = ( monitorQueryIdToConfigIdMap[attrs[ConfigKey.MONITOR_QUERY_ID]] = attrs[ConfigKey.CONFIG_ID]; - const monitorLocations = attrs[ConfigKey.LOCATIONS].map((location) => location.id); + const monitorLocIds = attrs[ConfigKey.LOCATIONS].map((location) => location.id); if (attrs[ConfigKey.ENABLED] === false) { const queriedLocations = Array.isArray(queryLocations) ? queryLocations : [queryLocations]; const intersectingLocations = intersection( - monitorLocations, - queryLocations ? queriedLocations : monitorLocations + monitorLocIds, + queryLocations ? queriedLocations : monitorLocIds ); disabledCount += intersectingLocations.length; disabledMonitorsCount += 1; @@ -101,9 +104,9 @@ export const processMonitors = ( enabledMonitorQueryIds.push(attrs[ConfigKey.MONITOR_QUERY_ID]); monitorLocationsMap[attrs[ConfigKey.MONITOR_QUERY_ID]] = queryLocations - ? intersection(monitorLocations, queryLocations) - : monitorLocations; - listOfLocationsSet = new Set([...listOfLocationsSet, ...monitorLocations]); + ? intersection(monitorLocIds, queryLocations) + : monitorLocIds; + listOfLocationsSet = new Set([...listOfLocationsSet, ...monitorLocIds]); maxPeriod = Math.max(maxPeriod, periodToMs(attrs[ConfigKey.SCHEDULE])); } diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts index da3887ac94d56..24abf55d53c43 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts @@ -4,107 +4,114 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { withApmSpan } from '@kbn/apm-data-access-plugin/server/utils/with_apm_span'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import { isEmpty } from 'lodash'; import { isKibanaResponse } from '@kbn/core-http-server'; +import { syntheticsServiceApiKey } from './saved_objects/service_api_key'; import { isTestUser, SyntheticsEsClient } from './lib'; -import { checkIndicesReadPrivileges } from './synthetics_service/authentication/check_has_privilege'; import { SYNTHETICS_INDEX_PATTERN } from '../common/constants'; -import { syntheticsServiceApiKey } from './saved_objects/service_api_key'; +import { checkIndicesReadPrivileges } from './synthetics_service/authentication/check_has_privilege'; import { SyntheticsRouteWrapper } from './routes/types'; export const syntheticsRouteWrapper: SyntheticsRouteWrapper = ( - uptimeRoute, + syntheticsRoute, server, syntheticsMonitorClient ) => ({ - ...uptimeRoute, + ...syntheticsRoute, options: { - ...(uptimeRoute.options ?? {}), + ...(syntheticsRoute.options ?? {}), }, security: { authz: { requiredPrivileges: [ 'uptime-read', - ...(uptimeRoute.requiredPrivileges ?? []), - ...(uptimeRoute?.writeAccess ? ['uptime-write'] : []), + ...(syntheticsRoute.requiredPrivileges ?? []), + ...(syntheticsRoute?.writeAccess ? ['uptime-write'] : []), ], }, }, handler: async (context, request, response) => { - const { elasticsearch, savedObjects, uiSettings } = await context.core; + return withApmSpan('synthetics_route_handler', async () => { + const { elasticsearch, savedObjects, uiSettings } = await context.core; - const { client: esClient } = elasticsearch; - const savedObjectsClient = savedObjects.getClient({ - includedHiddenTypes: [syntheticsServiceApiKey.name], - }); + const { client: esClient } = elasticsearch; + const savedObjectsClient = savedObjects.getClient({ + includedHiddenTypes: [syntheticsServiceApiKey.name], + }); - // specifically needed for the synthetics service api key generation - server.authSavedObjectsClient = savedObjectsClient; + // specifically needed for the synthetics service api key generation + server.authSavedObjectsClient = savedObjectsClient; - const syntheticsEsClient = new SyntheticsEsClient(savedObjectsClient, esClient.asCurrentUser, { - request, - uiSettings, - isDev: Boolean(server.isDev) && !isTestUser(server), - heartbeatIndices: SYNTHETICS_INDEX_PATTERN, - }); + const syntheticsEsClient = new SyntheticsEsClient( + savedObjectsClient, + esClient.asCurrentUser, + { + request, + uiSettings, + isDev: Boolean(server.isDev) && !isTestUser(server), + heartbeatIndices: SYNTHETICS_INDEX_PATTERN, + } + ); - server.syntheticsEsClient = syntheticsEsClient; + server.syntheticsEsClient = syntheticsEsClient; - const spaceId = server.spaces?.spacesService.getSpaceId(request) ?? DEFAULT_SPACE_ID; + const spaceId = server.spaces?.spacesService.getSpaceId(request) ?? DEFAULT_SPACE_ID; - try { - const res = await uptimeRoute.handler({ - syntheticsEsClient, - savedObjectsClient, - context, - request, - response, - server, - spaceId, - syntheticsMonitorClient, - }); - if (isKibanaResponse(res)) { - return res; - } + try { + const res = await syntheticsRoute.handler({ + syntheticsEsClient, + savedObjectsClient, + context, + request, + response, + server, + spaceId, + syntheticsMonitorClient, + }); + if (isKibanaResponse(res)) { + return res; + } - const inspectData = await syntheticsEsClient.getInspectData(uptimeRoute.path); + const inspectData = await syntheticsEsClient.getInspectData(syntheticsRoute.path); - if (Array.isArray(res)) { - if (isEmpty(inspectData)) { - return response.ok({ - body: res, - }); - } else { - return response.ok({ - body: { - result: res, - ...inspectData, - }, - }); + if (Array.isArray(res)) { + if (isEmpty(inspectData)) { + return response.ok({ + body: res, + }); + } else { + return response.ok({ + body: { + result: res, + ...inspectData, + }, + }); + } } - } - return response.ok({ - body: { - ...res, - ...(await syntheticsEsClient.getInspectData(uptimeRoute.path)), - }, - }); - } catch (e) { - if (e.statusCode === 403) { - const privileges = await checkIndicesReadPrivileges(syntheticsEsClient); - if (!privileges.has_all_requested) { - return response.forbidden({ - body: { - message: - 'MissingIndicesPrivileges: You do not have permission to read from the synthetics-* indices. Please contact your administrator.', - }, - }); + return response.ok({ + body: { + ...res, + ...inspectData, + }, + }); + } catch (e) { + if (e.statusCode === 403) { + const privileges = await checkIndicesReadPrivileges(syntheticsEsClient); + if (!privileges.has_all_requested) { + return response.forbidden({ + body: { + message: + 'MissingIndicesPrivileges: You do not have permission to read from the synthetics-* indices. Please contact your administrator.', + }, + }); + } } + server.logger.error(e); + throw e; } - server.logger.error(e); - throw e; - } + }); }, }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.ts index c223de84c42dc..9e4229aba0a0e 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.ts @@ -356,11 +356,18 @@ export class SyntheticsService { if (output) { this.logger.debug(`1 monitor will be pushed to synthetics service.`); - this.syncErrors = await this.apiClient.post({ - monitors, - output, - license, - }); + this.apiClient + .post({ + monitors, + output, + license, + }) + .then((res) => { + this.syncErrors = res; + }) + .catch((e) => { + this.logger.error(e); + }); } return this.syncErrors; } catch (e) { diff --git a/x-pack/plugins/observability_solution/synthetics/tsconfig.json b/x-pack/plugins/observability_solution/synthetics/tsconfig.json index c82f6a5c3036a..8d2b26a72436d 100644 --- a/x-pack/plugins/observability_solution/synthetics/tsconfig.json +++ b/x-pack/plugins/observability_solution/synthetics/tsconfig.json @@ -106,7 +106,8 @@ "@kbn/core-chrome-browser", "@kbn/core-rendering-browser", "@kbn/index-lifecycle-management-common-shared", - "@kbn/core-http-server-utils" + "@kbn/core-http-server-utils", + "@kbn/apm-data-access-plugin" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_solution/uptime/e2e/config.ts b/x-pack/plugins/observability_solution/uptime/e2e/config.ts index 4f3e86eeb35ea..f38a590ed1502 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/config.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/config.ts @@ -9,7 +9,7 @@ import { FtrConfigProviderContext } from '@kbn/test'; import { CA_CERT_PATH } from '@kbn/dev-utils'; import { commonFunctionalServices } from '@kbn/ftr-common-functional-services'; import { commonFunctionalUIServices } from '@kbn/ftr-common-functional-ui-services'; -import { readKibanaConfig } from './tasks/read_kibana_config'; +import { readKibanaConfig } from '@kbn/observability-synthetics-test-data'; const MANIFEST_KEY = 'xpack.uptime.service.manifestUrl'; const SERVICE_PASSWORD = 'xpack.uptime.service.password'; const SERVICE_USERNAME = 'xpack.uptime.service.username'; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/helpers/parse_args_params.ts b/x-pack/plugins/observability_solution/uptime/e2e/helpers/parse_args_params.ts deleted file mode 100644 index a69cae912dfee..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/e2e/helpers/parse_args_params.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import yargs from 'yargs'; - -const { argv } = yargs(process.argv.slice(2)) - .option('headless', { - default: true, - type: 'boolean', - description: 'Start in headless mode', - }) - .option('bail', { - default: false, - type: 'boolean', - description: 'Pause on error', - }) - .option('grep', { - default: undefined, - type: 'string', - description: 'run only journeys with a name or tags that matches the glob', - }) - .help(); - -export { argv }; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/helpers/record_video.ts b/x-pack/plugins/observability_solution/uptime/e2e/helpers/record_video.ts deleted file mode 100644 index 23bcdfb643e72..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/e2e/helpers/record_video.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import fs from 'fs'; -import Runner from '@elastic/synthetics/dist/core/runner'; -import { after, Page } from '@elastic/synthetics'; - -const SYNTHETICS_RUNNER = Symbol.for('SYNTHETICS_RUNNER'); - -// @ts-ignore -export const runner: Runner = global[SYNTHETICS_RUNNER]; - -export const recordVideo = (page: Page, postfix = '') => { - after(async () => { - try { - const videoFilePath = await page.video()?.path(); - const pathToVideo = videoFilePath?.replace('.journeys/videos/', '').replace('.webm', ''); - const newVideoPath = videoFilePath?.replace( - pathToVideo!, - postfix ? runner.currentJourney!.name + `-${postfix}` : runner.currentJourney!.name - ); - fs.renameSync(videoFilePath!, newVideoPath!); - } catch (e) { - // eslint-disable-next-line no-console - console.log('Error while renaming video file', e); - } - }); -}; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/helpers/synthetics_runner.ts b/x-pack/plugins/observability_solution/uptime/e2e/helpers/synthetics_runner.ts deleted file mode 100644 index c9d1f485afbf2..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/e2e/helpers/synthetics_runner.ts +++ /dev/null @@ -1,155 +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. - */ - -/* eslint-disable no-console */ - -import Url from 'url'; -import { run as syntheticsRun } from '@elastic/synthetics'; -import { PromiseType } from 'utility-types'; -import { createApmUsers } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/create_apm_users'; - -import { EsArchiver } from '@kbn/es-archiver'; -import { esArchiverUnload } from '../tasks/es_archiver'; -import { TestReporter } from './test_reporter'; - -export interface ArgParams { - headless: boolean; - match?: string; - pauseOnError: boolean; -} - -export class SyntheticsRunner { - public getService: any; - public kibanaUrl: string; - private elasticsearchUrl: string; - - public testFilesLoaded: boolean = false; - - public params: ArgParams; - - private loadTestFilesCallback?: (reload?: boolean) => Promise<void>; - - constructor(getService: any, params: ArgParams) { - this.getService = getService; - this.kibanaUrl = this.getKibanaUrl(); - this.elasticsearchUrl = this.getElasticsearchUrl(); - this.params = params; - } - - async setup() { - await this.createTestUsers(); - } - - async createTestUsers() { - await createApmUsers({ - elasticsearch: { node: this.elasticsearchUrl, username: 'elastic', password: 'changeme' }, - kibana: { hostname: this.kibanaUrl }, - }); - } - - async loadTestFiles(callback: (reload?: boolean) => Promise<void>, reload = false) { - console.log('Loading test files'); - await callback(reload); - this.loadTestFilesCallback = callback; - this.testFilesLoaded = true; - console.log('Successfully loaded test files'); - } - - async loadTestData(e2eDir: string, dataArchives: string[]) { - try { - console.log('Loading esArchiver...'); - - const esArchiver: EsArchiver = this.getService('esArchiver'); - - const promises = dataArchives.map((archive) => { - if (archive === 'synthetics_data') { - return esArchiver.load(e2eDir + archive, { - docsOnly: true, - skipExisting: true, - }); - } - return esArchiver.load(e2eDir + archive, { skipExisting: true }); - }); - - await Promise.all([...promises]); - } catch (e) { - console.log(e); - } - } - - getKibanaUrl() { - const config = this.getService('config'); - - return Url.format({ - protocol: config.get('servers.kibana.protocol'), - hostname: config.get('servers.kibana.hostname'), - port: config.get('servers.kibana.port'), - }); - } - - getElasticsearchUrl() { - const config = this.getService('config'); - - return Url.format({ - protocol: config.get('servers.elasticsearch.protocol'), - hostname: config.get('servers.elasticsearch.hostname'), - port: config.get('servers.elasticsearch.port'), - }); - } - - async run() { - if (!this.testFilesLoaded) { - throw new Error('Test files not loaded'); - } - const { headless, match, pauseOnError } = this.params; - const noOfRuns = process.env.NO_OF_RUNS ? Number(process.env.NO_OF_RUNS) : 1; - console.log(`Running ${noOfRuns} times`); - let results: PromiseType<ReturnType<typeof syntheticsRun>> = {}; - for (let i = 0; i < noOfRuns; i++) { - results = await syntheticsRun({ - params: { kibanaUrl: this.kibanaUrl, getService: this.getService }, - playwrightOptions: { - headless, - chromiumSandbox: false, - timeout: 60 * 1000, - viewport: { - height: 900, - width: 1600, - }, - recordVideo: { - dir: '.journeys/videos', - }, - }, - grepOpts: { match: match === 'undefined' ? '' : match }, - pauseOnError, - screenshots: 'only-on-failure', - reporter: TestReporter, - }); - if (noOfRuns > 1) { - // need to reload again since runner resets the journeys - await this.loadTestFiles(this.loadTestFilesCallback!, true); - } - } - - await this.assertResults(results); - } - - assertResults(results: PromiseType<ReturnType<typeof syntheticsRun>>) { - Object.entries(results).forEach(([_journey, result]) => { - if (result.status !== 'succeeded') { - process.exitCode = 1; - process.exit(); - } - }); - } - - cleanUp() { - console.log('Removing esArchiver...'); - esArchiverUnload('full_heartbeat'); - esArchiverUnload('browser'); - } -} diff --git a/x-pack/plugins/observability_solution/uptime/e2e/helpers/test_reporter.ts b/x-pack/plugins/observability_solution/uptime/e2e/helpers/test_reporter.ts deleted file mode 100644 index 198a038ec027f..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/e2e/helpers/test_reporter.ts +++ /dev/null @@ -1,229 +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 { Journey, Step } from '@elastic/synthetics/dist/dsl'; -import { Reporter, ReporterOptions } from '@elastic/synthetics'; -import { - JourneyEndResult, - JourneyStartResult, - StepEndResult, -} from '@elastic/synthetics/dist/common_types'; - -import { yellow, green, cyan, red, bold } from 'chalk'; - -// eslint-disable-next-line no-console -const log = console.log; - -import { performance } from 'perf_hooks'; -import * as fs from 'fs'; -import { gatherScreenshots } from '@elastic/synthetics/dist/reporters/json'; -import { CACHE_PATH } from '@elastic/synthetics/dist/helpers'; -import { join } from 'path'; - -function renderError(error: any) { - let output = ''; - const outer = indent(''); - const inner = indent(outer); - const container = outer + '---\n'; - output += container; - let stack = error.stack; - if (stack) { - output += inner + 'stack: |-\n'; - stack = rewriteErrorStack(stack, findPWLogsIndexes(stack)); - const lines = String(stack).split('\n'); - for (const line of lines) { - output += inner + ' ' + line + '\n'; - } - } - output += container; - return red(output); -} - -function renderDuration(durationMs: number) { - return Number(durationMs).toFixed(0); -} - -export class TestReporter implements Reporter { - metrics = { - succeeded: 0, - failed: 0, - skipped: 0, - }; - - journeys: Map<string, Array<StepEndResult & { name: string }>> = new Map(); - - constructor(options: ReporterOptions = {}) {} - - onJourneyStart(journey: Journey, {}: JourneyStartResult) { - if (process.env.CI) { - this.write(`\n--- Journey: ${journey.name}`); - } else { - this.write(bold(`\n Journey: ${journey.name}`)); - } - } - - onStepEnd(journey: Journey, step: Step, result: StepEndResult) { - const { status, end, start, error } = result; - const message = `${symbols[status]} Step: '${step.name}' ${status} (${renderDuration( - (end - start) * 1000 - )} ms)`; - this.write(indent(message)); - if (error) { - this.write(renderError(error)); - } - this.metrics[status]++; - if (!this.journeys.has(journey.name)) { - this.journeys.set(journey.name, []); - } - this.journeys.get(journey.name)?.push({ name: step.name, ...result }); - } - - async onJourneyEnd(journey: Journey, { error, start, end, status }: JourneyEndResult) { - const { failed, succeeded, skipped } = this.metrics; - const total = failed + succeeded + skipped; - if (total === 0 && error) { - this.write(renderError(error)); - } - const message = `${symbols[status]} Took (${renderDuration(end - start)} seconds)`; - this.write(message); - - await fs.promises.mkdir('.journeys/failed_steps', { recursive: true }); - - await gatherScreenshots(join(CACHE_PATH, 'screenshots'), async (screenshot) => { - const { data, step } = screenshot; - - if (status === 'failed') { - await (async () => { - await fs.promises.writeFile(join('.journeys/failed_steps/', `${step.name}.jpg`), data, { - encoding: 'base64', - }); - })(); - } - }); - } - - onEnd() { - const failedJourneys = Array.from(this.journeys.entries()).filter(([, steps]) => - steps.some((step) => step.status === 'failed') - ); - - if (failedJourneys.length > 0) { - failedJourneys.forEach(([journeyName, steps]) => { - if (process.env.CI) { - const name = red(`Journey: ${journeyName} 🥵`); - this.write(`\n+++ ${name}`); - steps.forEach((stepResult) => { - const { status, end, start, error, name: stepName } = stepResult; - const message = `${symbols[status]} Step: '${stepName}' ${status} (${renderDuration( - (end - start) * 1000 - )} ms)`; - this.write(indent(message)); - if (error) { - this.write(renderError(error)); - } - }); - } - }); - } - - const successfulJourneys = Array.from(this.journeys.entries()).filter(([, steps]) => - steps.every((step) => step.status === 'succeeded') - ); - - successfulJourneys.forEach(([journeyName, steps]) => { - try { - fs.unlinkSync('.journeys/videos/' + journeyName + '.webm'); - } catch (e) { - // eslint-disable-next-line no-console - console.log( - 'Failed to delete video file for path ' + '.journeys/videos/' + journeyName + '.webm' - ); - } - }); - - const { failed, succeeded, skipped } = this.metrics; - const total = failed + succeeded + skipped; - - let message = '\n'; - if (total === 0) { - message = 'No tests found!'; - message += ` (${renderDuration(now())} ms) \n`; - this.write(message); - return; - } - - message += succeeded > 0 ? green(` ${succeeded} passed`) : ''; - message += failed > 0 ? red(` ${failed} failed`) : ''; - message += skipped > 0 ? cyan(` ${skipped} skipped`) : ''; - message += ` (${renderDuration(now() / 1000)} seconds) \n`; - this.write(message); - } - - write(message: any) { - if (typeof message === 'object') { - message = JSON.stringify(message); - } - log(message + '\n'); - } -} - -const SEPARATOR = '\n'; - -function indent(lines: string, tab = ' ') { - return lines.replace(/^/gm, tab); -} - -const NO_UTF8_SUPPORT = process.platform === 'win32'; -const symbols = { - warning: yellow(NO_UTF8_SUPPORT ? '!' : '⚠'), - skipped: cyan('-'), - progress: cyan('>'), - succeeded: green(NO_UTF8_SUPPORT ? 'ok' : '✓'), - failed: red(NO_UTF8_SUPPORT ? 'x' : '✖'), -}; - -function now() { - return performance.now(); -} - -function findPWLogsIndexes(msgOrStack: string): [number, number] { - let startIndex = 0; - let endIndex = 0; - if (!msgOrStack) { - return [startIndex, endIndex]; - } - const lines = String(msgOrStack).split(SEPARATOR); - const logStart = /[=]{3,} logs [=]{3,}/; - const logEnd = /[=]{10,}/; - lines.forEach((line, index) => { - if (logStart.test(line)) { - startIndex = index; - } else if (logEnd.test(line)) { - endIndex = index; - } - }); - return [startIndex, endIndex]; -} - -function rewriteErrorStack(stack: string, indexes: [number, number]) { - const [start, end] = indexes; - /** - * Do not rewrite if its not a playwright error - */ - if (start === 0 && end === 0) { - return stack; - } - const linesToKeep = start + 3; - if (start > 0 && linesToKeep < end) { - const lines = stack.split(SEPARATOR); - return lines - .slice(0, linesToKeep) - .concat(...lines.slice(end)) - .join(SEPARATOR); - } - return stack; -} diff --git a/x-pack/plugins/observability_solution/uptime/e2e/tasks/es_archiver.ts b/x-pack/plugins/observability_solution/uptime/e2e/tasks/es_archiver.ts deleted file mode 100644 index 8415de3a385bd..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/e2e/tasks/es_archiver.ts +++ /dev/null @@ -1,37 +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 Path from 'path'; -import { execSync } from 'child_process'; - -const ES_ARCHIVE_DIR = './fixtures/es_archiver'; - -// Otherwise execSync would inject NODE_TLS_REJECT_UNAUTHORIZED=0 and node would abort if used over https -const NODE_TLS_REJECT_UNAUTHORIZED = '1'; - -export const esArchiverLoad = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - execSync( - `node ../../../../../scripts/es_archiver load "${path}" --config ../../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverUnload = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - execSync( - `node ../../../../../scripts/es_archiver unload "${path}" --config ../../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverResetKibana = () => { - execSync( - `node ../../../../../scripts/es_archiver empty-kibana-index --config ../../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/tasks/read_kibana_config.ts b/x-pack/plugins/observability_solution/uptime/e2e/tasks/read_kibana_config.ts deleted file mode 100644 index b892454b12c97..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/e2e/tasks/read_kibana_config.ts +++ /dev/null @@ -1,22 +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 path from 'path'; -import fs from 'fs'; -import yaml from 'js-yaml'; - -export type KibanaConfig = ReturnType<typeof readKibanaConfig>; - -export const readKibanaConfig = () => { - const kibanaConfigDir = path.join(__filename, '../../../../../../../config'); - const kibanaDevConfig = path.join(kibanaConfigDir, 'kibana.dev.yml'); - const kibanaConfig = path.join(kibanaConfigDir, 'kibana.yml'); - - return (yaml.load( - fs.readFileSync(fs.existsSync(kibanaDevConfig) ? kibanaDevConfig : kibanaConfig, 'utf8') - ) || {}) as Record<string, string>; -}; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/tsconfig.json b/x-pack/plugins/observability_solution/uptime/e2e/tsconfig.json index 2ad789f1e88d9..a88e6a0dbfb58 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/tsconfig.json +++ b/x-pack/plugins/observability_solution/uptime/e2e/tsconfig.json @@ -13,7 +13,7 @@ "@kbn/ux-plugin/e2e", "@kbn/ftr-common-functional-services", "@kbn/apm-plugin", - "@kbn/es-archiver", - "@kbn/ftr-common-functional-ui-services" + "@kbn/ftr-common-functional-ui-services", + "@kbn/observability-synthetics-test-data" ] } diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/default_email_settings.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/default_email_settings.ts index 2865084aa29e8..2050134a26d69 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/default_email_settings.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/default_email_settings.ts @@ -6,13 +6,13 @@ */ import { journey, step, before } from '@elastic/synthetics'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { assertNotText, assertText, byTestId, waitForLoadingToFinish, } from '../../../helpers/utils'; -import { recordVideo } from '../../../helpers/record_video'; import { settingsPageProvider } from '../../page_objects/settings'; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/status_alert_flyouts_in_alerting_app.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/status_alert_flyouts_in_alerting_app.ts index b3cdfbe134935..ddd3501244109 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/status_alert_flyouts_in_alerting_app.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/status_alert_flyouts_in_alerting_app.ts @@ -7,8 +7,8 @@ import { journey, step, expect, before } from '@elastic/synthetics'; import { RetryService } from '@kbn/ftr-common-functional-services'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId, assertText, waitForLoadingToFinish } from '../../../helpers/utils'; -import { recordVideo } from '../../../helpers/record_video'; import { loginPageProvider } from '../../../page_objects/login'; journey('StatusFlyoutInAlertingApp', async ({ page, params }) => { diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts index f8ac13ff0361a..2209a1b12a803 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts @@ -6,8 +6,8 @@ */ import { journey, step, before, expect } from '@elastic/synthetics'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId, assertText, waitForLoadingToFinish } from '../../../helpers/utils'; -import { recordVideo } from '../../../helpers/record_video'; import { loginPageProvider } from '../../../page_objects/login'; journey('TlsFlyoutInAlertingApp', async ({ page, params }) => { diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/data_view_permissions.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/data_view_permissions.ts index f8b74dabc027b..ee3ead7d615c4 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/data_view_permissions.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/data_view_permissions.ts @@ -7,8 +7,8 @@ import { journey, step, expect, before } from '@elastic/synthetics'; import { callKibana } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/helpers/call_kibana'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId, TIMEOUT_60_SEC, waitForLoadingToFinish } from '../../helpers/utils'; -import { recordVideo } from '../../helpers/record_video'; import { loginPageProvider } from '../../page_objects/login'; journey('DataViewPermissions', async ({ page, params }) => { diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/locations/locations.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/locations/locations.ts index afb5ebf0c04a1..efda8352d93b1 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/locations/locations.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/locations/locations.ts @@ -6,7 +6,7 @@ */ import { journey, step, before, Page } from '@elastic/synthetics'; -import { recordVideo } from '../../../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { makeChecksWithStatus } from '../../../helpers/make_checks'; import { monitorDetailsPageProvider } from '../../page_objects/monitor_details'; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_alerts.journey.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_alerts.journey.ts index 88a174f76cc59..6e5ed114d72de 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_alerts.journey.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_alerts.journey.ts @@ -7,8 +7,8 @@ import { journey, step, expect, before, Page } from '@elastic/synthetics'; import { noop } from 'lodash'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId, delay } from '../../../helpers/utils'; -import { recordVideo } from '../../../helpers/record_video'; import { monitorDetailsPageProvider } from '../../page_objects/monitor_details'; const dateRangeStart = '2019-09-10T12:40:08.078Z'; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_details.journey.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_details.journey.ts index f46081c7b3823..b54d462cdfaa3 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_details.journey.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/monitor_details.journey.ts @@ -6,8 +6,8 @@ */ import { journey, step, before, Page } from '@elastic/synthetics'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId } from '../../../helpers/utils'; -import { recordVideo } from '../../../helpers/record_video'; import { monitorDetailsPageProvider } from '../../page_objects/monitor_details'; const dateRangeStart = '2019-09-10T12:40:08.078Z'; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/ping_redirects.journey.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/ping_redirects.journey.ts index 502217721381d..d90438721715a 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/ping_redirects.journey.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/monitor_details/ping_redirects.journey.ts @@ -6,8 +6,8 @@ */ import { journey, step, expect, before, Page } from '@elastic/synthetics'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId, delay } from '../../../helpers/utils'; -import { recordVideo } from '../../../helpers/record_video'; import { makeChecksWithStatus } from '../../../helpers/make_checks'; import { monitorDetailsPageProvider } from '../../page_objects/monitor_details'; diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/step_duration.journey.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/step_duration.journey.ts index 2dc781fcbf90f..41f31681fd06f 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/step_duration.journey.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/step_duration.journey.ts @@ -7,7 +7,7 @@ import { journey, step, expect } from '@elastic/synthetics'; import { RetryService } from '@kbn/ftr-common-functional-services'; -import { recordVideo } from '../../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { loginPageProvider } from '../../page_objects/login'; journey('StepsDuration', async ({ page, params }) => { diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts index 81559169deff3..f27cd3acba3cf 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts @@ -6,8 +6,8 @@ */ import { journey, step, before } from '@elastic/synthetics'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { byTestId, waitForLoadingToFinish } from '../../helpers/utils'; -import { recordVideo } from '../../helpers/record_video'; journey('UptimeOverview', ({ page, params }) => { recordVideo(page); diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/synthetics_run.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/synthetics_run.ts index b457a5b1e104f..26a3b9e2e27bb 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/synthetics_run.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/synthetics_run.ts @@ -6,8 +6,7 @@ */ import { FtrConfigProviderContext } from '@kbn/test'; import path from 'path'; -import { argv } from '../helpers/parse_args_params'; -import { SyntheticsRunner } from '../helpers/synthetics_runner'; +import { SyntheticsRunner, argv } from '@kbn/observability-synthetics-test-data'; const { headless, grep, bail: pauseOnError } = argv; diff --git a/x-pack/plugins/observability_solution/ux/e2e/helpers/parse_args_params.ts b/x-pack/plugins/observability_solution/ux/e2e/helpers/parse_args_params.ts deleted file mode 100644 index 41100ba2ec295..0000000000000 --- a/x-pack/plugins/observability_solution/ux/e2e/helpers/parse_args_params.ts +++ /dev/null @@ -1,33 +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 yargs from 'yargs'; - -const { argv } = yargs(process.argv.slice(2)) - .option('headless', { - default: true, - type: 'boolean', - description: 'Start in headless mode', - }) - .option('bail', { - default: false, - type: 'boolean', - description: 'Pause on error', - }) - .option('watch', { - default: false, - type: 'boolean', - description: 'Runs the server in watch mode, restarting on changes', - }) - .option('grep', { - default: undefined, - type: 'string', - description: 'run only journeys with a name or tags that matches the glob', - }) - .help(); - -export { argv }; diff --git a/x-pack/plugins/observability_solution/ux/e2e/helpers/record_video.ts b/x-pack/plugins/observability_solution/ux/e2e/helpers/record_video.ts deleted file mode 100644 index 23bcdfb643e72..0000000000000 --- a/x-pack/plugins/observability_solution/ux/e2e/helpers/record_video.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import fs from 'fs'; -import Runner from '@elastic/synthetics/dist/core/runner'; -import { after, Page } from '@elastic/synthetics'; - -const SYNTHETICS_RUNNER = Symbol.for('SYNTHETICS_RUNNER'); - -// @ts-ignore -export const runner: Runner = global[SYNTHETICS_RUNNER]; - -export const recordVideo = (page: Page, postfix = '') => { - after(async () => { - try { - const videoFilePath = await page.video()?.path(); - const pathToVideo = videoFilePath?.replace('.journeys/videos/', '').replace('.webm', ''); - const newVideoPath = videoFilePath?.replace( - pathToVideo!, - postfix ? runner.currentJourney!.name + `-${postfix}` : runner.currentJourney!.name - ); - fs.renameSync(videoFilePath!, newVideoPath!); - } catch (e) { - // eslint-disable-next-line no-console - console.log('Error while renaming video file', e); - } - }); -}; diff --git a/x-pack/plugins/observability_solution/ux/e2e/helpers/synthetics_runner.ts b/x-pack/plugins/observability_solution/ux/e2e/helpers/synthetics_runner.ts deleted file mode 100644 index e191d5fc101f7..0000000000000 --- a/x-pack/plugins/observability_solution/ux/e2e/helpers/synthetics_runner.ts +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable no-console */ - -import Url from 'url'; -import { run as syntheticsRun } from '@elastic/synthetics'; -import { PromiseType } from 'utility-types'; -import { createApmUsers } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/create_apm_users'; - -import { EsArchiver } from '@kbn/es-archiver'; -import { esArchiverUnload } from '../tasks/es_archiver'; -import { TestReporter } from './test_reporter'; - -export interface ArgParams { - headless: boolean; - match?: string; - pauseOnError: boolean; -} - -export class SyntheticsRunner { - public getService: any; - public kibanaUrl: string; - private elasticsearchUrl: string; - - public testFilesLoaded: boolean = false; - - public params: ArgParams; - - private loadTestFilesCallback?: (reload?: boolean) => Promise<void>; - - constructor(getService: any, params: ArgParams) { - this.getService = getService; - this.kibanaUrl = this.getKibanaUrl(); - this.elasticsearchUrl = this.getElasticsearchUrl(); - this.params = params; - } - - async setup() { - await this.createTestUsers(); - } - - async createTestUsers() { - await createApmUsers({ - elasticsearch: { - node: this.elasticsearchUrl, - username: 'elastic', - password: 'changeme', - }, - kibana: { hostname: this.kibanaUrl }, - }); - } - - async loadTestFiles(callback: (reload?: boolean) => Promise<void>, reload = false) { - console.log('Loading test files'); - await callback(reload); - this.loadTestFilesCallback = callback; - this.testFilesLoaded = true; - console.log('Successfully loaded test files'); - } - - async loadTestData(e2eDir: string, dataArchives: string[]) { - try { - console.log('Loading esArchiver...'); - - const esArchiver: EsArchiver = this.getService('esArchiver'); - - const promises = dataArchives.map((archive) => { - if (archive === 'synthetics_data') { - return esArchiver.load(e2eDir + archive, { - docsOnly: true, - skipExisting: true, - }); - } - return esArchiver.load(e2eDir + archive, { skipExisting: true }); - }); - - await Promise.all([...promises]); - } catch (e) { - console.log(e); - } - } - - getKibanaUrl() { - const config = this.getService('config'); - - return Url.format({ - protocol: config.get('servers.kibana.protocol'), - hostname: config.get('servers.kibana.hostname'), - port: config.get('servers.kibana.port'), - }); - } - - getElasticsearchUrl() { - const config = this.getService('config'); - - return Url.format({ - protocol: config.get('servers.elasticsearch.protocol'), - hostname: config.get('servers.elasticsearch.hostname'), - port: config.get('servers.elasticsearch.port'), - }); - } - - async run() { - if (!this.testFilesLoaded) { - throw new Error('Test files not loaded'); - } - const { headless, match, pauseOnError } = this.params; - const noOfRuns = process.env.NO_OF_RUNS ? Number(process.env.NO_OF_RUNS) : 1; - console.log(`Running ${noOfRuns} times`); - let results: PromiseType<ReturnType<typeof syntheticsRun>> = {}; - for (let i = 0; i < noOfRuns; i++) { - results = await syntheticsRun({ - params: { kibanaUrl: this.kibanaUrl, getService: this.getService }, - playwrightOptions: { - headless, - chromiumSandbox: false, - timeout: 60 * 1000, - viewport: { - height: 900, - width: 1600, - }, - recordVideo: { - dir: '.journeys/videos', - }, - }, - grepOpts: { match: match === 'undefined' ? '' : match }, - pauseOnError, - screenshots: 'only-on-failure', - reporter: TestReporter, - }); - if (noOfRuns > 1) { - // need to reload again since runner resets the journeys - await this.loadTestFiles(this.loadTestFilesCallback!, true); - } - } - - await this.assertResults(results); - } - - assertResults(results: PromiseType<ReturnType<typeof syntheticsRun>>) { - Object.entries(results).forEach(([_journey, result]) => { - if (result.status !== 'succeeded') { - process.exitCode = 1; - process.exit(); - } - }); - } - - cleanUp() { - console.log('Removing esArchiver...'); - esArchiverUnload('full_heartbeat'); - esArchiverUnload('browser'); - } -} diff --git a/x-pack/plugins/observability_solution/ux/e2e/helpers/test_reporter.ts b/x-pack/plugins/observability_solution/ux/e2e/helpers/test_reporter.ts deleted file mode 100644 index 198a038ec027f..0000000000000 --- a/x-pack/plugins/observability_solution/ux/e2e/helpers/test_reporter.ts +++ /dev/null @@ -1,229 +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 { Journey, Step } from '@elastic/synthetics/dist/dsl'; -import { Reporter, ReporterOptions } from '@elastic/synthetics'; -import { - JourneyEndResult, - JourneyStartResult, - StepEndResult, -} from '@elastic/synthetics/dist/common_types'; - -import { yellow, green, cyan, red, bold } from 'chalk'; - -// eslint-disable-next-line no-console -const log = console.log; - -import { performance } from 'perf_hooks'; -import * as fs from 'fs'; -import { gatherScreenshots } from '@elastic/synthetics/dist/reporters/json'; -import { CACHE_PATH } from '@elastic/synthetics/dist/helpers'; -import { join } from 'path'; - -function renderError(error: any) { - let output = ''; - const outer = indent(''); - const inner = indent(outer); - const container = outer + '---\n'; - output += container; - let stack = error.stack; - if (stack) { - output += inner + 'stack: |-\n'; - stack = rewriteErrorStack(stack, findPWLogsIndexes(stack)); - const lines = String(stack).split('\n'); - for (const line of lines) { - output += inner + ' ' + line + '\n'; - } - } - output += container; - return red(output); -} - -function renderDuration(durationMs: number) { - return Number(durationMs).toFixed(0); -} - -export class TestReporter implements Reporter { - metrics = { - succeeded: 0, - failed: 0, - skipped: 0, - }; - - journeys: Map<string, Array<StepEndResult & { name: string }>> = new Map(); - - constructor(options: ReporterOptions = {}) {} - - onJourneyStart(journey: Journey, {}: JourneyStartResult) { - if (process.env.CI) { - this.write(`\n--- Journey: ${journey.name}`); - } else { - this.write(bold(`\n Journey: ${journey.name}`)); - } - } - - onStepEnd(journey: Journey, step: Step, result: StepEndResult) { - const { status, end, start, error } = result; - const message = `${symbols[status]} Step: '${step.name}' ${status} (${renderDuration( - (end - start) * 1000 - )} ms)`; - this.write(indent(message)); - if (error) { - this.write(renderError(error)); - } - this.metrics[status]++; - if (!this.journeys.has(journey.name)) { - this.journeys.set(journey.name, []); - } - this.journeys.get(journey.name)?.push({ name: step.name, ...result }); - } - - async onJourneyEnd(journey: Journey, { error, start, end, status }: JourneyEndResult) { - const { failed, succeeded, skipped } = this.metrics; - const total = failed + succeeded + skipped; - if (total === 0 && error) { - this.write(renderError(error)); - } - const message = `${symbols[status]} Took (${renderDuration(end - start)} seconds)`; - this.write(message); - - await fs.promises.mkdir('.journeys/failed_steps', { recursive: true }); - - await gatherScreenshots(join(CACHE_PATH, 'screenshots'), async (screenshot) => { - const { data, step } = screenshot; - - if (status === 'failed') { - await (async () => { - await fs.promises.writeFile(join('.journeys/failed_steps/', `${step.name}.jpg`), data, { - encoding: 'base64', - }); - })(); - } - }); - } - - onEnd() { - const failedJourneys = Array.from(this.journeys.entries()).filter(([, steps]) => - steps.some((step) => step.status === 'failed') - ); - - if (failedJourneys.length > 0) { - failedJourneys.forEach(([journeyName, steps]) => { - if (process.env.CI) { - const name = red(`Journey: ${journeyName} 🥵`); - this.write(`\n+++ ${name}`); - steps.forEach((stepResult) => { - const { status, end, start, error, name: stepName } = stepResult; - const message = `${symbols[status]} Step: '${stepName}' ${status} (${renderDuration( - (end - start) * 1000 - )} ms)`; - this.write(indent(message)); - if (error) { - this.write(renderError(error)); - } - }); - } - }); - } - - const successfulJourneys = Array.from(this.journeys.entries()).filter(([, steps]) => - steps.every((step) => step.status === 'succeeded') - ); - - successfulJourneys.forEach(([journeyName, steps]) => { - try { - fs.unlinkSync('.journeys/videos/' + journeyName + '.webm'); - } catch (e) { - // eslint-disable-next-line no-console - console.log( - 'Failed to delete video file for path ' + '.journeys/videos/' + journeyName + '.webm' - ); - } - }); - - const { failed, succeeded, skipped } = this.metrics; - const total = failed + succeeded + skipped; - - let message = '\n'; - if (total === 0) { - message = 'No tests found!'; - message += ` (${renderDuration(now())} ms) \n`; - this.write(message); - return; - } - - message += succeeded > 0 ? green(` ${succeeded} passed`) : ''; - message += failed > 0 ? red(` ${failed} failed`) : ''; - message += skipped > 0 ? cyan(` ${skipped} skipped`) : ''; - message += ` (${renderDuration(now() / 1000)} seconds) \n`; - this.write(message); - } - - write(message: any) { - if (typeof message === 'object') { - message = JSON.stringify(message); - } - log(message + '\n'); - } -} - -const SEPARATOR = '\n'; - -function indent(lines: string, tab = ' ') { - return lines.replace(/^/gm, tab); -} - -const NO_UTF8_SUPPORT = process.platform === 'win32'; -const symbols = { - warning: yellow(NO_UTF8_SUPPORT ? '!' : '⚠'), - skipped: cyan('-'), - progress: cyan('>'), - succeeded: green(NO_UTF8_SUPPORT ? 'ok' : '✓'), - failed: red(NO_UTF8_SUPPORT ? 'x' : '✖'), -}; - -function now() { - return performance.now(); -} - -function findPWLogsIndexes(msgOrStack: string): [number, number] { - let startIndex = 0; - let endIndex = 0; - if (!msgOrStack) { - return [startIndex, endIndex]; - } - const lines = String(msgOrStack).split(SEPARATOR); - const logStart = /[=]{3,} logs [=]{3,}/; - const logEnd = /[=]{10,}/; - lines.forEach((line, index) => { - if (logStart.test(line)) { - startIndex = index; - } else if (logEnd.test(line)) { - endIndex = index; - } - }); - return [startIndex, endIndex]; -} - -function rewriteErrorStack(stack: string, indexes: [number, number]) { - const [start, end] = indexes; - /** - * Do not rewrite if its not a playwright error - */ - if (start === 0 && end === 0) { - return stack; - } - const linesToKeep = start + 3; - if (start > 0 && linesToKeep < end) { - const lines = stack.split(SEPARATOR); - return lines - .slice(0, linesToKeep) - .concat(...lines.slice(end)) - .join(SEPARATOR); - } - return stack; -} diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/core_web_vitals.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/core_web_vitals.ts index 6aeebbb913b13..a40073644803d 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/core_web_vitals.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/core_web_vitals.ts @@ -6,7 +6,7 @@ */ import { journey, step, expect, before } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/inp.journey.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/inp.journey.ts index 451b5b749a936..215325caeb40f 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/inp.journey.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/inp.journey.ts @@ -7,7 +7,7 @@ import { journey, step, expect, before } from '@elastic/synthetics'; import { Client } from '@elastic/elasticsearch'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { loginToKibana, waitForLoadingToFinish } from './utils'; const addTestTransaction = async (params: any) => { diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/page_views.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/page_views.ts index cdae75f724d44..ec91050fb6d26 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/page_views.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/page_views.ts @@ -6,7 +6,7 @@ */ import { journey, step, expect, before } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { byTestId, loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/url_ux_query.journey.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/url_ux_query.journey.ts index 24c1847b5cd06..730952254f1d5 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/url_ux_query.journey.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/url_ux_query.journey.ts @@ -6,7 +6,7 @@ */ import { journey, step, expect, before } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { byTestId, loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_client_metrics.journey.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_client_metrics.journey.ts index 97cad67b91a7f..ad8f569dbd47c 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_client_metrics.journey.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_client_metrics.journey.ts @@ -6,7 +6,7 @@ */ import { journey, step, expect, before } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { byTestId, loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_js_errors.journey.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_js_errors.journey.ts index 9f573bf5e149c..4c685c4db4f42 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_js_errors.journey.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_js_errors.journey.ts @@ -6,7 +6,7 @@ */ import { journey, step, expect, before } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { byTestId, loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_long_task_metric_journey.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_long_task_metric_journey.ts index eb9bad1c763d3..5e55610e87933 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_long_task_metric_journey.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_long_task_metric_journey.ts @@ -6,7 +6,7 @@ */ import { journey, step, before, expect } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { byTestId, loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_visitor_breakdown.journey.ts b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_visitor_breakdown.journey.ts index 86e804f947515..92e51d4c16c36 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_visitor_breakdown.journey.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/journeys/ux_visitor_breakdown.journey.ts @@ -6,7 +6,7 @@ */ import { journey, step, before } from '@elastic/synthetics'; -import { recordVideo } from '../helpers/record_video'; +import { recordVideo } from '@kbn/observability-synthetics-test-data'; import { UXDashboardDatePicker } from '../page_objects/date_picker'; import { byLensTestId, loginToKibana, waitForLoadingToFinish } from './utils'; diff --git a/x-pack/plugins/observability_solution/ux/e2e/synthetics_run.ts b/x-pack/plugins/observability_solution/ux/e2e/synthetics_run.ts index 7c7581b10e6a6..84287949caa28 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/synthetics_run.ts +++ b/x-pack/plugins/observability_solution/ux/e2e/synthetics_run.ts @@ -6,8 +6,7 @@ */ import { FtrConfigProviderContext } from '@kbn/test'; import path from 'path'; -import { argv } from './helpers/parse_args_params'; -import { SyntheticsRunner } from './helpers/synthetics_runner'; +import { SyntheticsRunner, argv } from '@kbn/observability-synthetics-test-data'; const { headless, grep, bail: pauseOnError } = argv; diff --git a/x-pack/plugins/observability_solution/ux/e2e/tasks/es_archiver.ts b/x-pack/plugins/observability_solution/ux/e2e/tasks/es_archiver.ts deleted file mode 100644 index 8415de3a385bd..0000000000000 --- a/x-pack/plugins/observability_solution/ux/e2e/tasks/es_archiver.ts +++ /dev/null @@ -1,37 +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 Path from 'path'; -import { execSync } from 'child_process'; - -const ES_ARCHIVE_DIR = './fixtures/es_archiver'; - -// Otherwise execSync would inject NODE_TLS_REJECT_UNAUTHORIZED=0 and node would abort if used over https -const NODE_TLS_REJECT_UNAUTHORIZED = '1'; - -export const esArchiverLoad = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - execSync( - `node ../../../../../scripts/es_archiver load "${path}" --config ../../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverUnload = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - execSync( - `node ../../../../../scripts/es_archiver unload "${path}" --config ../../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; - -export const esArchiverResetKibana = () => { - execSync( - `node ../../../../../scripts/es_archiver empty-kibana-index --config ../../../../test/functional/config.base.js`, - { env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED }, stdio: 'inherit' } - ); -}; diff --git a/x-pack/plugins/observability_solution/ux/e2e/tsconfig.json b/x-pack/plugins/observability_solution/ux/e2e/tsconfig.json index 93a315a3e7a6b..93ddeb2fc4921 100644 --- a/x-pack/plugins/observability_solution/ux/e2e/tsconfig.json +++ b/x-pack/plugins/observability_solution/ux/e2e/tsconfig.json @@ -6,5 +6,8 @@ "outDir": "target/types", "types": ["node"] }, - "kbn_references": ["@kbn/test", "@kbn/apm-plugin", "@kbn/es-archiver"] + "kbn_references": [ + "@kbn/test", + "@kbn/observability-synthetics-test-data", + ] } diff --git a/x-pack/plugins/observability_solution/ux/kibana.jsonc b/x-pack/plugins/observability_solution/ux/kibana.jsonc index f2770a896d89b..6626a9e414612 100644 --- a/x-pack/plugins/observability_solution/ux/kibana.jsonc +++ b/x-pack/plugins/observability_solution/ux/kibana.jsonc @@ -2,7 +2,7 @@ "type": "plugin", "id": "@kbn/ux-plugin", "owner": [ - "@elastic/obs-ux-infra_services-team" + "@elastic/obs-ux-management-team" ], "group": "observability", "visibility": "private", @@ -46,4 +46,4 @@ "maps" ] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/search_connectors/kibana.jsonc b/x-pack/plugins/search_connectors/kibana.jsonc index 6290b9692b384..45ae79ec2cb5c 100644 --- a/x-pack/plugins/search_connectors/kibana.jsonc +++ b/x-pack/plugins/search_connectors/kibana.jsonc @@ -3,7 +3,7 @@ "id": "@kbn/search-connectors-plugin", "owner": "@elastic/search-kibana", // TODO this is currently used from Observability too, must be refactored before solution-specific builds - // see x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx + // see x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx // cc sphilipse "group": "search", "visibility": "private", diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/perform_rule_upgrade/perform_rule_upgrade_route.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/perform_rule_upgrade/perform_rule_upgrade_route.ts index 0021aece67455..3ef53e7b7c67a 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/perform_rule_upgrade/perform_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/perform_rule_upgrade/perform_rule_upgrade_route.ts @@ -115,7 +115,7 @@ export const RuleUpgradeSpecifier = z.object({ export type UpgradeSpecificRulesRequest = z.infer<typeof UpgradeSpecificRulesRequest>; export const UpgradeSpecificRulesRequest = z.object({ mode: z.literal('SPECIFIC_RULES'), - rules: z.array(RuleUpgradeSpecifier), + rules: z.array(RuleUpgradeSpecifier).min(1), pick_version: PickVersionValues.optional(), }); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx index 9aa3491218f88..1293ddff34f75 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useStream } from './use_stream'; const refetchCurrentConversation = jest.fn(); @@ -49,7 +49,7 @@ describe.skip('useStream', () => { }); it('Should stream response. isLoading/isStreaming are true while streaming, isLoading/isStreaming are false when streaming completes', async () => { - const { result, waitFor } = renderHook(() => useStream(defaultProps)); + const { result } = renderHook(() => useStream(defaultProps)); expect(reader).toHaveBeenCalledTimes(1); await waitFor(() => { expect(result.current).toEqual({ @@ -107,7 +107,7 @@ describe.skip('useStream', () => { releaseLock: jest.fn(), closed: jest.fn().mockResolvedValue(true), } as unknown as ReadableStreamDefaultReader<Uint8Array>; - const { result, waitForNextUpdate } = renderHook(() => + const { result } = renderHook(() => useStream({ ...defaultProps, reader: errorReader, @@ -115,7 +115,7 @@ describe.skip('useStream', () => { ); expect(result.current.error).toBeUndefined(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.error).toBe(errorMessage); expect(result.current.isLoading).toBe(false); diff --git a/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx b/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx index ca90d72b37157..eb9adf234e9fd 100644 --- a/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx @@ -22,7 +22,14 @@ jest.mock('@kbn/elastic-assistant', () => ({ jest.mock('../common/hooks/use_experimental_features'); describe('AssistantOverlay', () => { - const queryClient = new QueryClient(); + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + cacheTime: Infinity, + retry: false, + }, + }, + }); beforeEach(() => { jest.clearAllMocks(); diff --git a/x-pack/plugins/security_solution/public/assistant/provider.test.tsx b/x-pack/plugins/security_solution/public/assistant/provider.test.tsx index a96623b8567a8..5108fb259cfb2 100644 --- a/x-pack/plugins/security_solution/public/assistant/provider.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/provider.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { httpServiceMock, type HttpSetupMock } from '@kbn/core-http-browser-mocks'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { createConversations } from './provider'; @@ -166,47 +166,43 @@ describe('createConversations', () => { }); it('should call bulk conversations with the transformed conversations from the local storage', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => - createConversations( - coreMock.createStart().notifications, - http, - mockStorage as unknown as Storage - ) - ); - await waitForNextUpdate(); - expect(http.fetch.mock.calls[0][0]).toBe( - '/internal/elastic_assistant/current_user/conversations/_bulk_action' - ); - expect( - http.fetch.mock.calls[0].length > 1 - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - JSON.parse((http.fetch.mock.calls[0] as any[])[1]?.body).create.length - : 0 - ).toBe(2); - }); + renderHook(() => + createConversations( + coreMock.createStart().notifications, + http, + mockStorage as unknown as Storage + ) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(http.fetch.mock.calls[0][0]).toBe( + '/internal/elastic_assistant/current_user/conversations/_bulk_action' + ); + expect( + http.fetch.mock.calls[0].length > 1 + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + JSON.parse((http.fetch.mock.calls[0] as any[])[1]?.body).create.length + : 0 + ).toBe(2); }); it('should add missing actionTypeId to apiConfig', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => - createConversations( - coreMock.createStart().notifications, - http, - mockStorage as unknown as Storage - ) - ); - await waitForNextUpdate(); - expect(http.fetch.mock.calls[0][0]).toBe( - '/internal/elastic_assistant/current_user/conversations/_bulk_action' - ); - const createdConversations = - http.fetch.mock.calls[0].length > 1 - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - JSON.parse((http.fetch.mock.calls[0] as any[])[1]?.body)?.create - : []; - expect(createdConversations[0].apiConfig.actionTypeId).toEqual('.bedrock'); - expect(createdConversations[1].apiConfig.actionTypeId).toEqual('.gen-ai'); - }); + renderHook(() => + createConversations( + coreMock.createStart().notifications, + http, + mockStorage as unknown as Storage + ) + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(http.fetch.mock.calls[0][0]).toBe( + '/internal/elastic_assistant/current_user/conversations/_bulk_action' + ); + const createdConversations = + http.fetch.mock.calls[0].length > 1 + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + JSON.parse((http.fetch.mock.calls[0] as any[])[1]?.body)?.create + : []; + expect(createdConversations[0].apiConfig.actionTypeId).toEqual('.bedrock'); + expect(createdConversations[1].apiConfig.actionTypeId).toEqual('.gen-ai'); }); }); diff --git a/x-pack/plugins/security_solution/public/assistant/use_assistant_telemetry/index.test.tsx b/x-pack/plugins/security_solution/public/assistant/use_assistant_telemetry/index.test.tsx index b90db333742a4..269d09bfed0fc 100644 --- a/x-pack/plugins/security_solution/public/assistant/use_assistant_telemetry/index.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/use_assistant_telemetry/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useAssistantTelemetry } from '.'; import { BASE_SECURITY_CONVERSATIONS } from '../content/conversations'; import { createTelemetryServiceMock } from '../../common/lib/telemetry/telemetry_service.mock'; diff --git a/x-pack/plugins/security_solution/public/assistant/use_conversation_store/index.test.tsx b/x-pack/plugins/security_solution/public/assistant/use_conversation_store/index.test.tsx index 99836af47a7a8..d93430e1552df 100644 --- a/x-pack/plugins/security_solution/public/assistant/use_conversation_store/index.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/use_conversation_store/index.test.tsx @@ -4,7 +4,8 @@ * 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 { renderHook } from '@testing-library/react'; import { useBaseConversations } from '.'; import { useLinkAuthorized } from '../../common/links'; import { useKibana as mockUseKibana } from '../../common/lib/kibana/__mocks__'; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_case/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_case/index.test.tsx index 7ecb824739679..b9e5aadb018ad 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_case/index.test.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_case/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useAddToNewCase } from '.'; import { TestProviders } from '../../../../../../common/mock'; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx index e84b7973208f7..fd91ff132f204 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useAddToExistingCase } from '.'; import { useKibana } from '../../../../../../common/lib/kibana'; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts index 86f243e9445f4..4d7d7316a9c9b 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/results/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useAssistantOverlay } from '@kbn/elastic-assistant'; import { useAssistantAvailability } from '../../../../../assistant/use_assistant_availability'; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/index.test.tsx index a476aead19036..a21ff89827d4c 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/index.test.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/index.test.tsx @@ -7,7 +7,7 @@ import { useLoadConnectors } from '@kbn/elastic-assistant'; import { useFetchAnonymizationFields } from '@kbn/elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields'; -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import React from 'react'; import { useKibana } from '../../../common/lib/kibana'; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/use_poll_api/use_poll_api.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/use_poll_api/use_poll_api.test.tsx index c243138d9ef5c..8d161657ae040 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/use_poll_api/use_poll_api.test.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/use_attack_discovery/use_poll_api/use_poll_api.test.tsx @@ -7,7 +7,7 @@ import type { HttpSetupMock } from '@kbn/core-http-browser-mocks'; import { coreMock } from '@kbn/core/public/mocks'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { attackDiscoveryStatus, usePollApi } from './use_poll_api'; import moment from 'moment/moment'; import { kibanaMock } from '../../../../common/mock'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_all_esql_rule_fields.test.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_all_esql_rule_fields.test.ts index 51d9c145a97b3..d857665878672 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_all_esql_rule_fields.test.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_all_esql_rule_fields.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import type { DataViewFieldBase } from '@kbn/es-query'; import { useQuery } from '@tanstack/react-query'; import { useAllEsqlRuleFields } from './use_all_esql_rule_fields'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_esql_index.test.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_esql_index.test.ts index eabd2050e7ba2..3d29970ad0547 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_esql_index.test.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/hooks/use_esql_index.test.ts @@ -4,7 +4,8 @@ * 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 { renderHook } from '@testing-library/react'; import { useEsqlIndex } from './use_esql_index'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/add_to_rules_table/use_add_to_rules_table.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/add_to_rules_table/use_add_to_rules_table.test.tsx index 8862c626ea6e4..55b10a34333aa 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/add_to_rules_table/use_add_to_rules_table.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/add_to_rules_table/use_add_to_rules_table.test.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { fireEvent, render as rTLRender, waitFor, act } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { fireEvent, render as rTLRender, waitFor, act, renderHook } from '@testing-library/react'; import type { EuiTableFieldDataColumnType } from '@elastic/eui'; import type { Rule } from '../../../../rule_management/logic/types'; import { getRulesSchemaMock } from '../../../../../../common/api/detection_engine/model/rule_schema/mocks'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/value_with_space_warning/__tests__/use_value_with_space_warning.test.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/value_with_space_warning/__tests__/use_value_with_space_warning.test.ts index 4c0df5f03e098..92a5e60bb5590 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/value_with_space_warning/__tests__/use_value_with_space_warning.test.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/value_with_space_warning/__tests__/use_value_with_space_warning.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useValueWithSpaceWarning } from '../use_value_with_space_warning'; describe('useValueWithSpaceWarning', () => { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_fetch_or_create_rule_exception_list.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_fetch_or_create_rule_exception_list.test.tsx index 6cca3e02e3223..8ec41f5cb70f7 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_fetch_or_create_rule_exception_list.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_fetch_or_create_rule_exception_list.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { act, renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { waitFor, renderHook } from '@testing-library/react'; import { coreMock } from '@kbn/core/public/mocks'; import * as rulesApi from '../../rule_management/api/api'; @@ -40,8 +40,8 @@ describe('useFetchOrCreateRuleExceptionList', () => { let render: ( listType?: UseFetchOrCreateRuleExceptionListProps['exceptionListType'] ) => RenderHookResult< - UseFetchOrCreateRuleExceptionListProps, - ReturnUseFetchOrCreateRuleExceptionList + ReturnUseFetchOrCreateRuleExceptionList, + UseFetchOrCreateRuleExceptionListProps >; const onError = jest.fn(); const onSuccess = jest.fn(); @@ -94,15 +94,14 @@ describe('useFetchOrCreateRuleExceptionList', () => { .mockResolvedValue(detectionExceptionList); render = (listType = detectionListType) => - renderHook<UseFetchOrCreateRuleExceptionListProps, ReturnUseFetchOrCreateRuleExceptionList>( - () => - useFetchOrCreateRuleExceptionList({ - http: mockKibanaHttpService, - ruleId, - exceptionListType: listType, - onError, - onSuccess, - }) + renderHook(() => + useFetchOrCreateRuleExceptionList({ + http: mockKibanaHttpService, + ruleId, + exceptionListType: listType, + onError, + onSuccess, + }) ); }); @@ -111,20 +110,17 @@ describe('useFetchOrCreateRuleExceptionList', () => { }); it('initializes hook', async () => { - const { result, waitForNextUpdate } = render(); + const { result } = render(); // Should set isLoading to true while fetching expect(result.current).toEqual([true, null]); - await waitForNextUpdate(); - expect(result.current).toEqual([false, detectionExceptionList]); + await waitFor(() => expect(result.current).toEqual([false, detectionExceptionList])); }); it('fetches the rule with the given ruleId', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); + render(); + await waitFor(() => { expect(fetchRuleById).toHaveBeenCalledTimes(1); expect(fetchRuleById).toHaveBeenCalledWith({ id: ruleId, @@ -141,78 +137,48 @@ describe('useFetchOrCreateRuleExceptionList', () => { }); it('does not fetch the exceptions lists', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(fetchExceptionListById).not.toHaveBeenCalled(); - }); + render(); + await waitFor(() => expect(fetchExceptionListById).not.toHaveBeenCalled()); }); + it('should create a new exception list', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(addExceptionList).toHaveBeenCalledTimes(1); - }); + render(); + await waitFor(() => expect(addExceptionList).toHaveBeenCalledTimes(1)); }); it('should update the rule', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(patchRule).toHaveBeenCalledTimes(1); - }); + render(); + await waitFor(() => expect(patchRule).toHaveBeenCalledTimes(1)); }); it('invokes onSuccess', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(onSuccess).toHaveBeenCalledWith(false); - }); + render(); + await waitFor(() => expect(onSuccess).toHaveBeenCalledWith(false)); }); }); describe("when the rule has exception list references and 'detection' is passed in", () => { it('fetches the exceptions lists', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(fetchExceptionListById).toHaveBeenCalledTimes(2); - }); + render(); + await waitFor(() => expect(fetchExceptionListById).toHaveBeenCalledTimes(2)); }); + it('does not create a new exception list', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(addExceptionList).not.toHaveBeenCalled(); - }); + render(); + await waitFor(() => expect(addExceptionList).not.toHaveBeenCalled()); }); + it('does not update the rule', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(patchRule).not.toHaveBeenCalled(); - }); + render(); + await waitFor(() => expect(patchRule).not.toHaveBeenCalled()); }); + it('should set the exception list to be the fetched list', async () => { - await act(async () => { - const { result, waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current[1]).toEqual(detectionExceptionList); - }); + const { result } = render(); + await waitFor(() => expect(result.current[1]).toEqual(detectionExceptionList)); }); + it('invokes onSuccess indicating', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(onSuccess).toHaveBeenCalledWith(false); - }); + render(); + await waitFor(() => expect(onSuccess).toHaveBeenCalledWith(false)); }); describe("but the rule does not have a reference to 'detection' type exception list", () => { @@ -223,30 +189,16 @@ describe('useFetchOrCreateRuleExceptionList', () => { }); it('should create a new exception list', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(addExceptionList).toHaveBeenCalledTimes(1); - }); + render(); + await waitFor(() => expect(addExceptionList).toHaveBeenCalledTimes(1)); }); it('should update the rule', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(patchRule).toHaveBeenCalledTimes(1); - }); + render(); + await waitFor(() => expect(patchRule).toHaveBeenCalledTimes(1)); }); it('should set the exception list to be the newly created list', async () => { - await act(async () => { - const { result, waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current[1]).toEqual(newDetectionExceptionList); - }); + const { result } = render(); + await waitFor(() => expect(result.current[1]).toEqual(newDetectionExceptionList)); }); }); }); @@ -263,34 +215,20 @@ describe('useFetchOrCreateRuleExceptionList', () => { }); it('fetches the exceptions lists', async () => { - await act(async () => { - const { waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(fetchExceptionListById).toHaveBeenCalledTimes(2); - }); + render(endpointListType); + await waitFor(() => expect(fetchExceptionListById).toHaveBeenCalledTimes(2)); }); it('does not create a new exception list', async () => { - await act(async () => { - const { waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - expect(addExceptionList).not.toHaveBeenCalled(); - }); + render(endpointListType); + await waitFor(() => expect(addExceptionList).not.toHaveBeenCalled()); }); it('does not update the rule', async () => { - await act(async () => { - const { waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - expect(patchRule).not.toHaveBeenCalled(); - }); + render(endpointListType); + await waitFor(() => expect(patchRule).not.toHaveBeenCalled()); }); it('should set the exception list to be the fetched list', async () => { - await act(async () => { - const { result, waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current[1]).toEqual(endpointExceptionList); - }); + const { result } = render(endpointListType); + await waitFor(() => expect(result.current[1]).toEqual(endpointExceptionList)); }); describe("but the rule does not have a reference to 'endpoint' type exception list", () => { @@ -301,30 +239,16 @@ describe('useFetchOrCreateRuleExceptionList', () => { }); it('should create a new exception list', async () => { - await act(async () => { - const { waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(addEndpointExceptionList).toHaveBeenCalledTimes(1); - }); + render(endpointListType); + await waitFor(() => expect(addEndpointExceptionList).toHaveBeenCalledTimes(1)); }); it('should update the rule', async () => { - await act(async () => { - const { waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(patchRule).toHaveBeenCalledTimes(1); - }); + render(endpointListType); + await waitFor(() => expect(patchRule).toHaveBeenCalledTimes(1)); }); it('should set the exception list to be the newly created list', async () => { - await act(async () => { - const { result, waitForNextUpdate } = render(endpointListType); - await waitForNextUpdate(); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current[1]).toEqual(newEndpointExceptionList); - }); + const { result } = render(endpointListType); + await waitFor(() => expect(result.current[1]).toEqual(newEndpointExceptionList)); }); }); }); @@ -335,37 +259,26 @@ describe('useFetchOrCreateRuleExceptionList', () => { }); it('exception list should be null', async () => { - await act(async () => { - const { result, waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(result.current[1]).toBeNull(); - }); + const { result } = render(); + await waitFor(() => expect(result.current[1]).toBeNull()); }); it('isLoading should be false', async () => { - await act(async () => { - const { result, waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(result.current[0]).toEqual(false); - }); + const { result } = render(); + await waitFor(() => expect(result.current[0]).toEqual(false)); }); it('should call error callback', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - await waitForNextUpdate(); + render(); + await waitFor(() => { expect(onError).toHaveBeenCalledTimes(1); expect(onError).toHaveBeenCalledWith(error, null, null); }); }); it('does not call onSuccess', async () => { - await act(async () => { - const { waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(onSuccess).not.toHaveBeenCalled(); - }); + render(); + await waitFor(() => expect(onSuccess).not.toHaveBeenCalled()); }); }); }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.test.tsx index 6c641ceb2ad9e..e67e479c38258 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.test.tsx @@ -7,7 +7,7 @@ import moment from 'moment'; -import { act } from '@testing-library/react-hooks'; +import { act } from '@testing-library/react'; import { useScheduleRuleRunMutation } from './use_schedule_rule_run_mutation'; import { renderMutation } from '../../../../management/hooks/test_utils'; import { scheduleRuleRunMock } from '../../logic/__mocks__/mock'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/logic/use_schedule_rule_run.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/logic/use_schedule_rule_run.test.tsx index ce70bc08bd722..d20d8e8e7642d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/logic/use_schedule_rule_run.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/logic/use_schedule_rule_run.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act, waitFor } from '@testing-library/react'; import moment from 'moment'; import { useKibana } from '../../../common/lib/kibana'; import { useKibana as mockUseKibana } from '../../../common/lib/kibana/__mocks__'; @@ -41,7 +41,7 @@ describe('When using the `useScheduleRuleRun()` hook', () => { }); it('should send schedule rule run request', async () => { - const { result, waitFor } = renderHook(() => useScheduleRuleRun(), { + const { result } = renderHook(() => useScheduleRuleRun(), { wrapper: TestProviders, }); @@ -50,20 +50,18 @@ describe('When using the `useScheduleRuleRun()` hook', () => { result.current.scheduleRuleRun({ ruleIds: ['rule-1'], timeRange }); }); - await waitFor(() => { - return mockUseScheduleRuleRunMutation.mock.calls.length > 0; - }); - - expect(mockUseScheduleRuleRunMutation).toHaveBeenCalledWith( - expect.objectContaining({ - ruleIds: ['rule-1'], - timeRange, - }) + await waitFor(() => + expect(mockUseScheduleRuleRunMutation).toHaveBeenCalledWith( + expect.objectContaining({ + ruleIds: ['rule-1'], + timeRange, + }) + ) ); }); it('should call reportEvent with success status on success', async () => { - const { result, waitFor } = renderHook(() => useScheduleRuleRun(), { + const { result } = renderHook(() => useScheduleRuleRun(), { wrapper: TestProviders, }); @@ -74,22 +72,20 @@ describe('When using the `useScheduleRuleRun()` hook', () => { result.current.scheduleRuleRun({ ruleIds: ['rule-1'], timeRange }); }); - await waitFor(() => { - return mockUseScheduleRuleRunMutation.mock.calls.length > 0; - }); - - expect(mockedUseKibana.services.telemetry.reportEvent).toHaveBeenCalledWith( - ManualRuleRunEventTypes.ManualRuleRunExecute, - { - rangeInMs: timeRange.endDate.diff(timeRange.startDate), - status: 'success', - rulesCount: 1, - } + await waitFor(() => + expect(mockedUseKibana.services.telemetry.reportEvent).toHaveBeenCalledWith( + ManualRuleRunEventTypes.ManualRuleRunExecute, + { + rangeInMs: timeRange.endDate.diff(timeRange.startDate), + status: 'success', + rulesCount: 1, + } + ) ); }); it('should call reportEvent with error status on failure', async () => { - const { result, waitFor } = renderHook(() => useScheduleRuleRun(), { + const { result } = renderHook(() => useScheduleRuleRun(), { wrapper: TestProviders, }); @@ -100,17 +96,15 @@ describe('When using the `useScheduleRuleRun()` hook', () => { result.current.scheduleRuleRun({ ruleIds: ['rule-1'], timeRange }); }); - await waitFor(() => { - return mockUseScheduleRuleRunMutation.mock.calls.length > 0; - }); - - expect(mockedUseKibana.services.telemetry.reportEvent).toHaveBeenCalledWith( - ManualRuleRunEventTypes.ManualRuleRunExecute, - { - rangeInMs: timeRange.endDate.diff(timeRange.startDate), - status: 'error', - rulesCount: 1, - } + await waitFor(() => + expect(mockedUseKibana.services.telemetry.reportEvent).toHaveBeenCalledWith( + ManualRuleRunEventTypes.ManualRuleRunExecute, + { + rangeInMs: timeRange.endDate.diff(timeRange.startDate), + status: 'error', + rulesCount: 1, + } + ) ); }); }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx index 7c7125a36dc5d..3425779926f7d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import type { FC, PropsWithChildren } from 'react'; +import type { FC, PropsWithChildren, ReactNode } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; import styled from 'styled-components'; import { css } from '@emotion/css'; @@ -107,6 +107,7 @@ export const TabContentPadding: FC<PropsWithChildren<unknown>> = ({ children }) interface RuleDetailsFlyoutProps { rule: RuleResponse; + subHeader?: ReactNode; ruleActions?: React.ReactNode; size?: EuiFlyoutProps['size']; extraTabs?: EuiTabbedContentTab[]; @@ -115,15 +116,16 @@ interface RuleDetailsFlyoutProps { closeFlyout: () => void; } -export const RuleDetailsFlyout = ({ +export function RuleDetailsFlyout({ rule, ruleActions, + subHeader, size = 'm', extraTabs = [], dataTestSubj, id, closeFlyout, -}: RuleDetailsFlyoutProps) => { +}: RuleDetailsFlyoutProps): JSX.Element { const { expandedOverviewSections, toggleOverviewSection } = useOverviewTabSections(); const overviewTab: EuiTabbedContentTab = useMemo( @@ -202,7 +204,13 @@ export const RuleDetailsFlyout = ({ <EuiTitle size="m"> <h2 id={prebuiltRulesFlyoutTitleId}>{rule.name}</h2> </EuiTitle> - <EuiSpacer size="l" /> + <EuiSpacer size="s" /> + {subHeader && ( + <> + {subHeader} + <EuiSpacer size="s" /> + </> + )} </EuiFlyoutHeader> <StyledEuiFlyoutBody> <ScrollableFlyoutTabbedContent @@ -223,4 +231,4 @@ export const RuleDetailsFlyout = ({ </EuiFlyoutFooter> </EuiFlyout> ); -}; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/action_required.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/action_required.tsx new file mode 100644 index 0000000000000..d21136531fd07 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/action_required.tsx @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiBadge } from '@elastic/eui'; +import * as i18n from './translations'; + +export function ActionRequiredBadge(): JSX.Element { + return <EuiBadge color="danger">{i18n.ACTION_REQUIRED}</EuiBadge>; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/modified_badge.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/modified_badge.tsx new file mode 100644 index 0000000000000..bfe70af031835 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/modified_badge.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 type { ReactNode } from 'react'; +import React from 'react'; +import { EuiBadge, EuiToolTip } from '@elastic/eui'; +import * as i18n from './translations'; + +interface ModifiedBadgeProps { + tooltip?: ReactNode; +} + +export function ModifiedBadge({ tooltip }: ModifiedBadgeProps): JSX.Element { + return ( + <EuiToolTip content={tooltip}> + <EuiBadge color="hollow" iconType="indexEdit" iconSide="left"> + {i18n.MODIFIED} + </EuiBadge> + </EuiToolTip> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/ready_for_upgrade_badge.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/ready_for_upgrade_badge.tsx new file mode 100644 index 0000000000000..c5498fe04dcfe --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/ready_for_upgrade_badge.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { EuiBadgeProps } from '@elastic/eui'; +import { EuiBadge } from '@elastic/eui'; +import * as i18n from './translations'; + +interface ReadyForUpgradeBadgeProps { + color?: EuiBadgeProps['color']; +} + +export function ReadyForUpgradeBadge({ + color = 'success', +}: ReadyForUpgradeBadgeProps): JSX.Element { + return <EuiBadge color={color}>{i18n.READY_FOR_UPDATE}</EuiBadge>; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/review_required_badge.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/review_required_badge.tsx new file mode 100644 index 0000000000000..db02ce9a3615e --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/review_required_badge.tsx @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiBadge } from '@elastic/eui'; +import * as i18n from './translations'; + +export function ReviewRequiredBadge(): JSX.Element { + return <EuiBadge color="warning">{i18n.REVIEW_REQUIRED}</EuiBadge>; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/translations.ts new file mode 100644 index 0000000000000..f55b9ad2eef73 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/badges/translations.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const READY_FOR_UPDATE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.badge.readyForUpdate', + { + defaultMessage: 'Ready for update', + } +); + +export const REVIEW_REQUIRED = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.badge.reviewRequired', + { + defaultMessage: 'Review required', + } +); + +export const ACTION_REQUIRED = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.badge.actionRequired', + { + defaultMessage: 'Action required', + } +); + +export const MODIFIED = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.badge.modified', + { + defaultMessage: 'Modified', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side.tsx deleted file mode 100644 index e5ec6a8dfc540..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side.tsx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useState } from 'react'; -import { EuiFlexGroup, EuiTitle } from '@elastic/eui'; -import { VersionsPicker } from '../versions_picker/versions_picker'; -import type { Version } from '../versions_picker/constants'; -import { SelectedVersions } from '../versions_picker/constants'; -import { pickFieldValueForVersion } from './utils'; -import type { - DiffableAllFields, - ThreeWayDiff, -} from '../../../../../../../common/api/detection_engine'; -import { getSubfieldChanges } from './get_subfield_changes'; -import { SubfieldChanges } from './subfield_changes'; -import { SideHeader } from '../components/side_header'; -import { ComparisonSideHelpInfo } from './comparison_side_help_info'; -import * as i18n from './translations'; - -interface ComparisonSideProps<FieldName extends keyof DiffableAllFields> { - fieldName: FieldName; - fieldThreeWayDiff: ThreeWayDiff<DiffableAllFields[FieldName]>; - resolvedValue: DiffableAllFields[FieldName]; -} - -export function ComparisonSide<FieldName extends keyof DiffableAllFields>({ - fieldName, - fieldThreeWayDiff, - resolvedValue, -}: ComparisonSideProps<FieldName>) { - const [selectedVersions, setSelectedVersions] = useState<SelectedVersions>( - SelectedVersions.CurrentFinal - ); - - const [oldVersionType, newVersionType] = selectedVersions.split('_') as [Version, Version]; - - const oldFieldValue = pickFieldValueForVersion(oldVersionType, fieldThreeWayDiff, resolvedValue); - - const newFieldValue = pickFieldValueForVersion(newVersionType, fieldThreeWayDiff, resolvedValue); - - const subfieldChanges = getSubfieldChanges(fieldName, oldFieldValue, newFieldValue); - - return ( - <> - <SideHeader> - <EuiFlexGroup direction="row" alignItems="center"> - <EuiTitle size="xxs"> - <h3> - {i18n.TITLE} - <ComparisonSideHelpInfo /> - </h3> - </EuiTitle> - <VersionsPicker - hasBaseVersion={fieldThreeWayDiff.has_base_version} - selectedVersions={selectedVersions} - onChange={setSelectedVersions} - /> - </EuiFlexGroup> - </SideHeader> - <SubfieldChanges fieldName={fieldName} subfieldChanges={subfieldChanges} /> - </> - ); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx index e1eaa9b1e96cd..47e5e537f3ab0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx @@ -9,6 +9,14 @@ import React from 'react'; import useToggle from 'react-use/lib/useToggle'; import { EuiPopover, EuiText, EuiButtonIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { TITLE } from './translations'; +import { + BASE_VERSION, + CURRENT_VERSION, + FINAL_VERSION, + TARGET_VERSION, +} from './versions_picker/translations'; /** * Theme doesn't expose width variables. Using provided size variables will require @@ -34,10 +42,64 @@ export function ComparisonSideHelpInfo(): JSX.Element { <EuiPopover button={button} isOpen={isPopoverOpen} closePopover={togglePopover}> <EuiText style={{ width: POPOVER_WIDTH }} size="s"> <FormattedMessage - id="xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeHelpText" - defaultMessage="Choose field values used in the upgraded rule. " + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.comparisonSide.upgradeHelpText" + defaultMessage="{title} shows field's JSON diff between prebuilt rule field versions affecting the rule update process. {versions}" + values={{ + title: <strong>{TITLE}</strong>, + versions: ( + <> + <br /> + <ul> + <li> + <strong>{BASE_VERSION}</strong> {'-'} {BASE_VERSION_EXPLANATION} + </li> + <li> + <strong>{CURRENT_VERSION}</strong> {'-'} {CURRENT_VERSION_EXPLANATION} + </li> + <li> + <strong>{TARGET_VERSION}</strong> {'-'} {TARGET_VERSION_EXPLANATION} + </li> + <li> + <strong>{FINAL_VERSION}</strong> {'-'} {FINAL_VERSION_EXPLANATION} + </li> + </ul> + </> + ), + }} /> </EuiText> </EuiPopover> ); } + +const BASE_VERSION_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.baseVersionExplanation', + { + defaultMessage: 'version originally installed from Elastic prebuilt rules package', + } +); + +const CURRENT_VERSION_EXPLANATION = ( + <FormattedMessage + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionExplanation" + defaultMessage="current version including modification made after prebuilt rule installation. With lack of modifications it matches with {base}." + values={{ + base: <strong>{BASE_VERSION}</strong>, + }} + /> +); + +const TARGET_VERSION_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.targetVersionExplanation', + { + defaultMessage: 'version coming from a new version of Elastic prebuilt rules package', + } +); + +const FINAL_VERSION_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.finalVersionExplanation', + { + defaultMessage: + 'version used to the update the rule. Initial value is suggested by the diff algorithm.', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.stories.tsx similarity index 98% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side.stories.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.stories.tsx index 37ddb71dce9f7..004b7ff25670b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { ComparisonSide } from './comparison_side'; +import { FieldComparisonSide } from './field_comparison_side'; import type { ThreeWayDiff, DiffableAllFields, @@ -20,7 +20,7 @@ import { KqlQueryType, } from '../../../../../../../common/api/detection_engine'; export default { - component: ComparisonSide, + component: FieldComparisonSide, title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/ComparisonSide', argTypes: { fieldName: { @@ -44,14 +44,8 @@ interface TemplateProps<FieldName extends keyof DiffableAllFields> { resolvedValue?: DiffableAllFields[FieldName]; } -const Template: Story<TemplateProps<keyof DiffableAllFields>> = (args) => { - return ( - <ComparisonSide - fieldName={args.fieldName} - fieldThreeWayDiff={args.fieldThreeWayDiff} - resolvedValue={args.resolvedValue} - /> - ); +const Template: Story<TemplateProps<keyof DiffableAllFields>> = () => { + return <FieldComparisonSide />; }; export const NoBaseVersion = Template.bind({}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx new file mode 100644 index 0000000000000..0b9b37c91e226 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { VersionsPicker } from './versions_picker/versions_picker'; +import type { Version } from './versions_picker/constants'; +import { SelectedVersions } from './versions_picker/constants'; +import { FieldUpgradeSideHeader } from '../field_upgrade_side_header'; +import { useFieldUpgradeContext } from '../rule_upgrade/field_upgrade_context'; +import { pickFieldValueForVersion } from './utils'; +import { getSubfieldChanges } from './get_subfield_changes'; +import { SubfieldChanges } from './subfield_changes'; +import { ComparisonSideHelpInfo } from './comparison_side_help_info'; +import * as i18n from './translations'; + +export function FieldComparisonSide(): JSX.Element { + const { fieldName, fieldDiff, finalDiffableRule } = useFieldUpgradeContext(); + const resolvedValue = finalDiffableRule[fieldName]; + + const [selectedVersions, setSelectedVersions] = useState<SelectedVersions>( + SelectedVersions.CurrentFinal + ); + + const [oldVersionType, newVersionType] = selectedVersions.split('_') as [Version, Version]; + + const oldFieldValue = pickFieldValueForVersion(oldVersionType, fieldDiff, resolvedValue); + + const newFieldValue = pickFieldValueForVersion(newVersionType, fieldDiff, resolvedValue); + + const subfieldChanges = getSubfieldChanges(fieldName, oldFieldValue, newFieldValue); + + return ( + <> + <FieldUpgradeSideHeader> + <EuiFlexGroup alignItems="center"> + <EuiFlexItem> + <EuiTitle size="xxs"> + <h3> + {i18n.TITLE} + <ComparisonSideHelpInfo /> + </h3> + </EuiTitle> + </EuiFlexItem> + <EuiFlexItem> + <VersionsPicker + hasBaseVersion={fieldDiff.has_base_version} + selectedVersions={selectedVersions} + onChange={setSelectedVersions} + /> + </EuiFlexItem> + </EuiFlexGroup> + </FieldUpgradeSideHeader> + <SubfieldChanges fieldName={fieldName} subfieldChanges={subfieldChanges} /> + </> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/index.ts index c3628d74176c3..0ac093b895a73 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/index.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/index.ts @@ -28,10 +28,10 @@ import type { SubfieldChanges } from '../types'; * @param newFieldValue - The new value of the field. * @returns - An array of subfield changes. */ -export const getSubfieldChanges = <FieldName extends keyof DiffableAllFields>( - fieldName: FieldName, - oldFieldValue?: DiffableAllFields[FieldName], - newFieldValue?: DiffableAllFields[FieldName] +export const getSubfieldChanges = ( + fieldName: keyof DiffableAllFields, + oldFieldValue: unknown, + newFieldValue: unknown ): SubfieldChanges => { switch (fieldName) { /* diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/subfield_changes.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/subfield_changes.tsx index af10edbe1c599..a5d44438f161c 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/subfield_changes.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/subfield_changes.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { Fragment } from 'react'; import { EuiHorizontalRule } from '@elastic/eui'; import type { SubfieldChanges } from './types'; import { Subfield } from './subfield'; @@ -28,16 +28,15 @@ export function SubfieldChanges({ fieldName, subfieldChanges }: SubfieldChangesP const shouldShowSeparator = index !== subfieldChanges.length - 1; return ( - <> + <Fragment key={`${fieldName}${change.subfieldName}`}> <Subfield - key={change.subfieldName} fieldName={fieldName} subfieldName={change.subfieldName} oldSubfieldValue={change.oldSubfieldValue} newSubfieldValue={change.newSubfieldValue} /> {shouldShowSeparator ? <EuiHorizontalRule margin="s" size="full" /> : null} - </> + </Fragment> ); })} </> diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/utils.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/utils.ts index d0673c460a1d5..8f97d3462d358 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/utils.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/utils.ts @@ -6,11 +6,8 @@ */ import stringify from 'json-stable-stringify'; -import { Version } from '../versions_picker/constants'; -import type { - DiffableAllFields, - ThreeWayDiff, -} from '../../../../../../../common/api/detection_engine'; +import { Version } from './versions_picker/constants'; +import type { ThreeWayDiff } from '../../../../../../../common/api/detection_engine'; /** * Picks the field value for a given version either from a three-way diff object or from a user-set resolved value. @@ -20,11 +17,11 @@ import type { * @param resolvedValue - A value field will be upgraded to. * @returns - The field value for the specified version */ -export function pickFieldValueForVersion<FieldName extends keyof DiffableAllFields>( +export function pickFieldValueForVersion( version: Version, - fieldThreeWayDiff: ThreeWayDiff<DiffableAllFields[FieldName]>, - resolvedValue: DiffableAllFields[FieldName] -): DiffableAllFields[FieldName] | undefined { + fieldThreeWayDiff: ThreeWayDiff<unknown>, + resolvedValue: unknown +): unknown { if (version === Version.Final) { return resolvedValue; } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/constants.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts similarity index 70% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/constants.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts index 73a7e89a200a3..04d38ed10dce2 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/constants.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts @@ -27,32 +27,32 @@ export enum SelectedVersions { export const CURRENT_OPTIONS: EuiSelectOption[] = [ { value: SelectedVersions.CurrentFinal, - text: i18n.CURRENT_VS_FINAL, + text: i18n.VERSION1_VS_VERSION2(i18n.CURRENT_VERSION, i18n.FINAL_VERSION), }, { value: SelectedVersions.CurrentTarget, - text: i18n.CURRENT_VS_TARGET, + text: i18n.VERSION1_VS_VERSION2(i18n.CURRENT_VERSION, i18n.TARGET_VERSION), }, ]; export const TARGET_OPTIONS: EuiSelectOption[] = [ { value: SelectedVersions.TargetFinal, - text: i18n.TARGET_VS_FINAL, + text: i18n.VERSION1_VS_VERSION2(i18n.TARGET_VERSION, i18n.FINAL_VERSION), }, ]; export const BASE_OPTIONS: EuiSelectOption[] = [ { value: SelectedVersions.BaseFinal, - text: i18n.BASE_VS_FINAL, + text: i18n.VERSION1_VS_VERSION2(i18n.BASE_VERSION, i18n.FINAL_VERSION), }, { value: SelectedVersions.BaseTarget, - text: i18n.BASE_VS_TARGET, + text: i18n.VERSION1_VS_VERSION2(i18n.BASE_VERSION, i18n.TARGET_VERSION), }, { value: SelectedVersions.BaseCurrent, - text: i18n.BASE_VS_CURRENT, + text: i18n.VERSION1_VS_VERSION2(i18n.BASE_VERSION, i18n.CURRENT_VERSION), }, ]; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/translations.ts new file mode 100644 index 0000000000000..0f63b8be2aa92 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/translations.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 BASE_VERSION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.baseVersionLabel', + { + defaultMessage: 'Original', + } +); + +export const CURRENT_VERSION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.currentVersionLabel', + { + defaultMessage: 'Current', + } +); + +export const TARGET_VERSION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.targetVersionLabel', + { + defaultMessage: 'Elastic update', + } +); + +export const FINAL_VERSION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.finalVersionLabel', + { + defaultMessage: 'Final', + } +); + +export const VERSION1_VS_VERSION2 = (version1: string, version2: string): string => { + return i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.version1VsVersion2', + { + defaultMessage: '{version1} vs {version2}', + values: { + version1, + version2, + }, + } + ); +}; + +export const VERSION_PICKER_ARIA_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.ariaLabel', + { + defaultMessage: 'Select versions to compare', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/versions_picker.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.stories.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/versions_picker.stories.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.stories.tsx diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/versions_picker.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/versions_picker.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx index 572e281ff3ae4..4710667e0b315 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/versions_picker.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx @@ -6,6 +6,7 @@ */ import React, { useCallback, useMemo } from 'react'; +import { css } from '@emotion/css'; import { EuiSelect } from '@elastic/eui'; import type { EuiSelectOption } from '@elastic/eui'; import { BASE_OPTIONS, CURRENT_OPTIONS, TARGET_OPTIONS, SelectedVersions } from './constants'; @@ -36,6 +37,7 @@ export function VersionsPicker({ return ( <EuiSelect + className={VERSIONS_PICKER_STYLES} options={options} value={selectedVersions} onChange={handleChange} @@ -43,3 +45,9 @@ export function VersionsPicker({ /> ); } + +const VERSIONS_PICKER_STYLES = css` + // Set min-width a bit wider than default + // to make English text in narrow screens readable + min-width: 220px; +`; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_conflicts_resolver.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_conflicts_resolver.tsx deleted file mode 100644 index 6a2ad17f45f26..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_conflicts_resolver.tsx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiSpacer, useEuiTheme } from '@elastic/eui'; -import { css } from '@emotion/css'; -import { SplitAccordion } from '../../../../../../common/components/split_accordion'; -import type { - DiffableAllFields, - RuleFieldsDiff, - ThreeWayDiff, -} from '../../../../../../../common/api/detection_engine'; -import { ThreeWayDiffConflict } from '../../../../../../../common/api/detection_engine'; -import type { FieldUpgradeState } from '../../../../model/prebuilt_rule_upgrade'; -import { ComparisonSide } from '../comparison_side/comparison_side'; -import { FinalSide } from '../final_side/final_side'; -import { FieldUpgradeConflictsResolverHeader } from './field_upgrade_conflicts_resolver_header'; -import { useDiffableRuleContext } from '../diffable_rule_context'; -import type { UpgradeableDiffableFields } from '../../../../model/prebuilt_rule_upgrade/fields'; - -interface FieldUpgradeConflictsResolverProps<FieldName extends UpgradeableDiffableFields> { - fieldName: FieldName; - fieldUpgradeState: FieldUpgradeState; - fieldThreeWayDiff: RuleFieldsDiff[FieldName]; -} - -export function FieldUpgradeConflictsResolver<FieldName extends UpgradeableDiffableFields>({ - fieldName, - fieldUpgradeState, - fieldThreeWayDiff, -}: FieldUpgradeConflictsResolverProps<FieldName>): JSX.Element { - const { euiTheme } = useEuiTheme(); - const hasConflict = fieldThreeWayDiff.conflict !== ThreeWayDiffConflict.NONE; - - const { finalDiffableRule } = useDiffableRuleContext(); - - return ( - <> - <SplitAccordion - header={ - <FieldUpgradeConflictsResolverHeader - fieldName={fieldName} - fieldUpgradeState={fieldUpgradeState} - /> - } - initialIsOpen={hasConflict} - data-test-subj="ruleUpgradePerFieldDiff" - > - <EuiFlexGroup gutterSize="s" alignItems="flexStart"> - <EuiFlexItem grow={1}> - <ComparisonSide - fieldName={fieldName} - fieldThreeWayDiff={fieldThreeWayDiff as ThreeWayDiff<DiffableAllFields[FieldName]>} - resolvedValue={finalDiffableRule[fieldName] as DiffableAllFields[FieldName]} - /> - </EuiFlexItem> - <EuiFlexItem - grow={0} - css={css` - align-self: stretch; - border-right: ${euiTheme.border.thin}; - `} - /> - <EuiFlexItem grow={1}> - <FinalSide fieldName={fieldName} /> - </EuiFlexItem> - </EuiFlexGroup> - </SplitAccordion> - <EuiSpacer size="s" /> - </> - ); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/field_upgrade_state_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/field_upgrade_state_info.tsx deleted file mode 100644 index c49fc18e2c6ba..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/field_upgrade_state_info.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiIcon, EuiText } from '@elastic/eui'; -import { FieldUpgradeState } from '../../../../../model/prebuilt_rule_upgrade'; -import * as i18n from './translations'; - -interface FieldUpgradeStateInfoProps { - state: FieldUpgradeState; -} - -export function FieldUpgradeStateInfo({ state }: FieldUpgradeStateInfoProps): JSX.Element { - switch (state) { - case FieldUpgradeState.Accepted: - return ( - <> - <EuiText color="success" size="xs"> - <EuiIcon type="checkInCircleFilled" /> -  <strong>{i18n.UPDATE_ACCEPTED}</strong> - {i18n.SEPARATOR} - {i18n.UPDATE_ACCEPTED_DESCRIPTION} - </EuiText> - </> - ); - - case FieldUpgradeState.SolvableConflict: - return ( - <> - <EuiText color="warning" size="xs"> - <EuiIcon type="warning" /> -  <strong>{i18n.SOLVABLE_CONFLICT}</strong> - {i18n.SEPARATOR} - {i18n.SOLVABLE_CONFLICT_DESCRIPTION} - </EuiText> - </> - ); - - case FieldUpgradeState.NonSolvableConflict: - return ( - <> - <EuiText color="danger" size="xs"> - <EuiIcon type="warning" /> -  <strong>{i18n.NON_SOLVABLE_CONFLICT}</strong> - {i18n.SEPARATOR} - {i18n.NON_SOLVABLE_CONFLICT_DESCRIPTION} - </EuiText> - </> - ); - } -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/rule_upgrade_callout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/rule_upgrade_callout.tsx deleted file mode 100644 index 8ab2674524952..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/rule_upgrade_callout.tsx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { EuiCallOut } from '@elastic/eui'; -import type { RuleUpgradeState } from '../../../../../model/prebuilt_rule_upgrade'; -import { FieldUpgradeState } from '../../../../../model/prebuilt_rule_upgrade'; -import * as i18n from './translations'; - -interface RuleUpgradeCalloutProps { - ruleUpgradeState: RuleUpgradeState; -} - -export function RuleUpgradeCallout({ ruleUpgradeState }: RuleUpgradeCalloutProps): JSX.Element { - const fieldsUpgradeState = ruleUpgradeState.fieldsUpgradeState; - const { numOfNonSolvableConflicts, numOfSolvableConflicts } = useMemo(() => { - let numOfFieldsWithNonSolvableConflicts = 0; - let numOfFieldsWithSolvableConflicts = 0; - - for (const fieldName of Object.keys(fieldsUpgradeState)) { - if (fieldsUpgradeState[fieldName] === FieldUpgradeState.NonSolvableConflict) { - numOfFieldsWithNonSolvableConflicts++; - } - - if (fieldsUpgradeState[fieldName] === FieldUpgradeState.SolvableConflict) { - numOfFieldsWithSolvableConflicts++; - } - } - - return { - numOfNonSolvableConflicts: numOfFieldsWithNonSolvableConflicts, - numOfSolvableConflicts: numOfFieldsWithSolvableConflicts, - }; - }, [fieldsUpgradeState]); - - if (numOfNonSolvableConflicts > 0) { - return ( - <EuiCallOut - title={i18n.RULE_HAS_NON_SOLVABLE_CONFLICTS(numOfNonSolvableConflicts)} - iconType="warning" - color="danger" - size="s" - > - <p>{i18n.RULE_HAS_NON_SOLVABLE_CONFLICTS_DESCRIPTION}</p> - </EuiCallOut> - ); - } - - if (numOfSolvableConflicts > 0) { - return ( - <EuiCallOut - title={i18n.RULE_HAS_SOLVABLE_CONFLICTS(numOfSolvableConflicts)} - iconType="warning" - color="warning" - size="s" - > - <p>{i18n.RULE_HAS_SOLVABLE_CONFLICTS_DESCRIPTION}</p> - </EuiCallOut> - ); - } - - return ( - <EuiCallOut - title={i18n.RULE_IS_READY_FOR_UPGRADE} - iconType="checkInCircleFilled" - color="success" - size="s" - > - <p>{i18n.RULE_IS_READY_FOR_UPGRADE_DESCRIPTION}</p> - </EuiCallOut> - ); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/translations.tsx deleted file mode 100644 index 319884746dbc2..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/translations.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const RULE_HAS_NON_SOLVABLE_CONFLICTS = (count: number) => - i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflicts', - { - values: { count }, - defaultMessage: - '{count} of the fields {count, plural, one {has} other {have}} an unsolved conflict. Please review and modify accordingly.', - } - ); - -export const RULE_HAS_NON_SOLVABLE_CONFLICTS_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasNonSolvableConflictsDescription', - { - defaultMessage: - 'Please provide an input for the unsolved conflict. You can also keep the current without the updates, or accept the Elastic update but lose your modifications.', - } -); - -export const RULE_HAS_SOLVABLE_CONFLICTS = (count: number) => - i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflicts', - { - values: { count }, - defaultMessage: - '{count} of the fields {count, plural, one {has} other {have}} an update conflict, please review the suggested update being updating.', - } - ); - -export const RULE_HAS_SOLVABLE_CONFLICTS_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSolvableConflictsDescription', - { - defaultMessage: - 'Please review the suggested updated version before accepting the update. You can edit and then save the field if you wish to change it.', - } -); - -export const RULE_IS_READY_FOR_UPGRADE = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgrade', - { - defaultMessage: 'The update is ready to be applied.', - } -); - -export const RULE_IS_READY_FOR_UPGRADE_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgradeDescription', - { - defaultMessage: 'All conflicts have now been reviewed and solved please update the rule.', - } -); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_conflicts_resolver.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_conflicts_resolver.tsx deleted file mode 100644 index 3379cf2ab3e96..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_conflicts_resolver.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import type { RuleUpgradeState } from '../../../../model/prebuilt_rule_upgrade'; -import { FieldUpgradeConflictsResolver } from './field_upgrade_conflicts_resolver'; -import type { NonUpgradeableDiffableFields } from '../../../../model/prebuilt_rule_upgrade/fields'; -import { isNonUpgradeableFieldName } from '../../../../model/prebuilt_rule_upgrade/fields'; - -type FieldDiffEntries<FieldsDiff, ExcludedFields extends keyof FieldsDiff = never> = Array< - [ - Exclude<keyof FieldsDiff, ExcludedFields>, - Required<FieldsDiff>[Exclude<keyof FieldsDiff, ExcludedFields>] - ] ->; - -interface RuleUpgradeConflictsResolverProps { - ruleUpgradeState: RuleUpgradeState; -} - -export function RuleUpgradeConflictsResolver({ - ruleUpgradeState, -}: RuleUpgradeConflictsResolverProps): React.ReactNode { - const fieldDiffEntries = Object.entries(ruleUpgradeState.diff.fields) as FieldDiffEntries< - typeof ruleUpgradeState.diff.fields - >; - - const fields = fieldDiffEntries.filter(([fieldName]) => { - return isNonUpgradeableFieldName(fieldName) === false; - }) as FieldDiffEntries<typeof ruleUpgradeState.diff.fields, NonUpgradeableDiffableFields>; - - return fields.map(([fieldName, fieldDiff]) => ( - <FieldUpgradeConflictsResolver - key={fieldName} - fieldName={fieldName} - fieldUpgradeState={ruleUpgradeState.fieldsUpgradeState[fieldName]} - fieldThreeWayDiff={fieldDiff} - /> - )); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/translations.tsx deleted file mode 100644 index 27172cb98755c..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/translations.tsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiLink } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { useKibana } from '../../../../../../common/lib/kibana/kibana_react'; - -export const NUM_OF_FIELDS_WITH_UPDATES = (count: number) => ( - <FormattedMessage - id="xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.fieldsWithUpdates" - defaultMessage="Upgrade has {count} {count, plural, one {field} other {fields}}" - values={{ count: <strong>{count}</strong> }} - /> -); - -export const NUM_OF_CONFLICTS = (count: number) => ( - <FormattedMessage - id="xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.numOfConflicts" - defaultMessage="{count} {count, plural, one {conflict} other {conflicts}}" - values={{ count: <strong>{count}</strong> }} - /> -); - -const UPGRADE_RULES_DOCS_LINK = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.updateYourRulesDocsLink', - { - defaultMessage: 'update your rules', - } -); - -export function RuleUpgradeHelper(): JSX.Element { - const { - docLinks: { - links: { - securitySolution: { manageDetectionRules }, - }, - }, - } = useKibana().services; - const manageDetectionRulesSnoozeSection = `${manageDetectionRules}#edit-rules-settings`; - - return ( - <FormattedMessage - id="xpack.securitySolution.detectionEngine.rules.upgradeRules.ruleUpgradeHelper" - defaultMessage="Understand how to {docsLink}." - values={{ - docsLink: ( - <EuiLink href={manageDetectionRulesSnoozeSection} target="_blank"> - {UPGRADE_RULES_DOCS_LINK} - </EuiLink> - ), - }} - /> - ); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/diffable_rule_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/diffable_rule_context.tsx deleted file mode 100644 index 4210b394c7618..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/diffable_rule_context.tsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { createContext, useContext } from 'react'; -import type { DiffableRule } from '../../../../../../common/api/detection_engine'; -import { invariant } from '../../../../../../common/utils/invariant'; -import type { SetRuleFieldResolvedValueFn } from '../../../model/prebuilt_rule_upgrade/set_rule_field_resolved_value'; - -interface DiffableRuleContextType { - finalDiffableRule: DiffableRule; - setRuleFieldResolvedValue: SetRuleFieldResolvedValueFn; -} - -const DiffableRuleContext = createContext<DiffableRuleContextType | null>(null); - -interface DiffableRuleContextProviderProps { - finalDiffableRule: DiffableRule; - setRuleFieldResolvedValue: SetRuleFieldResolvedValueFn; - children: React.ReactNode; -} - -export function DiffableRuleContextProvider({ - finalDiffableRule, - setRuleFieldResolvedValue, - children, -}: DiffableRuleContextProviderProps) { - const contextValue = { - finalDiffableRule, - setRuleFieldResolvedValue, - }; - - return ( - <DiffableRuleContext.Provider value={contextValue}>{children}</DiffableRuleContext.Provider> - ); -} - -export function useDiffableRuleContext() { - const context = useContext(DiffableRuleContext); - - invariant( - context !== null, - 'useDiffableRuleContext must be used inside a DiffableRuleContextProvider' - ); - - return context; -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side.tsx new file mode 100644 index 0000000000000..8a6c312d74db0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FieldEditFormContextProvider } from '../context/field_edit_form_context'; +import { FieldFinalSideContent } from './field_final_side_content'; +import { FieldFinalSideHeader } from './field_final_side_header'; + +export function FieldFinalSide(): JSX.Element { + return ( + <FieldEditFormContextProvider> + <FieldFinalSideHeader /> + <FieldFinalSideContent /> + </FieldEditFormContextProvider> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_content.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_content.tsx new file mode 100644 index 0000000000000..66fcee8547d7f --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_content.tsx @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiButtonEmpty, EuiFlexGroup } from '@elastic/eui'; +import { FieldFinalReadOnly } from '../../final_readonly'; +import { FieldFinalEdit } from '../../final_edit'; +import { assertUnreachable } from '../../../../../../../../common/utility_types'; +import { + FieldFinalSideMode, + useFieldUpgradeContext, +} from '../../rule_upgrade/field_upgrade_context'; +import * as i18n from './translations'; + +export function FieldFinalSideContent(): JSX.Element { + const { rightSideMode, setEditMode, setReadOnlyMode } = useFieldUpgradeContext(); + + switch (rightSideMode) { + case FieldFinalSideMode.Readonly: + return ( + <> + <EuiFlexGroup justifyContent="flexEnd"> + <EuiButtonEmpty iconType="pencil" onClick={setEditMode}> + {i18n.EDIT} + </EuiButtonEmpty> + </EuiFlexGroup> + <FieldFinalReadOnly /> + </> + ); + case FieldFinalSideMode.Edit: + return ( + <> + <EuiFlexGroup justifyContent="flexEnd"> + <EuiButtonEmpty iconType="cross" onClick={setReadOnlyMode}> + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexGroup> + <FieldFinalEdit /> + </> + ); + default: + return assertUnreachable(rightSideMode); + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_header.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_header.tsx new file mode 100644 index 0000000000000..0e70689b7c9db --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_header.tsx @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PropsWithChildren } from 'react'; +import React, { useCallback } from 'react'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import type { DiffableAllFields } from '../../../../../../../../common/api/detection_engine'; +import { FieldUpgradeSideHeader } from '../../field_upgrade_side_header'; +import { assertUnreachable } from '../../../../../../../../common/utility_types'; +import { + FieldFinalSideMode, + useFieldUpgradeContext, +} from '../../rule_upgrade/field_upgrade_context'; +import { useFieldEditFormContext } from '../context/field_edit_form_context'; +import { FieldFinalSideHelpInfo } from './field_final_side_help_info'; +import * as i18n from './translations'; + +export function FieldFinalSideHeader(): JSX.Element { + const { fieldName, hasConflict, rightSideMode, finalDiffableRule, setRuleFieldResolvedValue } = + useFieldUpgradeContext(); + const { form } = useFieldEditFormContext(); + + const handleAccept = useCallback( + () => + setRuleFieldResolvedValue({ + ruleId: finalDiffableRule.rule_id, + fieldName: fieldName as keyof DiffableAllFields, + resolvedValue: finalDiffableRule[fieldName] as DiffableAllFields[typeof fieldName], + }), + [finalDiffableRule, fieldName, setRuleFieldResolvedValue] + ); + const handleSave = useCallback(() => form?.submit(), [form]); + + switch (rightSideMode) { + case FieldFinalSideMode.Readonly: + return ( + <FieldUpgradeSideHeader> + <StaticHeaderContent> + {hasConflict && ( + <EuiButton iconType="checkInCircleFilled" size="s" onClick={handleAccept}> + {i18n.ACCEPT} + </EuiButton> + )} + </StaticHeaderContent> + </FieldUpgradeSideHeader> + ); + case FieldFinalSideMode.Edit: + return ( + <FieldUpgradeSideHeader> + <StaticHeaderContent> + <EuiButton + iconType="checkInCircleFilled" + size="s" + disabled={!form?.isValid} + onClick={handleSave} + > + {hasConflict ? i18n.SAVE_AND_ACCEPT : i18n.SAVE} + </EuiButton> + </StaticHeaderContent> + </FieldUpgradeSideHeader> + ); + default: + return assertUnreachable(rightSideMode); + } +} + +function StaticHeaderContent({ children }: PropsWithChildren<{}>): JSX.Element { + return ( + <EuiFlexGroup alignItems="stretch" justifyContent="center"> + <EuiFlexItem> + <EuiFlexGroup alignItems="center"> + <EuiTitle size="xxs"> + <h3> + {i18n.FINAL_UPDATE} + <FieldFinalSideHelpInfo /> + </h3> + </EuiTitle> + </EuiFlexGroup> + </EuiFlexItem> + <EuiFlexItem grow={false}>{children}</EuiFlexItem> + </EuiFlexGroup> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side_help_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx similarity index 93% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side_help_info.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx index 51e0c5097b97d..e3e0b38da7d63 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side_help_info.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx @@ -19,7 +19,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; */ const POPOVER_WIDTH = 320; -export function FinalSideHelpInfo(): JSX.Element { +export function FieldFinalSideHelpInfo(): JSX.Element { const [isPopoverOpen, togglePopover] = useToggle(false); const button = ( @@ -34,7 +34,7 @@ export function FinalSideHelpInfo(): JSX.Element { <EuiPopover button={button} isOpen={isPopoverOpen} closePopover={togglePopover}> <EuiText style={{ width: POPOVER_WIDTH }} size="s"> <FormattedMessage - id="xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeHelpText" + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.finalSide.upgradeHelpText" defaultMessage="Choose field values used in the upgraded rule. " /> </EuiText> diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_component_props.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/rule_field_edit_component_props.ts similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_component_props.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/rule_field_edit_component_props.ts diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_form_wrapper.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/rule_field_edit_form_wrapper.tsx similarity index 81% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_form_wrapper.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/rule_field_edit_form_wrapper.tsx index a5f7eedc6114c..ab12f62cfa27b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_form_wrapper.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/rule_field_edit_form_wrapper.tsx @@ -6,7 +6,6 @@ */ import React, { useCallback, useEffect } from 'react'; -import { EuiButtonEmpty, EuiFlexGroup } from '@elastic/eui'; import { extractValidationMessages } from '../../../../../../rule_creation/logic/extract_validation_messages'; import type { FormWithWarningsSubmitHandler } from '../../../../../../../common/hooks/use_form_with_warnings'; import { useFormWithWarnings } from '../../../../../../../common/hooks/use_form_with_warnings'; @@ -16,9 +15,8 @@ import type { DiffableAllFields, DiffableRule, } from '../../../../../../../../common/api/detection_engine'; -import { useFinalSideContext } from '../../final_side/final_side_context'; -import { useDiffableRuleContext } from '../../diffable_rule_context'; -import * as i18n from '../../translations'; +import { useFieldUpgradeContext } from '../../rule_upgrade/field_upgrade_context'; +import { useFieldEditFormContext } from '../context/field_edit_form_context'; import type { RuleFieldEditComponentProps } from './rule_field_edit_component_props'; import { useConfirmValidationErrorsModal } from '../../../../../../../common/hooks/use_confirm_validation_errors_modal'; import { @@ -55,8 +53,9 @@ export function RuleFieldEditFormWrapper({ deserializer, serializer, }: RuleFieldEditFormWrapperProps) { - const { fieldName, setReadOnlyMode } = useFinalSideContext(); - const { finalDiffableRule, setRuleFieldResolvedValue } = useDiffableRuleContext(); + const { registerForm } = useFieldEditFormContext(); + const { fieldName, finalDiffableRule, setReadOnlyMode, setRuleFieldResolvedValue } = + useFieldUpgradeContext(); const deserialize = useCallback( (defaultValue: FormData): FormData => @@ -104,6 +103,8 @@ export function RuleFieldEditFormWrapper({ }, }); + useEffect(() => registerForm(form), [registerForm, form]); + // form.isValid has `undefined` value until all fields are dirty. // Run the validation upfront to visualize form validity state. useEffect(() => { @@ -111,24 +112,14 @@ export function RuleFieldEditFormWrapper({ }, [form]); return ( - <> - <EuiFlexGroup justifyContent="flexEnd"> - <EuiButtonEmpty iconType="cross" onClick={setReadOnlyMode}> - {i18n.CANCEL_BUTTON_LABEL} - </EuiButtonEmpty> - <EuiButtonEmpty iconType="save" onClick={form.submit} disabled={!form.isValid}> - {i18n.SAVE_BUTTON_LABEL} - </EuiButtonEmpty> - </EuiFlexGroup> + <Form form={form}> {modal} - <Form form={form}> - <FieldComponent - finalDiffableRule={finalDiffableRule} - setFieldValue={form.setFieldValue} - resetForm={form.reset} - /> - </Form> - </> + <FieldComponent + finalDiffableRule={finalDiffableRule} + setFieldValue={form.setFieldValue} + resetForm={form.reset} + /> + </Form> ); } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/translations.ts new file mode 100644 index 0000000000000..4c44629bf4268 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/translations.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const FINAL_UPDATE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.finalUpdate', + { + defaultMessage: 'Final update', + } +); + +export const SAVE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.field.save', + { + defaultMessage: 'Save', + } +); + +export const ACCEPT = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.field.accept', + { + defaultMessage: 'Accept', + } +); + +export const SAVE_AND_ACCEPT = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.field.saveAndAccept', + { + defaultMessage: 'Save and accept', + } +); + +export const CANCEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.cancelButtonLabel', + { + defaultMessage: 'Cancel', + } +); + +export const EDIT = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.editButtonLabel', + { + defaultMessage: 'Edit', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/context/field_edit_form_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/context/field_edit_form_context.tsx new file mode 100644 index 0000000000000..ba722107e8b9e --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/context/field_edit_form_context.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { + createContext, + useContext, + type PropsWithChildren, + useState, + useCallback, + useRef, +} from 'react'; +import type { FormHook } from '../../../../../../../shared_imports'; +import { invariant } from '../../../../../../../../common/utils/invariant'; + +type FieldEditFormCleanUp = () => void; + +interface FieldEditFormContextType { + form: FormHook | undefined; + registerForm: (form: FormHook) => FieldEditFormCleanUp; +} + +const FieldEditFormContext = createContext<FieldEditFormContextType | null>(null); + +/** + * FieldEditFormContext helps to encapsulate form related logic in `field_final_side` folder. + * + * The only purpose is to obtain the recent form handler and provide it for consumers in + * in the `field_final_side` folder. + */ +export function FieldEditFormContextProvider({ children }: PropsWithChildren<{}>) { + // Using reference reduces unnecessary re-renders though we need to re-render children + // whenever something in the form changes like validity state to be able to reflect that changes. + const formRef = useRef<FormHook | undefined>(); + // Setting the state re-renders the component and its children. The state value is ignored since + // we use a ref here. In that case it doesn't re-render components upon form cleanup. In that case + // the edit component disappears and we aren't interested in the form's state anymore. + const [, setForm] = useState<FormHook | undefined>(); + const registerForm = useCallback( + (formToRegister: FormHook) => { + // Guard against subtle bugs. In attempt of using two forms throw an exception. + if (formRef.current) { + throw new Error( + 'Unexpected new form registration while the old one was not cleaned. Do you properly cleanup form by returning registerForm result from useEffect.' + ); + } + + formRef.current = formToRegister; + setForm(formToRegister); + + return () => (formRef.current = undefined); + }, + [formRef, setForm] + ); + + return ( + <FieldEditFormContext.Provider value={{ form: formRef.current, registerForm }}> + {children} + </FieldEditFormContext.Provider> + ); +} + +export function useFieldEditFormContext() { + const context = useContext(FieldEditFormContext); + + invariant( + context !== null, + 'useFieldEditFormContext must be used inside a FieldEditFormProvider' + ); + + return context; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/index.ts new file mode 100644 index 0000000000000..bcab35a1c27b1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './components/field_final_side'; +export type * from './components/rule_field_edit_component_props'; +export * from './components/rule_field_edit_form_wrapper'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/side_header.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_upgrade_side_header.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/side_header.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_upgrade_side_header.tsx index 574e3f526f856..3e0e60d3c4edf 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/side_header.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_upgrade_side_header.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/css'; -export function SideHeader({ children }: PropsWithChildren<{}>) { +export function FieldUpgradeSideHeader({ children }: PropsWithChildren<{}>) { const { euiTheme } = useEuiTheme(); return ( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx index 3f10ce014d82e..0b8668e90a903 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { RuleFieldEditFormWrapper } from './fields/rule_field_edit_form_wrapper'; +import { RuleFieldEditFormWrapper } from '../field_final_side'; import type { UpgradeableCommonFields } from '../../../../model/prebuilt_rule_upgrade/fields'; import { BuildingBlockEdit, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/field_final_edit.tsx similarity index 86% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/field_final_edit.tsx index 13bc3daa56037..542e9aabcddd2 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/field_final_edit.tsx @@ -7,13 +7,6 @@ import React from 'react'; import { assertUnreachable } from '../../../../../../../common/utility_types'; -import { useDiffableRuleContext } from '../diffable_rule_context'; -import { CommonRuleFieldEdit } from './common_rule_field_edit'; -import { CustomQueryRuleFieldEdit } from './custom_query_rule_field_edit'; -import { SavedQueryRuleFieldEdit } from './saved_query_rule_field_edit'; -import { ThreatMatchRuleFieldEdit } from './threat_match_rule_field_edit'; -import { ThresholdRuleFieldEdit } from './threshold_rule_field_edit'; -import { NewTermsRuleFieldEdit } from './new_terms_rule_field_edit'; import type { UpgradeableCustomQueryFields, UpgradeableSavedQueryFields, @@ -25,22 +18,28 @@ import type { UpgradeableMachineLearningFields, } from '../../../../model/prebuilt_rule_upgrade/fields'; import { isCommonFieldName } from '../../../../model/prebuilt_rule_upgrade/fields'; -import { useFinalSideContext } from '../final_side/final_side_context'; +import { useFieldUpgradeContext } from '../rule_upgrade/field_upgrade_context'; +import { CommonRuleFieldEdit } from './common_rule_field_edit'; +import { CustomQueryRuleFieldEdit } from './custom_query_rule_field_edit'; +import { SavedQueryRuleFieldEdit } from './saved_query_rule_field_edit'; +import { ThreatMatchRuleFieldEdit } from './threat_match_rule_field_edit'; +import { ThresholdRuleFieldEdit } from './threshold_rule_field_edit'; +import { NewTermsRuleFieldEdit } from './new_terms_rule_field_edit'; import { EqlRuleFieldEdit } from './eql_rule_field_edit'; import { EsqlRuleFieldEdit } from './esql_rule_field_edit'; import { MachineLearningRuleFieldEdit } from './machine_learning_rule_field_edit'; -export function FinalEdit() { - const { finalDiffableRule } = useDiffableRuleContext(); - const { type } = finalDiffableRule; - - const { fieldName } = useFinalSideContext(); +export function FieldFinalEdit(): JSX.Element { + const { + fieldName, + finalDiffableRule: { type: ruleType }, + } = useFieldUpgradeContext(); if (isCommonFieldName(fieldName)) { return <CommonRuleFieldEdit fieldName={fieldName} />; } - switch (type) { + switch (ruleType) { case 'query': return <CustomQueryRuleFieldEdit fieldName={fieldName as UpgradeableCustomQueryFields} />; case 'saved_query': @@ -60,6 +59,6 @@ export function FinalEdit() { case 'new_terms': return <NewTermsRuleFieldEdit fieldName={fieldName as UpgradeableNewTermsFields} />; default: - return assertUnreachable(type); + return assertUnreachable(ruleType); } } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_adapter.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_adapter.tsx index 6dfd38d5676d3..3100e5c21f8bb 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_adapter.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_adapter.tsx @@ -11,7 +11,7 @@ import { getTermsAggregationFields } from '../../../../../../../rule_creation_ui import { isEsqlRule, isMlRule } from '../../../../../../../../../common/detection_engine/utils'; import { useAllEsqlRuleFields } from '../../../../../../../rule_creation_ui/hooks'; import { useMLRuleConfig } from '../../../../../../../../common/components/ml/hooks/use_ml_rule_config'; -import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import type { RuleFieldEditComponentProps } from '../../../field_final_side'; import { useDiffableRuleDataView } from '../hooks/use_diffable_rule_data_view'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_form.tsx index f6ed2e5c657c7..e01db6f428887 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/alert_suppression/suppression_edit_form.tsx @@ -17,7 +17,7 @@ import { AlertSuppressionDurationType } from '../../../../../../../../detections import { type FormData } from '../../../../../../../../shared_imports'; import { DEFAULT_SUPPRESSION_MISSING_FIELDS_STRATEGY } from '../../../../../../../../../common/detection_engine/constants'; import { type AlertSuppression } from '../../../../../../../../../common/api/detection_engine'; -import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import { RuleFieldEditFormWrapper } from '../../../field_final_side'; import { AlertSuppressionEditAdapter } from './suppression_edit_adapter'; import { alertSuppressionFormSchema, type AlertSuppressionFormData } from './form_schema'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx index 2f697288221cf..7ff2b7fdbd6fd 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx @@ -11,7 +11,7 @@ import { css } from '@emotion/css'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { DataSourceType } from '../../../../../../../../../common/api/detection_engine/prebuilt_rules'; import { UseMultiFields } from '../../../../../../../../shared_imports'; -import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import type { RuleFieldEditComponentProps } from '../../../field_final_side'; import { IndexPatternField } from './index_pattern_edit'; import { DataSourceInfoText } from './data_source_info_text'; import { DataViewField } from './data_view_field'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx index e30b713908a02..ec9e49bb7ab17 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx @@ -16,7 +16,7 @@ import { FIELD_TYPES, } from '../../../../../../../../shared_imports'; import { DataSourceType } from '../../../../../../../../../common/api/detection_engine/prebuilt_rules'; -import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import { RuleFieldEditFormWrapper } from '../../../field_final_side'; import { DataSourceEdit } from './data_source_edit'; import { INDEX_HELPER_TEXT } from '../../../../../../../rule_creation_ui/components/step_define_rule/translations'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx index 9e24fd6c56c77..3562e7de82d66 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx @@ -10,7 +10,7 @@ import type { EuiButtonGroupOptionProps } from '@elastic/eui'; import { EuiButtonGroup } from '@elastic/eui'; import { DataSourceType } from '../../../../../../../../../common/api/detection_engine/prebuilt_rules'; import type { FieldHook } from '../../../../../../../../shared_imports'; -import type { ResetFormFn } from '../rule_field_edit_component_props'; +import type { ResetFormFn } from '../../../field_final_side'; import * as i18n from './translations'; interface DataSourceTypeSelectorFieldProps { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx index cea9b9308c0df..73e7c553c9127 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { DataViewBase } from '@kbn/es-query'; import { EqlQueryEdit } from '../../../../../../../rule_creation/components/eql_query_edit'; -import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import type { RuleFieldEditComponentProps } from '../../../field_final_side'; import { useDiffableRuleDataView } from '../hooks/use_diffable_rule_data_view'; export function EqlQueryEditAdapter({ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx index 4dd953006d39c..f357504af76f0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx @@ -10,7 +10,7 @@ import type { Filter } from '@kbn/es-query'; import type { EqlOptions } from '@kbn/timelines-plugin/common'; import type { FieldValueQueryBar } from '../../../../../../../rule_creation_ui/components/query_bar_field'; import type { FormData, FormSchema } from '../../../../../../../../shared_imports'; -import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import { RuleFieldEditFormWrapper } from '../../../field_final_side'; import { type DiffableRule, RuleEqlQuery, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_adapter.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_adapter.tsx index faf43d5b88b22..a3b1faf667d99 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_adapter.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_adapter.tsx @@ -7,8 +7,8 @@ import React from 'react'; import type { DataViewBase } from '@kbn/es-query'; +import type { RuleFieldEditComponentProps } from '../../../field_final_side'; import { EsqlQueryEdit } from '../../../../../../../rule_creation/components/esql_query_edit'; -import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; import { useDiffableRuleDataView } from '../hooks/use_diffable_rule_data_view'; export function EsqlQueryEditAdapter({ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_form.tsx index a156ef747aedc..dd482b6962d8a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/esql_query/esql_query_edit_form.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { FormData, FormSchema } from '../../../../../../../../shared_imports'; -import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import { RuleFieldEditFormWrapper } from '../../../field_final_side'; import type { FieldValueQueryBar } from '../../../../../../../rule_creation_ui/components/query_bar_field'; import { type DiffableRule, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx index 27415855adfbe..f377e17d8e23b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx @@ -18,7 +18,7 @@ import type { DiffableRule } from '../../../../../../../../../common/api/detecti import type { SetRuleQuery } from '../../../../../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; import { useRuleFromTimeline } from '../../../../../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; import { useGetSavedQuery } from '../../../../../../../../detections/pages/detection_engine/rules/use_get_saved_query'; -import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import type { RuleFieldEditComponentProps } from '../../../field_final_side'; import { useDiffableRuleDataView } from '../hooks/use_diffable_rule_data_view'; export function KqlQueryEdit({ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx index 98ffc4b6bfdf0..a02fa9b9fd9d4 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx @@ -9,8 +9,8 @@ import React from 'react'; import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; import type { FormData, FormSchema } from '../../../../../../../../shared_imports'; import { schema } from '../../../../../../../rule_creation_ui/components/step_define_rule/schema'; -import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; import type { FieldValueQueryBar } from '../../../../../../../rule_creation_ui/components/query_bar_field'; +import { RuleFieldEditFormWrapper } from '../../../field_final_side'; import { KqlQueryLanguage, KqlQueryType, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/threshold_alert_suppression/suppression_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/threshold_alert_suppression/suppression_edit_form.tsx index af9f9db00cff2..0d4be2e421a5c 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/threshold_alert_suppression/suppression_edit_form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/threshold_alert_suppression/suppression_edit_form.tsx @@ -13,12 +13,12 @@ import { import { ALERT_SUPPRESSION_DURATION_FIELD_NAME } from '../../../../../../../rule_creation/components/alert_suppression_edit'; import { type FormData } from '../../../../../../../../shared_imports'; import type { ThresholdAlertSuppression } from '../../../../../../../../../common/api/detection_engine'; -import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import { RuleFieldEditFormWrapper } from '../../../field_final_side'; import { thresholdAlertSuppressionFormSchema, type ThresholdAlertSuppressionFormData, } from './form_schema'; -import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import type { RuleFieldEditComponentProps } from '../../../field_final_side'; export function ThresholdAlertSuppressionEditForm(): JSX.Element { return ( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/index.ts similarity index 86% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/index.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/index.ts index 75ff48ff541a1..cc252595beee6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_callout/index.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './rule_upgrade_callout'; +export * from './field_final_edit'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/field_final_readonly.tsx similarity index 93% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/field_readonly.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/field_final_readonly.tsx index ecaec5af0f54a..33abbb4792946 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/field_readonly.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/field_final_readonly.tsx @@ -18,6 +18,7 @@ import type { DiffableMachineLearningFields, } from '../../../../../../../common/api/detection_engine'; import { assertUnreachable } from '../../../../../../../common/utility_types'; +import { useFieldUpgradeContext } from '../rule_upgrade/field_upgrade_context'; import { CustomQueryRuleFieldReadOnly } from './custom_query_rule_field_readonly'; import { SavedQueryRuleFieldReadOnly } from './saved_query_rule_field_readonly'; import { EqlRuleFieldReadOnly } from './eql_rule_field_readonly'; @@ -27,14 +28,9 @@ import { ThresholdRuleFieldReadOnly } from './threshold_rule_field_readonly'; import { MachineLearningRuleFieldReadOnly } from './machine_learning_rule_field_readonly'; import { NewTermsRuleFieldReadOnly } from './new_terms_rule_field_readonly'; import { CommonRuleFieldReadOnly } from './common_rule_field_readonly'; -import { useDiffableRuleContext } from '../diffable_rule_context'; -interface FieldReadOnlyProps { - fieldName: string; -} - -export function FieldReadOnly({ fieldName }: FieldReadOnlyProps) { - const { finalDiffableRule } = useDiffableRuleContext(); +export function FieldFinalReadOnly(): JSX.Element { + const { fieldName, finalDiffableRule } = useFieldUpgradeContext(); const { data: commonField } = useMemo( () => DiffableCommonFields.keyof().safeParse(fieldName), diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/alert_suppression/alert_suppression.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/alert_suppression/alert_suppression.stories.tsx index 9aeeee25983d3..9cebd044dad63 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/alert_suppression/alert_suppression.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/alert_suppression/alert_suppression.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { AlertSuppressionReadOnly } from './alert_suppression'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="alert_suppression" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="alert_suppression" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/anomaly_threshold/anomaly_threshold.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/anomaly_threshold/anomaly_threshold.stories.tsx index 392187941046c..0f7ce369a117d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/anomaly_threshold/anomaly_threshold.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/anomaly_threshold/anomaly_threshold.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { AnomalyThresholdReadOnly } from './anomaly_threshold'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockMachineLearningRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="anomaly_threshold" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="anomaly_threshold" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/building_block/building_block.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/building_block/building_block.stories.tsx index 6bace209f283b..7112e63a313d8 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/building_block/building_block.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/building_block/building_block.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { BuildingBlockReadOnly } from './building_block'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="building_block" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="building_block" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/data_source/data_source.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/data_source/data_source.stories.tsx index d7bf26bc7d9ba..93f71afefb902 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/data_source/data_source.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/data_source/data_source.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { @@ -18,7 +18,7 @@ import { } from '../../storybook/mocks'; export default { - component: FieldReadOnly, + component: FieldFinalReadOnly, title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/data_source', }; @@ -32,8 +32,9 @@ const Template: Story<TemplateProps> = (args) => { <ThreeWayDiffStorybookProviders kibanaServicesOverrides={args.kibanaServicesOverrides} finalDiffableRule={args.finalDiffableRule} + fieldName="data_source" > - <FieldReadOnly fieldName="data_source" /> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.stories.tsx index 079c327fb29ef..de7df1f7fbfbf 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { DescriptionReadOnly } from './description'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="description" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="description" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.stories.tsx index 8ee0ac1511784..bad23cba21e2e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { EqlQueryReadOnly } from './eql_query'; @@ -34,8 +34,9 @@ const Template: Story<TemplateProps> = (args) => { <ThreeWayDiffStorybookProviders kibanaServicesOverrides={args.kibanaServicesOverrides} finalDiffableRule={args.finalDiffableRule} + fieldName="eql_query" > - <FieldReadOnly fieldName="eql_query" /> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/esql_query/esql_query.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/esql_query/esql_query.stories.tsx index 70f37106842e1..81b692bfc4e9b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/esql_query/esql_query.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/esql_query/esql_query.stories.tsx @@ -7,13 +7,13 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockEsqlRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; export default { - component: FieldReadOnly, + component: FieldFinalReadOnly, title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/esql_query', }; @@ -23,8 +23,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="esql_query" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="esql_query" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/false_positives/false_positives.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/false_positives/false_positives.stories.tsx index a5884b340e32b..a3f2defba2ec9 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/false_positives/false_positives.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/false_positives/false_positives.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FalsePositivesReadOnly } from './false_positives'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="false_positives" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="false_positives" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/history_window_start/history_window_start.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/history_window_start/history_window_start.stories.tsx index 12e0f086ecec9..da87cf2c04eb0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/history_window_start/history_window_start.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/history_window_start/history_window_start.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { HistoryWindowStartReadOnly } from './history_window_start'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockNewTermsRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="history_window_start" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="history_window_start" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/investigation_fields/investigation_fields.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/investigation_fields/investigation_fields.stories.tsx index a32c79076a03d..400e7fd5ccba9 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/investigation_fields/investigation_fields.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/investigation_fields/investigation_fields.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { InvestigationFieldsReadOnly } from './investigation_fields'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="investigation_fields" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="investigation_fields" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/kql_query.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/kql_query.stories.tsx index 16731ec498162..500999fea6c4f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/kql_query.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/kql_query.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { @@ -22,7 +22,7 @@ import { } from '../../storybook/mocks'; export default { - component: FieldReadOnly, + component: FieldFinalReadOnly, title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/kql_query', }; @@ -36,8 +36,9 @@ const Template: Story<TemplateProps> = (args) => { <ThreeWayDiffStorybookProviders kibanaServicesOverrides={args.kibanaServicesOverrides} finalDiffableRule={args.finalDiffableRule} + fieldName="kql_query" > - <FieldReadOnly fieldName="kql_query" /> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/machine_learning_job_id/machine_learning_job_id.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/machine_learning_job_id/machine_learning_job_id.stories.tsx index ea23aa5984106..35d90a26fdfde 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/machine_learning_job_id/machine_learning_job_id.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/machine_learning_job_id/machine_learning_job_id.stories.tsx @@ -10,7 +10,7 @@ import { useQueryClient } from '@tanstack/react-query'; import type { Story } from '@storybook/react'; import { MachineLearningJobIdReadOnly } from './machine_learning_job_id'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { GET_MODULES_QUERY_KEY } from '../../../../../../../../common/components/ml_popover/hooks/use_fetch_modules_query'; import { GET_RECOGNIZER_QUERY_KEY } from '../../../../../../../../common/components/ml_popover/hooks/use_fetch_recognizer_query'; @@ -64,9 +64,12 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="machine_learning_job_id" + > <MockMlData> - <FieldReadOnly fieldName="machine_learning_job_id" /> + <FieldFinalReadOnly /> </MockMlData> </ThreeWayDiffStorybookProviders> ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/max_signals/max_signals.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/max_signals/max_signals.stories.tsx index 3c7945366a174..6959a5c391649 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/max_signals/max_signals.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/max_signals/max_signals.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { MaxSignalsReadOnly } from './max_signals'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="max_signals" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="max_signals" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.stories.tsx index d97f71b4df0ac..137b34f851a27 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { NameReadOnly } from './name'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="name" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="name"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/new_terms_fields/new_terms_fields.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/new_terms_fields/new_terms_fields.stories.tsx index f3dc5a1e3da9b..0f870562f2a8b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/new_terms_fields/new_terms_fields.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/new_terms_fields/new_terms_fields.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { NewTermsFieldsReadOnly } from './new_terms_fields'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockNewTermsRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="new_terms_fields" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="new_terms_fields" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/note.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/note.stories.tsx index 4a62c5e58dc28..9492b797689c7 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/note.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/note.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { NoteReadOnly } from './note'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="note" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="note"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/references/references.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/references/references.stories.tsx index ea8ee856099dd..d4d0d3241a6bf 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/references/references.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/references/references.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { ReferencesReadOnly } from './references'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="references" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="references" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/related_integrations/related_integrations.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/related_integrations/related_integrations.stories.tsx index b810eaa1fbb8f..65f4f50dbfb87 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/related_integrations/related_integrations.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/related_integrations/related_integrations.stories.tsx @@ -10,7 +10,7 @@ import { useQueryClient } from '@tanstack/react-query'; import type { Story } from '@storybook/react'; import { RelatedIntegrationsReadOnly } from './related_integrations'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; @@ -45,9 +45,12 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="related_integrations" + > <MockRelatedIntegrationsData> - <FieldReadOnly fieldName="related_integrations" /> + <FieldFinalReadOnly /> </MockRelatedIntegrationsData> </ThreeWayDiffStorybookProviders> ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/required_fields/required_fields.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/required_fields/required_fields.stories.tsx index ee926fc7ed561..b3839c9535612 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/required_fields/required_fields.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/required_fields/required_fields.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { RequiredFieldsReadOnly } from './required_fields'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -23,8 +23,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="required_fields" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="required_fields" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score/risk_score.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score/risk_score.stories.tsx index cb640e31090cc..c045000018d07 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score/risk_score.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score/risk_score.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { RiskScoreReadOnly } from './risk_score'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="risk_score" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="risk_score" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score_mapping/risk_score_mapping.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score_mapping/risk_score_mapping.stories.tsx index 90dbe7f981f64..4c7bd4cbba9ef 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score_mapping/risk_score_mapping.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score_mapping/risk_score_mapping.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { RiskScoreMappingReadOnly } from './risk_score_mapping'; import { mockCustomQueryRule } from '../../storybook/mocks'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="risk_score_mapping" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="risk_score_mapping" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_name_override/rule_name_override.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_name_override/rule_name_override.stories.tsx index d0d596f15af42..0552b9e4f6b4f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_name_override/rule_name_override.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_name_override/rule_name_override.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { RuleNameOverrideReadOnly } from './rule_name_override'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="rule_name_override" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="rule_name_override" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_schedule/rule_schedule.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_schedule/rule_schedule.stories.tsx index 30f2170a30f31..cca1dcb9bc21f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_schedule/rule_schedule.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_schedule/rule_schedule.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { RuleScheduleReadOnly } from './rule_schedule'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="rule_schedule" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="rule_schedule" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/setup/setup.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/setup/setup.stories.tsx index 34410c7c6f638..14ba62913053e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/setup/setup.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/setup/setup.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { SetupReadOnly } from './setup'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="setup" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="setup"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity/severity.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity/severity.stories.tsx index b51547d1655e0..3d6836295aa94 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity/severity.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity/severity.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { SeverityReadOnly } from './severity'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="severity" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="severity"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity_mapping/severity_mapping.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity_mapping/severity_mapping.stories.tsx index b4ecb70ce66cd..4d3825cc7e4dc 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity_mapping/severity_mapping.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity_mapping/severity_mapping.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { SeverityMappingReadOnly } from './severity_mapping'; import { mockCustomQueryRule } from '../../storybook/mocks'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="severity_mapping" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="severity_mapping" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.stories.tsx index c8129dd989d24..f93f5ffd2dad0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { TagsReadOnly } from './tags'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="tags" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="tags"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat/threat.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat/threat.stories.tsx index de8c15f29e0cc..671dc68e1054f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat/threat.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat/threat.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatReadOnly } from './threat'; import { mockCustomQueryRule } from '../../storybook/mocks'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="threat" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="threat"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_index/threat_index.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_index/threat_index.stories.tsx index aeb1b6491bba6..6ab55ca01e335 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_index/threat_index.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_index/threat_index.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatIndexReadOnly } from './threat_index'; import { mockThreatMatchRule } from '../../storybook/mocks'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="threat_index" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="threat_index" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_indicator_path/threat_indicator_path.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_indicator_path/threat_indicator_path.stories.tsx index bb91b29fffe11..15c547001a27d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_indicator_path/threat_indicator_path.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_indicator_path/threat_indicator_path.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatIndicatorPathReadOnly } from './threat_indicator_path'; import { mockThreatMatchRule } from '../../storybook/mocks'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="threat_indicator_path" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="threat_indicator_path" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_mapping/threat_mapping.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_mapping/threat_mapping.stories.tsx index 35c4bba4544a7..587be1b02cba0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_mapping/threat_mapping.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_mapping/threat_mapping.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatMappingReadOnly } from './threat_mapping'; import { mockThreatMatchRule } from '../../storybook/mocks'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="threat_mapping" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="threat_mapping" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_query/threat_query.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_query/threat_query.stories.tsx index 625226ab4f9f5..46e98bbaa798d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_query/threat_query.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_query/threat_query.stories.tsx @@ -7,7 +7,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatQueryReadOnly } from './threat_query'; import { @@ -34,8 +34,9 @@ const Template: Story<TemplateProps> = (args) => { <ThreeWayDiffStorybookProviders kibanaServicesOverrides={args.kibanaServicesOverrides} finalDiffableRule={args.finalDiffableRule} + fieldName="threat_query" > - <FieldReadOnly fieldName="threat_query" /> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threshold/threshold.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threshold/threshold.stories.tsx index 0541d5f9a9b47..5270a2af8a635 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threshold/threshold.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threshold/threshold.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { ThresholdReadOnly } from './threshold'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockThresholdRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="threshold" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="threshold" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timeline_template/timeline_template.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timeline_template/timeline_template.stories.tsx index e4c3a2043ff24..582affc9d192e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timeline_template/timeline_template.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timeline_template/timeline_template.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { TimelineTemplateReadOnly } from './timeline_template'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="timeline_template" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="timeline_template" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_override/timestamp_override.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_override/timestamp_override.stories.tsx index 5828ba156d9d2..3d4c5b00005ad 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_override/timestamp_override.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_override/timestamp_override.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { TimestampOverrideReadOnly } from './timestamp_override'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -25,8 +25,11 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="timestamp_override" /> + <ThreeWayDiffStorybookProviders + finalDiffableRule={args.finalDiffableRule} + fieldName="timestamp_override" + > + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/type/type.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/type/type.stories.tsx index ba252a8a80b88..c57bdf36ce3a0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/type/type.stories.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/type/type.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { TypeReadOnly } from './type'; -import { FieldReadOnly } from '../../field_readonly'; +import { FieldFinalReadOnly } from '../../field_final_readonly'; import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,8 +24,8 @@ interface TemplateProps { const Template: Story<TemplateProps> = (args) => { return ( - <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule}> - <FieldReadOnly fieldName="type" /> + <ThreeWayDiffStorybookProviders finalDiffableRule={args.finalDiffableRule} fieldName="type"> + <FieldFinalReadOnly /> </ThreeWayDiffStorybookProviders> ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/final_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/final_readonly.tsx deleted file mode 100644 index 21b8475fe3002..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/final_readonly.tsx +++ /dev/null @@ -1,25 +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 { EuiButtonEmpty } from '@elastic/eui'; -import React from 'react'; -import { FieldReadOnly } from './field_readonly'; -import * as i18n from '../translations'; -import { useFinalSideContext } from '../final_side/final_side_context'; - -export function FinalReadOnly() { - const { setEditMode, fieldName } = useFinalSideContext(); - - return ( - <> - <EuiButtonEmpty iconType="pencil" onClick={setEditMode}> - {i18n.EDIT_BUTTON_LABEL} - </EuiButtonEmpty> - <FieldReadOnly fieldName={fieldName} /> - </> - ); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/index.ts new file mode 100644 index 0000000000000..4abd3b839ae2f --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './field_final_readonly'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/three_way_diff_storybook_providers.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/three_way_diff_storybook_providers.tsx index 722f5ac9f6ada..d961f3d23befb 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/three_way_diff_storybook_providers.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/three_way_diff_storybook_providers.tsx @@ -13,10 +13,14 @@ import { Provider as ReduxStoreProvider } from 'react-redux'; import type { CoreStart } from '@kbn/core/public'; import type { UpsellingService } from '@kbn/security-solution-upselling/service'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; +import type { UpgradeableDiffableFields } from '../../../../../model/prebuilt_rule_upgrade/fields'; import { ReactQueryClientProvider } from '../../../../../../../common/containers/query_client/query_client_provider'; import { UpsellingProvider } from '../../../../../../../common/components/upselling_provider'; -import { DiffableRuleContextProvider } from '../../diffable_rule_context'; -import type { DiffableRule } from '../../../../../../../../common/api/detection_engine'; +import { FieldUpgradeContextProvider } from '../../rule_upgrade/field_upgrade_context'; +import type { + DiffableRule, + RuleResponse, +} from '../../../../../../../../common/api/detection_engine'; import { mockCustomQueryRule } from './mocks'; function createKibanaServicesMock(overrides?: Partial<CoreStart>) { @@ -78,29 +82,49 @@ interface StorybookProvidersProps { children: React.ReactNode; kibanaServicesOverrides?: Record<string, unknown>; finalDiffableRule?: DiffableRule; + fieldName: string; } export function ThreeWayDiffStorybookProviders({ children, kibanaServicesOverrides, finalDiffableRule = mockCustomQueryRule(), + fieldName, }: StorybookProvidersProps) { const kibanaServicesMock = createKibanaServicesMock(kibanaServicesOverrides); const KibanaReactContext = createKibanaReactContext(kibanaServicesMock); const store = createMockStore(); + const ruleUpgradeStateMock = { + id: 'test-id', + rule_id: 'test-id', + current_rule: {} as RuleResponse, + target_rule: {} as RuleResponse, + diff: { + fields: {}, + num_fields_with_updates: 0, + num_fields_with_conflicts: 0, + num_fields_with_non_solvable_conflicts: 0, + }, + revision: 1, + finalRule: finalDiffableRule, + hasUnresolvedConflicts: false, + fieldsUpgradeState: {}, + }; + return ( <KibanaReactContext.Provider> <ReactQueryClientProvider> <ReduxStoreProvider store={store}> <UpsellingProvider upsellingService={kibanaServicesMock.upsellingService}> - <DiffableRuleContextProvider - finalDiffableRule={finalDiffableRule} + <FieldUpgradeContextProvider + ruleUpgradeState={ruleUpgradeStateMock} + fieldName={fieldName as UpgradeableDiffableFields} setRuleFieldResolvedValue={setRuleFieldResolvedValueMock} > {children} - </DiffableRuleContextProvider> + </FieldUpgradeContextProvider> </UpsellingProvider> </ReduxStoreProvider> </ReactQueryClientProvider> diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side.tsx deleted file mode 100644 index 30e3f4461195a..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiTitle } from '@elastic/eui'; -import { SideHeader } from '../components/side_header'; -import { FinalSideHelpInfo } from './final_side_help_info'; -import * as i18n from './translations'; -import { FinalReadOnly } from '../final_readonly/final_readonly'; -import { FinalEdit } from '../final_edit/final_edit'; -import { FinalSideMode } from './constants'; -import type { UpgradeableDiffableFields } from '../../../../model/prebuilt_rule_upgrade/fields'; -import { assertUnreachable } from '../../../../../../../common/utility_types'; -import { FinalSideContextProvider, useFinalSideContext } from './final_side_context'; - -interface FinalSideProps { - fieldName: UpgradeableDiffableFields; -} - -export function FinalSide({ fieldName }: FinalSideProps): JSX.Element { - return ( - <> - <SideHeader> - <EuiTitle size="xxs"> - <h3> - {i18n.FINAL_UPDATE} - <FinalSideHelpInfo /> - </h3> - </EuiTitle> - </SideHeader> - <FinalSideContextProvider fieldName={fieldName}> - <FinalSideContent /> - </FinalSideContextProvider> - </> - ); -} - -function FinalSideContent(): JSX.Element { - const { mode } = useFinalSideContext(); - - switch (mode) { - case FinalSideMode.READONLY: - return <FinalReadOnly />; - case FinalSideMode.EDIT: - return <FinalEdit />; - default: - return assertUnreachable(mode); - } -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side_context.tsx deleted file mode 100644 index 6beb0535e5e27..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/final_side_context.tsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { createContext, useContext, type PropsWithChildren, useCallback } from 'react'; -import { invariant } from '../../../../../../../common/utils/invariant'; -import { FinalSideMode } from './constants'; -import type { UpgradeableDiffableFields } from '../../../../model/prebuilt_rule_upgrade/fields'; - -interface FinalSideContextType { - fieldName: UpgradeableDiffableFields; - mode: FinalSideMode; - setReadOnlyMode: () => void; - setEditMode: () => void; -} - -const FinalSideContext = createContext<FinalSideContextType | null>(null); - -interface FinalSideContextProviderProps { - fieldName: UpgradeableDiffableFields; -} - -export function FinalSideContextProvider({ - children, - fieldName, -}: PropsWithChildren<FinalSideContextProviderProps>) { - const [mode, setMode] = React.useState<FinalSideMode>(FinalSideMode.READONLY); - const setReadOnlyMode = useCallback(() => setMode(FinalSideMode.READONLY), []); - const setEditMode = useCallback(() => setMode(FinalSideMode.EDIT), []); - - const contextValue = { - fieldName, - setReadOnlyMode, - setEditMode, - mode, - }; - - return <FinalSideContext.Provider value={contextValue}>{children}</FinalSideContext.Provider>; -} - -export function useFinalSideContext() { - const context = useContext(FinalSideContext); - - invariant(context !== null, 'useFinalSideContext must be used inside a FinalSideContextProvider'); - - return context; -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/index.ts new file mode 100644 index 0000000000000..95e6836ca8f09 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { RuleUpgrade as RuleUpgradeTab } from './rule_upgrade'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade.tsx new file mode 100644 index 0000000000000..d7e3e33fcb5f8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade.tsx @@ -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 React from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/css'; +import { SplitAccordion } from '../../../../../../common/components/split_accordion'; +import { FieldComparisonSide } from '../comparison_side/field_comparison_side'; +import { FieldFinalSide } from '../field_final_side'; +import { FieldUpgradeHeader } from './field_upgrade_header'; +import { useFieldUpgradeContext } from './field_upgrade_context'; + +export function FieldUpgrade(): JSX.Element { + const { euiTheme } = useEuiTheme(); + const { fieldName, fieldUpgradeState, hasConflict } = useFieldUpgradeContext(); + + return ( + <> + <SplitAccordion + header={<FieldUpgradeHeader fieldName={fieldName} fieldUpgradeState={fieldUpgradeState} />} + initialIsOpen={hasConflict} + data-test-subj="ruleUpgradePerFieldDiff" + > + <EuiFlexGroup gutterSize="s" alignItems="flexStart"> + <EuiFlexItem grow={1}> + <FieldComparisonSide /> + </EuiFlexItem> + <EuiFlexItem + grow={0} + css={css` + align-self: stretch; + border-right: ${euiTheme.border.thin}; + `} + /> + <EuiFlexItem grow={1}> + <FieldFinalSide /> + </EuiFlexItem> + </EuiFlexGroup> + </SplitAccordion> + <EuiSpacer size="s" /> + </> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_context.tsx new file mode 100644 index 0000000000000..f88c9fb3e0760 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_context.tsx @@ -0,0 +1,167 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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, { createContext, useContext, useMemo } from 'react'; +import { useBoolean } from '@kbn/react-hooks'; +import type { + DiffableRule, + FieldsDiff, + ThreeWayDiff, +} from '../../../../../../../common/api/detection_engine'; +import { invariant } from '../../../../../../../common/utils/invariant'; +import { convertRuleToDiffable } from '../../../../../../../common/detection_engine/prebuilt_rules/diff/convert_rule_to_diffable'; +import type { SetRuleFieldResolvedValueFn } from '../../../../model/prebuilt_rule_upgrade/set_rule_field_resolved_value'; +import type { UpgradeableDiffableFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import type { RuleUpgradeState } from '../../../../model/prebuilt_rule_upgrade'; +import { FieldUpgradeStateEnum } from '../../../../model/prebuilt_rule_upgrade'; + +export enum FieldFinalSideMode { + Readonly = 'readonly', + Edit = 'edit', +} + +interface FieldUpgradeContextType { + /** + * Field name of an upgradable field from DiffableRule + */ + fieldName: UpgradeableDiffableFields; + /** + * Field's upgrade state + */ + fieldUpgradeState: FieldUpgradeStateEnum; + /** + * Whether rule has an unresolved conflict. This state is derived from `fieldUpgradeState`. + */ + hasConflict: boolean; + /** + * Field's three way diff + */ + fieldDiff: ThreeWayDiff<unknown>; + /** + * Current final diffable rule including resolved values + */ + finalDiffableRule: DiffableRule; + /** + * Field final side view mode `Readonly` or `Editing` + */ + rightSideMode: FieldFinalSideMode; + /** + * Sets field's resolved value + */ + setRuleFieldResolvedValue: SetRuleFieldResolvedValueFn; + /** + * Sets field's right side `readonly` mode + */ + setReadOnlyMode: () => void; + /** + * Sets field's right side `edit` mode + */ + setEditMode: () => void; +} + +const FieldUpgradeContext = createContext<FieldUpgradeContextType | null>(null); + +interface FieldUpgradeContextProviderProps { + ruleUpgradeState: RuleUpgradeState; + fieldName: UpgradeableDiffableFields; + setRuleFieldResolvedValue: SetRuleFieldResolvedValueFn; + children: React.ReactNode; +} + +export function FieldUpgradeContextProvider({ + ruleUpgradeState, + fieldName, + setRuleFieldResolvedValue, + children, +}: FieldUpgradeContextProviderProps) { + const { state: fieldUpgradeState } = ruleUpgradeState.fieldsUpgradeState[fieldName]; + const fieldDiff = ruleUpgradeState.diff.fields[fieldName]; + const initialRightSideMode = + fieldUpgradeState === FieldUpgradeStateEnum.NonSolvableConflict + ? FieldFinalSideMode.Edit + : FieldFinalSideMode.Readonly; + + const [editing, { on: setEditMode, off: setReadOnlyMode }] = useBoolean( + initialRightSideMode === FieldFinalSideMode.Edit + ); + + invariant(fieldDiff, `Field diff is not found for ${fieldName}.`); + + const contextValue: FieldUpgradeContextType = useMemo( + () => ({ + fieldName, + fieldUpgradeState, + hasConflict: + fieldUpgradeState === FieldUpgradeStateEnum.SolvableConflict || + fieldUpgradeState === FieldUpgradeStateEnum.NonSolvableConflict, + fieldDiff, + finalDiffableRule: calcFinalDiffableRule(ruleUpgradeState), + rightSideMode: editing ? FieldFinalSideMode.Edit : FieldFinalSideMode.Readonly, + setRuleFieldResolvedValue, + setReadOnlyMode, + setEditMode, + }), + [ + fieldName, + fieldUpgradeState, + fieldDiff, + ruleUpgradeState, + editing, + setRuleFieldResolvedValue, + setReadOnlyMode, + setEditMode, + ] + ); + + return ( + <FieldUpgradeContext.Provider value={contextValue}>{children}</FieldUpgradeContext.Provider> + ); +} + +export function useFieldUpgradeContext() { + const context = useContext(FieldUpgradeContext); + + invariant( + context !== null, + 'useFieldUpgradeContext must be used inside a FieldUpgradeContextProvider' + ); + + return context; +} + +function calcFinalDiffableRule(ruleUpgradeState: RuleUpgradeState): DiffableRule { + const fieldsResolvedValues = Object.entries(ruleUpgradeState.fieldsUpgradeState).reduce< + Record<string, unknown> + >((result, [fieldName, fieldState]) => { + if (fieldState.state === FieldUpgradeStateEnum.Accepted) { + result[fieldName] = fieldState.resolvedValue; + } + + return result; + }, {}); + + return { + ...convertRuleToDiffable(ruleUpgradeState.target_rule), + ...convertRuleFieldsDiffToDiffable(ruleUpgradeState.diff.fields), + ...fieldsResolvedValues, + } as DiffableRule; +} + +/** + * Assembles a `DiffableRule` from rule fields diff `merged_version`s. + */ +function convertRuleFieldsDiffToDiffable( + ruleFieldsDiff: FieldsDiff<Record<string, unknown>> +): Partial<DiffableRule> { + const mergeVersionRule: Record<string, unknown> = {}; + + for (const fieldName of Object.keys(ruleFieldsDiff)) { + mergeVersionRule[fieldName] = ruleFieldsDiff[fieldName].merged_version; + } + + return mergeVersionRule; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_conflicts_resolver_header.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_header.tsx similarity index 65% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_conflicts_resolver_header.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_header.tsx index a096f025873a5..b401f702bd036 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_conflicts_resolver_header.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_header.tsx @@ -9,25 +9,27 @@ import React from 'react'; import { camelCase, startCase } from 'lodash'; import { EuiFlexGroup, EuiTitle } from '@elastic/eui'; import { fieldToDisplayNameMap } from '../../diff_components/translations'; -import type { FieldUpgradeState } from '../../../../model/prebuilt_rule_upgrade'; +import type { FieldUpgradeStateEnum } from '../../../../model/prebuilt_rule_upgrade'; import { FieldUpgradeStateInfo } from './field_upgrade_state_info'; -interface FieldUpgradeConflictsResolverHeaderProps { +interface FieldUpgradeHeaderProps { fieldName: string; - fieldUpgradeState: FieldUpgradeState; + fieldUpgradeState: FieldUpgradeStateEnum; } -export function FieldUpgradeConflictsResolverHeader({ +export function FieldUpgradeHeader({ fieldName, fieldUpgradeState, -}: FieldUpgradeConflictsResolverHeaderProps): JSX.Element { +}: FieldUpgradeHeaderProps): JSX.Element { return ( - <EuiFlexGroup direction="row" alignItems="center"> + <EuiFlexGroup alignItems="center"> <EuiTitle data-test-subj="ruleUpgradeFieldDiffLabel" size="xs"> <h5>{fieldToDisplayNameMap[fieldName] ?? startCase(camelCase(fieldName))}</h5> </EuiTitle> - <FieldUpgradeStateInfo state={fieldUpgradeState} /> + <EuiFlexGroup alignItems="center" gutterSize="s"> + <FieldUpgradeStateInfo state={fieldUpgradeState} /> + </EuiFlexGroup> </EuiFlexGroup> ); } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx new file mode 100644 index 0000000000000..a85cf96cc50d2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { assertUnreachable } from '../../../../../../../../common/utility_types'; +import { FieldUpgradeStateEnum } from '../../../../../model/prebuilt_rule_upgrade'; +import { ReadyForUpgradeBadge } from '../../badges/ready_for_upgrade_badge'; +import { ReviewRequiredBadge } from '../../badges/review_required_badge'; +import { ActionRequiredBadge } from '../../badges/action_required'; +import * as i18n from './translations'; + +interface FieldUpgradeStateInfoProps { + state: FieldUpgradeStateEnum; +} + +export function FieldUpgradeStateInfo({ state }: FieldUpgradeStateInfoProps): JSX.Element { + const { color, badge, title, description } = useMemo(() => { + switch (state) { + case FieldUpgradeStateEnum.NoUpdate: + return { + color: 'success', + title: i18n.NO_UPDATE, + description: i18n.NO_UPDATE_DESCRIPTION, + }; + + case FieldUpgradeStateEnum.NoConflict: + return { + color: 'success', + badge: <ReadyForUpgradeBadge />, + title: i18n.NO_CONFLICT, + description: i18n.NO_CONFLICT_DESCRIPTION, + }; + + case FieldUpgradeStateEnum.Accepted: + return { + color: 'success', + badge: <ReadyForUpgradeBadge />, + title: i18n.REVIEWED_AND_ACCEPTED, + }; + + case FieldUpgradeStateEnum.SolvableConflict: + return { + color: 'warning', + badge: <ReviewRequiredBadge />, + title: i18n.SOLVABLE_CONFLICT, + description: i18n.SOLVABLE_CONFLICT_DESCRIPTION, + }; + + case FieldUpgradeStateEnum.NonSolvableConflict: + return { + color: 'danger', + badge: <ActionRequiredBadge />, + title: i18n.NON_SOLVABLE_CONFLICT, + description: i18n.NON_SOLVABLE_CONFLICT_DESCRIPTION, + }; + + default: + return assertUnreachable(state); + } + }, [state]); + + return ( + <EuiText color={color} size="xs"> + <EuiFlexGroup gutterSize="s" alignItems="center"> + <EuiFlexItem grow={false}>{badge}</EuiFlexItem> + <EuiFlexItem grow={false}> + <strong>{title}</strong> + </EuiFlexItem> + + {description && ( + <EuiFlexItem grow={false}> + {i18n.SEPARATOR} {description} + </EuiFlexItem> + )} + </EuiFlexGroup> + </EuiText> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/index.ts similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/index.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/index.ts diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx similarity index 58% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/translations.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx index 36349b5029a87..c3115c6ce0925 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/field_upgrade_state_info/translations.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx @@ -7,18 +7,39 @@ import { i18n } from '@kbn/i18n'; -export const UPDATE_ACCEPTED = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAccepted', +export const NO_UPDATE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.noUpdate', { - defaultMessage: 'Update accepted', + defaultMessage: 'No update', } ); -export const UPDATE_ACCEPTED_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.updateAcceptedDescription', +export const NO_UPDATE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.noUpdateDescription', { defaultMessage: - 'You can still make changes, please review/accept all other conflicts before updating the rule.', + 'The field was modified after rule installation but does not have Elastic update.', + } +); + +export const NO_CONFLICT = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.noConflict', + { + defaultMessage: 'No conflicts', + } +); + +export const NO_CONFLICT_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.noConflictDescription', + { + defaultMessage: 'The update has no conflicts and has been applied to the final update.', + } +); + +export const REVIEWED_AND_ACCEPTED = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.reviewedAndAccepted', + { + defaultMessage: 'Reviewed and accepted', } ); @@ -40,7 +61,7 @@ export const SOLVABLE_CONFLICT_DESCRIPTION = i18n.translate( export const NON_SOLVABLE_CONFLICT = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflict', { - defaultMessage: 'Solved conflict', + defaultMessage: 'Unsolved conflict', } ); @@ -48,7 +69,7 @@ export const NON_SOLVABLE_CONFLICT_DESCRIPTION = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.nonSolvableConflictDescription', { defaultMessage: - 'We have suggested an update for this modified field, please review before accepting.', + 'Unable to suggest a merged version for the update. Current version is provided for you to edit.', } ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/index.ts new file mode 100644 index 0000000000000..af2bd34a7b6e8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './rule_upgrade'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade.tsx new file mode 100644 index 0000000000000..73746f3c48211 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiSpacer } from '@elastic/eui'; +import { + FieldUpgradeStateEnum, + type RuleUpgradeState, + type SetRuleFieldResolvedValueFn, +} from '../../../../model/prebuilt_rule_upgrade'; +import type { UpgradeableDiffableFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { RuleUpgradeInfoBar } from './rule_upgrade_info_bar'; +import { RuleUpgradeCallout } from './rule_upgrade_callout'; +import { FieldUpgrade } from './field_upgrade'; +import { FieldUpgradeContextProvider } from './field_upgrade_context'; + +interface RuleUpgradeProps { + ruleUpgradeState: RuleUpgradeState; + setRuleFieldResolvedValue: SetRuleFieldResolvedValueFn; +} + +export const RuleUpgrade = memo(function RuleUpgrade({ + ruleUpgradeState, + setRuleFieldResolvedValue, +}: RuleUpgradeProps): JSX.Element { + const totalNumOfFields = calcTotalNumOfFields(ruleUpgradeState); + const numOfFieldsWithUpdates = calcNumOfFieldsWithUpdates(ruleUpgradeState); + const numOfSolvableConflicts = calcNumOfSolvableConflicts(ruleUpgradeState); + const numOfNonSolvableConflicts = calcNumOfNonSolvableConflicts(ruleUpgradeState); + const fieldNames = Object.keys( + ruleUpgradeState.fieldsUpgradeState + ) as UpgradeableDiffableFields[]; + + return ( + <> + <EuiSpacer size="s" /> + <RuleUpgradeInfoBar + totalNumOfFields={totalNumOfFields} + numOfFieldsWithUpdates={numOfFieldsWithUpdates} + numOfConflicts={numOfSolvableConflicts + numOfNonSolvableConflicts} + /> + <EuiSpacer size="s" /> + <RuleUpgradeCallout + numOfSolvableConflicts={numOfSolvableConflicts} + numOfNonSolvableConflicts={numOfNonSolvableConflicts} + /> + <EuiSpacer size="s" /> + {fieldNames.map((fieldName) => ( + <FieldUpgradeContextProvider + key={fieldName} + ruleUpgradeState={ruleUpgradeState} + fieldName={fieldName} + setRuleFieldResolvedValue={setRuleFieldResolvedValue} + > + <FieldUpgrade /> + </FieldUpgradeContextProvider> + ))} + </> + ); +}); + +function calcTotalNumOfFields(ruleUpgradeState: RuleUpgradeState): number { + return Object.keys(ruleUpgradeState.fieldsUpgradeState).length; +} + +function calcNumOfFieldsWithUpdates(ruleUpgradeState: RuleUpgradeState): number { + return Object.values(ruleUpgradeState.fieldsUpgradeState).filter( + ({ state }) => state !== FieldUpgradeStateEnum.NoUpdate + ).length; +} + +function calcNumOfSolvableConflicts(ruleUpgradeState: RuleUpgradeState): number { + return Object.values(ruleUpgradeState.fieldsUpgradeState).filter( + ({ state }) => state === FieldUpgradeStateEnum.SolvableConflict + ).length; +} + +function calcNumOfNonSolvableConflicts(ruleUpgradeState: RuleUpgradeState): number { + return Object.values(ruleUpgradeState.fieldsUpgradeState).filter( + ({ state }) => state === FieldUpgradeStateEnum.NonSolvableConflict + ).length; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade_callout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade_callout.tsx new file mode 100644 index 0000000000000..3b3c0c7e49e51 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade_callout.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiCallOut } from '@elastic/eui'; +import { ActionRequiredBadge } from '../badges/action_required'; +import { ReviewRequiredBadge } from '../badges/review_required_badge'; +import { ReadyForUpgradeBadge } from '../badges/ready_for_upgrade_badge'; +import * as i18n from './translations'; + +interface RuleUpgradeCalloutProps { + numOfSolvableConflicts: number; + numOfNonSolvableConflicts: number; +} + +export function RuleUpgradeCallout({ + numOfSolvableConflicts, + numOfNonSolvableConflicts, +}: RuleUpgradeCalloutProps): JSX.Element { + if (numOfNonSolvableConflicts > 0) { + return ( + <EuiCallOut + title={ + <> + <strong>{i18n.UPGRADE_STATUS}</strong> +   + <ActionRequiredBadge /> +   + {i18n.RULE_HAS_CONFLICTS(numOfNonSolvableConflicts + numOfSolvableConflicts)} + </> + } + color="danger" + size="s" + > + <p>{i18n.RULE_HAS_HARD_CONFLICTS_DESCRIPTION}</p> + </EuiCallOut> + ); + } + + if (numOfSolvableConflicts > 0) { + return ( + <EuiCallOut + title={ + <> + <strong>{i18n.UPGRADE_STATUS}</strong> +   + <ReviewRequiredBadge /> +   + {i18n.RULE_HAS_CONFLICTS(numOfSolvableConflicts)} + </> + } + color="warning" + size="s" + > + <p>{i18n.RULE_HAS_SOFT_CONFLICTS_DESCRIPTION}</p> + </EuiCallOut> + ); + } + + return ( + <EuiCallOut + title={ + <> + <strong>{i18n.UPGRADE_STATUS}</strong> +   + <ReadyForUpgradeBadge /> + </> + } + color="success" + size="s" + > + <p>{i18n.RULE_IS_READY_FOR_UPGRADE_DESCRIPTION}</p> + </EuiCallOut> + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_info_bar.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade_info_bar.tsx similarity index 70% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_info_bar.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade_info_bar.tsx index 970f04f383274..3520734b2b257 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/components/rule_upgrade_info_bar.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/rule_upgrade_info_bar.tsx @@ -6,7 +6,6 @@ */ import React from 'react'; -import type { RuleUpgradeState } from '../../../../model/prebuilt_rule_upgrade'; import { UtilityBar, UtilityBarGroup, @@ -15,17 +14,25 @@ import { } from '../../../../../../common/components/utility_bar'; import * as i18n from './translations'; -interface UpgradeInfoBarProps { - ruleUpgradeState: RuleUpgradeState; +interface RuleUpgradeInfoBarProps { + totalNumOfFields: number; + numOfFieldsWithUpdates: number; + numOfConflicts: number; } -export function RuleUpgradeInfoBar({ ruleUpgradeState }: UpgradeInfoBarProps): JSX.Element { - const numOfFieldsWithUpdates = ruleUpgradeState.diff.num_fields_with_updates; - const numOfConflicts = ruleUpgradeState.diff.num_fields_with_conflicts; - +export function RuleUpgradeInfoBar({ + totalNumOfFields, + numOfFieldsWithUpdates, + numOfConflicts, +}: RuleUpgradeInfoBarProps): JSX.Element { return ( <UtilityBar> <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText dataTestSubj="showingRules"> + {i18n.TOTAL_NUM_OF_FIELDS(totalNumOfFields)} + </UtilityBarText> + </UtilityBarGroup> <UtilityBarGroup> <UtilityBarText dataTestSubj="showingRules"> {i18n.NUM_OF_FIELDS_WITH_UPDATES(numOfFieldsWithUpdates)} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/translations.tsx new file mode 100644 index 0000000000000..4a73f096a271c --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/translations.tsx @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useKibana } from '../../../../../../common/lib/kibana/kibana_react'; + +export const TOTAL_NUM_OF_FIELDS = (count: number) => ( + <FormattedMessage + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.totalNumOfFieldsWithUpdates" + defaultMessage="{countValue} {count, plural, one {field} other {fields}} for review" + values={{ countValue: <strong>{count}</strong>, count }} + /> +); + +export const NUM_OF_FIELDS_WITH_UPDATES = (count: number) => ( + <FormattedMessage + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.numOfFieldsWithUpdates" + defaultMessage="{countValue} {count, plural, one {field} other {fields}} in Elastic update" + values={{ countValue: <strong>{count}</strong>, count }} + /> +); + +export const NUM_OF_CONFLICTS = (count: number) => ( + <FormattedMessage + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.diffTab.numOfConflicts" + defaultMessage="{countValue} {count, plural, one {conflict} other {conflicts}}" + values={{ countValue: <strong>{count}</strong>, count }} + /> +); + +const UPGRADE_RULES_DOCS_LINK = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.updateYourRulesDocsLink', + { + defaultMessage: 'update your rules', + } +); + +export function RuleUpgradeHelper(): JSX.Element { + const { + docLinks: { + links: { + securitySolution: { manageDetectionRules }, + }, + }, + } = useKibana().services; + const manageDetectionRulesUpdateRulesSection = `${manageDetectionRules}#edit-rules-settings`; + + return ( + <FormattedMessage + id="xpack.securitySolution.detectionEngine.rules.upgradeRules.ruleUpgradeHelper" + defaultMessage="Understand how to {docsLink}." + values={{ + docsLink: ( + <EuiLink href={manageDetectionRulesUpdateRulesSection} target="_blank"> + {UPGRADE_RULES_DOCS_LINK} + </EuiLink> + ), + }} + /> + ); +} + +export const UPGRADE_STATUS = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.upgradeStatusTitle', + { + defaultMessage: 'Update status:', + } +); + +export const RULE_HAS_CONFLICTS = (count: number) => + i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasConflicts', + { + values: { count }, + defaultMessage: + '{count} {count, plural, one {field has a conflict} other {fields have conflicts}}. Please review and provide a final update.', + } + ); + +export const RULE_HAS_SOFT_CONFLICTS_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasSoftConflictsDescription', + { + defaultMessage: + 'Please review and accept conflicts. You can also keep the current version without the updates, or accept the Elastic update but lose your modifications.', + } +); + +export const RULE_HAS_HARD_CONFLICTS_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleHasHardConflictsDescription', + { + defaultMessage: + 'Please provide an input for the conflicts. You can also keep the current version without the updates, or accept the Elastic update but lose your modifications.', + } +); + +export const RULE_IS_READY_FOR_UPGRADE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.ruleIsReadyForUpgradeDescription', + { + defaultMessage: 'There are no conflicts and the update is ready to be applied.', + } +); + +export const FIELD_MODIFIED_BADGE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.upgradeFlyout.fieldModifiedBadgeDescription', + { + defaultMessage: 'The field value was edited and differs from the stock value', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade_conflicts_resolver_tab.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade_conflicts_resolver_tab.tsx deleted file mode 100644 index 95fa407fb7ca2..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade_conflicts_resolver_tab.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiSpacer } from '@elastic/eui'; -import type { - RuleUpgradeState, - SetRuleFieldResolvedValueFn, -} from '../../../model/prebuilt_rule_upgrade'; -import { RuleUpgradeInfoBar } from './components/rule_upgrade_info_bar'; -import { RuleUpgradeConflictsResolver } from './components/rule_upgrade_conflicts_resolver'; -import { DiffableRuleContextProvider } from './diffable_rule_context'; -import { RuleUpgradeCallout } from './components/rule_upgrade_callout'; - -interface RuleUpgradeConflictsResolverTabProps { - ruleUpgradeState: RuleUpgradeState; - setRuleFieldResolvedValue: SetRuleFieldResolvedValueFn; -} - -export function RuleUpgradeConflictsResolverTab({ - ruleUpgradeState, - setRuleFieldResolvedValue, -}: RuleUpgradeConflictsResolverTabProps): JSX.Element { - return ( - <DiffableRuleContextProvider - finalDiffableRule={ruleUpgradeState.finalRule} - setRuleFieldResolvedValue={setRuleFieldResolvedValue} - > - <EuiSpacer size="s" /> - <RuleUpgradeInfoBar ruleUpgradeState={ruleUpgradeState} /> - <EuiSpacer size="s" /> - <RuleUpgradeCallout ruleUpgradeState={ruleUpgradeState} /> - <EuiSpacer size="s" /> - <RuleUpgradeConflictsResolver ruleUpgradeState={ruleUpgradeState} /> - </DiffableRuleContextProvider> - ); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/translations.ts deleted file mode 100644 index ced733d87ff6e..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/translations.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const CANCEL_BUTTON_LABEL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.cancelButtonLabel', - { - defaultMessage: 'Cancel', - } -); - -export const SAVE_BUTTON_LABEL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.saveButtonLabel', - { - defaultMessage: 'Save', - } -); - -export const EDIT_BUTTON_LABEL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.editButtonLabel', - { - defaultMessage: 'Edit', - } -); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/translations.ts deleted file mode 100644 index 15699edc206e7..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/versions_picker/translations.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const BASE_VS_TARGET = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsTargetLabel', - { - defaultMessage: 'Base vs Target', - } -); - -export const BASE_VS_CURRENT = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsCurrentLabel', - { - defaultMessage: 'Base vs Current', - } -); - -export const BASE_VS_FINAL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.baseVsFinalLabel', - { - defaultMessage: 'Base vs Final', - } -); - -export const CURRENT_VS_TARGET = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsTargetLabel', - { - defaultMessage: 'Current vs Target', - } -); - -export const CURRENT_VS_FINAL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.currentVsFinalLabel', - { - defaultMessage: 'Current vs Final', - } -); - -export const TARGET_VS_FINAL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.targetVsFinalLabel', - { - defaultMessage: 'Target vs Final', - } -); - -export const VERSION_PICKER_ARIA_LABEL = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versionsPicker.ariaLabel', - { - defaultMessage: 'Select versions to compare', - } -); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts similarity index 80% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts index ae2d8799c0bd4..0fd522403edc6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts @@ -5,7 +5,9 @@ * 2.0. */ -export enum FieldUpgradeState { +export enum FieldUpgradeStateEnum { + NoUpdate = 'NO_UPDATE', + NoConflict = 'NO_CONFLICT', Accepted = 'ACCEPTED', SolvableConflict = 'SOLVABLE_CONFLICT', NonSolvableConflict = 'NON_SOLVABLE_CONFLICT', diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/fields_upgrade_state.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/fields_upgrade_state.ts index fb18061067ff8..88522bf559050 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/fields_upgrade_state.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/fields_upgrade_state.ts @@ -5,6 +5,16 @@ * 2.0. */ -import type { FieldUpgradeState } from './field_upgrade_state'; +import type { DiffableAllFields } from '../../../../../common/api/detection_engine'; +import type { FieldUpgradeStateEnum } from './field_upgrade_state_enum'; -export type FieldsUpgradeState = Record<string, FieldUpgradeState>; +export type FieldsUpgradeState = Record< + string, + | { + state: Exclude<FieldUpgradeStateEnum, FieldUpgradeStateEnum.Accepted>; + } + | { + state: FieldUpgradeStateEnum.Accepted; + resolvedValue: DiffableAllFields[keyof DiffableAllFields]; + } +>; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/index.ts index 57ee30f308f08..0e5a631fde2e2 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/index.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -export * from './field_upgrade_state'; +export * from './field_upgrade_state_enum'; export * from './fields_upgrade_state'; export * from './rule_upgrade_state'; export * from './rules_upgrade_state'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/rule_upgrade_state.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/rule_upgrade_state.ts index 0c72361bb29dc..7cd1f9c9ef843 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/rule_upgrade_state.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/rule_upgrade_state.ts @@ -5,23 +5,16 @@ * 2.0. */ -import { - type DiffableRule, - type RuleUpgradeInfoForReview, -} from '../../../../../common/api/detection_engine'; +import { type RuleUpgradeInfoForReview } from '../../../../../common/api/detection_engine'; import type { FieldsUpgradeState } from './fields_upgrade_state'; export interface RuleUpgradeState extends RuleUpgradeInfoForReview { /** - * Rule containing desired values users expect to see in the upgraded rule. + * Stores a record of customizable field names mapped to field upgrade state. */ - finalRule: DiffableRule; + fieldsUpgradeState: FieldsUpgradeState; /** * Indicates whether there are conflicts blocking rule upgrading. */ hasUnresolvedConflicts: boolean; - /** - * Stores a record of field names mapped to field upgrade state. - */ - fieldsUpgradeState: FieldsUpgradeState; } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/use_add_prebuilt_rules_table_columns.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/use_add_prebuilt_rules_table_columns.tsx index a0a317e72b4c2..4e15de4011fab 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/use_add_prebuilt_rules_table_columns.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/use_add_prebuilt_rules_table_columns.tsx @@ -55,7 +55,7 @@ export const RULE_NAME_COLUMN: TableColumn = { field: 'name', name: i18n.COLUMN_RULE, render: (value: RuleResponse['name'], rule: RuleResponse) => ( - <RuleName name={value} ruleId={rule.id} /> + <RuleName name={value} ruleId={rule.rule_id} /> ), sortable: true, truncateText: true, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/rule_type_change_callout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/rule_type_change_callout.tsx index f66fd92a685fe..0111ceb40d38f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/rule_type_change_callout.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/rule_type_change_callout.tsx @@ -5,17 +5,28 @@ * 2.0. */ -import { EuiCallOut } from '@elastic/eui'; import React from 'react'; +import { EuiCallOut } from '@elastic/eui'; import { RULE_TYPE_CHANGE_CALLOUT_DESCRIPTION, RULE_TYPE_CHANGE_CALLOUT_TITLE, + RULE_TYPE_CHANGE_WITH_CUSTOMIZATIONS_CALLOUT_DESCRIPTION, } from './translations'; -export const RuleTypeChangeCallout = () => { +interface RuleTypeChangeCalloutProps { + hasCustomizations: boolean; +} + +export function RuleTypeChangeCallout({ + hasCustomizations, +}: RuleTypeChangeCalloutProps): JSX.Element { return ( <EuiCallOut title={RULE_TYPE_CHANGE_CALLOUT_TITLE} color="danger" iconType="warning"> - <p>{RULE_TYPE_CHANGE_CALLOUT_DESCRIPTION}</p> + <p> + {hasCustomizations + ? RULE_TYPE_CHANGE_WITH_CUSTOMIZATIONS_CALLOUT_DESCRIPTION + : RULE_TYPE_CHANGE_CALLOUT_DESCRIPTION} + </p> </EuiCallOut> ); -}; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.tsx similarity index 68% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.tsx index 9a07c1bb6908a..4b9f79e061ce9 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.tsx @@ -5,7 +5,10 @@ * 2.0. */ +import React from 'react'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import type { ReactNode } from 'react'; export const UPDATE_ALL = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.upgradeRules.upgradeAll', @@ -88,8 +91,51 @@ export const RULE_TYPE_CHANGE_CALLOUT_TITLE = i18n.translate( export const RULE_TYPE_CHANGE_CALLOUT_DESCRIPTION = i18n.translate( 'xpack.securitySolution.detectionEngine.upgradeRules.ruleTypeChangeCalloutDescription', + { + defaultMessage: 'Elastic update has rule type changed.', + } +); + +export const RULE_TYPE_CHANGE_WITH_CUSTOMIZATIONS_CALLOUT_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.upgradeRules.ruleTypeChangeWithCustomizationCalloutDescription', { defaultMessage: 'Your customization will be lost at update. Please take note of your customization or clone this rule before updating.', } ); + +export const LAST_UPDATE = i18n.translate( + 'xpack.securitySolution.detectionEngine.upgradeFlyout.header.lastUpdate', + { + defaultMessage: 'Last update', + } +); + +export const UPDATED_BY_AND_WHEN = (updatedBy: ReactNode, updatedAt: ReactNode) => ( + <FormattedMessage + id="xpack.securitySolution.detectionEngine.upgradeFlyout.header.updated" + defaultMessage="{updatedBy} on {updatedAt}" + values={{ updatedBy, updatedAt }} + /> +); + +export const SEVERITY = i18n.translate( + 'xpack.securitySolution.detectionEngine.upgradeFlyout.header.severity', + { + defaultMessage: 'Severity', + } +); + +export const FIELD_UPDATES = i18n.translate( + 'xpack.securitySolution.detectionEngine.upgradeFlyout.header.fieldUpdates', + { + defaultMessage: 'Field updates', + } +); + +export const RULE_MODIFIED_BADGE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.upgradeFlyout.ruleModifiedBadgeDescription', + { + defaultMessage: 'The rule was edited and field values differs from the stock values', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_flyout_subheader.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_flyout_subheader.tsx new file mode 100644 index 0000000000000..bab43e55c2e00 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_flyout_subheader.tsx @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText } from '@elastic/eui'; +import { camelCase, startCase } from 'lodash'; +import type { FieldsDiff } from '../../../../../../common/api/detection_engine'; +import { FormattedDate } from '../../../../../common/components/formatted_date'; +import { SeverityBadge } from '../../../../../common/components/severity_badge'; +import { ModifiedBadge } from '../../../../rule_management/components/rule_details/three_way_diff/badges/modified_badge'; +import type { RuleUpgradeState } from '../../../../rule_management/model/prebuilt_rule_upgrade'; +import { fieldToDisplayNameMap } from '../../../../rule_management/components/rule_details/diff_components/translations'; +import * as i18n from './translations'; + +interface UpgradeFlyoutSubHeaderProps { + ruleUpgradeState: RuleUpgradeState; +} + +export const UpgradeFlyoutSubHeader = memo(function UpgradeFlyoutSubHeader({ + ruleUpgradeState, +}: UpgradeFlyoutSubHeaderProps): JSX.Element { + const lastUpdate = ( + <EuiText size="s"> + <strong> + {i18n.LAST_UPDATE} + {':'} + </strong>{' '} + {i18n.UPDATED_BY_AND_WHEN( + ruleUpgradeState.current_rule.updated_by, + <FormattedDate value={ruleUpgradeState.current_rule.updated_at} fieldName="" /> + )} + </EuiText> + ); + + const severity = ( + <EuiFlexGroup gutterSize="xs"> + <EuiText size="s"> + <strong> + {i18n.SEVERITY} + {':'} + </strong> + </EuiText> + <SeverityBadge value={ruleUpgradeState.target_rule.severity} /> + </EuiFlexGroup> + ); + + const customized = ruleUpgradeState.current_rule.rule_source.type === 'external' && + ruleUpgradeState.current_rule.rule_source.is_customized && ( + <ModifiedBadge tooltip={i18n.RULE_MODIFIED_BADGE_DESCRIPTION} /> + ); + + const fieldsDiff: FieldsDiff<Record<string, unknown>> = ruleUpgradeState.diff.fields; + const fieldsNamesWithUpdates = Object.keys(ruleUpgradeState.fieldsUpgradeState).filter( + (fieldName) => fieldsDiff[fieldName].has_update + ); + const fieldUpdates = !fieldsDiff.type && fieldsNamesWithUpdates.length > 0 && ( + <EuiText size="s"> + <strong> + {i18n.FIELD_UPDATES} + {':'} + </strong>{' '} + {fieldsNamesWithUpdates + .map((fieldName) => fieldToDisplayNameMap[fieldName] ?? startCase(camelCase(fieldName))) + .join(', ')} + </EuiText> + ); + + return ( + <> + <EuiFlexGroup alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>{lastUpdate}</EuiFlexItem> + <EuiFlexItem grow={false}>{severity}</EuiFlexItem> + </EuiFlexGroup> + <EuiSpacer size="xs" /> + <EuiFlexGroup alignItems="center" gutterSize="s"> + {customized && <EuiFlexItem grow={false}>{customized}</EuiFlexItem>} + <EuiFlexItem grow={false}>{fieldUpdates}</EuiFlexItem> + </EuiFlexGroup> + </> + ); +}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table.tsx index 2437a5e87866d..623f36c5ebb1d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table.tsx @@ -15,7 +15,7 @@ import { EuiSkeletonText, EuiSkeletonTitle, } from '@elastic/eui'; -import React, { useMemo, useState } from 'react'; +import React, { useState } from 'react'; import type { RuleUpgradeState } from '../../../../rule_management/model/prebuilt_rule_upgrade'; import * as i18n from '../../../../../detections/pages/detection_engine/rules/translations'; import { RULES_TABLE_INITIAL_PAGE_SIZE, RULES_TABLE_PAGE_SIZE_OPTIONS } from '../constants'; @@ -38,22 +38,17 @@ const NO_ITEMS_MESSAGE = ( * Table Component for displaying rules that have available updates */ export const UpgradePrebuiltRulesTable = React.memo(() => { - const upgradeRulesTableContext = useUpgradePrebuiltRulesTableContext(); - const [selected, setSelected] = useState<RuleUpgradeState[]>([]); - const { state: { - rulesUpgradeState, + ruleUpgradeStates, hasRulesToUpgrade, isLoading, isRefetching, isUpgradingSecurityPackages, }, - } = upgradeRulesTableContext; - const ruleUpgradeStatesArray = useMemo( - () => Object.values(rulesUpgradeState), - [rulesUpgradeState] - ); + } = useUpgradePrebuiltRulesTableContext(); + const [selected, setSelected] = useState<RuleUpgradeState[]>([]); + const rulesColumns = useUpgradePrebuiltRulesTableColumns(); const shouldShowProgress = isUpgradingSecurityPackages || isRefetching; @@ -102,7 +97,7 @@ export const UpgradePrebuiltRulesTable = React.memo(() => { </EuiFlexGroup> <EuiInMemoryTable - items={ruleUpgradeStatesArray} + items={ruleUpgradeStates} sorting pagination={{ initialPageSize: RULES_TABLE_INITIAL_PAGE_SIZE, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx index 8a1d201149654..8184481e25cc3 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx @@ -21,14 +21,14 @@ export const UpgradePrebuiltRulesTableButtons = ({ }: UpgradePrebuiltRulesTableButtonsProps) => { const { state: { - ruleUpgradeInfos, + ruleUpgradeStates, hasRulesToUpgrade, loadingRules, isRefetching, isUpgradingSecurityPackages, isPrebuiltRulesCustomizationEnabled, }, - actions: { upgradeRules }, + actions: { upgradeRules, upgradeAllRules }, } = useUpgradePrebuiltRulesTableContext(); const [{ loading: isUserDataLoading, canUserCRUD }] = useUserData(); const canUserEditRules = canUserCRUD && !isUserDataLoading; @@ -38,10 +38,13 @@ export const UpgradePrebuiltRulesTableButtons = ({ const isRuleUpgrading = loadingRules.length > 0; const isRequestInProgress = isRuleUpgrading || isRefetching || isUpgradingSecurityPackages; + const doAllSelectedRulesHaveConflicts = - isPrebuiltRulesCustomizationEnabled && isAllRuleHaveConflicts(selectedRules); + isPrebuiltRulesCustomizationEnabled && + selectedRules.every(({ hasUnresolvedConflicts }) => hasUnresolvedConflicts); const doAllRulesHaveConflicts = - isPrebuiltRulesCustomizationEnabled && isAllRuleHaveConflicts(ruleUpgradeInfos); + isPrebuiltRulesCustomizationEnabled && + ruleUpgradeStates.every(({ hasUnresolvedConflicts }) => hasUnresolvedConflicts); const { selectedRulesButtonTooltip, allRulesButtonTooltip } = useBulkUpdateButtonsTooltipContent({ canUserEditRules, @@ -55,12 +58,6 @@ export const UpgradePrebuiltRulesTableButtons = ({ [selectedRules, upgradeRules] ); - const upgradeAllRules = useCallback( - // Upgrade all rules, ignoring filter and selection - () => upgradeRules(ruleUpgradeInfos.map((rule) => rule.rule_id)), - [ruleUpgradeInfos, upgradeRules] - ); - return ( <EuiFlexGroup alignItems="center" gutterSize="s" responsive={false} wrap={true}> {shouldDisplayUpgradeSelectedRulesButton ? ( @@ -146,7 +143,3 @@ const useBulkUpdateButtonsTooltipContent = ({ allRulesButtonTooltip: undefined, }; }; - -function isAllRuleHaveConflicts(rules: Array<{ diff: { num_fields_with_conflicts: number } }>) { - return rules.every((rule) => rule.diff.num_fields_with_conflicts > 0); -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx index 6aad29f8b5792..751b24f865e61 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx @@ -10,49 +10,40 @@ import type { Dispatch, SetStateAction } from 'react'; import React, { createContext, useCallback, useContext, useMemo, useState } from 'react'; import type { RuleFieldsToUpgrade, - RuleUpgradeInfoForReview, RuleUpgradeSpecifier, } from '../../../../../../common/api/detection_engine'; +import { useIsPrebuiltRulesCustomizationEnabled } from '../../../../rule_management/hooks/use_is_prebuilt_rules_customization_enabled'; +import { useAppToasts } from '../../../../../common/hooks/use_app_toasts'; +import type { RuleUpgradeState } from '../../../../rule_management/model/prebuilt_rule_upgrade'; +import { RuleUpgradeTab } from '../../../../rule_management/components/rule_details/three_way_diff'; +import { PerFieldRuleDiffTab } from '../../../../rule_management/components/rule_details/per_field_rule_diff_tab'; +import { useIsUpgradingSecurityPackages } from '../../../../rule_management/logic/use_upgrade_security_packages'; import type { RuleResponse, RuleSignatureId, } from '../../../../../../common/api/detection_engine/model/rule_schema'; import { invariant } from '../../../../../../common/utils/invariant'; -import { useAppToasts } from '../../../../../common/hooks/use_app_toasts'; -import { PerFieldRuleDiffTab } from '../../../../rule_management/components/rule_details/per_field_rule_diff_tab'; import { TabContentPadding } from '../../../../rule_management/components/rule_details/rule_details_flyout'; -import { RuleDiffTab } from '../../../../rule_management/components/rule_details/rule_diff_tab'; -import { RuleUpgradeConflictsResolverTab } from '../../../../rule_management/components/rule_details/three_way_diff/rule_upgrade_conflicts_resolver_tab'; -import * as ruleDetailsI18n from '../../../../rule_management/components/rule_details/translations'; -import { useIsPrebuiltRulesCustomizationEnabled } from '../../../../rule_management/hooks/use_is_prebuilt_rules_customization_enabled'; import { usePerformUpgradeSpecificRules } from '../../../../rule_management/logic/prebuilt_rules/use_perform_rule_upgrade'; import { usePrebuiltRulesUpgradeReview } from '../../../../rule_management/logic/prebuilt_rules/use_prebuilt_rules_upgrade_review'; -import { useIsUpgradingSecurityPackages } from '../../../../rule_management/logic/use_upgrade_security_packages'; -import type { - RuleUpgradeState, - RulesUpgradeState, -} from '../../../../rule_management/model/prebuilt_rule_upgrade'; -import { FieldUpgradeState } from '../../../../rule_management/model/prebuilt_rule_upgrade/field_upgrade_state'; -import { isNonUpgradeableFieldName } from '../../../../rule_management/model/prebuilt_rule_upgrade/fields'; +import { RuleDiffTab } from '../../../../rule_management/components/rule_details/rule_diff_tab'; +import { FieldUpgradeStateEnum } from '../../../../rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum'; import { useRulePreviewFlyout } from '../use_rule_preview_flyout'; -import { MlJobUpgradeModal } from './modals/ml_job_upgrade_modal'; -import { UpgradeConflictsModal } from './modals/upgrade_conflicts_modal'; -import * as i18n from './translations'; import type { UpgradePrebuiltRulesTableFilterOptions } from './use_filter_prebuilt_rules_to_upgrade'; import { useFilterPrebuiltRulesToUpgrade } from './use_filter_prebuilt_rules_to_upgrade'; import { usePrebuiltRulesUpgradeState } from './use_prebuilt_rules_upgrade_state'; -import { useMlJobUpgradeModal, useUpgradeConflictsModal } from './use_upgrade_modals'; +import { useOutdatedMlJobsUpgradeModal } from './use_ml_jobs_upgrade_modal'; +import { useUpgradeWithConflictsModal } from './use_upgrade_with_conflicts_modal'; import { RuleTypeChangeCallout } from './rule_type_change_callout'; +import { UpgradeFlyoutSubHeader } from './upgrade_flyout_subheader'; +import * as ruleDetailsI18n from '../../../../rule_management/components/rule_details/translations'; +import * as i18n from './translations'; export interface UpgradePrebuiltRulesTableState { - /** - * Rule upgrade state (all rules available for upgrade) - */ - ruleUpgradeInfos: RuleUpgradeInfoForReview[]; /** * Rule upgrade state after applying `filterOptions` */ - rulesUpgradeState: RulesUpgradeState; + ruleUpgradeStates: RuleUpgradeState[]; /** * Currently selected table filter */ @@ -101,6 +92,7 @@ export const PREBUILT_RULE_UPDATE_FLYOUT_ANCHOR = 'updatePrebuiltRulePreview'; export interface UpgradePrebuiltRulesTableActions { reFetchRules: () => void; upgradeRules: (ruleIds: RuleSignatureId[]) => void; + upgradeAllRules: () => void; setFilterOptions: Dispatch<SetStateAction<UpgradePrebuiltRulesTableFilterOptions>>; openRulePreview: (ruleId: string) => void; } @@ -146,28 +138,20 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ refetchInterval: false, // Disable automatic refetching since request is expensive keepPreviousData: true, // Use this option so that the state doesn't jump between "success" and "loading" on page change }); - const filteredRuleUpgradeInfos = useFilterPrebuiltRulesToUpgrade({ + const { rulesUpgradeState, setRuleFieldResolvedValue } = + usePrebuiltRulesUpgradeState(ruleUpgradeInfos); + const ruleUpgradeStates = useMemo(() => Object.values(rulesUpgradeState), [rulesUpgradeState]); + const filteredRuleUpgradeStates = useFilterPrebuiltRulesToUpgrade({ filterOptions, - rules: ruleUpgradeInfos, + data: ruleUpgradeStates, }); - const { rulesUpgradeState, setRuleFieldResolvedValue } = - usePrebuiltRulesUpgradeState(filteredRuleUpgradeInfos); const { - isVisible: isLegacyMLJobsModalVisible, - legacyJobsInstalled, + modal: confirmLegacyMlJobsUpgradeModal, confirmLegacyMLJobs, - handleConfirm: handleLegacyMLJobsConfirm, - handleCancel: handleLegacyMLJobsCancel, - loadingJobs, - } = useMlJobUpgradeModal(); - - const { - isVisible: isConflictsModalVisible, - confirmConflictsUpgrade, - handleConfirm: handleConflictsConfirm, - handleCancel: handleConflictsCancel, - } = useUpgradeConflictsModal(); + isLoading: areMlJobsLoading, + } = useOutdatedMlJobsUpgradeModal(); + const { modal: upgradeConflictsModal, confirmConflictsUpgrade } = useUpgradeWithConflictsModal(); const { mutateAsync: upgradeSpecificRulesRequest } = usePerformUpgradeSpecificRules(); @@ -263,6 +247,19 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ [isPrebuiltRulesCustomizationEnabled, upgradeRulesToResolved, upgradeRulesToTarget] ); + const upgradeAllRules = useCallback( + // Upgrade all rules, ignoring filter and selection + () => upgradeRules(ruleUpgradeInfos.map((rule) => rule.rule_id)), + [ruleUpgradeInfos, upgradeRules] + ); + + const subHeaderFactory = useCallback( + (rule: RuleResponse) => + rulesUpgradeState[rule.rule_id] ? ( + <UpgradeFlyoutSubHeader ruleUpgradeState={rulesUpgradeState[rule.rule_id]} /> + ) : null, + [rulesUpgradeState] + ); const ruleActionsFactory = useCallback( (rule: RuleResponse, closeRulePreview: () => void) => { const ruleUpgradeState = rulesUpgradeState[rule.rule_id]; @@ -313,11 +310,19 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ } const hasRuleTypeChange = ruleUpgradeState.diff.fields.type?.has_update ?? false; + const hasCustomizations = + ruleUpgradeState.current_rule.rule_source.type === 'external' && + ruleUpgradeState.current_rule.rule_source.is_customized; const shouldShowRuleTypeChangeCallout = hasRuleTypeChange && isPrebuiltRulesCustomizationEnabled; + let updateTabContent = ( <PerFieldRuleDiffTab - header={shouldShowRuleTypeChangeCallout ? <RuleTypeChangeCallout /> : null} + header={ + shouldShowRuleTypeChangeCallout && ( + <RuleTypeChangeCallout hasCustomizations={hasCustomizations} /> + ) + } ruleDiff={ruleUpgradeState.diff} /> ); @@ -327,7 +332,7 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ // conflicts, only accept the target rule. if (isPrebuiltRulesCustomizationEnabled && !hasRuleTypeChange) { updateTabContent = ( - <RuleUpgradeConflictsResolverTab + <RuleUpgradeTab ruleUpgradeState={ruleUpgradeState} setRuleFieldResolvedValue={setRuleFieldResolvedValue} /> @@ -352,12 +357,12 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ </EuiToolTip> ), content: ( - <TabContentPadding> + <div> <RuleDiffTab oldRule={ruleUpgradeState.current_rule} newRule={ruleUpgradeState.target_rule} /> - </TabContentPadding> + </div> ), }; @@ -366,11 +371,12 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ [rulesUpgradeState, setRuleFieldResolvedValue, isPrebuiltRulesCustomizationEnabled] ); const filteredRules = useMemo( - () => filteredRuleUpgradeInfos.map((rule) => rule.target_rule), - [filteredRuleUpgradeInfos] + () => filteredRuleUpgradeStates.map(({ target_rule: targetRule }) => targetRule), + [filteredRuleUpgradeStates] ); const { rulePreviewFlyout, openRulePreview } = useRulePreviewFlyout({ rules: filteredRules, + subHeaderFactory, ruleActionsFactory, extraTabsFactory, flyoutProps: { @@ -383,22 +389,22 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ () => ({ reFetchRules: refetch, upgradeRules, + upgradeAllRules, setFilterOptions, openRulePreview, }), - [refetch, upgradeRules, openRulePreview] + [refetch, upgradeRules, upgradeAllRules, openRulePreview] ); - const providerValue = useMemo<UpgradePrebuiltRulesContextType>(() => { - return { + const providerValue = useMemo<UpgradePrebuiltRulesContextType>( + () => ({ state: { - ruleUpgradeInfos, - rulesUpgradeState, + ruleUpgradeStates: filteredRuleUpgradeStates, hasRulesToUpgrade: isFetched && ruleUpgradeInfos.length > 0, filterOptions, tags, isFetched, - isLoading: isLoading || loadingJobs, + isLoading: isLoading || areMlJobsLoading, isRefetching, isUpgradingSecurityPackages, loadingRules, @@ -406,39 +412,29 @@ export const UpgradePrebuiltRulesTableContextProvider = ({ isPrebuiltRulesCustomizationEnabled, }, actions, - }; - }, [ - ruleUpgradeInfos, - rulesUpgradeState, - filterOptions, - tags, - isFetched, - isLoading, - loadingJobs, - isRefetching, - isUpgradingSecurityPackages, - loadingRules, - dataUpdatedAt, - actions, - isPrebuiltRulesCustomizationEnabled, - ]); + }), + [ + ruleUpgradeInfos.length, + filteredRuleUpgradeStates, + filterOptions, + tags, + isFetched, + isLoading, + areMlJobsLoading, + isRefetching, + isUpgradingSecurityPackages, + loadingRules, + dataUpdatedAt, + actions, + isPrebuiltRulesCustomizationEnabled, + ] + ); return ( <UpgradePrebuiltRulesTableContext.Provider value={providerValue}> <> - {isLegacyMLJobsModalVisible && ( - <MlJobUpgradeModal - jobs={legacyJobsInstalled} - onCancel={handleLegacyMLJobsCancel} - onConfirm={handleLegacyMLJobsConfirm} - /> - )} - {isConflictsModalVisible && ( - <UpgradeConflictsModal - onCancel={handleConflictsCancel} - onConfirm={handleConflictsConfirm} - /> - )} + {confirmLegacyMlJobsUpgradeModal} + {upgradeConflictsModal} {children} {rulePreviewFlyout} </> @@ -457,21 +453,15 @@ export const useUpgradePrebuiltRulesTableContext = (): UpgradePrebuiltRulesConte }; function constructRuleFieldsToUpgrade(ruleUpgradeState: RuleUpgradeState): RuleFieldsToUpgrade { - const finalRule = ruleUpgradeState.finalRule as Record<string, unknown>; const ruleFieldsToUpgrade: Record<string, unknown> = {}; - for (const fieldName of Object.keys(ruleUpgradeState.fieldsUpgradeState)) { - const fieldUpgradeState = ruleUpgradeState.fieldsUpgradeState[fieldName]; - - if (!isNonUpgradeableFieldName(fieldName) && fieldUpgradeState === FieldUpgradeState.Accepted) { - invariant( - fieldName in finalRule, - `Ready to upgrade field "${fieldName}" is not found in final rule` - ); - + for (const [fieldName, fieldUpgradeState] of Object.entries( + ruleUpgradeState.fieldsUpgradeState + )) { + if (fieldUpgradeState.state === FieldUpgradeStateEnum.Accepted) { ruleFieldsToUpgrade[fieldName] = { pick_version: 'RESOLVED', - resolved_value: finalRule[fieldName], + resolved_value: fieldUpgradeState.resolvedValue, }; } } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_filter_prebuilt_rules_to_upgrade.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_filter_prebuilt_rules_to_upgrade.ts index b5a0e123d7510..a3dd45f8fabc0 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_filter_prebuilt_rules_to_upgrade.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_filter_prebuilt_rules_to_upgrade.ts @@ -6,7 +6,7 @@ */ import { useMemo } from 'react'; -import type { RuleUpgradeInfoForReview } from '../../../../../../common/api/detection_engine/prebuilt_rules'; +import type { RuleUpgradeState } from '../../../../rule_management/model/prebuilt_rule_upgrade'; import { RuleCustomizationEnum, type FilterOptions } from '../../../../rule_management/logic/types'; export type UpgradePrebuiltRulesTableFilterOptions = Pick< @@ -14,16 +14,19 @@ export type UpgradePrebuiltRulesTableFilterOptions = Pick< 'filter' | 'tags' | 'ruleSource' >; +interface UseFilterPrebuiltRulesToUpgradeParams { + data: RuleUpgradeState[]; + filterOptions: UpgradePrebuiltRulesTableFilterOptions; +} + export const useFilterPrebuiltRulesToUpgrade = ({ - rules, + data, filterOptions, -}: { - rules: RuleUpgradeInfoForReview[]; - filterOptions: UpgradePrebuiltRulesTableFilterOptions; -}) => { - const filteredRules = useMemo(() => { +}: UseFilterPrebuiltRulesToUpgradeParams): RuleUpgradeState[] => { + return useMemo(() => { const { filter, tags, ruleSource } = filterOptions; - return rules.filter((ruleInfo) => { + + return data.filter((ruleInfo) => { if (filter && !ruleInfo.current_rule.name.toLowerCase().includes(filter.toLowerCase())) { return false; } @@ -53,7 +56,5 @@ export const useFilterPrebuiltRulesToUpgrade = ({ return true; }); - }, [filterOptions, rules]); - - return filteredRules; + }, [filterOptions, data]); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/index.ts new file mode 100644 index 0000000000000..470224e90a547 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_ml_jobs_upgrade_modal'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/ml_job_upgrade_modal/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/ml_jobs_upgrade_modal.tsx similarity index 80% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/ml_job_upgrade_modal/index.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/ml_jobs_upgrade_modal.tsx index 84c0a5a579ba6..37d6a84728aea 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/ml_job_upgrade_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/ml_jobs_upgrade_modal.tsx @@ -5,9 +5,9 @@ * 2.0. */ +import React, { memo } from 'react'; import { EuiConfirmModal } from '@elastic/eui'; import type { MlSummaryJob } from '@kbn/ml-plugin/common'; -import React, { memo } from 'react'; import styled from 'styled-components'; import { rgba } from 'polished'; import * as i18n from './translations'; @@ -33,15 +33,17 @@ const JobsUL = styled.ul` } `; -export interface MlJobUpgradeModalProps { +interface OutdatedMlJobsUpgradeModalProps { jobs: MlSummaryJob[]; - onCancel: ( - event?: React.KeyboardEvent<HTMLDivElement> | React.MouseEvent<HTMLButtonElement> - ) => void; - onConfirm?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; + onCancel: () => void; + onConfirm: () => void; } -const MlJobUpgradeModalComponent = ({ jobs, onCancel, onConfirm }: MlJobUpgradeModalProps) => { +export const OutdatedMlJobsUpgradeModal = memo(function LegacyMlJobsUpgradeModal({ + jobs, + onCancel, + onConfirm, +}: OutdatedMlJobsUpgradeModalProps): JSX.Element { return ( <EuiConfirmModal title={i18n.ML_JOB_UPGRADE_MODAL_TITLE} @@ -61,6 +63,4 @@ const MlJobUpgradeModalComponent = ({ jobs, onCancel, onConfirm }: MlJobUpgradeM </JobsUL> </EuiConfirmModal> ); -}; - -export const MlJobUpgradeModal = memo(MlJobUpgradeModalComponent); +}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/ml_job_upgrade_modal/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/translations.tsx similarity index 95% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/ml_job_upgrade_modal/translations.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/translations.tsx index caf94e5c1a261..8250591de71cc 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/ml_job_upgrade_modal/translations.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/translations.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { MlJobCompatibilityLink } from '../../../../../../../common/components/links_to_docs'; +import { MlJobCompatibilityLink } from '../../../../../../common/components/links_to_docs'; export const ML_JOB_UPGRADE_MODAL_TITLE = i18n.translate( 'xpack.securitySolution.detectionEngine.mlJobUpgradeModal.messageTitle', diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/use_ml_jobs_upgrade_modal.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/use_ml_jobs_upgrade_modal.tsx new file mode 100644 index 0000000000000..cb4682f49a603 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_ml_jobs_upgrade_modal/use_ml_jobs_upgrade_modal.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ReactNode } from 'react'; +import React, { useCallback } from 'react'; +import { useBoolean } from '@kbn/react-hooks'; +import { useInstalledSecurityJobs } from '../../../../../../common/components/ml/hooks/use_installed_security_jobs'; +import { affectedJobIds } from '../../../../../../../common/machine_learning/affected_job_ids'; +import { useAsyncConfirmation } from '../../rules_table/use_async_confirmation'; +import { OutdatedMlJobsUpgradeModal } from './ml_jobs_upgrade_modal'; + +interface UseOutdatedMlJobsUpgradeModalResult { + modal: ReactNode; + isLoading: boolean; + confirmLegacyMLJobs: () => Promise<boolean>; +} + +export function useOutdatedMlJobsUpgradeModal(): UseOutdatedMlJobsUpgradeModalResult { + const [isVisible, { on: showModal, off: hideModal }] = useBoolean(false); + const { loading, jobs } = useInstalledSecurityJobs(); + const legacyJobsInstalled = jobs.filter((job) => affectedJobIds.includes(job.id)); + const [confirmLegacyMLJobs, confirm, cancel] = useAsyncConfirmation({ + onInit: showModal, + onFinish: hideModal, + }); + + const handleLegacyMLJobsConfirm = useCallback(async () => { + if (legacyJobsInstalled.length > 0) { + return confirmLegacyMLJobs(); + } + + return true; + }, [confirmLegacyMLJobs, legacyJobsInstalled]); + + return { + modal: isVisible && ( + <OutdatedMlJobsUpgradeModal jobs={jobs} onConfirm={confirm} onCancel={cancel} /> + ), + confirmLegacyMLJobs: handleLegacyMLJobsConfirm, + isLoading: loading, + }; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts index b50ca7da1849d..81d64b1b39945 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts @@ -12,16 +12,16 @@ import type { FieldsUpgradeState, SetRuleFieldResolvedValueFn, } from '../../../../rule_management/model/prebuilt_rule_upgrade'; -import { FieldUpgradeState } from '../../../../rule_management/model/prebuilt_rule_upgrade'; +import { FieldUpgradeStateEnum } from '../../../../rule_management/model/prebuilt_rule_upgrade'; import { type FieldsDiff, type DiffableAllFields, - type DiffableRule, type RuleUpgradeInfoForReview, ThreeWayDiffConflict, type RuleSignatureId, + NON_UPGRADEABLE_DIFFABLE_FIELDS, } from '../../../../../../common/api/detection_engine'; -import { convertRuleToDiffable } from '../../../../../../common/detection_engine/prebuilt_rules/diff/convert_rule_to_diffable'; +import { assertUnreachable } from '../../../../../../common/utility_types'; type RuleResolvedConflicts = Partial<DiffableAllFields>; type RulesResolvedConflicts = Record<RuleSignatureId, RuleResolvedConflicts>; @@ -54,21 +54,23 @@ export function usePrebuiltRulesUpgradeState( const state: RulesUpgradeState = {}; for (const ruleUpgradeInfo of ruleUpgradeInfos) { + const fieldsUpgradeState = calcFieldsState( + ruleUpgradeInfo.diff.fields, + rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} + ); + + const hasRuleTypeChange = Boolean(ruleUpgradeInfo.diff.fields.type); + const hasFieldConflicts = Object.values(fieldsUpgradeState).some( + ({ state: fieldState }) => + fieldState === FieldUpgradeStateEnum.SolvableConflict || + fieldState === FieldUpgradeStateEnum.NonSolvableConflict + ); + state[ruleUpgradeInfo.rule_id] = { ...ruleUpgradeInfo, - finalRule: calcFinalDiffableRule( - ruleUpgradeInfo, - rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} - ), - fieldsUpgradeState: calcFieldsState( - ruleUpgradeInfo.diff.fields, - rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} - ), + fieldsUpgradeState, hasUnresolvedConflicts: isPrebuiltRulesCustomizationEnabled - ? getUnacceptedConflictsCount( - ruleUpgradeInfo.diff.fields, - rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} - ) > 0 + ? hasRuleTypeChange || hasFieldConflicts : false, }; } @@ -82,76 +84,49 @@ export function usePrebuiltRulesUpgradeState( }; } -function calcFinalDiffableRule( - ruleUpgradeInfo: RuleUpgradeInfoForReview, - ruleResolvedConflicts: RuleResolvedConflicts -): DiffableRule { - return { - ...convertRuleToDiffable(ruleUpgradeInfo.target_rule), - ...convertRuleFieldsDiffToDiffable(ruleUpgradeInfo.diff.fields), - ...ruleResolvedConflicts, - } as DiffableRule; -} - -/** - * Assembles a `DiffableRule` from rule fields diff `merged_version`s. - */ -function convertRuleFieldsDiffToDiffable( - ruleFieldsDiff: FieldsDiff<Record<string, unknown>> -): Partial<DiffableRule> { - const mergeVersionRule: Record<string, unknown> = {}; - - for (const fieldName of Object.keys(ruleFieldsDiff)) { - mergeVersionRule[fieldName] = ruleFieldsDiff[fieldName].merged_version; - } - - return mergeVersionRule; -} +const NON_UPGRADEABLE_DIFFABLE_FIELDS_SET: Readonly<Set<string>> = new Set( + NON_UPGRADEABLE_DIFFABLE_FIELDS +); function calcFieldsState( - ruleFieldsDiff: FieldsDiff<Record<string, unknown>>, + fieldsDiff: FieldsDiff<Record<string, unknown>>, ruleResolvedConflicts: RuleResolvedConflicts ): FieldsUpgradeState { const fieldsState: FieldsUpgradeState = {}; - for (const fieldName of Object.keys(ruleFieldsDiff)) { - switch (ruleFieldsDiff[fieldName].conflict) { + for (const fieldName of Object.keys(fieldsDiff)) { + if (NON_UPGRADEABLE_DIFFABLE_FIELDS_SET.has(fieldName)) { + // eslint-disable-next-line no-continue + continue; + } + + const fieldDiff = fieldsDiff[fieldName]; + + switch (fieldDiff.conflict) { case ThreeWayDiffConflict.NONE: - fieldsState[fieldName] = FieldUpgradeState.Accepted; + fieldsState[fieldName] = { + state: fieldDiff.has_update + ? FieldUpgradeStateEnum.NoConflict + : FieldUpgradeStateEnum.NoUpdate, + }; break; case ThreeWayDiffConflict.SOLVABLE: - fieldsState[fieldName] = FieldUpgradeState.SolvableConflict; + fieldsState[fieldName] = { state: FieldUpgradeStateEnum.SolvableConflict }; break; case ThreeWayDiffConflict.NON_SOLVABLE: - fieldsState[fieldName] = FieldUpgradeState.NonSolvableConflict; + fieldsState[fieldName] = { state: FieldUpgradeStateEnum.NonSolvableConflict }; break; + + default: + assertUnreachable(fieldDiff.conflict); } } - for (const fieldName of Object.keys(ruleResolvedConflicts)) { - fieldsState[fieldName] = FieldUpgradeState.Accepted; + for (const [fieldName, resolvedValue] of Object.entries(ruleResolvedConflicts)) { + fieldsState[fieldName] = { state: FieldUpgradeStateEnum.Accepted, resolvedValue }; } return fieldsState; } - -function getUnacceptedConflictsCount( - ruleFieldsDiff: FieldsDiff<Record<string, unknown>>, - ruleResolvedConflicts: RuleResolvedConflicts -): number { - const fieldNames = Object.keys(ruleFieldsDiff); - const fieldNamesWithConflict = fieldNames.filter( - (fieldName) => ruleFieldsDiff[fieldName].conflict !== ThreeWayDiffConflict.NONE - ); - const fieldNamesWithConflictSet = new Set(fieldNamesWithConflict); - - for (const resolvedConflictField of Object.keys(ruleResolvedConflicts)) { - if (fieldNamesWithConflictSet.has(resolvedConflictField)) { - fieldNamesWithConflictSet.delete(resolvedConflictField); - } - } - - return fieldNamesWithConflictSet.size; -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_modals.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_modals.tsx deleted file mode 100644 index 256ccf47c194f..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_modals.tsx +++ /dev/null @@ -1,53 +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 { useCallback } from 'react'; -import { useInstalledSecurityJobs } from '../../../../../common/components/ml/hooks/use_installed_security_jobs'; -import { useBoolState } from '../../../../../common/hooks/use_bool_state'; -import { affectedJobIds } from '../../../../../../common/machine_learning/affected_job_ids'; -import { useAsyncConfirmation } from '../rules_table/use_async_confirmation'; - -export const useMlJobUpgradeModal = () => { - const [isVisible, showModal, hideModal] = useBoolState(false); - const { loading: loadingJobs, jobs } = useInstalledSecurityJobs(); - const legacyJobsInstalled = jobs.filter((job) => affectedJobIds.includes(job.id)); - const [confirmLegacyMLJobs, handleConfirm, handleCancel] = useAsyncConfirmation({ - onInit: showModal, - onFinish: hideModal, - }); - - const handleLegacyMLJobsConfirm = useCallback(async () => { - if (legacyJobsInstalled.length > 0) { - return confirmLegacyMLJobs(); - } - return true; - }, [confirmLegacyMLJobs, legacyJobsInstalled]); - - return { - isVisible, - legacyJobsInstalled, - confirmLegacyMLJobs: handleLegacyMLJobsConfirm, - handleConfirm, - handleCancel, - loadingJobs, - }; -}; - -export const useUpgradeConflictsModal = () => { - const [isVisible, showModal, hideModal] = useBoolState(false); - const [confirmConflictsUpgrade, handleConfirm, handleCancel] = useAsyncConfirmation({ - onInit: showModal, - onFinish: hideModal, - }); - - return { - isVisible, - confirmConflictsUpgrade, - handleConfirm, - handleCancel, - }; -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_prebuilt_rules_table_columns.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_prebuilt_rules_table_columns.tsx index c2b1f8e3dbe46..919664c100b2f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_prebuilt_rules_table_columns.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_prebuilt_rules_table_columns.tsx @@ -59,7 +59,7 @@ const RULE_NAME_COLUMN: TableColumn = { field: 'current_rule.name', name: i18n.COLUMN_RULE, render: (value: RuleUpgradeState['current_rule']['name'], ruleUpgradeState: RuleUpgradeState) => ( - <RuleName name={value} ruleId={ruleUpgradeState.id} /> + <RuleName name={value} ruleId={ruleUpgradeState.rule_id} /> ), sortable: true, truncateText: true, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/index.ts new file mode 100644 index 0000000000000..7a01864683869 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_upgrade_modal'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/upgrade_conflicts_modal/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/translations.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/upgrade_conflicts_modal/translations.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/translations.tsx diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/upgrade_conflicts_modal/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/upgrade_modal.tsx similarity index 63% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/upgrade_conflicts_modal/index.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/upgrade_modal.tsx index 0c664398c51f6..3374ae5c16b4d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/modals/upgrade_conflicts_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/upgrade_modal.tsx @@ -9,14 +9,15 @@ import { EuiConfirmModal, EuiText } from '@elastic/eui'; import React, { memo } from 'react'; import * as i18n from './translations'; -export interface UpgradeConflictsModalProps { - onCancel: ( - event?: React.KeyboardEvent<HTMLDivElement> | React.MouseEvent<HTMLButtonElement> - ) => void; - onConfirm?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; +interface UpgradeWithConflictsModalProps { + onCancel: () => void; + onConfirm: () => void; } -const UpgradeConflictsModalComponent = ({ onCancel, onConfirm }: UpgradeConflictsModalProps) => { +export const UpgradeWithConflictsModal = memo(function ConfirmUpgradeWithConflictsModal({ + onCancel, + onConfirm, +}: UpgradeWithConflictsModalProps): JSX.Element { return ( <EuiConfirmModal title={i18n.UPGRADE_CONFLICTS_MODAL_TITLE} @@ -26,11 +27,9 @@ const UpgradeConflictsModalComponent = ({ onCancel, onConfirm }: UpgradeConflict confirmButtonText={i18n.UPGRADE_CONFLICTS_MODAL_CONFIRM} buttonColor="primary" defaultFocusedButton="confirm" - data-test-subj="upgradeConflictsModal" + data-test-subj="confirmUpgradeWithConflictsModal" > <EuiText>{i18n.UPGRADE_CONFLICTS_MODAL_BODY}</EuiText> </EuiConfirmModal> ); -}; - -export const UpgradeConflictsModal = memo(UpgradeConflictsModalComponent); +}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/use_upgrade_modal.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/use_upgrade_modal.tsx new file mode 100644 index 0000000000000..0714ba458d34e --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_upgrade_with_conflicts_modal/use_upgrade_modal.tsx @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ReactNode } from 'react'; +import React from 'react'; +import { useBoolean } from '@kbn/react-hooks'; +import { useAsyncConfirmation } from '../../rules_table/use_async_confirmation'; +import { UpgradeWithConflictsModal } from './upgrade_modal'; + +interface UseUpgradeWithConflictsModalResult { + modal: ReactNode; + confirmConflictsUpgrade: () => Promise<boolean>; +} + +export function useUpgradeWithConflictsModal(): UseUpgradeWithConflictsModalResult { + const [isVisible, { on: showModal, off: hideModal }] = useBoolean(false); + const [confirmConflictsUpgrade, confirm, cancel] = useAsyncConfirmation({ + onInit: showModal, + onFinish: hideModal, + }); + + return { + modal: isVisible && <UpgradeWithConflictsModal onConfirm={confirm} onCancel={cancel} />, + confirmConflictsUpgrade, + }; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rule_preview_flyout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rule_preview_flyout.tsx index d6dcdd0592b85..0c16a5c6ed165 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rule_preview_flyout.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rule_preview_flyout.tsx @@ -17,6 +17,7 @@ interface UseRulePreviewFlyoutParams { rules: RuleResponse[]; ruleActionsFactory: (rule: RuleResponse, closeRulePreview: () => void) => ReactNode; extraTabsFactory?: (rule: RuleResponse) => EuiTabbedContentTab[]; + subHeaderFactory?: (rule: RuleResponse) => ReactNode; flyoutProps: RulePreviewFlyoutProps; } @@ -38,10 +39,15 @@ export function useRulePreviewFlyout({ rules, extraTabsFactory, ruleActionsFactory, + subHeaderFactory, flyoutProps, }: UseRulePreviewFlyoutParams): UseRulePreviewFlyoutResult { const [rule, setRuleForPreview] = useState<RuleResponse | undefined>(); const closeRulePreview = useCallback(() => setRuleForPreview(undefined), []); + const subHeader = useMemo( + () => (rule ? subHeaderFactory?.(rule) : null), + [subHeaderFactory, rule] + ); const ruleActions = useMemo( () => rule && ruleActionsFactory(rule, closeRulePreview), [rule, ruleActionsFactory, closeRulePreview] @@ -61,13 +67,14 @@ export function useRulePreviewFlyout({ closeFlyout={closeRulePreview} ruleActions={ruleActions} extraTabs={extraTabs} + subHeader={subHeader} /> ), openRulePreview: useCallback( (ruleId: RuleSignatureId) => { - const ruleToShowInFlyout = rules.find((x) => x.id === ruleId); + const ruleToShowInFlyout = rules.find((x) => x.rule_id === ruleId); - invariant(ruleToShowInFlyout, `Rule with id ${ruleId} not found`); + invariant(ruleToShowInFlyout, `Rule with rule_id ${ruleId} not found`); setRuleForPreview(ruleToShowInFlyout); }, [rules, setRuleForPreview] diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx index db1cd501bc3fc..48ae76514c288 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists/use_lists_config.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useKibana } from '../../../../common/lib/kibana'; import { useListsIndex } from './use_lists_index'; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts index 4aa8085fbf571..1ca42c446771c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts @@ -63,7 +63,9 @@ const clickArtifactTab = (tabId: string) => { cy.get(`#${tabId}`).click(); }; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/171644 +// Failing: See https://github.com/elastic/kibana/issues/203935 +describe.skip( 'Artifact tabs in Policy Details page', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts index b5c41d1e66faf..6ab7979c46086 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts @@ -35,7 +35,8 @@ const loginWithoutAccess = (url: string) => { loadPage(url); }; -describe('Artifacts pages', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/191914 +describe.skip('Artifacts pages', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { let endpointData: ReturnTypeFromChainable<typeof indexEndpointHosts> | undefined; before(() => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts index 0b010d2d60099..1a06697ad9752 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts @@ -38,7 +38,8 @@ const { clearMultiValueInput, } = blocklistFormSelectors; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203933 +describe.skip( 'Blocklist', { tags: ['@ess', '@serverless', '@serverlessQA'], diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts index af7310953e86e..1e9599afb9fee 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts @@ -18,7 +18,9 @@ import { login } from '../../tasks/login'; import type { ReturnTypeFromChainable } from '../../types'; // Skipped in Serverless MKI due to interactions with internal indices -describe('Event Filters', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/194135 +// Failing: See https://github.com/elastic/kibana/issues/194135 +describe.skip('Event Filters', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { let endpointData: ReturnTypeFromChainable<typeof indexEndpointHosts> | undefined; const CONDITION_VALUE = 'valuesAutocompleteMatch'; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/trusted_apps.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/trusted_apps.cy.ts index aef24ed4ce045..4b47fa234377a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/trusted_apps.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/trusted_apps.cy.ts @@ -35,7 +35,8 @@ const { expectFieldOptionsNotRendered, } = trustedAppsFormSelectors; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203929 +describe.skip( 'Trusted Apps', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'], // @skipInServerlessMKI until kibana is rebuilt after merge diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 86e07e65e83ae..065a48f7cb3c4 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -20,7 +20,8 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203921 +describe.skip( 'Automated Response Actions', { tags: ['@ess', '@serverless'], diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts index 84d160c2e492a..5ebb78faef5d0 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts @@ -12,7 +12,8 @@ import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts' import { login, ROLE } from '../../tasks/login'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/171640 +describe.skip( 'Response actions history page', { tags: [ diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts index a427413429b19..c27fa73dcfee5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts @@ -14,7 +14,9 @@ import type { ReturnTypeFromChainable } from '../../types'; import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts'; -describe('No License', { tags: '@ess', env: { ftrConfig: { license: 'basic' } } }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203917 +// Failing: See https://github.com/elastic/kibana/issues/203917 +describe.skip('No License', { tags: '@ess', env: { ftrConfig: { license: 'basic' } } }, () => { describe('User cannot use endpoint action in form', () => { const [ruleName, ruleDescription] = generateRandomStringName(2); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts index fa0c232498a4c..a582180d4931f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts @@ -14,7 +14,8 @@ import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts' import { login, ROLE } from '../../tasks/login'; -describe('Results', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/171665 +describe.skip('Results', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { let endpointData: ReturnTypeFromChainable<typeof indexEndpointHosts> | undefined; let alertData: ReturnTypeFromChainable<typeof indexEndpointRuleAlerts> | undefined; const [endpointAgentId, endpointHostname] = generateRandomStringName(2); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts index 12cdfcfa6e09c..2e9bbeb2a766a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts @@ -28,7 +28,8 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/168284 +describe.skip('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_mocked_data.cy.ts index 2235cd3df6832..dc0e35fb6a280 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_mocked_data.cy.ts @@ -13,7 +13,8 @@ import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { login } from '../../tasks/login'; import { loadPage } from '../../tasks/common'; -describe('Endpoints page', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/171639 +describe.skip('Endpoints page', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let endpointData: ReturnTypeFromChainable<typeof indexEndpointHosts>; before(() => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_rbac_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_rbac_mocked_data.cy.ts index 62786effd8303..f831cc24778f0 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_rbac_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints_rbac_mocked_data.cy.ts @@ -14,7 +14,8 @@ import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { login } from '../../tasks/login'; import { loadPage } from '../../tasks/common'; -describe('Endpoints RBAC', { tags: ['@ess'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203930 +describe.skip('Endpoints RBAC', { tags: ['@ess'] }, () => { type Privilege = 'all' | 'read' | 'none'; const PRIVILEGES: Privilege[] = ['none', 'read', 'all']; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts index ee6ff0951d11b..f3ee7e9dcf6c8 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts @@ -13,7 +13,8 @@ import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/e import { login } from '../../tasks/login'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203918 +describe.skip( 'Policy List', { tags: ['@ess', '@serverless', '@serverlessQA'], diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts index eed5970fbc9d0..c04db294c77cf 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts @@ -27,7 +27,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/179598 +describe.skip( 'Response console: From Alerts', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts index 2ff96b249cfdb..c1223c2f22d4c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170674 +describe.skip('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts index 64cc11e553538..de1f9524326f0 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts @@ -20,7 +20,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/169821 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts index c5d88ad5420b1..a7f600521e8f3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts @@ -29,7 +29,8 @@ import { indexNewCase } from '../../tasks/index_new_case'; import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts'; -describe('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/182459 +describe.skip('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { describe('from Manage', () => { let endpointData: ReturnTypeFromChainable<typeof indexEndpointHosts> | undefined; let isolatedEndpointData: ReturnTypeFromChainable<typeof indexEndpointHosts> | undefined; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts index dfd67d6854b63..93c6f0698a81a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts @@ -10,7 +10,8 @@ import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { login } from '../../tasks/login'; import { loadPage } from '../../tasks/common'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/172549 +describe.skip( 'Response actions history page', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts index d5f3bd7d956af..a95c935c4ca94 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170373 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts index ef252cbce01aa..94619aba2a8f7 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170424 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts index b08dcd0eea492..8b6ca1ed95e15 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts @@ -26,7 +26,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/173464 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts index a2b150bfad0c2..fc5a05cbc7770 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts @@ -28,6 +28,7 @@ const AGENT_BEAT_FILE_PATH_SUFFIX = '/components/agentbeat'; // FLAKY: https://github.com/elastic/kibana/issues/170370 // FLAKY: https://github.com/elastic/kibana/issues/170371 +// FLAKY: https://github.com/elastic/kibana/issues/170563 describe.skip('Response console', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { login(); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts index 4f45522a76ecf..dba28400b8edc 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts @@ -27,7 +27,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/172326 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/execute.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/execute.cy.ts index 5c7432129e43b..bf89837ae414a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/execute.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/execute.cy.ts @@ -17,7 +17,9 @@ import { import { interceptActionRequests, sendActionResponse } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203899 +// Failing: See https://github.com/elastic/kibana/issues/203899 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/get_file.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/get_file.cy.ts index 978b1e2cd37df..87d11f163c3f3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/get_file.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/get_file.cy.ts @@ -17,7 +17,8 @@ import { import { interceptActionRequests, sendActionResponse } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203905 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/isolate.cy.ts index 0afac2d5dc455..1d67a1dd5ebb6 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/isolate.cy.ts @@ -22,7 +22,8 @@ import { } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203896 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/kill_process.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/kill_process.cy.ts index 3c484d2a6fa7d..bbb527e38526a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/kill_process.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/kill_process.cy.ts @@ -17,7 +17,8 @@ import { import { interceptActionRequests, sendActionResponse } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203919 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/processes.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/processes.cy.ts index e4226aae4c395..d18dafba9126c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/processes.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/processes.cy.ts @@ -18,7 +18,8 @@ import { import { interceptActionRequests, sendActionResponse } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203907 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/release.cy.ts index f4c68a4fd0405..aa083545877ac 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/release.cy.ts @@ -22,7 +22,8 @@ import { } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/203904 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/suspend_process.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/suspend_process.cy.ts index b5ef08feb8075..544d13e1ab081 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/suspend_process.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked/suspend_process.cy.ts @@ -17,7 +17,8 @@ import { import { interceptActionRequests, sendActionResponse } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/180388 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/endpoint_list_with_security_essentials.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/endpoint_list_with_security_essentials.cy.ts index d82bde7f0426c..2c79cff9fede3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/endpoint_list_with_security_essentials.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/endpoint_list_with_security_essentials.cy.ts @@ -15,7 +15,8 @@ import { visitEndpointList, } from '../../screens'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/171643 +describe.skip( 'When on the Endpoint List in Security Essentials PLI', { tags: ['@serverless', '@skipInServerlessMKI'], diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts index ca3d0b9f6c1a1..727597cdc4583 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts @@ -30,7 +30,8 @@ import { visitPolicyList, } from '../../../screens'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170052 +describe.skip( 'User Roles for Security Complete PLI with Endpoint Complete addon', { tags: ['@serverless', '@skipInServerlessMKI'], diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts index 674ede811fc77..0be9b83fe32fc 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts @@ -20,7 +20,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203913 +describe.skip( 'Unenroll agent from fleet with agent tamper protection is disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts index 6f82d9c98a0cf..819506722f8b5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203911 +describe.skip( 'Uninstall agent from host when agent tamper protection is disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts index 0915cd578adc1..48f9a59a26015 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts @@ -20,7 +20,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/182451 +describe.skip( 'Unenroll agent from fleet when agent tamper protection is enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts index 286be75f745b3..aea4ee91829c5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts @@ -22,7 +22,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/182448 +describe.skip( 'Uninstall agent from host when agent tamper protection is enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts index 67c71e4bd5ffb..27a9d8e944093 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203932 +describe.skip( 'Unenroll agent from fleet when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts index 687b2a5924bea..d81afeed57bb8 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/203934 +describe.skip( 'Unenroll agent from fleet changing when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts index cf091cdccc60d..5a6326b77582c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts @@ -21,7 +21,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/182505 +describe.skip( 'Unenroll agent from fleet changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts index 63f4715331514..29fa081ef4fe3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts @@ -24,7 +24,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/182458 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts index 45b278539d5b5..1c87e379234bc 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts @@ -23,7 +23,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/182515 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts index db49f448bc980..1cdb4833945a7 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts @@ -23,7 +23,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/182450 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/delete_migration.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/delete_migration.ts index 45098f8dea239..04f15570434a3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/delete_migration.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/delete_migration.ts @@ -14,7 +14,6 @@ import type { SignalsMigrationSO } from './saved_objects_schema'; /** * Deletes a completed migration: * * deletes the migration SO - * * deletes the underlying task document * * applies deletion policy to the relevant index * * @param esClient An {@link ElasticsearchClient} @@ -40,7 +39,7 @@ export const deleteMigration = async ({ return migration; } - const { destinationIndex, sourceIndex, taskId } = migration.attributes; + const { destinationIndex, sourceIndex } = migration.attributes; if (isMigrationFailed(migration)) { await applyMigrationCleanupPolicy({ @@ -57,7 +56,6 @@ export const deleteMigration = async ({ }); } - await esClient.delete({ index: '.tasks', id: taskId }); await deleteMigrationSavedObject({ id: migration.id, soClient }); return migration; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.test.ts index 6c855a5b77748..51f81ad75e405 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.test.ts @@ -40,6 +40,7 @@ describe('finalizeMigration', () => { signalsAlias: 'my-signals-alias', soClient, username: 'username', + legacySiemSignalsAlias: '.siem-signals-default', }); expect(updateMigrationSavedObject).not.toHaveBeenCalled(); @@ -54,6 +55,7 @@ describe('finalizeMigration', () => { signalsAlias: 'my-signals-alias', soClient, username: 'username', + legacySiemSignalsAlias: '.siem-signals-default', }); expect(updateMigrationSavedObject).not.toHaveBeenCalled(); @@ -72,6 +74,7 @@ describe('finalizeMigration', () => { signalsAlias: 'my-signals-alias', soClient, username: 'username', + legacySiemSignalsAlias: '.siem-signals-default', }); expect(updateMigrationSavedObject).toHaveBeenCalledWith( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.ts index e9ce2a4a641a6..3aca53c1422d8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/finalize_migration.ts @@ -35,12 +35,14 @@ export const finalizeMigration = async ({ signalsAlias, soClient, username, + legacySiemSignalsAlias, }: { esClient: ElasticsearchClient; migration: SignalsMigrationSO; signalsAlias: string; soClient: SavedObjectsClientContract; username: string; + legacySiemSignalsAlias: string; }): Promise<SignalsMigrationSO> => { if (!isMigrationPending(migration)) { return migration; @@ -86,6 +88,7 @@ export const finalizeMigration = async ({ esClient, newIndex: destinationIndex, oldIndex: sourceIndex, + legacySiemSignalsAlias, }); const updatedMigration = await updateMigrationSavedObject({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_index_alias_per_space.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_index_alias_per_space.test.ts new file mode 100644 index 0000000000000..a2361c6b7aeee --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_index_alias_per_space.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { getIndexAliasPerSpace } from './get_index_alias_per_space'; + +describe('getIndexAliasPerSpace', () => { + let esClient: ReturnType<typeof elasticsearchServiceMock.createElasticsearchClient>; + + beforeEach(() => { + esClient = elasticsearchServiceMock.createElasticsearchClient(); + }); + + it('returns object with index alias and space', async () => { + esClient.indices.getAlias.mockResponseOnce({ + '.siem-signals-default-old-one': { + aliases: { + '.siem-signals-default': { + is_write_index: false, + }, + }, + }, + '.siem-signals-another-1-legacy': { + aliases: { + '.siem-signals-another-1': { + is_write_index: false, + }, + }, + }, + }); + + const result = await getIndexAliasPerSpace({ + esClient, + signalsIndex: '.siem-signals', + signalsAliasAllSpaces: '.siem-signals-*', + }); + + expect(result).toEqual({ + '.siem-signals-another-1-legacy': { + alias: '.siem-signals-another-1', + indexName: '.siem-signals-another-1-legacy', + space: 'another-1', + }, + '.siem-signals-default-old-one': { + alias: '.siem-signals-default', + indexName: '.siem-signals-default-old-one', + space: 'default', + }, + }); + }); + + it('filters out .internal.alert indices', async () => { + esClient.indices.getAlias.mockResponseOnce({ + '.siem-signals-default-old-one': { + aliases: { + '.siem-signals-default': { + is_write_index: false, + }, + }, + }, + '.internal.alerts-security.alerts-another-2-000001': { + aliases: { + '.siem-signals-another-2': { + is_write_index: false, + }, + }, + }, + }); + + const result = await getIndexAliasPerSpace({ + esClient, + signalsIndex: '.siem-signals', + signalsAliasAllSpaces: '.siem-signals-*', + }); + + expect(result).toEqual({ + '.siem-signals-default-old-one': { + alias: '.siem-signals-default', + indexName: '.siem-signals-default-old-one', + space: 'default', + }, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_index_alias_per_space.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_index_alias_per_space.ts new file mode 100644 index 0000000000000..04895f0d74f39 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_index_alias_per_space.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { ElasticsearchClient } from '@kbn/core/server'; + +interface IndexAlias { + alias: string; + space: string; + indexName: string; +} + +/** + * Retrieves index, its alias and Kibana space + */ +export const getIndexAliasPerSpace = async ({ + esClient, + signalsIndex, + signalsAliasAllSpaces, +}: { + esClient: ElasticsearchClient; + signalsIndex: string; + signalsAliasAllSpaces: string; +}): Promise<Record<string, IndexAlias>> => { + const response = await esClient.indices.getAlias( + { + name: signalsAliasAllSpaces, + }, + { meta: true } + ); + + const indexAliasesMap = Object.keys(response.body).reduce<Record<string, IndexAlias>>( + (acc, indexName) => { + if (!indexName.startsWith('.internal.alerts-')) { + const alias = Object.keys(response.body[indexName].aliases)[0]; + + acc[indexName] = { + alias, + space: alias.replace(`${signalsIndex}-`, ''), + indexName, + }; + } + + return acc; + }, + {} + ); + + return indexAliasesMap; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_latest_index_template_version.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_latest_index_template_version.test.ts new file mode 100644 index 0000000000000..ea48c51aabcc5 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_latest_index_template_version.test.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { IndicesGetIndexTemplateResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { getLatestIndexTemplateVersion } from './get_latest_index_template_version'; + +describe('getIndexAliasPerSpace', () => { + let esClient: ReturnType<typeof elasticsearchServiceMock.createElasticsearchClient>; + + beforeEach(() => { + esClient = elasticsearchServiceMock.createElasticsearchClient(); + }); + + it('returns latest index template version', async () => { + esClient.indices.getIndexTemplate.mockResponseOnce({ + index_templates: [ + { index_template: { version: 77 } }, + { index_template: { version: 10 } }, + { index_template: { version: 23 } }, + { index_template: { version: 0 } }, + ], + } as IndicesGetIndexTemplateResponse); + + const version = await getLatestIndexTemplateVersion({ + esClient, + name: '.siem-signals-*', + }); + + expect(version).toBe(77); + }); + + it('returns 0 if templates empty', async () => { + esClient.indices.getIndexTemplate.mockResponseOnce({ + index_templates: [], + }); + + const version = await getLatestIndexTemplateVersion({ + esClient, + name: '.siem-signals-*', + }); + + expect(version).toBe(0); + }); + + it('returns 0 if request fails', async () => { + esClient.indices.getIndexTemplate.mockRejectedValueOnce('Failure'); + + const version = await getLatestIndexTemplateVersion({ + esClient, + name: '.siem-signals-*', + }); + + expect(version).toBe(0); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_latest_index_template_version.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_latest_index_template_version.ts new file mode 100644 index 0000000000000..b06a14adc2ce2 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_latest_index_template_version.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { ElasticsearchClient } from '@kbn/core/server'; + +/** + * Retrieves the latest version of index template + * There are can be multiple index templates across different Kibana spaces, + * so we get them all and return the latest(greatest) number + */ +export const getLatestIndexTemplateVersion = async ({ + esClient, + name, +}: { + esClient: ElasticsearchClient; + name: string; +}): Promise<number> => { + let latestTemplateVersion: number; + try { + const response = await esClient.indices.getIndexTemplate({ name }); + const versions = response.index_templates.map( + (template) => template.index_template.version ?? 0 + ); + + latestTemplateVersion = versions.length ? Math.max(...versions) : 0; + } catch (e) { + latestTemplateVersion = 0; + } + + return latestTemplateVersion; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_non_migrated_signals_info.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_non_migrated_signals_info.test.ts new file mode 100644 index 0000000000000..36252ab792342 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_non_migrated_signals_info.test.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 { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { loggerMock } from '@kbn/logging-mocks'; + +import { getNonMigratedSignalsInfo } from './get_non_migrated_signals_info'; +import { getIndexVersionsByIndex } from './get_index_versions_by_index'; +import { getSignalVersionsByIndex } from './get_signal_versions_by_index'; +import { getLatestIndexTemplateVersion } from './get_latest_index_template_version'; +import { getIndexAliasPerSpace } from './get_index_alias_per_space'; + +jest.mock('./get_index_versions_by_index', () => ({ getIndexVersionsByIndex: jest.fn() })); +jest.mock('./get_signal_versions_by_index', () => ({ getSignalVersionsByIndex: jest.fn() })); +jest.mock('./get_latest_index_template_version', () => ({ + getLatestIndexTemplateVersion: jest.fn(), +})); +jest.mock('./get_index_alias_per_space', () => ({ getIndexAliasPerSpace: jest.fn() })); + +const getIndexVersionsByIndexMock = getIndexVersionsByIndex as jest.Mock; +const getSignalVersionsByIndexMock = getSignalVersionsByIndex as jest.Mock; +const getLatestIndexTemplateVersionMock = getLatestIndexTemplateVersion as jest.Mock; +const getIndexAliasPerSpaceMock = getIndexAliasPerSpace as jest.Mock; + +const TEMPLATE_VERSION = 77; + +describe('getNonMigratedSignalsInfo', () => { + let esClient: ReturnType<typeof elasticsearchServiceMock.createElasticsearchClient>; + const logger = loggerMock.create(); + + beforeEach(() => { + esClient = elasticsearchServiceMock.createElasticsearchClient(); + + getLatestIndexTemplateVersionMock.mockReturnValue(TEMPLATE_VERSION); + getIndexVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': 10, + '.siem-signals-default-old-one': 42, + }); + getSignalVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': [{ count: 2, version: 10 }], + }); + getIndexAliasPerSpaceMock.mockReturnValue({ + '.siem-signals-another-1-legacy': { + alias: '.siem-signals-another-1', + indexName: '.siem-signals-another-1-legacy', + space: 'another-1', + }, + '.siem-signals-default-old-one': { + alias: '.siem-signals-default', + indexName: '.siem-signals-default-old-one', + space: 'default', + }, + }); + }); + + it('returns empty results if no siem indices found', async () => { + getIndexAliasPerSpaceMock.mockReturnValue({}); + + const result = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex: 'siem-signals', + logger, + }); + + expect(result).toEqual({ + isMigrationRequired: false, + spaces: [], + indices: [], + }); + }); + + it('returns empty when error happens', async () => { + getLatestIndexTemplateVersionMock.mockRejectedValueOnce(new Error('Test failure')); + const debugSpy = jest.spyOn(logger, 'debug'); + + const result = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex: 'siem-signals', + logger, + }); + + expect(result).toEqual({ + isMigrationRequired: false, + spaces: [], + indices: [], + }); + expect(debugSpy).toHaveBeenCalledWith(expect.stringContaining('Test failure')); + }); + + it('returns empty results if no siem indices or signals outdated', async () => { + getIndexVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': TEMPLATE_VERSION, + '.siem-signals-default-old-one': TEMPLATE_VERSION, + }); + getSignalVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': [{ count: 2, version: TEMPLATE_VERSION }], + }); + + const result = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex: 'siem-signals', + logger, + }); + + expect(result).toEqual({ + isMigrationRequired: false, + spaces: [], + indices: [], + }); + }); + it('returns results for outdated index', async () => { + getIndexVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': TEMPLATE_VERSION, + '.siem-signals-default-old-one': 16, + }); + getSignalVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': [{ count: 2, version: TEMPLATE_VERSION }], + }); + + const result = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex: 'siem-signals', + logger, + }); + + expect(result).toEqual({ + indices: ['.siem-signals-default-old-one'], + isMigrationRequired: true, + spaces: ['default'], + }); + }); + it('returns results for outdated signals in index', async () => { + getIndexVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': TEMPLATE_VERSION, + '.siem-signals-default-old-one': TEMPLATE_VERSION, + }); + getSignalVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': [{ count: 2, version: 12 }], + }); + + const result = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex: 'siem-signals', + logger, + }); + + expect(result).toEqual({ + indices: ['.siem-signals-another-1-legacy'], + isMigrationRequired: true, + spaces: ['another-1'], + }); + }); + it('returns indices in multiple spaces', async () => { + getIndexVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': 11, + '.siem-signals-default-old-one': 11, + }); + getSignalVersionsByIndexMock.mockReturnValue({ + '.siem-signals-another-1-legacy': [{ count: 2, version: 11 }], + }); + + const result = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex: 'siem-signals', + logger, + }); + + expect(result).toEqual({ + indices: ['.siem-signals-another-1-legacy', '.siem-signals-default-old-one'], + isMigrationRequired: true, + spaces: ['another-1', 'default'], + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_non_migrated_signals_info.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_non_migrated_signals_info.ts new file mode 100644 index 0000000000000..d1f561fb3846c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/get_non_migrated_signals_info.ts @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient, Logger } from '@kbn/core/server'; + +import type { IndexVersionsByIndex } from './get_index_versions_by_index'; +import { getIndexVersionsByIndex } from './get_index_versions_by_index'; +import { + getSignalVersionsByIndex, + type SignalVersionsByIndex, +} from './get_signal_versions_by_index'; +import { isOutdated as getIsOutdated, signalsAreOutdated } from './helpers'; +import { getLatestIndexTemplateVersion } from './get_latest_index_template_version'; +import { getIndexAliasPerSpace } from './get_index_alias_per_space'; + +interface OutdatedSpaces { + isMigrationRequired: boolean; + spaces: string[]; + indices: string[]; +} + +/** + * gets lists of spaces and non-migrated signal indices + */ +export const getNonMigratedSignalsInfo = async ({ + esClient, + signalsIndex, + logger, +}: { + esClient: ElasticsearchClient; + signalsIndex: string; + logger: Logger; +}): Promise<OutdatedSpaces> => { + const signalsAliasAllSpaces = `${signalsIndex}-*`; + + try { + const latestTemplateVersion = await getLatestIndexTemplateVersion({ + esClient, + name: signalsAliasAllSpaces, + }); + const indexAliasesMap = await getIndexAliasPerSpace({ + esClient, + signalsAliasAllSpaces, + signalsIndex, + }); + + const indices = Object.keys(indexAliasesMap); + + if (indices.length === 0) { + return { + isMigrationRequired: false, + spaces: [], + indices: [], + }; + } + + let indexVersionsByIndex: IndexVersionsByIndex = {}; + try { + indexVersionsByIndex = await getIndexVersionsByIndex({ + esClient, + index: indices, + }); + } catch (e) { + logger.debug( + `Getting information about legacy siem signals index version failed:"${e?.message}"` + ); + } + + let signalVersionsByIndex: SignalVersionsByIndex = {}; + try { + signalVersionsByIndex = await getSignalVersionsByIndex({ + esClient, + index: indices, + }); + } catch (e) { + logger.debug(`Getting information about legacy siem signals versions failed:"${e?.message}"`); + } + + const outdatedIndices = indices.reduce<Array<{ indexName: string; space: string }>>( + (acc, indexName) => { + const version = indexVersionsByIndex[indexName] ?? 0; + const signalVersions = signalVersionsByIndex[indexName] ?? []; + + const isOutdated = + getIsOutdated({ current: version, target: latestTemplateVersion }) || + signalsAreOutdated({ signalVersions, target: latestTemplateVersion }); + + if (isOutdated) { + acc.push({ + indexName, + space: indexAliasesMap[indexName].space, + }); + } + + return acc; + }, + [] + ); + + const outdatedIndexNames = outdatedIndices.map((outdatedIndex) => outdatedIndex.indexName); + + // remove duplicated spaces + const spaces = [...new Set<string>(outdatedIndices.map((indexStatus) => indexStatus.space))]; + const isMigrationRequired = outdatedIndices.length > 0; + + logger.debug( + isMigrationRequired + ? `Legacy siem signals indices require migration: "${outdatedIndexNames.join( + ', ' + )}" in "${spaces.join(', ')}" spaces` + : 'No legacy siem indices require migration' + ); + + return { + isMigrationRequired, + spaces, + indices: outdatedIndexNames, + }; + } catch (e) { + logger.debug(`Getting information about legacy siem signals failed:"${e?.message}"`); + return { + isMigrationRequired: false, + spaces: [], + indices: [], + }; + } +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/migration_service.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/migration_service.ts index 5a4399bd6389c..5530f0a80c5d2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/migration_service.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/migration_service.ts @@ -22,6 +22,7 @@ export interface CreateParams { export interface FinalizeParams { signalsAlias: string; migration: SignalsMigrationSO; + legacySiemSignalsAlias: string; } export interface DeleteParams { @@ -59,13 +60,14 @@ export const signalsMigrationService = ({ username, }); }, - finalize: ({ migration, signalsAlias }) => + finalize: ({ migration, signalsAlias, legacySiemSignalsAlias }) => finalizeMigration({ esClient, migration, signalsAlias, soClient, username, + legacySiemSignalsAlias, }), delete: ({ migration, signalsAlias }) => deleteMigration({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/replace_signals_index_alias.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/replace_signals_index_alias.ts index ad77e64a55ac7..984707959005c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/replace_signals_index_alias.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/replace_signals_index_alias.ts @@ -26,11 +26,13 @@ export const replaceSignalsIndexAlias = async ({ esClient, newIndex, oldIndex, + legacySiemSignalsAlias, }: { alias: string; esClient: ElasticsearchClient; newIndex: string; oldIndex: string; + legacySiemSignalsAlias: string; }): Promise<void> => { await esClient.indices.updateAliases({ body: { @@ -40,12 +42,11 @@ export const replaceSignalsIndexAlias = async ({ ], }, }); - // TODO: space-aware? await esClient.indices.updateAliases({ body: { actions: [ - { remove: { index: oldIndex, alias: '.siem-signals-default' } }, - { add: { index: newIndex, alias: '.siem-signals-default', is_write_index: false } }, + { remove: { index: oldIndex, alias: legacySiemSignalsAlias } }, + { add: { index: newIndex, alias: legacySiemSignalsAlias, is_write_index: false } }, ], }, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts index 0ff0220056e73..4421a116def76 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts @@ -74,6 +74,7 @@ export const finalizeSignalsMigrationRoute = ( }); const spaceId = securitySolution.getSpaceId(); + const legacySiemSignalsAlias = appClient.getSignalsIndex(); const signalsAlias = ruleDataService.getResourceName(`security.alerts-${spaceId}`); const finalizeResults = await Promise.all( migrations.map(async (migration) => { @@ -81,6 +82,7 @@ export const finalizeSignalsMigrationRoute = ( const finalizedMigration = await migrationService.finalize({ migration, signalsAlias, + legacySiemSignalsAlias, }); if (isMigrationFailed(finalizedMigration)) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts index 15f64c7f96c41..8bee9b1947c2f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts @@ -65,7 +65,11 @@ export const getSignalsMigrationStatusRoute = ( const signalsAlias = appClient.getSignalsIndex(); const currentVersion = await getTemplateVersion({ alias: signalsAlias, esClient }); - const indexAliases = await getIndexAliases({ alias: signalsAlias, esClient }); + const indexAliases = await getIndexAliases({ + alias: signalsAlias, + esClient, + index: `${signalsAlias}-*`, + }); const signalsIndices = indexAliases.map((indexAlias) => indexAlias.index); const indicesInRange = await getSignalsIndicesInRange({ esClient, diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 28666df8c42bf..03512d9cbda04 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -281,6 +281,7 @@ export class Plugin implements ISecuritySolutionPlugin { all: allRiskScoreIndexPattern, latest: latestRiskScoreIndexPattern, }, + legacySignalsIndex: config.signalsIndex, }); this.telemetryUsageCounter = plugins.usageCollection?.createUsageCounter(APP_ID); diff --git a/x-pack/plugins/security_solution/server/usage/collector.ts b/x-pack/plugins/security_solution/server/usage/collector.ts index ca016d07d5099..aa507cd683db5 100644 --- a/x-pack/plugins/security_solution/server/usage/collector.ts +++ b/x-pack/plugins/security_solution/server/usage/collector.ts @@ -32,6 +32,7 @@ export const registerCollector: RegisterCollector = ({ usageCollection, logger, riskEngineIndexPatterns, + legacySignalsIndex, }) => { if (!usageCollection) { logger.debug('Usage collection is undefined, therefore returning early without registering it'); @@ -3076,6 +3077,21 @@ export const registerCollector: RegisterCollector = ({ }, }, }, + legacy_siem_signals: { + non_migrated_indices_total: { + type: 'long', + _meta: { + description: 'Total number of non migrated legacy siem signals indices', + }, + }, + spaces_total: { + type: 'long', + _meta: { + description: + 'Total number of Kibana spaces that have non migrated legacy siem signals indices', + }, + }, + }, }, endpointMetrics: { unique_endpoint_count: { @@ -3130,6 +3146,7 @@ export const registerCollector: RegisterCollector = ({ savedObjectsClient, logger, mlClient: ml, + legacySignalsIndex, }), getEndpointMetrics({ esClient, logger }), getDashboardMetrics({ diff --git a/x-pack/plugins/security_solution/server/usage/detections/get_initial_usage.ts b/x-pack/plugins/security_solution/server/usage/detections/get_initial_usage.ts index 6252b865c0ec9..538ea2509c463 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/get_initial_usage.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/get_initial_usage.ts @@ -9,6 +9,8 @@ import type { DetectionMetrics } from './types'; import { getInitialMlJobUsage } from './ml_jobs/get_initial_usage'; import { getInitialEventLogUsage, getInitialRulesUsage } from './rules/get_initial_usage'; +// eslint-disable-next-line no-restricted-imports +import { getInitialLegacySiemSignalsUsage } from './legacy_siem_signals/get_initial_usage'; /** * Initial detection metrics initialized. @@ -23,4 +25,5 @@ export const getInitialDetectionMetrics = (): DetectionMetrics => ({ detection_rule_usage: getInitialRulesUsage(), detection_rule_status: getInitialEventLogUsage(), }, + legacy_siem_signals: getInitialLegacySiemSignalsUsage(), }); diff --git a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts index be5044fbb4e21..cb5006799a1cf 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts @@ -57,6 +57,7 @@ describe('Detections Usage and Metrics', () => { savedObjectsClient, logger, mlClient, + legacySignalsIndex: '', }); expect(result).toEqual<DetectionMetrics>(getInitialDetectionMetrics()); }); @@ -79,6 +80,7 @@ describe('Detections Usage and Metrics', () => { savedObjectsClient, logger, mlClient, + legacySignalsIndex: '', }); expect(result).toEqual<DetectionMetrics>({ @@ -154,6 +156,7 @@ describe('Detections Usage and Metrics', () => { savedObjectsClient, logger, mlClient, + legacySignalsIndex: '', }); expect(result).toEqual<DetectionMetrics>({ @@ -210,6 +213,7 @@ describe('Detections Usage and Metrics', () => { savedObjectsClient, logger, mlClient, + legacySignalsIndex: '', }); expect(result).toEqual<DetectionMetrics>({ @@ -290,6 +294,7 @@ describe('Detections Usage and Metrics', () => { savedObjectsClient, logger, mlClient, + legacySignalsIndex: '', }); expect(result).toEqual<DetectionMetrics>(getInitialDetectionMetrics()); }); @@ -329,6 +334,7 @@ describe('Detections Usage and Metrics', () => { savedObjectsClient, logger, mlClient, + legacySignalsIndex: '', }); expect(result).toEqual( diff --git a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.ts b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.ts index 904c80debf5da..61badd153c65f 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.ts @@ -13,6 +13,10 @@ import { getMlJobMetrics } from './ml_jobs/get_metrics'; import { getRuleMetrics } from './rules/get_metrics'; import { getInitialEventLogUsage, getInitialRulesUsage } from './rules/get_initial_usage'; import { getInitialMlJobUsage } from './ml_jobs/get_initial_usage'; +// eslint-disable-next-line no-restricted-imports +import { getInitialLegacySiemSignalsUsage } from './legacy_siem_signals/get_initial_usage'; +// eslint-disable-next-line no-restricted-imports +import { getLegacySiemSignalsUsage } from './legacy_siem_signals/get_legacy_siem_signals_metrics'; export interface GetDetectionsMetricsOptions { signalsIndex: string; @@ -21,6 +25,7 @@ export interface GetDetectionsMetricsOptions { logger: Logger; mlClient: MlPluginSetup | undefined; eventLogIndex: string; + legacySignalsIndex: string; } export const getDetectionsMetrics = async ({ @@ -30,10 +35,12 @@ export const getDetectionsMetrics = async ({ savedObjectsClient, logger, mlClient, + legacySignalsIndex, }: GetDetectionsMetricsOptions): Promise<DetectionMetrics> => { - const [mlJobMetrics, detectionRuleMetrics] = await Promise.allSettled([ + const [mlJobMetrics, detectionRuleMetrics, legacySiemSignalsUsage] = await Promise.allSettled([ getMlJobMetrics({ mlClient, savedObjectsClient, logger }), getRuleMetrics({ signalsIndex, eventLogIndex, esClient, savedObjectsClient, logger }), + getLegacySiemSignalsUsage({ signalsIndex: legacySignalsIndex, esClient, logger }), ]); return { @@ -49,5 +56,9 @@ export const getDetectionsMetrics = async ({ detection_rule_usage: getInitialRulesUsage(), detection_rule_status: getInitialEventLogUsage(), }, + legacy_siem_signals: + legacySiemSignalsUsage.status === 'fulfilled' + ? legacySiemSignalsUsage.value + : getInitialLegacySiemSignalsUsage(), }; }; diff --git a/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/get_initial_usage.ts b/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/get_initial_usage.ts new file mode 100644 index 0000000000000..df222f9750490 --- /dev/null +++ b/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/get_initial_usage.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LegacySiemSignals } from './types'; + +export const getInitialLegacySiemSignalsUsage = (): LegacySiemSignals => ({ + non_migrated_indices_total: 0, + spaces_total: 0, +}); diff --git a/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/get_legacy_siem_signals_metrics.ts b/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/get_legacy_siem_signals_metrics.ts new file mode 100644 index 0000000000000..a6d2b8bf06aff --- /dev/null +++ b/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/get_legacy_siem_signals_metrics.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient, Logger } from '@kbn/core/server'; +import { getNonMigratedSignalsInfo } from '../../../lib/detection_engine/migrations/get_non_migrated_signals_info'; +import type { LegacySiemSignals } from './types'; + +export interface GetLegacySiemSignalsUsageOptions { + signalsIndex: string; + esClient: ElasticsearchClient; + logger: Logger; +} + +export const getLegacySiemSignalsUsage = async ({ + signalsIndex, + esClient, + logger, +}: GetLegacySiemSignalsUsageOptions): Promise<LegacySiemSignals> => { + const { indices, spaces } = await getNonMigratedSignalsInfo({ + esClient, + signalsIndex, + logger, + }); + + return { + non_migrated_indices_total: indices.length, + spaces_total: spaces.length, + }; +}; diff --git a/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/types.ts b/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/types.ts new file mode 100644 index 0000000000000..b4351b2e7808f --- /dev/null +++ b/x-pack/plugins/security_solution/server/usage/detections/legacy_siem_signals/types.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +export interface LegacySiemSignals { + non_migrated_indices_total: number; + spaces_total: number; +} diff --git a/x-pack/plugins/security_solution/server/usage/detections/types.ts b/x-pack/plugins/security_solution/server/usage/detections/types.ts index 2895e5c6f8b9a..3edbd028b6321 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/types.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/types.ts @@ -7,8 +7,11 @@ import type { MlJobUsageMetric } from './ml_jobs/types'; import type { RuleAdoption } from './rules/types'; +// eslint-disable-next-line no-restricted-imports +import type { LegacySiemSignals } from './legacy_siem_signals/types'; export interface DetectionMetrics { ml_jobs: MlJobUsageMetric; detection_rules: RuleAdoption; + legacy_siem_signals: LegacySiemSignals; } diff --git a/x-pack/plugins/security_solution/server/usage/types.ts b/x-pack/plugins/security_solution/server/usage/types.ts index 1df8f2d1388a0..fdaaac663ad41 100644 --- a/x-pack/plugins/security_solution/server/usage/types.ts +++ b/x-pack/plugins/security_solution/server/usage/types.ts @@ -33,6 +33,7 @@ export type CollectorDependencies = { all: string; latest: string; }; + legacySignalsIndex: string; } & Pick<SetupPlugins, 'ml' | 'usageCollection'>; export interface AlertBucket { diff --git a/x-pack/plugins/spaces/public/config.ts b/x-pack/plugins/spaces/public/config.ts index 3dd2d3bc89f92..dcd203eb696e3 100644 --- a/x-pack/plugins/spaces/public/config.ts +++ b/x-pack/plugins/spaces/public/config.ts @@ -9,7 +9,4 @@ export interface ConfigType { maxSpaces: number; allowFeatureVisibility: boolean; allowSolutionVisibility: boolean; - experimental: { - forceSolutionVisibility: boolean; - }; } diff --git a/x-pack/plugins/spaces/public/management/management_service.test.ts b/x-pack/plugins/spaces/public/management/management_service.test.ts index c89801953acdd..9aeddb8a66468 100644 --- a/x-pack/plugins/spaces/public/management/management_service.test.ts +++ b/x-pack/plugins/spaces/public/management/management_service.test.ts @@ -27,9 +27,6 @@ describe('ManagementService', () => { maxSpaces: 1000, allowFeatureVisibility: true, allowSolutionVisibility: true, - experimental: { - forceSolutionVisibility: false, - }, }; describe('#setup', () => { diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx index d721ff79600c3..ff5a709765901 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx @@ -45,9 +45,6 @@ const config: ConfigType = { maxSpaces: 1000, allowFeatureVisibility: true, allowSolutionVisibility: true, - experimental: { - forceSolutionVisibility: false, - }, }; const eventTracker = new EventTracker({ reportEvent: jest.fn() }); diff --git a/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx b/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx index eda87809c66b3..dc4f77a3b3e00 100644 --- a/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx +++ b/x-pack/plugins/spaces/public/nav_control/solution_view_tour/solution_view_tour.tsx @@ -72,6 +72,7 @@ export const SolutionViewTour: FC<Props> = ({ children, solution, isTourOpen, on onFinish={onFinishTour} step={1} stepsTotal={1} + repositionOnScroll title={i18n.translate('xpack.spaces.navControl.tour.title', { defaultMessage: 'You chose the {solution} solution view', values: { solution: solutionLabel }, diff --git a/x-pack/plugins/spaces/public/plugin.test.ts b/x-pack/plugins/spaces/public/plugin.test.ts index 33565748a99e3..40d6d7b39aa7c 100644 --- a/x-pack/plugins/spaces/public/plugin.test.ts +++ b/x-pack/plugins/spaces/public/plugin.test.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { cloudMock } from '@kbn/cloud-plugin/public/mocks'; import { coreMock } from '@kbn/core/public/mocks'; import { homePluginMock } from '@kbn/home-plugin/public/mocks'; import { @@ -20,7 +19,7 @@ describe('Spaces plugin', () => { it('should register the space selector app when buildFlavor is traditional', () => { const coreSetup = coreMock.createSetup(); const mockInitializerContext = coreMock.createPluginInitializerContext( - {}, + { allowSolutionVisibility: true }, { buildFlavor: 'traditional' } ); @@ -40,7 +39,7 @@ describe('Spaces plugin', () => { it('should not register the space selector app when buildFlavor is serverless and maxSpaces is 1', () => { const coreSetup = coreMock.createSetup(); const mockInitializerContext = coreMock.createPluginInitializerContext( - { maxSpaces: 1 }, + { maxSpaces: 1, allowSolutionVisibility: true }, { buildFlavor: 'serverless' } ); @@ -60,7 +59,7 @@ describe('Spaces plugin', () => { it('should register the space selector app when buildFlavor is serverless and and maxSpaces is >1', () => { const coreSetup = coreMock.createSetup(); const mockInitializerContext = coreMock.createPluginInitializerContext( - { maxSpaces: 2 }, + { maxSpaces: 2, allowSolutionVisibility: true }, { buildFlavor: 'serverless' } ); @@ -88,7 +87,7 @@ describe('Spaces plugin', () => { management.sections.section.kibana = mockSection; const mockInitializerContext = coreMock.createPluginInitializerContext( - {}, + { allowSolutionVisibility: true }, { buildFlavor: 'traditional' } ); @@ -122,7 +121,9 @@ describe('Spaces plugin', () => { management.sections.section.kibana = mockSection; - const plugin = new SpacesPlugin(coreMock.createPluginInitializerContext({ maxSpaces: 1 })); + const plugin = new SpacesPlugin( + coreMock.createPluginInitializerContext({ maxSpaces: 1, allowSolutionVisibility: true }) + ); plugin.setup(coreSetup, { management, home, @@ -152,7 +153,9 @@ describe('Spaces plugin', () => { management.sections.section.kibana = mockSection; - const plugin = new SpacesPlugin(coreMock.createPluginInitializerContext({ maxSpaces: 2 })); + const plugin = new SpacesPlugin( + coreMock.createPluginInitializerContext({ maxSpaces: 2, allowSolutionVisibility: true }) + ); plugin.setup(coreSetup, { management, home, @@ -179,7 +182,7 @@ describe('Spaces plugin', () => { const coreStart = coreMock.createStart(); const mockInitializerContext = coreMock.createPluginInitializerContext( - {}, + { allowSolutionVisibility: true }, { buildFlavor: 'traditional' } ); @@ -196,7 +199,7 @@ describe('Spaces plugin', () => { const coreStart = coreMock.createStart(); const mockInitializerContext = coreMock.createPluginInitializerContext( - { maxSpaces: 1 }, + { maxSpaces: 1, allowSolutionVisibility: true }, { buildFlavor: 'serverless' } ); @@ -214,7 +217,9 @@ describe('Spaces plugin', () => { const coreSetup = coreMock.createSetup(); const coreStart = coreMock.createStart(); - const plugin = new SpacesPlugin(coreMock.createPluginInitializerContext({ maxSpaces: 1 })); + const plugin = new SpacesPlugin( + coreMock.createPluginInitializerContext({ maxSpaces: 1, allowSolutionVisibility: true }) + ); const spacesSetup = plugin.setup(coreSetup, {}); const spacesStart = plugin.start(coreStart); @@ -226,7 +231,9 @@ describe('Spaces plugin', () => { const coreSetup = coreMock.createSetup(); const coreStart = coreMock.createStart(); - const plugin = new SpacesPlugin(coreMock.createPluginInitializerContext({ maxSpaces: 1000 })); + const plugin = new SpacesPlugin( + coreMock.createPluginInitializerContext({ maxSpaces: 1000, allowSolutionVisibility: true }) + ); const spacesSetup = plugin.setup(coreSetup, {}); const spacesStart = plugin.start(coreStart); @@ -236,129 +243,45 @@ describe('Spaces plugin', () => { }); describe('isSolutionViewEnabled', () => { - it('when onCloud, not serverless and allowSolutionVisibility is "true"', () => { + it('when allowSolutionVisibility is "true"', () => { const coreSetup = coreMock.createSetup(); const coreStart = coreMock.createStart(); - const cloud = cloudMock.createSetup(); - cloud.isCloudEnabled = true; const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: true }, - { buildFlavor: 'traditional' } - ) + coreMock.createPluginInitializerContext({ allowSolutionVisibility: true }) ); - const spacesSetup = plugin.setup(coreSetup, { cloud }); + const spacesSetup = plugin.setup(coreSetup, {}); const spacesStart = plugin.start(coreStart); expect(spacesSetup.isSolutionViewEnabled).toBe(true); expect(spacesStart.isSolutionViewEnabled).toBe(true); }); - it('when not onCloud and allowSolutionVisibility is "true"', () => { + it('when allowSolutionVisibility is "false"', () => { const coreSetup = coreMock.createSetup(); const coreStart = coreMock.createStart(); { const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: true }, // it is true but we are not onCloud - { buildFlavor: 'traditional' } - ) + coreMock.createPluginInitializerContext({ allowSolutionVisibility: false }) ); const spacesSetup = plugin.setup(coreSetup, {}); const spacesStart = plugin.start(coreStart); - expect(spacesSetup.isSolutionViewEnabled).toBe(false); // so it should be false - expect(spacesStart.isSolutionViewEnabled).toBe(false); - } - - { - // unless the forceSolutionVisibility flag is set - const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: false, experimental: { forceSolutionVisibility: true } }, - { buildFlavor: 'traditional' } - ) - ); - const spacesSetup = plugin.setup(coreSetup, {}); // we are not onCloud but forceSolutionVisibility is true - const spacesStart = plugin.start(coreStart); - - expect(spacesSetup.isSolutionViewEnabled).toBe(true); - expect(spacesStart.isSolutionViewEnabled).toBe(true); - } - }); - - it('when onCloud, not serverless and allowSolutionVisibility is "false"', () => { - const coreSetup = coreMock.createSetup(); - const coreStart = coreMock.createStart(); - const cloud = cloudMock.createSetup(); - cloud.isCloudEnabled = true; - - { - const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: false }, - { buildFlavor: 'traditional' } - ) - ); - const spacesSetup = plugin.setup(coreSetup, { cloud }); - const spacesStart = plugin.start(coreStart); - expect(spacesSetup.isSolutionViewEnabled).toBe(false); expect(spacesStart.isSolutionViewEnabled).toBe(false); } - - { - // unless the forceSolutionVisibility flag is set - const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: false, experimental: { forceSolutionVisibility: true } }, - { buildFlavor: 'traditional' } - ) - ); - const spacesSetup = plugin.setup(coreSetup, { cloud }); - const spacesStart = plugin.start(coreStart); - - expect(spacesSetup.isSolutionViewEnabled).toBe(true); - expect(spacesStart.isSolutionViewEnabled).toBe(true); - } }); - it('when onCloud and serverless', () => { + it('when allowSolutionVisibility is "undefined"', () => { const coreSetup = coreMock.createSetup(); - const coreStart = coreMock.createStart(); - const cloud = cloudMock.createSetup(); - cloud.isCloudEnabled = true; - - { - const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: true }, - { buildFlavor: 'serverless' } - ) - ); - const spacesSetup = plugin.setup(coreSetup, { cloud }); - const spacesStart = plugin.start(coreStart); - expect(spacesSetup.isSolutionViewEnabled).toBe(false); - expect(spacesStart.isSolutionViewEnabled).toBe(false); - } - - { - // unless the forceSolutionVisibility flag is set - const plugin = new SpacesPlugin( - coreMock.createPluginInitializerContext( - { allowSolutionVisibility: true, experimental: { forceSolutionVisibility: true } }, - { buildFlavor: 'serverless' } - ) - ); - const spacesSetup = plugin.setup(coreSetup, { cloud }); - const spacesStart = plugin.start(coreStart); - - expect(spacesSetup.isSolutionViewEnabled).toBe(true); - expect(spacesStart.isSolutionViewEnabled).toBe(true); - } + const plugin = new SpacesPlugin( + coreMock.createPluginInitializerContext({ allowSolutionVisibility: undefined }) + ); + expect(() => plugin.setup(coreSetup, {})).toThrowErrorMatchingInlineSnapshot( + `"allowSolutionVisibility has not been set in the Spaces plugin config."` + ); }); }); }); diff --git a/x-pack/plugins/spaces/public/plugin.tsx b/x-pack/plugins/spaces/public/plugin.tsx index 18083924200d9..c3583204a7bb3 100644 --- a/x-pack/plugins/spaces/public/plugin.tsx +++ b/x-pack/plugins/spaces/public/plugin.tsx @@ -59,14 +59,11 @@ export class SpacesPlugin implements Plugin<SpacesPluginSetup, SpacesPluginStart } public setup(core: CoreSetup<PluginsStart, SpacesPluginStart>, plugins: PluginsSetup) { - const hasOnlyDefaultSpace = this.config.maxSpaces === 1; - const onCloud = plugins.cloud !== undefined && plugins.cloud.isCloudEnabled; + if (this.config.allowSolutionVisibility === undefined) { + throw new Error('allowSolutionVisibility has not been set in the Spaces plugin config.'); + } - // We only allow "solution" to be set on cloud environments, not on prem - // unless the forceSolutionVisibility flag is set - const allowSolutionVisibility = - (onCloud && !this.isServerless && this.config.allowSolutionVisibility) || - Boolean(this.config.experimental?.forceSolutionVisibility); + const hasOnlyDefaultSpace = this.config.maxSpaces === 1; this.spacesManager = new SpacesManager(core.http); this.spacesApi = { @@ -77,12 +74,7 @@ export class SpacesPlugin implements Plugin<SpacesPluginSetup, SpacesPluginStart getActiveSpace$: () => this.spacesManager.onActiveSpaceChange$, getActiveSpace: () => this.spacesManager.getActiveSpace(), hasOnlyDefaultSpace, - isSolutionViewEnabled: allowSolutionVisibility, - }; - - this.config = { - ...this.config, - allowSolutionVisibility, + isSolutionViewEnabled: this.config.allowSolutionVisibility, }; registerSpacesEventTypes(core); @@ -167,7 +159,7 @@ export class SpacesPlugin implements Plugin<SpacesPluginSetup, SpacesPluginStart registerAnalyticsContext(core.analytics, this.spacesManager.onActiveSpaceChange$); - return { hasOnlyDefaultSpace, isSolutionViewEnabled: allowSolutionVisibility }; + return { hasOnlyDefaultSpace, isSolutionViewEnabled: this.config.allowSolutionVisibility }; } public start(core: CoreStart) { diff --git a/x-pack/plugins/spaces/server/index.ts b/x-pack/plugins/spaces/server/index.ts index 297a99a525ec7..a568f52c7c29a 100644 --- a/x-pack/plugins/spaces/server/index.ts +++ b/x-pack/plugins/spaces/server/index.ts @@ -34,9 +34,6 @@ export const config: PluginConfigDescriptor = { maxSpaces: true, allowFeatureVisibility: true, allowSolutionVisibility: true, - experimental: { - forceSolutionVisibility: true, - }, }, }; diff --git a/x-pack/plugins/spaces/server/plugin.test.ts b/x-pack/plugins/spaces/server/plugin.test.ts index 40aaf7044a4ea..cb2cee96a34e7 100644 --- a/x-pack/plugins/spaces/server/plugin.test.ts +++ b/x-pack/plugins/spaces/server/plugin.test.ts @@ -36,10 +36,7 @@ describe('Spaces plugin', () => { "hasOnlyDefaultSpace$": Observable { "operator": [Function], "source": Observable { - "operator": [Function], - "source": Observable { - "_subscribe": [Function], - }, + "_subscribe": [Function], }, }, "spacesClient": Object { @@ -123,10 +120,7 @@ describe('Spaces plugin', () => { "hasOnlyDefaultSpace$": Observable { "operator": [Function], "source": Observable { - "operator": [Function], - "source": Observable { - "_subscribe": [Function], - }, + "_subscribe": [Function], }, }, "spacesService": Object { diff --git a/x-pack/plugins/spaces/server/plugin.ts b/x-pack/plugins/spaces/server/plugin.ts index e36a6fb3cc7f1..e1c3c78976ecd 100644 --- a/x-pack/plugins/spaces/server/plugin.ts +++ b/x-pack/plugins/spaces/server/plugin.ts @@ -6,7 +6,7 @@ */ import type { Observable } from 'rxjs'; -import { BehaviorSubject, combineLatest, map } from 'rxjs'; +import { map } from 'rxjs'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; import type { @@ -120,24 +120,8 @@ export class SpacesPlugin private defaultSpaceService?: DefaultSpaceService; - private onCloud$ = new BehaviorSubject<boolean>(false); - constructor(private readonly initializerContext: PluginInitializerContext) { - this.config$ = combineLatest([ - initializerContext.config.create<ConfigType>(), - this.onCloud$, - ]).pipe( - map( - ([config, onCloud]): ConfigType => ({ - ...config, - // We only allow "solution" to be set on cloud environments, not on prem - // unless the forceSolutionVisibility flag is set. - allowSolutionVisibility: - (onCloud && config.allowSolutionVisibility) || - Boolean(config.experimental?.forceSolutionVisibility), - }) - ) - ); + this.config$ = initializerContext.config.create<ConfigType>(); this.hasOnlyDefaultSpace$ = this.config$.pipe(map(({ maxSpaces }) => maxSpaces === 1)); this.log = initializerContext.logger.get(); this.spacesService = new SpacesService(); @@ -148,7 +132,6 @@ export class SpacesPlugin } public setup(core: CoreSetup<PluginsStart>, plugins: PluginsSetup): SpacesPluginSetup { - this.onCloud$.next(plugins.cloud !== undefined && plugins.cloud.isCloudEnabled); const spacesClientSetup = this.spacesClientService.setup({ config$: this.config$ }); core.uiSettings.registerGlobal(getUiSettings()); diff --git a/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts b/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts index c5186edf4a378..a75f379ce471f 100644 --- a/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts +++ b/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts @@ -14,4 +14,7 @@ export enum SUB_ACTION { HOST_ACTIONS = 'hostActions', GET_AGENT_ONLINE_STATUS = 'getAgentOnlineStatus', EXECUTE_RTR_COMMAND = 'executeRTRCommand', + EXECUTE_ACTIVE_RESPONDER_RTR = 'batchActiveResponderExecuteRTR', + EXECUTE_ADMIN_RTR = 'batchAdminExecuteRTR', + GET_RTR_CLOUD_SCRIPTS = 'getRTRCloudScripts', } diff --git a/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts b/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts index d5e8cd693af98..d5d4154f985e9 100644 --- a/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts +++ b/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts @@ -17,6 +17,8 @@ export const CrowdstrikeSecretsSchema = schema.object({ clientSecret: schema.string(), }); +export const CrowdstrikeApiDoNotValidateResponsesSchema = schema.any(); + export const RelaxedCrowdstrikeBaseApiResponseSchema = schema.maybe( schema.object({}, { unknowns: 'allow' }) ); @@ -307,3 +309,46 @@ export const CrowdstrikeInitRTRResponseSchema = schema.object( export const CrowdstrikeInitRTRParamsSchema = schema.object({ endpoint_ids: schema.arrayOf(schema.string()), }); + +export const CrowdstrikeExecuteRTRResponseSchema = schema.object( + { + combined: schema.object( + { + resources: schema.recordOf( + schema.string(), + schema.object( + { + session_id: schema.maybe(schema.string()), + task_id: schema.maybe(schema.string()), + complete: schema.maybe(schema.boolean()), + stdout: schema.maybe(schema.string()), + stderr: schema.maybe(schema.string()), + base_command: schema.maybe(schema.string()), + aid: schema.maybe(schema.string()), + errors: schema.maybe(schema.arrayOf(schema.any())), + query_time: schema.maybe(schema.number()), + offline_queued: schema.maybe(schema.boolean()), + }, + { unknowns: 'allow' } + ) + ), + }, + { unknowns: 'allow' } + ), + meta: schema.object( + { + query_time: schema.maybe(schema.number()), + powered_by: schema.maybe(schema.string()), + trace_id: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ), + errors: schema.nullable(schema.arrayOf(schema.any())), + }, + { unknowns: 'allow' } +); + +export type CrowdStrikeExecuteRTRResponse = typeof CrowdstrikeExecuteRTRResponseSchema; + +// TODO: will be part of a next PR +export const CrowdstrikeGetScriptsParamsSchema = schema.any({}); diff --git a/x-pack/plugins/stack_connectors/common/sentinelone/schema.ts b/x-pack/plugins/stack_connectors/common/sentinelone/schema.ts index 7daf615e01d31..7a20df3ef45a0 100644 --- a/x-pack/plugins/stack_connectors/common/sentinelone/schema.ts +++ b/x-pack/plugins/stack_connectors/common/sentinelone/schema.ts @@ -16,6 +16,8 @@ export const SentinelOneSecretsSchema = schema.object({ token: schema.string(), }); +export const SentinelOneApiDoNotValidateResponsesSchema = schema.any(); + export const SentinelOneBaseApiResponseSchema = schema.maybe( schema.object({}, { unknowns: 'allow' }) ); 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 eec431d8a4dcf..815e22de5259c 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 @@ -345,70 +345,185 @@ describe('CrowdstrikeConnector', () => { expect(mockedRequest).toHaveBeenCalledTimes(3); }); }); - describe('batchInitRTRSession', () => { + describe('executeRTRCommand', () => { it('should make a POST request to the correct URL with correct data', async () => { - const mockResponse = { data: { batch_id: 'testBatchId' } }; + const mockResponse = { data: obfuscatedRTRResponse }; + mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); - mockedRequest.mockResolvedValueOnce(mockResponse); + mockedRequest.mockResolvedValue(mockResponse); - await connector.batchInitRTRSession( - { endpoint_ids: ['id1', 'id2'] }, + const result = await connector.executeRTRCommand( + { + command: 'runscript -Raw', + endpoint_ids: ['id1', 'id2'], + }, + connectorUsageCollector + ); + + expect(mockedRequest).toHaveBeenNthCalledWith( + 3, + expect.objectContaining({ + url: 'https://api.crowdstrike.com/real-time-response/combined/batch-command/v1', + method: 'post', + data: expect.objectContaining({ + command_string: 'runscript -Raw', + hosts: ['id1', 'id2'], + }), + }), + connectorUsageCollector + ); + + expect(result).toEqual(obfuscatedRTRResponse); + }); + }); + + describe('batchActiveResponderExecuteRTR', () => { + it('should make a POST request to the correct URL with correct data', async () => { + const mockResponse = { data: obfuscatedRTRResponse }; + + mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); + mockedRequest.mockResolvedValue(mockResponse); + + const result = await connector.batchActiveResponderExecuteRTR( + { + command: 'runscript', + endpoint_ids: ['id1', 'id2'], + }, connectorUsageCollector ); expect(mockedRequest).toHaveBeenNthCalledWith( 1, expect.objectContaining({ - headers: { - accept: 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded', - authorization: expect.any(String), - }, + url: 'https://api.crowdstrike.com/oauth2/token', method: 'post', - responseSchema: expect.any(Object), - url: tokenPath, }), connectorUsageCollector ); + expect(mockedRequest).toHaveBeenNthCalledWith( - 2, + 3, expect.objectContaining({ - url: 'https://api.crowdstrike.com/real-time-response/combined/batch-init-session/v1', + url: 'https://api.crowdstrike.com/real-time-response/combined/batch-active-responder-command/v1', method: 'post', - data: { host_ids: ['id1', 'id2'] }, - paramsSerializer: expect.any(Function), - responseSchema: expect.any(Object), }), connectorUsageCollector ); - // @ts-expect-error private static - but I still want to test it - expect(CrowdstrikeConnector.currentBatchId).toBe('testBatchId'); + + expect(result).toEqual(obfuscatedRTRResponse); }); + }); + + describe('batchAdminExecuteRTR', () => { + it('should make a POST request to the correct URL with correct data', async () => { + const mockResponse = { data: obfuscatedRTRResponse }; - it('should handle error when fetching batch init session', async () => { mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); - mockedRequest.mockRejectedValueOnce(new Error('Failed to fetch batch init session')); + mockedRequest.mockResolvedValue(mockResponse); + + const result = await connector.batchAdminExecuteRTR( + { + command: 'runscript', + endpoint_ids: ['id1', 'id2'], + }, + connectorUsageCollector + ); + + expect(mockedRequest).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + url: 'https://api.crowdstrike.com/oauth2/token', + method: 'post', + }), + connectorUsageCollector + ); + + expect(mockedRequest).toHaveBeenNthCalledWith( + 3, + expect.objectContaining({ + url: 'https://api.crowdstrike.com/real-time-response/combined/batch-admin-command/v1', + method: 'post', + }), + connectorUsageCollector + ); - await expect( - connector.batchInitRTRSession({ endpoint_ids: ['id1', 'id2'] }, connectorUsageCollector) - ).rejects.toThrow('Failed to fetch batch init session'); + expect(result).toEqual(obfuscatedRTRResponse); }); + }); + + describe('getRTRCloudScripts', () => { + it('should make a GET request to the correct URL with correct params', async () => { + const mockResponse = { data: { scripts: [{}] } }; - it('should retry once if token is invalid', async () => { - const mockResponse = { data: { batch_id: 'testBatchId' } }; mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); - mockedRequest.mockRejectedValueOnce({ code: 401 }); - mockedRequest.mockResolvedValueOnce({ data: { access_token: 'newTestToken' } }); mockedRequest.mockResolvedValueOnce(mockResponse); - await connector.batchInitRTRSession( - { endpoint_ids: ['id1', 'id2'] }, + const result = await connector.getRTRCloudScripts( + { ids: ['script1', 'script2'] }, + connectorUsageCollector + ); + + expect(mockedRequest).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + url: 'https://api.crowdstrike.com/oauth2/token', + method: 'post', + }), connectorUsageCollector ); - expect(mockedRequest).toHaveBeenCalledTimes(4); - // @ts-expect-error private static - but I still want to test it - expect(CrowdstrikeConnector.currentBatchId).toBe('testBatchId'); + expect(mockedRequest).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + url: 'https://api.crowdstrike.com/real-time-response/entities/scripts/v1', + method: 'GET', + }), + connectorUsageCollector + ); + + expect(result).toEqual({ scripts: [{}] }); }); }); }); + +const obfuscatedRTRResponse = { + combined: { + resources: { + host1: { + session_id: 'abcdef123456', + task_id: 'task123', + complete: true, + stdout: + 'bin \n boot \n dev \n etc \n home \n lib \n lib64 \n media \n mnt \n opt \n proc \n root \n run \n sbin \n srv \n sys \n tmp \n usr \n var \n', + stderr: '', + base_command: 'runscript', + aid: 'aid123', + errors: [{ message: 'Error example', code: 123 }], + query_time: 1234567890, + offline_queued: false, + }, + host2: { + session_id: 'ghijkl789101', + task_id: 'task456', + complete: false, + stdout: + 'bin \n boot \n dev \n etc \n home \n lib \n lib64 \n media \n mnt \n opt \n proc \n root \n run \n sbin \n srv \n sys \n tmp \n usr \n var \n', + stderr: '', + base_command: 'getscripts', + aid: 'aid456', + errors: null, + query_time: 9876543210, + offline_queued: true, + }, + }, + }, + meta: { + query_time: 1234567890, + powered_by: 'CrowdStrike', + trace_id: 'trace-abcdef123456', + }, + errors: [ + { message: 'An example error', code: 500 }, + { message: 'Another error example', code: 404 }, + ], +}; 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 bd1f6613d5f04..14b38b414eb3b 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 @@ -22,20 +22,24 @@ import type { CrowdstrikeGetTokenResponse, CrowdstrikeGetAgentOnlineStatusResponse, RelaxedCrowdstrikeBaseApiResponse, - CrowdstrikeInitRTRParams, } from '../../../common/crowdstrike/types'; import { CrowdstrikeHostActionsParamsSchema, CrowdstrikeGetAgentsParamsSchema, - CrowdstrikeGetTokenResponseSchema, CrowdstrikeHostActionsResponseSchema, RelaxedCrowdstrikeBaseApiResponseSchema, - CrowdstrikeInitRTRResponseSchema, CrowdstrikeRTRCommandParamsSchema, + CrowdstrikeExecuteRTRResponseSchema, + CrowdstrikeGetScriptsParamsSchema, + CrowdStrikeExecuteRTRResponse, + CrowdstrikeApiDoNotValidateResponsesSchema, + CrowdstrikeGetTokenResponseSchema, } from '../../../common/crowdstrike/schema'; import { SUB_ACTION } from '../../../common/crowdstrike/constants'; import { CrowdstrikeError } from './error'; +const SUPPORTED_RTR_COMMANDS = ['runscript']; + const paramsSerializer = (params: Record<string, string>) => { return Object.entries(params) .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) @@ -56,8 +60,6 @@ export class CrowdstrikeConnector extends SubActionConnector< > { private static token: string | null; private static tokenExpiryTimeout: NodeJS.Timeout; - // @ts-expect-error not used at the moment, will be used in a follow up PR - private static currentBatchId: string | undefined; private static base64encodedToken: string; private experimentalFeatures: ExperimentalFeatures; @@ -69,6 +71,10 @@ export class CrowdstrikeConnector extends SubActionConnector< agentStatus: string; batchInitRTRSession: string; batchRefreshRTRSession: string; + batchExecuteRTR: string; + batchActiveResponderExecuteRTR: string; + batchAdminExecuteRTR: string; + getRTRCloudScriptsDetails: string; }; constructor( @@ -84,6 +90,10 @@ export class CrowdstrikeConnector extends SubActionConnector< agentStatus: `${this.config.url}/devices/entities/online-state/v1`, batchInitRTRSession: `${this.config.url}/real-time-response/combined/batch-init-session/v1`, batchRefreshRTRSession: `${this.config.url}/real-time-response/combined/batch-refresh-session/v1`, + batchExecuteRTR: `${this.config.url}/real-time-response/combined/batch-command/v1`, + batchActiveResponderExecuteRTR: `${this.config.url}/real-time-response/combined/batch-active-responder-command/v1`, + batchAdminExecuteRTR: `${this.config.url}/real-time-response/combined/batch-admin-command/v1`, + getRTRCloudScriptsDetails: `${this.config.url}/real-time-response/entities/scripts/v1`, }; if (!CrowdstrikeConnector.base64encodedToken) { @@ -124,6 +134,22 @@ export class CrowdstrikeConnector extends SubActionConnector< method: 'executeRTRCommand', schema: CrowdstrikeRTRCommandParamsSchema, // Define a proper schema for the command }); + this.registerSubAction({ + name: SUB_ACTION.EXECUTE_ACTIVE_RESPONDER_RTR, + method: 'batchActiveResponderExecuteRTR', + schema: CrowdstrikeRTRCommandParamsSchema, // Define a proper schema for the command + }); + this.registerSubAction({ + name: SUB_ACTION.EXECUTE_ADMIN_RTR, + method: 'batchAdminExecuteRTR', + schema: CrowdstrikeRTRCommandParamsSchema, // Define a proper schema for the command + }); + // temporary to fetch scripts and help testing + this.registerSubAction({ + name: SUB_ACTION.GET_RTR_CLOUD_SCRIPTS, + method: 'getRTRCloudScripts', + schema: CrowdstrikeGetScriptsParamsSchema, + }); } } @@ -194,7 +220,7 @@ export class CrowdstrikeConnector extends SubActionConnector< ) as Promise<CrowdstrikeGetAgentOnlineStatusResponse>; } - private async getTokenRequest(connectorUsageCollector: ConnectorUsageCollector) { + private getTokenRequest = async (connectorUsageCollector: ConnectorUsageCollector) => { const response = await this.request<CrowdstrikeGetTokenResponse>( { url: this.urls.getToken, @@ -204,7 +230,8 @@ export class CrowdstrikeConnector extends SubActionConnector< 'Content-Type': 'application/x-www-form-urlencoded', authorization: 'Basic ' + CrowdstrikeConnector.base64encodedToken, }, - responseSchema: CrowdstrikeGetTokenResponseSchema, + responseSchema: + CrowdstrikeApiDoNotValidateResponsesSchema as unknown as typeof CrowdstrikeGetTokenResponseSchema, }, connectorUsageCollector ); @@ -219,13 +246,13 @@ export class CrowdstrikeConnector extends SubActionConnector< }, 29 * 60 * 1000); } return token; - } + }; - private async crowdstrikeApiRequest<R extends RelaxedCrowdstrikeBaseApiResponse>( + private crowdstrikeApiRequest = async <R extends RelaxedCrowdstrikeBaseApiResponse>( req: SubActionRequestParams<R>, connectorUsageCollector: ConnectorUsageCollector, retried?: boolean - ): Promise<R> { + ): Promise<R> => { try { if (!CrowdstrikeConnector.token) { CrowdstrikeConnector.token = (await this.getTokenRequest( @@ -240,7 +267,7 @@ export class CrowdstrikeConnector extends SubActionConnector< // where the external system might add/remove/change values in the response that we have no // control over. responseSchema: - RelaxedCrowdstrikeBaseApiResponseSchema as unknown as SubActionRequestParams<R>['responseSchema'], + CrowdstrikeApiDoNotValidateResponsesSchema as unknown as SubActionRequestParams<R>['responseSchema'], headers: { ...req.headers, Authorization: `Bearer ${CrowdstrikeConnector.token}`, @@ -257,39 +284,114 @@ export class CrowdstrikeConnector extends SubActionConnector< } throw new CrowdstrikeError(error.message); } - } + }; - public async batchInitRTRSession( - payload: CrowdstrikeInitRTRParams, + // Helper method to execute RTR commands with different API endpoints + private executeRTRCommandWithUrl = async ( + url: string, + payload: { + command: string; + endpoint_ids: string[]; + overwriteUrl?: 'batchExecuteRTR' | 'batchActiveResponderExecuteRTR' | 'batchAdminExecuteRTR'; + }, connectorUsageCollector: ConnectorUsageCollector - ) { - const response = await this.crowdstrikeApiRequest( + ): Promise<CrowdStrikeExecuteRTRResponse> => { + // Some commands are only available in specific API endpoints, however there's an additional requirement check for the command's argument + // Eg. runscript command is available with the batchExecuteRTR endpoint, but if it goes with --Raw parameter, it should go to batchAdminExecuteRTR endpoint + // This overwrite value will be coming from kibana response actions api + const csUrl = payload.overwriteUrl ? this.urls[payload.overwriteUrl] : url; + + const batchId = await this.crowdStrikeSessionManager.initializeSession( + { endpoint_ids: payload.endpoint_ids }, + connectorUsageCollector + ); + + const baseCommand = payload.command.split(' ')[0]; + + if (!SUPPORTED_RTR_COMMANDS.includes(baseCommand)) { + throw new CrowdstrikeError('Command not supported'); + } + return await this.crowdstrikeApiRequest<CrowdStrikeExecuteRTRResponse>( { - url: this.urls.batchInitRTRSession, + url: csUrl, method: 'post', data: { - host_ids: payload.endpoint_ids, + base_command: baseCommand, + command_string: payload.command, + batch_id: batchId, + hosts: payload.endpoint_ids, + persist_all: false, }, paramsSerializer, - responseSchema: CrowdstrikeInitRTRResponseSchema, + responseSchema: + CrowdstrikeExecuteRTRResponseSchema as unknown as SubActionRequestParams<CrowdStrikeExecuteRTRResponse>['responseSchema'], }, connectorUsageCollector ); + }; + + // Public method for generic RTR command execution + public async executeRTRCommand( + payload: { + command: string; + endpoint_ids: string[]; + overwriteUrl?: 'batchActiveResponderExecuteRTR' | 'batchAdminExecuteRTR'; + }, + connectorUsageCollector: ConnectorUsageCollector + ): Promise<CrowdStrikeExecuteRTRResponse> { + return await this.executeRTRCommandWithUrl( + this.urls.batchExecuteRTR, + payload, + connectorUsageCollector + ); + } - CrowdstrikeConnector.currentBatchId = response.batch_id; + // Public method for Active Responder RTR command execution + public async batchActiveResponderExecuteRTR( + payload: { + command: string; + endpoint_ids: string[]; + overwriteUrl?: 'batchAdminExecuteRTR'; + }, + connectorUsageCollector: ConnectorUsageCollector + ): Promise<CrowdStrikeExecuteRTRResponse> { + return await this.executeRTRCommandWithUrl( + this.urls.batchActiveResponderExecuteRTR, + payload, + connectorUsageCollector + ); } - // TODO: WIP - just to have session init logic in place - public async executeRTRCommand( - payload: { command: string; endpoint_ids: string[] }, + // Public method for Admin RTR command execution + public async batchAdminExecuteRTR( + payload: { + command: string; + endpoint_ids: string[]; + }, connectorUsageCollector: ConnectorUsageCollector - ) { - const batchId = await this.crowdStrikeSessionManager.initializeSession( - { endpoint_ids: payload.endpoint_ids }, + ): Promise<CrowdStrikeExecuteRTRResponse> { + return await this.executeRTRCommandWithUrl( + this.urls.batchAdminExecuteRTR, + payload, connectorUsageCollector ); + } - return Promise.resolve({ batchId }); + // TODO: for now just for testing purposes, will be a part of a following PR + public async getRTRCloudScripts( + payload: CrowdstrikeGetAgentsParams, + connectorUsageCollector: ConnectorUsageCollector + ): Promise<CrowdstrikeGetAgentOnlineStatusResponse> { + // @ts-expect-error will be a part of the next PR + return this.crowdstrikeApiRequest( + { + url: this.urls.getRTRCloudScriptsDetails, + method: 'GET', + paramsSerializer, + responseSchema: RelaxedCrowdstrikeBaseApiResponseSchema, + }, + connectorUsageCollector + ); } protected getResponseErrorMessage( diff --git a/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/sentinelone.ts b/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/sentinelone.ts index 42d946edbc787..4be4a4e25ef15 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/sentinelone.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/sentinelone.ts @@ -43,7 +43,7 @@ import { SentinelOneGetRemoteScriptResultsParamsSchema, SentinelOneDownloadRemoteScriptResultsParamsSchema, SentinelOneDownloadRemoteScriptResultsResponseSchema, - SentinelOneBaseApiResponseSchema, + SentinelOneApiDoNotValidateResponsesSchema, } from '../../../common/sentinelone/schema'; import { SUB_ACTION } from '../../../common/sentinelone/constants'; import { @@ -405,7 +405,7 @@ export class SentinelOneConnector extends SubActionConnector< // where the external system might add/remove/change values in the response that we have no // control over. responseSchema: - SentinelOneBaseApiResponseSchema as unknown as SubActionRequestParams<R>['responseSchema'], + SentinelOneApiDoNotValidateResponsesSchema as unknown as SubActionRequestParams<R>['responseSchema'], params: { ...req.params, APIToken: this.secrets.token, diff --git a/x-pack/plugins/task_manager/server/saved_objects/mappings.ts b/x-pack/plugins/task_manager/server/saved_objects/mappings.ts index 8ad641b56a58f..7ebd5091c7d47 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/mappings.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/mappings.ts @@ -65,6 +65,9 @@ export const taskMappings: SavedObjectsTypeMappingDefinition = { partition: { type: 'integer', }, + priority: { + type: 'integer', + }, }, }; diff --git a/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts b/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts index 775b3ea2f8cad..4c7ae514f0bb7 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts @@ -6,7 +6,7 @@ */ import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server'; -import { taskSchemaV1, taskSchemaV2 } from '../schemas/task'; +import { taskSchemaV1, taskSchemaV2, taskSchemaV3 } from '../schemas/task'; export const taskModelVersions: SavedObjectsModelVersionMap = { '1': { @@ -35,4 +35,18 @@ export const taskModelVersions: SavedObjectsModelVersionMap = { create: taskSchemaV2, }, }, + '3': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + priority: { type: 'integer' }, + }, + }, + ], + schemas: { + forwardCompatibility: taskSchemaV3.extends({}, { unknowns: 'ignore' }), + create: taskSchemaV3, + }, + }, }; diff --git a/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts b/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts index 2a6ee5c92198c..b6e724099912d 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts @@ -42,3 +42,7 @@ export const taskSchemaV1 = schema.object({ export const taskSchemaV2 = taskSchemaV1.extends({ partition: schema.maybe(schema.number()), }); + +export const taskSchemaV3 = taskSchemaV2.extends({ + priority: schema.maybe(schema.number()), +}); 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 eb9150f8482e2..34f755702c7b1 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -19470,6 +19470,22 @@ } } } + }, + "legacy_siem_signals": { + "properties": { + "non_migrated_indices_total": { + "type": "long", + "_meta": { + "description": "Total number of non migrated legacy siem signals indices" + } + }, + "spaces_total": { + "type": "long", + "_meta": { + "description": "Total number of Kibana spaces that have non migrated legacy siem signals indices" + } + } + } } } }, diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/jest.config.js b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/jest.config.js new file mode 100644 index 0000000000000..3620ef5a1c254 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/jest.config.js @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../../..', + roots: [ + '<rootDir>/x-pack/solutions/observability/packages/observability_ai/observability_ai_common', + '<rootDir>/x-pack/solutions/observability/packages/observability_ai/observability_ai_server', + ], +}; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/kibana.jsonc b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/kibana.jsonc new file mode 100644 index 0000000000000..731f38d6bfe88 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/observability-ai-common", + "owner": "@elastic/obs-ai-assistant", + "group": "observability", + "visibility": "private" +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/package.json b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/package.json new file mode 100644 index 0000000000000..0f5f1062937ba --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/observability-ai-common", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/root_cause_analysis/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/root_cause_analysis/index.ts new file mode 100644 index 0000000000000..8d052799aa583 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/root_cause_analysis/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { + RCA_END_PROCESS_TOOL_NAME, + RCA_INVESTIGATE_ENTITY_TOOL_NAME, + RCA_OBSERVE_TOOL_NAME, +} from './tool_names'; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/root_cause_analysis/tool_names.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/root_cause_analysis/tool_names.ts new file mode 100644 index 0000000000000..76fe9e377daed --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/root_cause_analysis/tool_names.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const RCA_OBSERVE_TOOL_NAME = 'observe'; +export const RCA_END_PROCESS_TOOL_NAME = 'endProcessAndWriteReport'; +export const RCA_INVESTIGATE_ENTITY_TOOL_NAME = 'investigateEntity'; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/tsconfig.json b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/tsconfig.json new file mode 100644 index 0000000000000..af23c916b5d13 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_common/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + ] +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/jest.config.js b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/jest.config.js new file mode 100644 index 0000000000000..8aa1c2d673222 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/jest.config.js @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../../..', + roots: [ + '<rootDir>/x-pack/solutions/observability/packages/observability_ai/observability_ai_server', + ], +}; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/kibana.jsonc b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/kibana.jsonc new file mode 100644 index 0000000000000..6eb48a95a5624 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-server", + "id": "@kbn/observability-ai-server", + "owner": "@elastic/obs-ai-assistant", + "group": "observability", + "visibility": "private" +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/package.json b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/package.json new file mode 100644 index 0000000000000..fc6fc310801dc --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/observability-ai-server", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_end_rca_process_tool.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_end_rca_process_tool.ts new file mode 100644 index 0000000000000..a1b546d2629a4 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_end_rca_process_tool.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { from, Observable, of, switchMap } from 'rxjs'; +import { RCA_END_PROCESS_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { AssistantMessage, MessageRole } from '@kbn/inference-common'; +import { writeFinalReport } from './tasks/write_final_report'; +import { EndProcessToolMessage, RootCauseAnalysisContext } from './types'; +import { generateSignificantEventsTimeline } from './tasks/generate_timeline'; +import { EMPTY_ASSISTANT_MESSAGE } from './empty_assistant_message'; + +export function callEndRcaProcessTool({ + rcaContext, + toolCallId, +}: { + rcaContext: RootCauseAnalysisContext; + toolCallId: string; +}): Observable<EndProcessToolMessage | AssistantMessage> { + return from( + writeFinalReport({ + rcaContext, + }) + ).pipe( + switchMap((report) => { + return from( + generateSignificantEventsTimeline({ + rcaContext, + report, + }).then((timeline) => { + return { timeline, report }; + }) + ); + }), + switchMap(({ report, timeline }) => { + const toolMessage: EndProcessToolMessage = { + name: RCA_END_PROCESS_TOOL_NAME, + role: MessageRole.Tool, + toolCallId, + response: { + report, + timeline, + }, + }; + return of(toolMessage, EMPTY_ASSISTANT_MESSAGE); + }) + ); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_investigate_entity_tool.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_investigate_entity_tool.ts new file mode 100644 index 0000000000000..c22d28d7389fb --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_investigate_entity_tool.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { from, Observable, of, switchMap } from 'rxjs'; +import { MessageRole } from '@kbn/inference-common'; +import { RCA_INVESTIGATE_ENTITY_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { InvestigateEntityToolMessage, RootCauseAnalysisContext, ToolErrorMessage } from './types'; +import { investigateEntity } from './tasks/investigate_entity'; +import { formatEntity } from './util/format_entity'; + +export function callInvestigateEntityTool({ + field, + value, + context, + toolCallId, + rcaContext, +}: { + field: string; + value: string; + context: string; + toolCallId: string; + rcaContext: RootCauseAnalysisContext; +}): Observable<InvestigateEntityToolMessage | ToolErrorMessage> { + const nextEntity = { + [field]: value, + }; + + return from( + investigateEntity({ + rcaContext, + entity: nextEntity, + context, + }) + ).pipe( + switchMap((entityInvestigation) => { + if (!entityInvestigation) { + const entityNotFoundToolMessage: ToolErrorMessage = { + name: 'error', + role: MessageRole.Tool, + response: { + error: { + message: `Entity ${formatEntity(nextEntity)} not found, have + you verified it exists and if the field and value you are using + are correct?`, + }, + }, + toolCallId, + }; + + return of(entityNotFoundToolMessage); + } + + const { + attachments, + relatedEntities, + entity: investigatedEntity, + summary, + } = entityInvestigation; + const toolMessage: InvestigateEntityToolMessage = { + name: RCA_INVESTIGATE_ENTITY_TOOL_NAME, + role: MessageRole.Tool as const, + toolCallId, + response: { + entity: investigatedEntity, + relatedEntities, + summary, + }, + data: { + attachments, + }, + }; + + return of(toolMessage); + }) + ); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_observe_tool.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_observe_tool.ts new file mode 100644 index 0000000000000..06676abd729f0 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/call_observe_tool.ts @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { AssistantMessage, MessageRole } from '@kbn/inference-common'; +import { + RCA_INVESTIGATE_ENTITY_TOOL_NAME, + RCA_OBSERVE_TOOL_NAME, +} from '@kbn/observability-ai-common/root_cause_analysis'; +import { compact, findLast } from 'lodash'; +import { from, Observable, of, switchMap } from 'rxjs'; +import { observeInvestigationResults } from './tasks/observe_investigation_results'; +import { + InvestigateEntityToolMessage, + ObservationToolMessage, + RootCauseAnalysisContext, + RootCauseAnalysisEvent, +} from './types'; + +export function callObserveTool({ + rcaContext, + toolCallId, +}: { + rcaContext: RootCauseAnalysisContext; + toolCallId: string; +}): Observable<ObservationToolMessage> { + const { events } = rcaContext; + + const lastAssistantMessage = findLast( + events.slice(0, -1), + (event): event is Extract<RootCauseAnalysisEvent, AssistantMessage> => + event.role === MessageRole.Assistant + ); + + const toolMessagesByToolCallId = Object.fromEntries( + compact( + events.map((message) => + 'toolCallId' in message && + (message.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME || message.name === 'error') + ? [message.toolCallId, message] + : undefined + ) + ) + ); + + const investigationToolMessages = + lastAssistantMessage && lastAssistantMessage.toolCalls + ? compact( + lastAssistantMessage.toolCalls.map((investigateEntityToolCall) => { + if (investigateEntityToolCall.function.name !== RCA_INVESTIGATE_ENTITY_TOOL_NAME) { + return undefined; + } + return { + toolCall: investigateEntityToolCall, + toolResponse: toolMessagesByToolCallId[investigateEntityToolCall.toolCallId], + }; + }) + ) + : []; + + const investigations = investigationToolMessages + .map((toolMessage) => toolMessage.toolResponse) + .filter( + (toolResponse): toolResponse is InvestigateEntityToolMessage => + toolResponse.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME + ) + .map((toolResponse) => ({ ...toolResponse.data, ...toolResponse.response })); + + return from( + observeInvestigationResults({ + rcaContext, + investigations, + }) + ).pipe( + switchMap((summary) => { + const observationToolMessage: ObservationToolMessage = { + name: RCA_OBSERVE_TOOL_NAME, + response: { + content: summary.content, + }, + data: summary, + role: MessageRole.Tool, + toolCallId, + }; + return of(observationToolMessage); + }) + ); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/empty_assistant_message.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/empty_assistant_message.ts new file mode 100644 index 0000000000000..08443d593a81a --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/empty_assistant_message.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { AssistantMessage, MessageRole } from '@kbn/inference-common'; +import { RootCauseAnalysisEvent } from './types'; + +export const EMPTY_ASSISTANT_MESSAGE: Extract<RootCauseAnalysisEvent, AssistantMessage> = { + content: '', + role: MessageRole.Assistant, + toolCalls: [], +}; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/index.ts new file mode 100644 index 0000000000000..66307dc2ef9a4 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/index.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. + */ + +export type { + RootCauseAnalysisEvent, + InvestigateEntityToolMessage, + EndProcessToolMessage, + ObservationToolMessage, + RootCauseAnalysisToolMessage, + ToolErrorMessage, + RootCauseAnalysisToolRequest, +} from './types'; +export type { SignificantEventsTimeline, SignificantEvent } from './tasks/generate_timeline'; +export type { EntityInvestigation } from './tasks/investigate_entity'; + +export { runRootCauseAnalysis } from './run_root_cause_analysis'; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/prompts/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/prompts/index.ts new file mode 100644 index 0000000000000..8a0a6a9064700 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/prompts/index.ts @@ -0,0 +1,345 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const RCA_SYSTEM_PROMPT_BASE = `You are a helpful assistant for Elastic Observability. +You are a distinguished SRE, who has an established career, working in both +small shops and FAANG-level companies. You have worked with Elasticsearch +since the beginning and expertly use it in your analysis of incidents. + +You use an evidence-based strategy to determine the root cause of +an incident. You thoroughly analyze Observability data. You use your +understanding of different architectures like microservies, monoliths, +event-driven systems, and environments like Kubernetes to discover +patterns and correlations in the data ingested into the user's system. + +Your sizable experience with monitoring software systems has taught +you how to investigate issues and correlate symptoms of the investigate +service with its dependencies. + +## Capabilities + +You are highly skilled at inspecting logs, traces, alerts, and SLOs to uncover +the root cause of incidents, with a special emphasis on detecting log patterns +that reveal system behavior. You can identify related entities, such as upstream +services or the specific pod a service is running on, by searching through logs +and traces for relationships using metadata like IP addresses, session IDs, or +distributed tracing data. While you can analyze alerts and SLO-derived metrics, +you do not directly analyze other system metrics, inspect files, or execute +commands that modify the system. + +## Non-capabilities + +You lack the capabilities to analyze metrics or connect to external systems.`; + +export const RCA_PROMPT_ENTITIES = `# Entities + +In an Observability system, entities are distinct components or resources within +the infrastructure, each representing points of interest for monitoring and +troubleshooting. These entities form the backbone of log-based analysis and +allow teams to track behavior, detect anomalies, and investigate issues across +different layers of the system. Here’s a breakdown of common entities in +observability: + +1. Services: Core units of functionality in an application ecosystem, +representing individual processes or applications (e.g., user-authentication, +payment processing). Services typically expose APIs or endpoints, and logs from +these entities often capture requests, responses, and error events, which are +critical for understanding application behavior. + +2. Kubernetes (K8s) Entities: + - Pods: The smallest deployable units in Kubernetes, usually containing one +or more containers. Logs from pods provide insight into container operations, +errors, and application states. + - Namespaces: Logical groupings within a cluster for organizing and isolating +resources, helping in filtering logs by domain or responsibility. + - Nodes: Worker machines (either physical or virtual) where pods run. Node +logs often cover hardware resource events, errors, and other system-level events +relevant to pod health and performance. + - Deployments and ReplicaSets: Define and manage the desired state of pod +replication and rolling updates. Logs from these components can reveal changes +in application versions, scaling events, and configuration updates. + +3. Virtual Machines (VMs): Virtualized computing resources that generate +operating system-level logs capturing events such as application crashes, +network issues, and OS-related errors. + +4. Applications: Software systems or packages running across the infrastructure,n +which may encompass multiple services. Logs from applications track user flows, +application states, and error messages, providing context for user interactions +and system events. + +5. Serverless Functions (e.g., AWS Lambda): Code executions triggered by +specific events. Logs from serverless functions capture invocation details, +execution paths, and error traces, which are useful for understanding specific +function behaviors and pinpointing execution anomalies. + +6. Databases and Data Stores: Includes SQL/NoSQL databases, caches, and storage +solutions. Logs from these entities cover query executions, connection issues, +and transaction errors, essential for tracking data layer issues. + +7. Containers: Portable environments running individual services or processes. +Container logs capture application and system events within the containerized +environment, helping track process-level errors and status changes. + +8. Load Balancers and API Gateways: Components responsible for managing and +routing traffic. Logs from these entities include request paths, status codes, +and errors encountered, which can indicate connectivity issues or +misconfigurations. + +9. Networking Components: Entities like virtual private clouds (VPCs), +firewalls, VPNs, and network interfaces. Logs from these components track +traffic flows, connectivity issues, and security events, crucial for identifying +network-related anomalies. + +10. Clusters and Regions: Groupings of infrastructure either physically or +logically, such as across data centers or cloud regions. Cluster and region logs +help capture high-level events and error messages, useful for understanding +system-wide issues and region-specific disruptions. + +Each of these entities is typically identified by fields such as +\`service.name\`, \`kubernetes.pod.name\`, \`container.id\`, or similar fields +in log records. Observability systems use these identifiers to connect entities, +creating a map of relationships and dependencies that helps teams diagnose +issues, understand cross-entity impacts, and uncover root causes in distributed +architectures.`; + +export const RCA_PROMPT_DEPENDENCIES = `## Understanding the Flow: Upstream vs. Downstream + +- Upstream dependencies: These are the services that your service +depends on. They supply data, perform tasks, or provide resources that +your service consumes. +- Downstream dependencies: These are the services that depend on your +service. They consume the data or resources your service generates. + +When diagnosing issues, distinguishing the direction of dependency can +clarify whether a problem originates from your service’s reliance on an +external input or whether your service is causing issues for other systems. + +--- + +## When to Investigate Upstream Dependencies + +Upstream issues typically occur when your service is failing due to problems +with the responses it receives from external systems. + +1. Timeouts and Latency +- Symptoms: Slow response times, retries, or timeouts. +- Errors: HTTP 504, retrying connection, exceeded timeout threshold. +- Focus: Check the performance and availability of upstream services +(e.g., APIs, databases) and network latency. + +2. Data Integrity Issues** +- Symptoms: Inconsistent or corrupted data. +- Errors: unexpected data format, deserialization errors. +- Focus: Verify data received from upstream services, and investigate +schema or data format changes. + +3. Connection Failures +- Symptoms: Your service cannot connect to upstream services. +- Errors: DNS lookup failed, connection refused, socket timeout. +- Focus: Check upstream service health, DNS, and networking components. + +4. Authentication/Authorization Failures** +- Symptoms: Failed access to upstream resources. +- Errors: 401 Unauthorized, 403 Forbidden, token issues. +- Focus: Validate credentials or tokens and investigate upstream access +policies. + +--- + +## When to Investigate Downstream Dependencies + +Downstream issues occur when your service is functioning but its outputs cause +failures in other services that depend on it. + +1. Data or API Response Issues +- Symptoms: Downstream services receive bad or invalid data. +- Errors: data type mismatch, invalid JSON format. +- Focus: Ensure your service is returning correct data and check for API +changes. + +2. Rate-Limiting and Resource Exhaustion** +- Symptoms: Downstream services are overwhelmed. +- Errors: 429 Too Many Requests, throttling or resource exhaustion. +- Focus: Check your service’s request rates and resource usage (e.g., memory, CPU). + +3. Unexpected Behavior or Regression +- Symptoms: Downstream failures after a recent deployment. +- Errors: New downstream errors after your service changes. +- Focus: Review recent updates, API contracts, or integration points. + +4. Eventual Consistency or Queue Backlogs +- Symptoms: Delayed processing in downstream systems. +- Errors: message queue full, backlog warnings. +- Focus: Check event production rates and queue statuses in downstream services.`; + +export const RCA_PROMPT_CHANGES = `## Reasoning about Correlating Changes in Incident Investigations + +In a root cause analysis, understanding the types and timing of changes is key +to linking symptoms with underlying causes. Changes can broadly be classified +into **symptomatic changes** (indicators of system issues like elevated error +rates or degraded throughput) and **system changes** (events that modify system +configuration or structure, such as scale-downs, new version rollouts, or +significant configuration adjustments). By correlating these changes, we can +assess whether observed symptoms are likely related to specific system +modifications. + +### Identifying Correlations Between Symptomatic and System Changes + +When investigating a sudden issue—such as a 5x increase in latency—it’s +essential to evaluate both the **timing** and **nature** of associated changes +in upstream dependencies, resource utilization, and configuration events. For +instance: + +- Consistent Symptomatic Behavior: If an upstream dependency exhibits a +similar, sustained latency spike around the same time and shows log entries +indicating CPU throttling, this would suggest a correlated, persistent issue +that may directly impact the observed symptom. A scale-down event preceding the +latency increase might indicate that reduced resources are stressing the +dependency. + +- Transient vs. Persistent Issues: Another upstream dependency that +experiences a brief latency increase but recovers quickly is less likely +related. Short-lived changes that self-correct without intervention typically +have different root causes or may be unrelated noise. + +### Types of Changes to Consider in Correlation + +1. Log Pattern Changes: A shift in log patterns, especially around error +levels, provides significant insight. If there’s an increase in critical or +warning log patterns for a dependency during the latency spike, it could +indicate that the issue stems from this entity. Compare these log patterns to +past behavior to assess whether they represent an anomaly that might warrant +further investigation. + +2. Event-Driven System Changes: + - Scale Events: Scale-up or scale-down events can directly impact +performance. If a latency increase aligns with a scale-down, it may suggest that +resource reduction is straining the system. + - Release or Deployment Events: A new version rollout or config change is +a frequent source of correlated issues. Compare the timing of the latency +increase to the deployment to see if the change directly impacts the system. +Correlate with alerts or SLO breaches on endpoints to understand the immediate +effects of the release. + +3. SLO and Alert-Based Changes: SLO breaches and alerts can provide concrete +timestamps for when symptoms begin. For instance, a breach on error rates for a +specific service endpoint following a dependency’s scale-down event suggests a +possible causal link. An alert indicating sustained latency increase in a +dependency that remains unresolved points to a high-priority area for deeper +investigation. + +4. Dependency Health and Behavior: + - Related vs. Unrelated Dependencies: Similar to the latency example, +observe if multiple dependencies experience symptomatic changes simultaneously. +Related dependencies should show consistent, similar issues, while unrelated +dependencies may exhibit brief, unrelated spikes. Persistent issues across key +dependencies likely indicate a systemic cause, while isolated changes are less +likely to be relevant. + +### Examples of Reasoning Through Changes + +Consider these scenarios: +- Increase in Error Rates and a Recent Deployment: Suppose error rates for +an endpoint increase sharply post-deployment. If related logs show new error +patterns, this aligns the symptom with a deployment change. Investigate specific +changes in the deployment (e.g., code changes or resource allocation). +- Throughput Decrease and Scaling Events: If throughput dips shortly after a +scale-down event, it might suggest resource constraints. Analyze CPU or memory +throttling logs from this period in upstream dependencies to confirm. +- Cross-Service Latency Spikes: If multiple services along a call path +experience latency spikes, with CPU throttling logs, this suggests a resource +bottleneck. Trace logs and alerts related to autoscaling decisions may provide +insights into whether the system configuration caused cascading delays. + +By carefully mapping these changes and analyzing their timing, you can +distinguish between causally related events and incidental changes, allowing for +a targeted and effective investigation.`; + +export const RCA_PROMPT_CHANGE_POINTS = `## Change points + +Change points can be defined as the following type: + +- \`dip\`: a significant dip occurs at this change point +- \`distribution_change\`: the overall distribution of the values has changed +significantly +- \`non_stationary\`: there is no change point, but the values are not from a +stationary distribution +- \`spike\`: a significant spike occurs at this point +- \`stationary\`: no change point found +- \`step_change\`: the change indicates a statistically significant step up or +down in value distribution +- \`trend_change\`: there is an overall trend change occurring at this point + +For \`spike\`, and \`dip\`, this means: a short-lived spike or dip that then again +stabilizes. For persisted changes, you'd see a \`step_change\` (if the values +before and after the change point are stable), or a \`trend_change\` when the +values show an upward or downward trend after the change.`; + +export const RCA_PROMPT_SIGNIFICANT_EVENTS = `## Significant events + +Generate a timeline of significant events. These events should capture +significant observed changes in the system that can be extracted from the +analyzed data. This timeline is absolutely critical to the investigation, +and close attention has to be paid to the data, and the instructions. + +The timeline should focus on key events as captured in log patterns, including +both notable changes and unusual/critical messages. This data-driven timeline +should help establish a chain of causality, pinpointing when anomalies began, +what system behaviors were observed, and how these patterns relate to the overall incident. + +- Use ISO timestamps to ensure precision and clarity. +- Include alerts that are part of the investigation. For these, use the start +time of the alert, and mention critical information about the alert, such as +reason and grouping fields. +- Focus on log entries that signal significant system behavior (e.g., errors, +retries, anomalies). +- Highlight critical log messages or changes in patterns that may correlate +with the issue. +- Include notable anomalies, such as spikes in error rates, unexpected system +responses, or any log entries suggesting failure or degradation. + +Do not include: +- Events that are indicative of normal operations. +- Events that are unlikely to be related to the investigated issue. + +Key Elements to Include: + +- Log Patterns: Capture log messages that show unusual events or +abnormalities such as error codes, failed retries, or changes in log frequency. +- Timestamps: Ensure every entry in the timeline is time-stamped +with an accurate ISO 8601 timestamp. +- Event Description: Provide a clear, concise, and objective description of +what was observed in the logs. +- Corroborating Data: Link log anomalies to other relevant data points such +as traffic shifts, request patterns, or upstream/downstream service impacts.`; + +export const RCA_PROMPT_TIMELINE_GUIDE = ` +The timeline should focus on key events as +captured in log patterns, including both notable changes and unusual/critical +messages. This data-driven timeline should help establish a chain of causality, +pinpointing when anomalies began, what system behaviors were observed, and how +these patterns relate to the overall incident. + +- Use ISO timestamps** to ensure precision and clarity. +- Focus on log entries** that signal significant system behavior (e.g., +errors, retries, anomalies). +- Highlight critical log messages** or changes in patterns that may correlate +with the issue. +- Include notable anomalies, such as spikes in error rates, unexpected +system responses, or any log entries suggesting failure or degradation. + +Key Elements to Include: + +Log Patterns: Capture log messages that show unusual events or +abnormalities such as error codes, failed retries, or changes in log frequency. +Timestamps: Ensure every entry in the timeline is time-stamped +with an accurate ISO 8601 timestamp. +Event Description: Provide a clear, concise description of what was +observed in the logs. +Corroborating Data: Link log anomalies to other relevant data points such +as traffic shifts, request patterns, or upstream/downstream service impacts.`; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/run_root_cause_analysis.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/run_root_cause_analysis.ts new file mode 100644 index 0000000000000..94b14b4f3d12f --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/run_root_cause_analysis.ts @@ -0,0 +1,305 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RulesClient } from '@kbn/alerting-plugin/server'; +import { calculateAuto } from '@kbn/calculate-auto'; +import { MessageRole, AssistantMessage, ToolMessage, ToolChoiceType } from '@kbn/inference-common'; +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { Logger } from '@kbn/logging'; +import { AlertsClient } from '@kbn/rule-registry-plugin/server'; +import { findLast, pick } from 'lodash'; +import moment from 'moment'; +import { catchError, filter, from, map, mergeMap, Observable, of, switchMap } from 'rxjs'; +import { ObservabilityAIAssistantClient } from '@kbn/observability-ai-assistant-plugin/server'; +import { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { + RCA_END_PROCESS_TOOL_NAME, + RCA_INVESTIGATE_ENTITY_TOOL_NAME, + RCA_OBSERVE_TOOL_NAME, +} from '@kbn/observability-ai-common/root_cause_analysis'; +import { callEndRcaProcessTool } from './call_end_rca_process_tool'; +import { callInvestigateEntityTool } from './call_investigate_entity_tool'; +import { callObserveTool } from './call_observe_tool'; +import { RCA_PROMPT_CHANGES, RCA_PROMPT_ENTITIES, RCA_SYSTEM_PROMPT_BASE } from './prompts'; +import { RCA_TOOLS } from './tools'; +import { + EndProcessToolMessage, + InvestigateEntityToolMessage, + ObservationToolMessage, + RootCauseAnalysisContext, + RootCauseAnalysisEvent, + ToolErrorMessage, +} from './types'; +import { callTools } from './util/call_tools'; +import { formatEntity } from './util/format_entity'; +import { validateInvestigateEntityToolCalls } from './util/validate_investigate_entity_tool_call'; + +const SYSTEM_PROMPT_WITH_OBSERVE_INSTRUCTIONS = `${RCA_SYSTEM_PROMPT_BASE} + +Your next step is to request an observation from another agent based +on the initial context or the results of previous investigations.`; + +const SYSTEM_PROMPT_WITH_DECISION_INSTRUCTIONS = `${RCA_SYSTEM_PROMPT_BASE} + +${RCA_PROMPT_ENTITIES} + +${RCA_PROMPT_CHANGES} + + To determine whether to end the process or continue analyzing another entity, +follow the advice from the previous observation, and these tips: + + Continuing the process: + - Do not investigate an entity twice. This will result in a failure. + - Logs, traces, or observability data that suggest upstream or downstream +issues (such as connection failures, timeouts, or authentication errors) +indicate further investigation is required. + + Ending the process: + - No further entities to investigate: If there are no unexplored upstream or +downstream dependencies, and all related entities have been investigated without +discovering new anomalies, it may be appropriate to end the process. + - If all investigated entities (e.g., services, hosts, containers) are +functioning normally, with no relevant issues found, and there are no signs of +dependencies being affected, you may consider ending the process. + - Avoid concluding the investigation based solely on symptoms or the absence +of immediate errors in the data. Unless a system change has been connected to +the incident, it is important to continue investigating dependencies to ensure +the root cause has been accurately identified.`; + +export function runRootCauseAnalysis({ + serviceName, + start: requestedStart, + end: requestedEnd, + esClient, + alertsClient, + rulesClient, + observabilityAIAssistantClient, + spaceId, + indices, + connectorId, + inferenceClient, + context: initialContext, + logger: incomingLogger, + prevEvents, +}: { + context: string; + serviceName: string; + logger: Logger; + inferenceClient: InferenceClient; + start: number; + end: number; + alertsClient: AlertsClient; + rulesClient: RulesClient; + esClient: ObservabilityElasticsearchClient; + observabilityAIAssistantClient: ObservabilityAIAssistantClient; + indices: { + logs: string[]; + traces: string[]; + sloSummaries: string[]; + }; + connectorId: string; + spaceId: string; + prevEvents?: RootCauseAnalysisEvent[]; +}): Observable<RootCauseAnalysisEvent> { + const logger = incomingLogger.get('rca'); + + const entity = { 'service.name': serviceName }; + + const bucketSize = calculateAuto + .atLeast(30, moment.duration(requestedEnd - requestedStart))! + .asMilliseconds(); + + const start = Math.floor(requestedStart / bucketSize) * bucketSize; + const end = Math.floor(requestedEnd / bucketSize) * bucketSize; + + const initialMessage = { + role: MessageRole.User as const, + content: `Investigate the health status of ${formatEntity(entity)}. + + The context given for this investigation is: + + ${initialContext}`, + }; + + const nextEvents = [initialMessage, ...(prevEvents ?? [])]; + + const initialRcaContext: RootCauseAnalysisContext = { + connectorId, + start, + end, + esClient, + events: nextEvents, + indices, + inferenceClient, + initialContext, + alertsClient, + observabilityAIAssistantClient, + logger, + rulesClient, + spaceId, + tokenLimit: 32_000, + }; + + const investigationTimeRangePrompt = `## Time range + + The time range of the investigation is ${new Date(start).toISOString()} until ${new Date( + end + ).toISOString()}`; + + initialContext = `${initialContext} + + ${investigationTimeRangePrompt} + `; + + const next$ = callTools( + { + system: RCA_SYSTEM_PROMPT_BASE, + connectorId, + inferenceClient, + messages: nextEvents, + logger, + }, + ({ messages }) => { + const lastSuccessfulToolResponse = findLast( + messages, + (message) => message.role === MessageRole.Tool && message.name !== 'error' + ) as Exclude<ToolMessage, ToolErrorMessage> | undefined; + + const shouldWriteObservationNext = + !lastSuccessfulToolResponse || lastSuccessfulToolResponse.name !== RCA_OBSERVE_TOOL_NAME; + + const nextTools = shouldWriteObservationNext + ? pick(RCA_TOOLS, RCA_OBSERVE_TOOL_NAME) + : pick(RCA_TOOLS, RCA_END_PROCESS_TOOL_NAME, RCA_INVESTIGATE_ENTITY_TOOL_NAME); + + const nextSystem = shouldWriteObservationNext + ? SYSTEM_PROMPT_WITH_OBSERVE_INSTRUCTIONS + : SYSTEM_PROMPT_WITH_DECISION_INSTRUCTIONS; + + return { + messages, + system: `${nextSystem} + + ${investigationTimeRangePrompt}`, + tools: nextTools, + toolChoice: shouldWriteObservationNext + ? { function: RCA_OBSERVE_TOOL_NAME } + : ToolChoiceType.required, + }; + }, + ({ + toolCalls, + messages, + }): Observable< + | ObservationToolMessage + | ToolErrorMessage + | InvestigateEntityToolMessage + | EndProcessToolMessage + | AssistantMessage + > => { + const nextRcaContext = { + ...initialRcaContext, + events: messages as RootCauseAnalysisEvent[], + }; + + return of(undefined).pipe( + switchMap(() => { + return from( + validateInvestigateEntityToolCalls({ rcaContext: nextRcaContext, toolCalls }) + ); + }), + switchMap((errors) => { + if (errors.length) { + return of( + ...toolCalls.map((toolCall) => { + const toolCallErrorMessage: ToolErrorMessage = { + role: MessageRole.Tool, + name: 'error', + response: { + error: { + message: `Some ${RCA_INVESTIGATE_ENTITY_TOOL_NAME} calls were not valid: + ${errors.map((error) => `- ${error}`).join('\n')}`, + }, + }, + toolCallId: toolCall.toolCallId, + }; + return toolCallErrorMessage; + }) + ); + } + return of(...toolCalls).pipe( + mergeMap((toolCall) => { + function executeToolCall(): Observable< + | EndProcessToolMessage + | InvestigateEntityToolMessage + | ObservationToolMessage + | ToolErrorMessage + | AssistantMessage + > { + switch (toolCall.function.name) { + case RCA_END_PROCESS_TOOL_NAME: + return callEndRcaProcessTool({ + rcaContext: nextRcaContext, + toolCallId: toolCall.toolCallId, + }); + + case RCA_INVESTIGATE_ENTITY_TOOL_NAME: + return callInvestigateEntityTool({ + context: toolCall.function.arguments.context, + field: toolCall.function.arguments.entity.field, + value: toolCall.function.arguments.entity.value, + rcaContext: nextRcaContext, + toolCallId: toolCall.toolCallId, + }); + + case RCA_OBSERVE_TOOL_NAME: + return callObserveTool({ + rcaContext: nextRcaContext, + toolCallId: toolCall.toolCallId, + }); + } + } + + return executeToolCall().pipe( + catchError((error) => { + logger.error(`Failed executing task: ${error.message}`); + logger.error(error); + const toolErrorMessage: ToolErrorMessage = { + name: 'error', + role: MessageRole.Tool, + response: { + error: { + ...('toJSON' in error && typeof error.toJSON === 'function' + ? error.toJSON() + : {}), + message: error.message, + }, + }, + toolCallId: toolCall.toolCallId, + }; + return of(toolErrorMessage); + }) + ); + }, 3) + ); + }) + ); + } + ); + + return next$.pipe( + filter((event) => + Boolean(event.role !== MessageRole.Assistant || event.content || event.toolCalls?.length) + ), + map((event) => { + if (event.role === MessageRole.Assistant) { + return event as Extract<RootCauseAnalysisEvent, AssistantMessage>; + } + return event; + }) + ); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/analyze_log_patterns/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/analyze_log_patterns/index.ts new file mode 100644 index 0000000000000..fe090b64c9728 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/analyze_log_patterns/index.ts @@ -0,0 +1,402 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getEntityKuery } from '@kbn/observability-utils-common/entities/get_entity_kuery'; +import { formatValueForKql } from '@kbn/observability-utils-common/es/format_value_for_kql'; +import type { TruncatedDocumentAnalysis } from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import { ShortIdTable } from '@kbn/observability-utils-common/llm/short_id_table'; +import { + P_VALUE_SIGNIFICANCE_HIGH, + P_VALUE_SIGNIFICANCE_MEDIUM, +} from '@kbn/observability-utils-common/ml/p_value_to_label'; +import { + FieldPatternResultWithChanges, + getLogPatterns, +} from '@kbn/observability-utils-server/entities/get_log_patterns'; +import { castArray, compact, groupBy, orderBy } from 'lodash'; +import { RCA_PROMPT_CHANGES, RCA_PROMPT_ENTITIES } from '../../prompts'; +import { RootCauseAnalysisContext } from '../../types'; +import { formatEntity } from '../../util/format_entity'; +import { serializeKnowledgeBaseEntries } from '../../util/serialize_knowledge_base_entries'; +import { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; + +type LogPatternRelevance = 'normal' | 'unusual' | 'warning' | 'critical'; + +export type AnalyzedLogPattern = FieldPatternResultWithChanges & { + relevance: LogPatternRelevance; + interesting: boolean; +}; + +export interface AnalyzeLogPatternOutput { + ownPatterns: AnalyzedLogPattern[]; + patternsFromOtherEntities: AnalyzedLogPattern[]; +} + +const normalDescription = `normal operations, such as such access logs`; +const unusualDescription = `something unusual and/or +appear rarely, such as startup or shutdown messages or +other rare vents`; +const warningDescription = `something being in an unexpected state, +such as error messages, rate limiting or disk usage warnings`; +const criticalDescription = `something being in a critical state, +such as startup failure messages, out-of-memory errors or crashloopbackoff +events`; + +interface LogPatternCutOff { + significance?: 'high' | 'medium' | 'low'; + pValue?: number; +} + +export async function analyzeLogPatterns({ + entity, + allAnalysis, + system, + rcaContext: { logger: parentLogger, inferenceClient, connectorId, esClient, start, end, indices }, + cutoff, + kbEntries, +}: { + entity: Record<string, string>; + allAnalysis: Array<{ index: string | string[]; analysis: TruncatedDocumentAnalysis }>; + system: string; + cutoff?: LogPatternCutOff; + kbEntries: ScoredKnowledgeBaseEntry[]; + rcaContext: Pick< + RootCauseAnalysisContext, + 'indices' | 'logger' | 'inferenceClient' | 'connectorId' | 'esClient' | 'start' | 'end' + >; +}): Promise<AnalyzeLogPatternOutput> { + const kuery = getEntityKuery(entity); + + const logger = parentLogger.get('analyzeLogPatterns'); + + const fields = ['message', 'error.exception.message']; + + logger.debug(() => `Analyzing log patterns for ${JSON.stringify(entity)}`); + + const systemPrompt = `You are a helpful assistant for Elastic Observability. + You are an expert in analyzing log messages for software + systems, and you use your extensive experience as an SRE + to thoroughly analyze log patterns for things that require + attention from the user. + + ${RCA_PROMPT_CHANGES} + + ${RCA_PROMPT_ENTITIES} + + ## Entity + + The following entity is being analyzed: + + ${formatEntity(entity)} + + ${serializeKnowledgeBaseEntries(kbEntries)} + + ### Entity analysis + + ${allAnalysis.map(({ index: analyzedIndex, analysis }) => { + return `#### Indices: ${castArray(analyzedIndex).join(',')} + + ${JSON.stringify(analysis)}`; + })} + + ${system}`; + + const kueryForOtherEntities = `NOT (${kuery}) AND ${Object.values(entity) + .map( + (val) => + `(${fields.map((field) => `(${[field, formatValueForKql(val)].join(':')})`).join(' OR ')})` + ) + .join(' AND ')}`; + + const [logPatternsFromEntity, logPatternsFromElsewhere] = await Promise.all([ + getLogPatterns({ + esClient, + index: [...indices.logs, ...indices.traces], + start, + end, + kuery, + includeChanges: true, + fields, + metadata: [], + }), + getLogPatterns({ + esClient, + index: [...indices.logs], + start, + end, + kuery: kueryForOtherEntities, + metadata: Object.keys(entity), + includeChanges: true, + fields, + }), + ]); + const patternIdLookupTable = new ShortIdTable(); + + logger.debug( + () => + `Found ${logPatternsFromEntity.length} own log patterns and ${logPatternsFromElsewhere.length} from others` + ); + + logger.trace( + () => + `Found log patterns${JSON.stringify({ + entity, + logPatternsFromEntity, + logPatternsFromElsewhere, + })}` + ); + + const patternsWithIds = [...logPatternsFromEntity, ...logPatternsFromElsewhere].map((pattern) => { + return { + ...pattern, + shortId: patternIdLookupTable.take(pattern.regex), + }; + }); + + const patternsByRegex = new Map(patternsWithIds.map((pattern) => [pattern.regex, pattern])); + + const serializedOwnEntity = formatEntity(entity); + + const [ownPatterns, patternsFromOtherEntities] = await Promise.all([ + logPatternsFromEntity.length ? categorizeOwnPatterns() : [], + logPatternsFromElsewhere.length ? selectRelevantPatternsFromOtherEntities() : [], + ]); + + logger.trace( + () => + `Classified log patterns ${JSON.stringify([entity, ownPatterns, patternsFromOtherEntities])}` + ); + + const allPatterns = [...ownPatterns, ...patternsFromOtherEntities]; + + const sortedByPValueAsc = orderBy( + allPatterns.filter((pattern) => pattern.change && pattern.change.p_value), + (pattern) => { + return pattern.change.p_value; + }, + 'asc' + ); + + const pValueCutOff = getPValueCutoff({ cutoff, max: sortedByPValueAsc[0]?.change.p_value }); + + return { + ownPatterns: ownPatterns.map((pattern) => ({ + ...pattern, + interesting: isInterestingPattern(pattern, pValueCutOff), + })), + patternsFromOtherEntities: patternsFromOtherEntities.map((pattern) => ({ + ...pattern, + interesting: isInterestingPattern(pattern, pValueCutOff), + })), + }; + + function categorizeOwnPatterns() { + return inferenceClient + .output({ + id: 'analyze_log_patterns', + connectorId, + system: systemPrompt, + input: `Based on the following log patterns from + ${formatEntity(entity)}, group these patterns into + the following categories: + + - normal (patterns that are indicative of ${normalDescription}) + - unusual (patterns that are indicative of ${unusualDescription}) + - warning (patterns that are indicative of ${warningDescription}) + - critical (patterns that are indicative of ${criticalDescription}) + + ## Log patterns: + + ${preparePatternsForLlm(logPatternsFromEntity)} + `, + schema: { + type: 'object', + properties: { + categories: { + type: 'array', + items: { + type: 'object', + properties: { + relevance: { + type: 'string', + enum: ['normal', 'unusual', 'warning', 'critical'], + }, + shortIds: { + type: 'array', + description: + 'The pattern IDs you want to group here. Use the pattern short ID.', + items: { + type: 'string', + }, + }, + }, + required: ['relevance', 'shortIds'], + }, + }, + }, + required: ['categories'], + } as const, + }) + .then((outputEvent) => { + return outputEvent.output.categories.flatMap((category) => { + return mapIdsBackToPatterns(category.shortIds).map((pattern) => { + return { + ...pattern, + relevance: category.relevance, + }; + }); + }); + }); + } + + function selectRelevantPatternsFromOtherEntities() { + return inferenceClient + .output({ + id: 'select_relevant_patterns_from_other_entities', + connectorId, + system: systemPrompt, + input: `Based on the following log patterns that + are NOT from ${serializedOwnEntity}, group these + patterns into the following categories: + + - irrelevant (patterns that are not relevant for + ${serializedOwnEntity}) + - normal (patterns that relevant for + ${serializedOwnEntity} and are indicative of ${normalDescription}) + - unusual (patterns that are relevant for + ${serializedOwnEntity} and are indicative of ${unusualDescription}) + - warning (patterns that are relevant for + ${serializedOwnEntity} and are indicative of ${warningDescription}) + - critical (patterns that are relevant for + ${serializedOwnEntity} and are indicative of ${criticalDescription}) + + Relevant patterns are messages that mention the + investigated entity, or things that are indicative + of critical failures or changes in the entity + that owns the log pattern. + + ## Log patterns: + + ${preparePatternsForLlm(logPatternsFromElsewhere)} + `, + schema: { + type: 'object', + properties: { + categories: { + type: 'array', + items: { + type: 'object', + properties: { + relevance: { + type: 'string', + enum: ['irrelevant', 'normal', 'unusual', 'warning', 'critical'], + }, + shortIds: { + type: 'array', + description: + 'The pattern IDs you want to group here. Use the pattern short ID.', + items: { + type: 'string', + }, + }, + }, + required: ['relevance', 'shortIds'], + }, + }, + }, + required: ['categories'], + } as const, + }) + .then((outputEvent) => { + return outputEvent.output.categories.flatMap((category) => { + return mapIdsBackToPatterns(category.shortIds).flatMap((pattern) => { + if (category.relevance === 'irrelevant') { + return []; + } + return [ + { + ...pattern, + relevance: category.relevance, + }, + ]; + }); + }); + }); + } + + function preparePatternsForLlm(patterns: FieldPatternResultWithChanges[]): string { + const groupedByField = groupBy(patterns, (pattern) => pattern.field); + + return Object.entries(groupedByField) + .map(([field, patternsForField]) => { + return `### \`${field}\` + + #### Patterns + + ${JSON.stringify( + patternsForField.map((pattern) => { + return { + shortId: patternIdLookupTable.take(pattern.regex), + regex: pattern.regex, + sample: pattern.sample, + highlight: pattern.highlight, + change: pattern.change, + }; + }) + )} + `; + }) + .join('\n\n'); + } + + function mapIdsBackToPatterns(ids?: string[]) { + return compact( + ids?.map((shortId) => { + const lookupId = patternIdLookupTable.lookup(shortId); + if (!lookupId) { + return undefined; + } + const pattern = patternsByRegex.get(lookupId); + return pattern; + }) + ); + } +} + +function isInterestingPattern( + pattern: Omit<AnalyzedLogPattern, 'interesting'>, + pValueCutOff: number +) { + return (pattern.change.p_value ?? 1) <= pValueCutOff || pattern.relevance !== 'normal'; +} + +function getPValueCutoff({ max, cutoff }: { max?: number; cutoff?: LogPatternCutOff }) { + if (cutoff?.pValue) { + return cutoff?.pValue; + } + + if (cutoff?.significance === 'high') { + return P_VALUE_SIGNIFICANCE_HIGH; + } + + if (cutoff?.significance === 'medium') { + return P_VALUE_SIGNIFICANCE_MEDIUM; + } + + if (max === undefined) { + return Number.MAX_VALUE; + } + + if (max <= P_VALUE_SIGNIFICANCE_HIGH) { + return P_VALUE_SIGNIFICANCE_HIGH; + } + + if (max <= P_VALUE_SIGNIFICANCE_MEDIUM) { + return P_VALUE_SIGNIFICANCE_MEDIUM; + } + + return Number.MAX_VALUE; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/describe_entity/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/describe_entity/index.ts new file mode 100644 index 0000000000000..bd050c4c61dfd --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/describe_entity/index.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { TruncatedDocumentAnalysis } from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import { FieldPatternResultWithChanges } from '@kbn/observability-utils-server/entities/get_log_patterns'; +import { RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { formatEntity } from '../../util/format_entity'; +import { serializeKnowledgeBaseEntries } from '../../util/serialize_knowledge_base_entries'; +import { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; +import { getInvestigateEntityTaskPrompt } from '../investigate_entity/prompts'; + +export async function describeEntity({ + inferenceClient, + connectorId, + entity, + contextForEntityInvestigation, + analysis, + ownPatterns, + kbEntries, +}: { + inferenceClient: InferenceClient; + connectorId: string; + entity: Record<string, string>; + analysis: TruncatedDocumentAnalysis; + contextForEntityInvestigation: string; + ownPatterns: FieldPatternResultWithChanges[]; + kbEntries: ScoredKnowledgeBaseEntry[]; +}) { + const system = RCA_SYSTEM_PROMPT_BASE; + + const input = `${getInvestigateEntityTaskPrompt({ entity, contextForEntityInvestigation })} + + ## Context for investigating ${formatEntity(entity)} + + ${contextForEntityInvestigation} + + ${serializeKnowledgeBaseEntries(kbEntries)} + + ## Data samples + + ${JSON.stringify(analysis)} + + ## Log patterns + + ${JSON.stringify(ownPatterns.map(({ regex, sample }) => ({ regex, sample })))} + + ## Current task + + Describe the entity characteristics based on the sample documents and log + patterns. Put it in context of the investigation process. Mention the reason + why it's being investigated, and how it is related other entities that were + previously investigated. Mention these three things: + + - infrastructure & environment + - communication characteristics (protocols and endpoints) + - context of entity in investigation + + You shouldn't mention the log patterns, they will be analyzed elsewhere. + `; + + const response = await inferenceClient.output({ + id: 'describe_entity', + connectorId, + system, + input, + }); + + return response.content; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/describe_log_patterns/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/describe_log_patterns/index.ts new file mode 100644 index 0000000000000..ea5cc75eea1de --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/describe_log_patterns/index.ts @@ -0,0 +1,189 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { TruncatedDocumentAnalysis } from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import { omit, partition, sumBy } from 'lodash'; +import { RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { formatEntity } from '../../util/format_entity'; +import { serializeKnowledgeBaseEntries } from '../../util/serialize_knowledge_base_entries'; +import { AnalyzedLogPattern } from '../analyze_log_patterns'; +import { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; +import { getInvestigateEntityTaskPrompt } from '../investigate_entity/prompts'; + +export interface LogPatternDescription { + content: string; + docCount: number; + interestingPatternCount: number; + ignoredPatternCount: number; + ignoredDocCount: number; +} + +export async function describeLogPatterns({ + inferenceClient, + connectorId, + entity, + contextForEntityInvestigation, + analysis, + ownPatterns: allOwnPatterns, + patternsFromOtherEntities, + kbEntries, +}: { + inferenceClient: InferenceClient; + connectorId: string; + entity: Record<string, string>; + analysis: TruncatedDocumentAnalysis; + contextForEntityInvestigation: string; + ownPatterns: AnalyzedLogPattern[]; + patternsFromOtherEntities: AnalyzedLogPattern[]; + kbEntries: ScoredKnowledgeBaseEntry[]; +}): Promise<LogPatternDescription> { + const system = RCA_SYSTEM_PROMPT_BASE; + + const [ownInterestingPatterns, ignoredOwnPatterns] = partition( + allOwnPatterns, + (pattern) => pattern.interesting + ); + + const stats = { + docCount: sumBy(allOwnPatterns, (pattern) => pattern.count), + interestingPatternCount: ownInterestingPatterns.length, + otherInterestingPatternCount: patternsFromOtherEntities.length, + ignoredPatternCount: ignoredOwnPatterns.length, + ignoredDocCount: sumBy(ignoredOwnPatterns, (pattern) => pattern.count), + }; + + const header = `## Log analysis + + ### Stats for own log patterns: + - ${stats.docCount} documents analyzed + - ${stats.interestingPatternCount} interesting patterns + - ${stats.ignoredPatternCount} ignored patterns, accounting for + ${stats.ignoredDocCount} out of ${stats.docCount} documents + - ${stats.otherInterestingPatternCount} relevant patterns from + other entities`; + + if (!stats.interestingPatternCount && !stats.otherInterestingPatternCount) { + return { + ...stats, + content: `${header}\n\nNo interesting log patterns`, + }; + } + + const ownLogPatternsPrompt = ownInterestingPatterns.length + ? JSON.stringify( + ownInterestingPatterns.map(({ regex, sample, change, count, timeseries }) => ({ + regex, + sample, + change, + count, + timeseries: timeseries.map(({ x, y }, index) => { + if (index === change.change_point) { + return `${change.type} at ${new Date(x).toISOString()}: ${y}`; + } + return `${new Date(x).toISOString()}: ${y}`; + }), + })) + ) + : 'No own log patterns found'; + + const otherLogPatternsPrompt = patternsFromOtherEntities.length + ? JSON.stringify( + patternsFromOtherEntities.map( + ({ regex, sample, change, count, timeseries, metadata, field, highlight }) => ({ + regex, + sample, + change, + count, + timeseries: timeseries.map(({ x, y }, index) => { + if (index === change.change_point) { + return `${change.type} at ${new Date(x).toISOString()}: ${y}`; + } + return `${new Date(x).toISOString()}: ${y}`; + }), + entity: omit(metadata, field), + highlight, + }) + ) + ) + : 'No relevant log patterns found from other entities'; + + const input = `${getInvestigateEntityTaskPrompt({ entity, contextForEntityInvestigation })} + + ## Context for investigating ${formatEntity(entity)} + + ${contextForEntityInvestigation} + + ${serializeKnowledgeBaseEntries(kbEntries)} + + ## Data samples + + ${JSON.stringify(analysis)} + + ## Log patterns from ${formatEntity(entity)} + + ${ownLogPatternsPrompt} + + ## Possibly relevant log patterns from other entities + + ${otherLogPatternsPrompt} + + ### Interpreting log patterns and samples + + The pattern itself is what is consistent across all messages. The values from these parts + are separately given in "constants". There's also a single (random) _sample_ included, with + the variable part being given as well. E.g., if the failure in the sample is not part of the pattern + itself, you should mention that in your analysis. + + ## Task + + Using only the log patterns, describe your observations about the entity. + + Group these pattterns together based on topic. Some examples of these topics: + + - normal operations such as request logs + - connection issues to an upstream dependency + - startup messages + - garbage collection messages + + For patterns with change points, describe the trend before and after the change point based + on the data points. E.g.: + - A persisted drop to near-zero after 2020-01-01T05:00:00.000Z + - A spike from 10 to 100 at 2020-01-01T05:00:00.000Z, which went back down + to the average after 2020-01-01T05:02:00.000Z + - A trend change after 2020-01-01T05:00:00.000Z. The values ranged from 10 + to 20 before, but then after increased from 20 to 100 until + 2020-01-01T05:02:00.000Z. + + Do not: + - repeat the variables, instead, repeat the constants. + - repeat the timeseries as a whole, verbatim, in full. However, you can use individual data points + timestamps to illustrate the magnitude of the change, as in the example previously given. + - make up timestamps. + - do not separately list individual events if you have already mentioned + the pattern. + + Statistics: + + - ${stats.interestingPatternCount} patterns from ${formatEntity(entity)} + were collected + - ${stats.docCount} logs were categorized + - ${stats.ignoredPatternCount} patterns were deemed uninteresting and accounted + for ${stats.ignoredDocCount} out of the total amount of logs + `; + + const response = await inferenceClient.output({ + id: 'describe_log_patterns', + connectorId, + system, + input, + }); + + return { + ...stats, + content: response.content, + }; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/analyze_fetched_related_entities.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/analyze_fetched_related_entities.ts new file mode 100644 index 0000000000000..893533629ff06 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/analyze_fetched_related_entities.ts @@ -0,0 +1,438 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { Logger } from '@kbn/logging'; +import { getEntityKuery } from '@kbn/observability-utils-common/entities/get_entity_kuery'; +import { + DocumentAnalysis, + TruncatedDocumentAnalysis, +} from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import { sortAndTruncateAnalyzedFields } from '@kbn/observability-utils-common/llm/log_analysis/sort_and_truncate_analyzed_fields'; +import { analyzeDocuments } from '@kbn/observability-utils-server/entities/analyze_documents'; +import { FieldPatternResultWithChanges } from '@kbn/observability-utils-server/entities/get_log_patterns'; +import { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { kqlQuery } from '@kbn/observability-utils-server/es/queries/kql_query'; +import { rangeQuery } from '@kbn/observability-utils-server/es/queries/range_query'; +import { chunk, isEmpty, isEqual } from 'lodash'; +import pLimit from 'p-limit'; +import { + RCA_PROMPT_DEPENDENCIES, + RCA_PROMPT_ENTITIES, + RCA_SYSTEM_PROMPT_BASE, +} from '../../prompts'; +import { chunkOutputCalls } from '../../util/chunk_output_calls'; +import { formatEntity } from '../../util/format_entity'; +import { serializeKnowledgeBaseEntries } from '../../util/serialize_knowledge_base_entries'; +import { toBlockquote } from '../../util/to_blockquote'; +import { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; +import { RelatedEntityKeywordSearch } from './write_keyword_searches_for_related_entities'; + +export interface RelatedEntityFromSearchResults { + entity: { [x: string]: string }; + highlight: Record<string, string[]>; + analysis: TruncatedDocumentAnalysis; +} + +function getPromptForFoundEntity({ entity, analysis, highlight }: RelatedEntityFromSearchResults) { + return `## Entity: ${formatEntity(entity)} + + ${toBlockquote(`### Search highlights for ${formatEntity(entity)} + ${JSON.stringify(highlight)}`)} + `; +} + +function getInputPromptBase({ + entity, + analysis, + ownPatterns, + patternsFromOtherEntities, + searches, + context, + kbEntries, +}: { + entity: Record<string, string>; + analysis: TruncatedDocumentAnalysis; + ownPatterns: FieldPatternResultWithChanges[]; + patternsFromOtherEntities: FieldPatternResultWithChanges[]; + searches: RelatedEntityKeywordSearch[]; + context: string; + kbEntries: ScoredKnowledgeBaseEntry[]; +}) { + const otherPatternsPrompt = patternsFromOtherEntities.length + ? JSON.stringify( + patternsFromOtherEntities.map((pattern) => ({ + sample: pattern.sample, + regex: pattern.regex, + })) + ) + : 'No relevant log patterns from other entities found'; + const logPatternsPrompt = ownPatterns.length + ? JSON.stringify( + ownPatterns.map((pattern) => { + return { sample: pattern.sample, regex: pattern.regex }; + }) + ) + : 'No log patterns found'; + return `Describe possible relationships to the investigated entity ${formatEntity(entity)}. + + ## Context + + ${toBlockquote(context)} + + ${serializeKnowledgeBaseEntries(kbEntries)} + + ## Data analysis + ${JSON.stringify(analysis)} + + ## Log patterns for ${formatEntity(entity)} + + ${logPatternsPrompt} + + ## Patterns from other entities + + ${otherPatternsPrompt} + + ## Search keywords + + ${searches + .map(({ fragments, appearsAs }) => { + return `## Appears as: ${appearsAs} + + ### Fragments: + ${fragments.map((fragment) => `- \`${fragment}\``).join('\n')}`; + }) + .join('\n')}`; +} + +function getInputPromptInstructions({ entity }: { entity: Record<string, any> }) { + return `### Indicator strength + +In an Observability system, indicators of relationships between entities like +services, hosts, users, or requests can vary in strength. Some indicators +clearly define relationships, while others only suggest correlations. Here’s a +breakdown of these indicators into strong, average, and weak categories, with an +additional look at how weak indicators can become strong when combined. + +Strong indicators provide definitive links between entities. Distributed tracing +IDs (trace, span, and parent) are among the strongest indicators, as they map +the complete request path across services, showing exact service interactions. +Session or user IDs are also strong indicators, capturing a user’s actions +across services or hosts and revealing issues specific to particular users. + +Average indicators give helpful context but may require supporting data to +clarify relationships. IP addresses, for instance, are moderately strong for +tracking inter-service calls within controlled environments but are weaker +across public or shared networks where IP reuse is common. URL paths also fall +in this category; they link entities to specific endpoints or service functions +and are moderately strong for tracking interactions between microservices with +known APIs. Port numbers are another average indicator. While they suggest the +service interaction type (HTTP, database), they generally need pairing with IP +addresses or URLs for more accuracy, as port numbers alone are often shared +across different services. + +Weak indicators are often too generic to imply a direct relationship but can +suggest possible correlations. Host names, for example, are broad and typically +cover a range of services or applications, especially in large clusters. +Time-based indicators, such as timestamps or TTL values, suggest possible timing +correlations but don’t establish a definitive link on their own. Status codes, +like HTTP 500 errors, indicate issues but don’t specify causality, often +requiring corroboration with stronger indicators like trace or session IDs. + +However, weak indicators can become strong when they appear together. For +instance, a combination of IP address, port, and timestamp can strongly suggest +a direct interaction between services, especially when the same combination is +seen repeatedly or in conjunction with related URLs. Similarly, a host name +combined with a unique URL path can strongly suggest that a specific service or +pod is generating particular request patterns, even if each alone is too +general. + +## Relevance to the investigation + +Given the context of the investigation, some entities might be very relevant +even if there is no strong evidence of them being a direct dependency of +${formatEntity(entity)}. For instance, the related entity might be an +orchestrating entity, or it might be involved in a specific operation related +to the ongoing issue. + +## Identifying entity relationships + +Your current task is to identify possible entity relationships for the +investigated entity ${formatEntity(entity)}. You will get some context, document +analysis for the investigated entity, and results from keyword searches that were +extracted from the entity. Based on this data, list entities that could possibly +be related to the given entity and/or the initial context. List the highly +relevant entities first. + +## Output + +For each possible relationship, describe the following things: +- The related entity (as a key-value pair) +- The indicators you have observed as evidence of the relationship. Include the +strength of the indicator, and the exact pieces of data that are related to it +(field names and values, in both the investigated entity, and the possibly +related entity). +- Reason how the related entity is related to both ${formatEntity(entity)} as a +dependency and the context. For instance, describe who is the caller and callee +or whether that is unclear, based on the data, or explain how it might be +related to the context. +- The overall likeliness of it being a relevant entity.`; +} + +export async function analyzeFetchedRelatedEntities({ + connectorId, + inferenceClient, + esClient, + start, + end, + searches, + groupingFields, + index, + entity, + ownPatterns, + analysis, + patternsFromOtherEntities, + logger: parentLogger, + context, + kbEntries, +}: { + connectorId: string; + inferenceClient: InferenceClient; + esClient: ObservabilityElasticsearchClient; + start: number; + end: number; + searches: RelatedEntityKeywordSearch[]; + groupingFields: string[]; + index: string | string[]; + entity: Record<string, string>; + analysis: { + truncated: TruncatedDocumentAnalysis; + full: DocumentAnalysis; + }; + ownPatterns: FieldPatternResultWithChanges[]; + patternsFromOtherEntities: FieldPatternResultWithChanges[]; + context: string; + logger: Logger; + kbEntries: ScoredKnowledgeBaseEntry[]; +}): Promise<{ + summaries: string[]; + foundEntities: RelatedEntityFromSearchResults[]; +}> { + const entityFields = Object.keys(entity); + + const logger = parentLogger.get('findRelatedEntities'); + + logger.debug( + () => `Finding related entities: ${JSON.stringify({ entity, groupingFields, searches })}` + ); + + const allValuesFromEntity = Array.from( + new Set(analysis.full.fields.flatMap((field) => field.values)) + ); + + const foundEntities = ( + await Promise.all( + groupingFields.map((groupingField) => getResultsForGroupingField(groupingField)) + ) + ).flat(); + + logger.debug(() => `Found ${foundEntities.length} entities via keyword searches`); + + const system = `${RCA_SYSTEM_PROMPT_BASE} + + ${RCA_PROMPT_ENTITIES} + + ${RCA_PROMPT_DEPENDENCIES}`; + + const inputPromptBase = getInputPromptBase({ + entity, + analysis: analysis.truncated, + ownPatterns, + patternsFromOtherEntities, + searches, + context, + kbEntries, + }); + + const foundEntityPrompts = foundEntities.map((foundEntity) => { + return { + text: getPromptForFoundEntity(foundEntity), + id: formatEntity(foundEntity.entity), + }; + }); + + const inputPromptInstructions = getInputPromptInstructions({ entity }); + + // don't do more than 10 entities in a response, we'll run out of + // tokens + const requests = chunk(foundEntityPrompts, 10).flatMap((texts) => + chunkOutputCalls({ + system, + input: `${inputPromptBase} ${inputPromptInstructions}`, + texts, + tokenLimit: 32_000 - 6_000, + }) + ); + + const allRelevantEntityDescriptions = await Promise.all( + requests.map(async (request) => { + const outputCompleteEvent = await inferenceClient.output({ + id: 'describe_relevant_entities', + connectorId, + system: request.system, + input: `${inputPromptBase} + + # Found entities + + ${request.texts.map((text) => text.text).join('\n\n')} + + ${inputPromptInstructions}`, + }); + + return outputCompleteEvent.content; + }) + ); + + return { + summaries: allRelevantEntityDescriptions, + foundEntities, + }; + + async function getResultsForGroupingField( + groupingField: string + ): Promise<RelatedEntityFromSearchResults[]> { + const excludeQuery = isEqual([groupingField], entityFields) + ? `NOT (${groupingField}:"${entity[groupingField]}")` + : ``; + + const fieldCaps = await esClient.fieldCaps('check_if_grouping_field_exists', { + fields: [groupingField], + index, + index_filter: { + bool: { + filter: [...rangeQuery(start, end)], + }, + }, + }); + + if (isEmpty(fieldCaps.fields[groupingField])) { + return []; + } + + const keywordSearchResults = await esClient.search( + 'find_related_entities_via_keyword_searches', + { + track_total_hits: false, + index, + query: { + bool: { + must: [...rangeQuery(start, end), ...kqlQuery(excludeQuery)], + should: [ + { + multi_match: { + query: searches.flatMap((search) => search.fragments).join(' '), + fields: '*', + }, + }, + ], + minimum_should_match: 1, + }, + }, + fields: [groupingField], + collapse: { + field: groupingField, + }, + highlight: { + fields: { + '*': {}, + }, + }, + _source: false, + size: 1_000, + } + ); + + if (!keywordSearchResults.hits.hits.length) { + logger.debug(() => `No hits: ${JSON.stringify({ entity, groupingField, searches })}`); + return []; + } + + logger.trace( + () => + `Hits: ${JSON.stringify({ + entity, + groupingField, + searches, + count: keywordSearchResults.hits.hits.length, + hits: keywordSearchResults.hits.hits, + })}` + ); + + const limiter = pLimit(20); + + const groupingFieldAnalysis = await Promise.all( + keywordSearchResults.hits.hits.map(async (hit) => { + return limiter(async () => { + const groupValue = hit.fields![groupingField][0] as string; + + const analysisForGroupingField = await analyzeDocuments({ + esClient, + start, + end, + index, + kuery: getEntityKuery({ + [groupingField]: groupValue, + }), + }); + + const analysisWithRelevantValues = { + ...analysisForGroupingField, + fields: analysisForGroupingField.fields + .filter((field) => { + return !field.empty; + }) + .map((field) => { + const valuesFoundInEntity = field.values.filter((value) => { + return ( + allValuesFromEntity.includes(value) || + allValuesFromEntity.some((valueFromEntity) => { + return ( + typeof valueFromEntity === 'string' && + typeof value === 'string' && + (value.includes(valueFromEntity) || valueFromEntity.includes(value)) + ); + }) + ); + }); + return { + ...field, + values: valuesFoundInEntity, + }; + }), + }; + + return { + groupingField, + key: groupValue, + highlight: hit.highlight!, + analysis: sortAndTruncateAnalyzedFields(analysisWithRelevantValues), + }; + }); + }) + ); + + return groupingFieldAnalysis.map(({ key, highlight, analysis: analysisForGroupingField }) => { + return { + entity: { + [groupingField]: key, + }, + highlight, + analysis: analysisForGroupingField, + }; + }); + } +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/extract_related_entities.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/extract_related_entities.ts new file mode 100644 index 0000000000000..5480a76eb2096 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/extract_related_entities.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import stringify from 'json-stable-stringify'; +import pLimit from 'p-limit'; +import { RelatedEntityFromSearchResults } from '.'; +import { + RCA_PROMPT_DEPENDENCIES, + RCA_PROMPT_ENTITIES, + RCA_SYSTEM_PROMPT_BASE, +} from '../../prompts'; +import { RootCauseAnalysisContext } from '../../types'; +import { formatEntity } from '../../util/format_entity'; +import { getPreviouslyInvestigatedEntities } from '../../util/get_previously_investigated_entities'; +import { toBlockquote } from '../../util/to_blockquote'; + +export interface RelatedEntityDescription { + entity: Record<string, string>; + reason: string; + confidence: string; +} + +export async function extractRelatedEntities({ + entity, + entityReport, + summaries, + foundEntities, + context, + rcaContext: { events, connectorId, inferenceClient }, +}: { + foundEntities: RelatedEntityFromSearchResults[]; + entity: Record<string, string>; + entityReport: string; + summaries: string[]; + context: string; + rcaContext: Pick<RootCauseAnalysisContext, 'events' | 'connectorId' | 'inferenceClient'>; +}): Promise<{ relatedEntities: RelatedEntityDescription[] }> { + const system = `${RCA_SYSTEM_PROMPT_BASE} + + ${RCA_PROMPT_ENTITIES} + + ${RCA_PROMPT_DEPENDENCIES}`; + + const previouslyInvestigatedEntities = getPreviouslyInvestigatedEntities({ events }); + + const previouslyInvestigatedEntitiesPrompt = previouslyInvestigatedEntities.length + ? `## Previously investigated entities + + ${previouslyInvestigatedEntities + .map((prevEntity) => `- ${formatEntity(prevEntity)}`) + .join('\n')}` + : ''; + + const prompts = summaries.map((summary) => { + return ` + # Investigated entity + + ${formatEntity(entity)} + + # Report + + ${toBlockquote(entityReport)} + + # Related entities report + + ${toBlockquote(summary)} + + ${previouslyInvestigatedEntitiesPrompt} + + # Context + + ${context} + + # Task + + Your current task is to extract relevant entities as a data structure from the + related entities report. Order them by relevance to the investigation, put the + most relevant ones first. + `; + }); + + const limiter = pLimit(5); + + const allEvents = await Promise.all( + prompts.map(async (input) => { + const completeEvent = await limiter(() => + inferenceClient.output({ + id: 'get_entity_relationships', + connectorId, + system, + input, + schema: { + type: 'object', + properties: { + related_entities: { + type: 'array', + items: { + type: 'object', + properties: { + entity: { + type: 'object', + properties: { + field: { + type: 'string', + }, + value: { + type: 'string', + }, + }, + required: ['field', 'value'], + }, + reason: { + type: 'string', + description: 'Describe why this entity might be relevant. Provide evidence.', + }, + confidence: { + type: 'string', + description: + 'Describe how confident you are in your conclusion about this relationship: low, moderate, high', + }, + }, + + required: ['entity', 'reason', 'confidence'], + }, + }, + }, + required: ['related_entities'], + } as const, + }) + ); + return completeEvent.output; + }) + ); + + const foundEntityIds = foundEntities.map(({ entity: foundEntity }) => stringify(foundEntity)); + + const relatedEntities = allEvents + .flat() + .flatMap((event) => { + return event.related_entities.map((item) => { + return { + entity: { [item.entity.field]: item.entity.value }, + reason: item.reason, + confidence: item.confidence, + }; + }); + }) + .filter((item) => { + return foundEntityIds.includes(stringify(item.entity)); + }); + + return { + relatedEntities, + }; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/index.ts new file mode 100644 index 0000000000000..05392db2d502c --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/index.ts @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { Logger } from '@kbn/logging'; +import { + DocumentAnalysis, + TruncatedDocumentAnalysis, +} from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { FieldPatternResultWithChanges } from '@kbn/observability-utils-server/entities/get_log_patterns'; +import { + analyzeFetchedRelatedEntities, + RelatedEntityFromSearchResults, +} from './analyze_fetched_related_entities'; +import { + RelatedEntityKeywordSearch, + writeKeywordSearchForRelatedEntities, +} from './write_keyword_searches_for_related_entities'; +import { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; + +export type { RelatedEntityFromSearchResults }; + +export async function findRelatedEntities({ + connectorId, + inferenceClient, + start, + end, + index, + esClient, + entity, + analysis, + logger, + context, + ownPatterns, + patternsFromOtherEntities, + kbEntries, +}: { + connectorId: string; + inferenceClient: InferenceClient; + start: number; + end: number; + index: string | string[]; + esClient: ObservabilityElasticsearchClient; + entity: Record<string, string>; + analysis: { + truncated: TruncatedDocumentAnalysis; + full: DocumentAnalysis; + }; + logger: Logger; + context: string; + ownPatterns: FieldPatternResultWithChanges[]; + patternsFromOtherEntities: FieldPatternResultWithChanges[]; + kbEntries: ScoredKnowledgeBaseEntry[]; +}): Promise<{ + searches: RelatedEntityKeywordSearch[]; + summaries: string[]; + foundEntities: RelatedEntityFromSearchResults[]; +}> { + const { groupingFields, searches } = await writeKeywordSearchForRelatedEntities({ + connectorId, + inferenceClient, + entity, + analysis: analysis.truncated, + ownPatterns, + context, + kbEntries, + }); + + const { summaries, foundEntities } = await analyzeFetchedRelatedEntities({ + entity, + connectorId, + start, + end, + esClient, + index, + inferenceClient, + searches, + groupingFields, + logger, + analysis, + ownPatterns, + patternsFromOtherEntities, + context, + kbEntries, + }); + + return { + searches, + summaries, + foundEntities, + }; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/write_keyword_searches_for_related_entities.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/write_keyword_searches_for_related_entities.ts new file mode 100644 index 0000000000000..6089ce748eb21 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/find_related_entities/write_keyword_searches_for_related_entities.ts @@ -0,0 +1,199 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { TruncatedDocumentAnalysis } from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import { FieldPatternResultWithChanges } from '@kbn/observability-utils-server/entities/get_log_patterns'; +import { RCA_PROMPT_ENTITIES, RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { formatEntity } from '../../util/format_entity'; +import { serializeKnowledgeBaseEntries } from '../../util/serialize_knowledge_base_entries'; +import { toBlockquote } from '../../util/to_blockquote'; +import { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; + +const SYSTEM_PROMPT_ADDENDUM = `# Guide: Constructing Keyword Searches to Find Related Entities + +When investigating issues like elevated failure rates for a +specific endpoint, you can use the metadata at hand (IP addresses, +URLs, session IDs, tracing IDs, etc.) to build targeted keyword searches. +By extracting meaningful fragments from the data, you can correlate +related services or hosts across distributed systems. Here’s how +you can break down the metadata and format your searches. + +## Grouping fields + +Define grouping fields for the entities you want to extract. For +instance, "service.name" if you are looking for services, or +"kubernetes.pod.name" if you are looking for pods. Focus +on services, unless you are looking for deployment or +configuration changes. + +--- + +## Key Metadata and Search Format + +### Example: Investigating a service failure for \`/api/products\` + +You can break down various pieces of metadata into searchable +fragments. For each value, include a short description of its +relationship to the investigation. This value will be used +by the system to determine the relevance of a given entity +that matches the search request. + +### 1. **IP Address and Port** +- **Fragments:** + - \`"10.44.0.11:8080"\`: Full address. + - \`"10.44.0.11"\`: IP address only. + - \`"8080"\`: Port number. +- **Appears as:** This IP address and port are referenced as +<ip-field-name> and <port-field-name> in the investigated entity +<entity-name>.. + +### 2. **Outgoing Request URL** +- **Fragments:** + - \`"http://called-service/api/product"\`: Full outgoing URL. + - \`"/api/product*"\`: Endpoint path. + - \`"called-service"\`: Service name of the upstream dependency. + - **Appears as:** These URL fragments appear as attributes.request.url + in the investigated entity <entity-name>. They could appear as referer + in the upstream dependency. + +### 3. **Parent and Span IDs** + - **Fragments:** + - \`"000aa"\`: Parent ID. + - \`"000bbb"\`: Span ID. + - **Relationship:** These ids appear as span.id and parent.id in the + investigated entity <entity-name>. They could be referring to spans + found on upstream or downstream services. + +--- + +## Example Search Format in JSON + +To structure your keyword search, format the fragments and their +relationships in a JSON array like this: + +\`\`\`json +{ + "groupingFields": [ "service.name" ], + "values": [ + { + "fragments": [ + "10.44.0.11:8080", + "10.44.0.11", + "8080" + ], + "appearsAs": "This IP address and port are referenced as <ip-field-name> and <port-field-name> in the investigated entity <entity-name>." + }, + { + "fragments": [ + "http://<upstream-service>/api/product", + "/api/product", + "<upstream-service>" + ], + "relationship": "These URL fragments appear as attributes.request.url in the investigated entity <entity-name>." + }, + { + "fragments": [ + "000aa", + "000bbb" + ], + "relationship": " These ids appear as span.id and parent.id in the investigated entity <entity-name>. They could be referring to spans found on upstream or downstream services" + } + ] +}`; + +export interface RelatedEntityKeywordSearch { + fragments: string[]; + appearsAs: string; +} + +export async function writeKeywordSearchForRelatedEntities({ + connectorId, + inferenceClient, + entity, + analysis, + ownPatterns, + context, + kbEntries, +}: { + connectorId: string; + inferenceClient: InferenceClient; + entity: Record<string, string>; + analysis: TruncatedDocumentAnalysis; + ownPatterns: FieldPatternResultWithChanges[]; + context: string; + kbEntries: ScoredKnowledgeBaseEntry[]; +}): Promise<{ + groupingFields: string[]; + searches: RelatedEntityKeywordSearch[]; +}> { + const logPatternsPrompt = ownPatterns.length + ? JSON.stringify( + ownPatterns.map((pattern) => ({ regex: pattern.regex, sample: pattern.sample })) + ) + : 'No log patterns found'; + + return inferenceClient + .output({ + id: 'extract_keyword_searches', + connectorId, + system: `${RCA_SYSTEM_PROMPT_BASE} + + ${RCA_PROMPT_ENTITIES}`, + input: `Your current task is to to extract keyword searches + to find related entities to the entity ${formatEntity(entity)}, + based on the following context: + + ## Investigation context + ${toBlockquote(context)} + + ${serializeKnowledgeBaseEntries(kbEntries)} + + ## Data analysis + ${JSON.stringify(analysis)} + + ## Log patterns + + ${logPatternsPrompt} + + ## Instructions + ${SYSTEM_PROMPT_ADDENDUM}`, + schema: { + type: 'object', + properties: { + groupingFields: { + type: 'array', + items: { + type: 'string', + }, + }, + searches: { + type: 'array', + items: { + type: 'object', + properties: { + fragments: { + type: 'array', + items: { + type: 'string', + }, + }, + appearsAs: { + type: 'string', + description: + 'Describe in what fields these values appear as in the investigated entity. You can mention multiple fields if applicable', + }, + }, + required: ['fragments', 'appearsAs'], + }, + }, + }, + required: ['searches', 'groupingFields'], + } as const, + }) + .then((event) => event.output); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/generate_timeline/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/generate_timeline/index.ts new file mode 100644 index 0000000000000..799755abec2e5 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/generate_timeline/index.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { RootCauseAnalysisContext } from '../../types'; +import { stringifySummaries } from '../../util/stringify_summaries'; + +type SignificantEventSeverity = 'info' | 'unusual' | 'warning' | 'critical'; + +type SignificantEventType = 'alert' | 'slo' | 'event'; + +export interface SignificantEvent { + severity: SignificantEventSeverity; + '@timestamp'?: string; + description: string; + type: SignificantEventType; +} + +export interface SignificantEventsTimeline { + events: SignificantEvent[]; +} + +export async function generateSignificantEventsTimeline({ + report, + rcaContext, +}: { + report: string; + rcaContext: RootCauseAnalysisContext; +}): Promise<SignificantEventsTimeline> { + const { connectorId, inferenceClient } = rcaContext; + + return await inferenceClient + .output({ + id: 'generate_timeline', + system: RCA_SYSTEM_PROMPT_BASE, + connectorId, + input: `Your current task is to generate a timeline + of significant events, based on the given RCA report, + according to a structured schema. This timeline will + be presented to the user as a visualization. + + ${stringifySummaries(rcaContext)} + + # Report + + ${report} + `, + schema: { + type: 'object', + properties: { + events: { + type: 'array', + items: { + type: 'object', + properties: { + timestamp: { + type: 'string', + description: 'The ISO timestamp of when the event occurred', + }, + severity: { + type: 'string', + enum: ['info', 'unusual', 'warning', 'critical'], + }, + type: { + type: 'string', + enum: ['alert', 'slo', 'event'], + }, + description: { + type: 'string', + description: 'A description of the event', + }, + }, + required: ['severity', 'description'], + }, + }, + }, + required: ['events'], + } as const, + }) + .then((timelineCompleteEvent) => { + return { + events: timelineCompleteEvent.output.events.map((event) => { + return { + '@timestamp': event.timestamp, + severity: event.severity, + type: event.type ?? 'event', + description: event.description, + }; + }), + }; + }); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/get_knowledge_base_entries/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/get_knowledge_base_entries/index.ts new file mode 100644 index 0000000000000..8fbe9a43defea --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/get_knowledge_base_entries/index.ts @@ -0,0 +1,185 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ShortIdTable } from '@kbn/observability-ai-assistant-plugin/common'; +import { decode, encode } from 'gpt-tokenizer'; +import { orderBy, sumBy } from 'lodash'; +import { RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { RootCauseAnalysisContext } from '../../types'; +import { formatEntity } from '../../util/format_entity'; +import { toBlockquote } from '../../util/to_blockquote'; + +export interface ScoredKnowledgeBaseEntry { + id: string; + text: string; + tokens: number; + score: number; + truncated?: { + tokens: number; + text: string; + }; +} + +export async function getKnowledgeBaseEntries({ + entity, + context, + rcaContext, + maxTokens: maxTokensForEntries, +}: { + entity: Record<string, string>; + context: string; + rcaContext: RootCauseAnalysisContext; + maxTokens: number; +}): Promise<ScoredKnowledgeBaseEntry[]> { + const response = await rcaContext.observabilityAIAssistantClient.recall({ + queries: [ + ...Object.values(entity).map((value) => ({ text: value, boost: 3 })), + { text: context }, + ], + limit: { + tokenCount: Number.MAX_VALUE, + }, + }); + + const { inferenceClient, connectorId } = rcaContext; + + const shortIdTable = new ShortIdTable(); + + const system = RCA_SYSTEM_PROMPT_BASE; + + const input = `Re-order the attached documents, based on relevance to the context. + Score them between 1 and 5, based on their relative relevance to each other. The + most relevant doc should be scored 5, and the least relevant doc should be scored + 1. + + # Entity + + ${formatEntity(entity)} + + # Context + + ${toBlockquote(context)} + `; + + const maxTokensForScoring = rcaContext.tokenLimit - encode(system + input).length - 1_000; + + const entriesWithTokens = response.map((entry) => { + return { + id: entry.id, + text: entry.text, + tokens: encode(entry.text), + }; + }); + + const totalTokenCount = sumBy(entriesWithTokens, (entry) => entry.tokens.length); + + const truncatedEntriesWithShortIds = entriesWithTokens.map((entry) => { + const tokensForEntry = Math.floor( + (entry.tokens.length / totalTokenCount) * maxTokensForScoring + ); + + const truncatedText = decode(entry.tokens.slice(0, tokensForEntry)); + const isTruncated = tokensForEntry < entry.tokens.length; + + return { + id: entry.id, + tokens: entry.tokens, + shortId: shortIdTable.take(entry.id), + text: entry.text, + truncatedText, + isTruncated, + }; + }); + + const scoredEntries = await inferenceClient.output({ + id: 'score_entries', + connectorId, + system: RCA_SYSTEM_PROMPT_BASE, + input: `${input} + + ${truncatedEntriesWithShortIds + .map((entry) => { + return `# ID: ${entry.shortId} + + ## Text (${entry.isTruncated ? `truncated` : `not truncated `}) + + ${toBlockquote(entry.truncatedText)} + `; + }) + .join('\n\n')} + `, + stream: false, + schema: { + type: 'object', + properties: { + docs: { + type: 'array', + items: { + type: 'object', + properties: { + score: { + type: 'number', + description: + 'A score between 1 and 5, with 5 being most relevant, and 1 being least relevant', + }, + id: { + type: 'string', + }, + }, + required: ['score', 'id'], + }, + }, + }, + required: ['docs'], + }, + } as const); + + const scoresById = new Map(scoredEntries.output.docs.map((doc) => [doc.id, doc.score])); + + const entriesWithScore = truncatedEntriesWithShortIds.map((entry) => { + const score = scoresById.get(entry.shortId) ?? 0; + return { + ...entry, + score, + }; + }); + + const sortedEntries = orderBy(entriesWithScore, (entry) => entry.score, 'desc'); + + const returnedEntries: ScoredKnowledgeBaseEntry[] = []; + + const tokensLeft = maxTokensForEntries; + + sortedEntries.forEach((entry) => { + if (entry.tokens.length <= tokensLeft) { + returnedEntries.push({ + id: entry.id, + text: entry.text, + tokens: entry.tokens.length, + score: entry.score, + }); + return; + } + + const tokensToTake = tokensLeft; + if (tokensToTake > 0) { + const tookTokens = entry.tokens.slice(0, tokensToTake); + returnedEntries.push({ + id: entry.id, + text: entry.text, + tokens: entry.tokens.length, + score: entry.score, + truncated: { + text: decode(tookTokens), + tokens: tookTokens.length, + }, + }); + } + }); + + return returnedEntries; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/index.ts new file mode 100644 index 0000000000000..1e9ae7147211b --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/index.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 { getEntityKuery } from '@kbn/observability-utils-common/entities/get_entity_kuery'; +import { sortAndTruncateAnalyzedFields } from '@kbn/observability-utils-common/llm/log_analysis/sort_and_truncate_analyzed_fields'; +import { analyzeDocuments } from '@kbn/observability-utils-server/entities/analyze_documents'; +import { getDataStreamsForEntity } from '@kbn/observability-utils-server/entities/get_data_streams_for_entity'; +import { getAlertsForEntity } from '@kbn/observability-utils-server/entities/signals/get_alerts_for_entity'; +import { getSlosForEntity } from '@kbn/observability-utils-server/entities/signals/get_slos_for_entity'; +import { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { RootCauseAnalysisContext } from '../../types'; +import { stringifySummaries } from '../../util/stringify_summaries'; +import { analyzeLogPatterns } from '../analyze_log_patterns'; +import { describeEntity } from '../describe_entity'; +import { describeLogPatterns } from '../describe_log_patterns'; +import { findRelatedEntities } from '../find_related_entities'; +import { extractRelatedEntities } from '../find_related_entities/extract_related_entities'; +import { writeEntityInvestigationReport } from '../write_entity_investigation_report'; +import { EntityInvestigation } from './types'; +import { getKnowledgeBaseEntries } from '../get_knowledge_base_entries'; + +export type { EntityInvestigation }; + +export interface EntityInvestigationParameters { + entity: Record<string, string>; + rcaContext: RootCauseAnalysisContext; + context: string; +} + +export async function investigateEntity( + parameters: EntityInvestigationParameters +): Promise<EntityInvestigation | undefined> { + const { + entity, + rcaContext, + rcaContext: { + inferenceClient, + connectorId, + start, + end, + esClient, + logger: parentLogger, + indices, + }, + context, + } = parameters; + const kuery = getEntityKuery(entity); + + const logger = parentLogger.get('investigateEntity'); + + logger.debug(() => `Investigating entity: ${JSON.stringify(parameters.entity)}`); + + const kbPromise = getKnowledgeBaseEntries({ + entity, + context, + rcaContext, + maxTokens: 4_000, + }).catch((error) => { + logger.error(`Could not fetch entries from knowledge base`); + logger.error(error); + return []; + }); + + const [{ dataStreams }, alerts, slos] = await getSignals({ ...parameters, kuery }); + + logger.debug( + () => + `Signals for entity ${JSON.stringify(entity)}: ${dataStreams.length} data streams, ${ + alerts.length + } alerts, ${slos.length} slos` + ); + + if (!dataStreams.length) { + return undefined; + } + + const fullAnalysis = await analyzeDataStreamsForEntity({ + start, + end, + esClient, + kuery, + dataStreams, + }); + + const truncatedAnalysis = sortAndTruncateAnalyzedFields(fullAnalysis); + + const kbEntries = await kbPromise; + + const { ownPatterns, patternsFromOtherEntities } = await analyzeLogPatterns({ + allAnalysis: [{ index: dataStreams, analysis: truncatedAnalysis }], + entity, + system: stringifySummaries(rcaContext), + cutoff: { + significance: 'high', + }, + rcaContext, + kbEntries, + }); + + logger.trace( + () => `Analyzed log patterns: ${JSON.stringify({ ownPatterns, patternsFromOtherEntities })}` + ); + + const entityReportPromise = Promise.all([ + describeEntity({ + inferenceClient, + analysis: truncatedAnalysis, + connectorId, + contextForEntityInvestigation: context, + entity, + ownPatterns, + kbEntries, + }), + describeLogPatterns({ + analysis: truncatedAnalysis, + connectorId, + contextForEntityInvestigation: context, + entity, + inferenceClient, + ownPatterns, + patternsFromOtherEntities, + kbEntries, + }), + ]).then(([entityDescription, logPatternDescription]) => { + return writeEntityInvestigationReport({ + connectorId, + inferenceClient, + entityDescription, + logPatternDescription, + contextForEntityInvestigation: context, + entity, + }).then((report) => { + return { + description: entityDescription, + logPatternDescription, + report, + }; + }); + }); + + const [entityReport, relatedEntitiesResults] = await Promise.all([ + entityReportPromise, + findRelatedEntities({ + connectorId, + end, + entity, + esClient, + index: indices.logs, + inferenceClient, + logger, + start, + context, + analysis: { + full: fullAnalysis, + truncated: truncatedAnalysis, + }, + ownPatterns, + patternsFromOtherEntities, + kbEntries, + }).then(async ({ searches, summaries, foundEntities }) => { + const report = await entityReportPromise; + + const { relatedEntities } = await extractRelatedEntities({ + entityReport: report.report, + summaries, + entity, + foundEntities, + context, + rcaContext, + }); + + return { + relatedEntities, + foundEntities, + searches, + summaries, + }; + }), + ]); + + return { + entity, + summary: [ + entityReport.description, + entityReport.logPatternDescription.content, + entityReport.report, + ].join('\n\n'), + relatedEntities: relatedEntitiesResults.relatedEntities, + attachments: { + alerts, + slos, + analysis: truncatedAnalysis, + ownPatterns, + patternsFromOtherEntities, + searches: relatedEntitiesResults.searches, + relatedEntitiesSummaries: relatedEntitiesResults.summaries, + kbEntries, + }, + }; +} + +async function getSignals({ + entity, + kuery, + rcaContext: { start, end, esClient, rulesClient, alertsClient, indices, spaceId }, +}: { + kuery: string; + entity: Record<string, unknown>; + rcaContext: Pick< + RootCauseAnalysisContext, + 'start' | 'end' | 'esClient' | 'rulesClient' | 'alertsClient' | 'indices' | 'spaceId' + >; +}) { + return await Promise.all([ + getDataStreamsForEntity({ + esClient, + kuery, + index: indices.logs.concat(indices.traces), + }), + getAlertsForEntity({ entity, rulesClient, alertsClient, start, end, size: 10 }).then( + (alertsResponse) => { + return alertsResponse.hits.hits.map((hit) => hit._source!); + } + ), + getSlosForEntity({ + entity, + start, + end, + esClient, + size: 1000, + sloSummaryIndices: indices.sloSummaries, + spaceId, + }).then((slosResponse) => { + return slosResponse.hits.hits.map((hit) => hit._source); + }), + ]); +} + +async function analyzeDataStreamsForEntity({ + start, + end, + dataStreams, + esClient, + kuery, +}: { + start: number; + end: number; + kuery: string; + dataStreams: string[]; + esClient: ObservabilityElasticsearchClient; +}) { + const analysis = await analyzeDocuments({ + esClient, + start, + end, + index: dataStreams, + kuery, + }); + + return { + ...analysis, + fields: analysis.fields.filter((field) => !field.empty), + }; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/prompts.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/prompts.ts new file mode 100644 index 0000000000000..e9d042e88a6ec --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/prompts.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { formatEntity } from '../../util/format_entity'; +import { toBlockquote } from '../../util/to_blockquote'; + +export const getInvestigateEntityTaskPrompt = ({ + entity, + contextForEntityInvestigation, +}: { + entity: Record<string, string>; + contextForEntityInvestigation: string; +}) => `## Entity-Based Investigation: Task Guide + +In the investigation process, you are currently investigating the entity +${formatEntity(entity)}. The context given for this investigation is: + +${toBlockquote(contextForEntityInvestigation)}`; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/types.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/types.ts new file mode 100644 index 0000000000000..e29735c894f22 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/investigate_entity/types.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 type { ParsedTechnicalFields } from '@kbn/rule-registry-plugin/common'; +import type { TruncatedDocumentAnalysis } from '@kbn/observability-utils-common/llm/log_analysis/document_analysis'; +import type { AnalyzeLogPatternOutput } from '../analyze_log_patterns'; +import type { RelatedEntityDescription } from '../find_related_entities/extract_related_entities'; +import type { RelatedEntityKeywordSearch } from '../find_related_entities/write_keyword_searches_for_related_entities'; +import type { ScoredKnowledgeBaseEntry } from '../get_knowledge_base_entries'; + +export interface EntityInvestigation { + entity: Record<string, string>; + summary: string; + relatedEntities: RelatedEntityDescription[]; + attachments: { + analysis: TruncatedDocumentAnalysis; + slos: Array< + Record<string, any> & { + status: 'VIOLATED' | 'DEGRADED' | 'HEALTHY' | 'NO_DATA'; + } + >; + alerts: ParsedTechnicalFields[]; + searches: RelatedEntityKeywordSearch[]; + relatedEntitiesSummaries: string[]; + kbEntries: ScoredKnowledgeBaseEntry[]; + } & AnalyzeLogPatternOutput; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/observe_investigation_results/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/observe_investigation_results/index.ts new file mode 100644 index 0000000000000..c0b5367cded31 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/observe_investigation_results/index.ts @@ -0,0 +1,239 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MessageRole } from '@kbn/inference-common'; +import { RCA_OBSERVE_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { RCA_PROMPT_CHANGES, RCA_PROMPT_ENTITIES, RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { ObservationToolMessage, RootCauseAnalysisContext } from '../../types'; +import { formatEntity } from '../../util/format_entity'; +import { getPreviouslyInvestigatedEntities } from '../../util/get_previously_investigated_entities'; +import { stringifySummaries } from '../../util/stringify_summaries'; +import { toBlockquote } from '../../util/to_blockquote'; +import { EntityInvestigation } from '../investigate_entity/types'; + +const INITIAL_OBSERVATION_TASK_GUIDE = `Your current task is to write observations based on the initial context. You +should acknowledge the context briefly, and mention key observations from the +initial context. + +Then, briefly describe what change you are looking for. Are the symptoms: + +- rapid, or gradual onset? +- subtle or prounounced? + +If possible, mention the time of the change. + +When considering the initial context, reason about relevant changes to observe, +such as short-lived versus persistent changes or singular events, like scale +events, rollouts, or configuration changes. + +After, taking into account the capabilities you have, plan for next steps. + +Describe the next step, which is to investigate the entity found in the initial +context. Only mention the entity (as a field/value). Do not mention any +additional filters. + +Be brief, accurate, and critical.`; + +const INVESTIGATION_ADDENDUM = ` +**Task Guide: Observe the investigation results** + +You will receive one or more investigations. These investigations mention: +- a general characterization of the entity based on its data +- relevant log patterns +- other signals, like SLOs or alerts +- possibly related entities, and investigation suggestions + +First, you should briefly acknowledge the initial context of the investigation +and where it stands. + +Next, you should note key observations from the investigations, and how they relate +to the ongoing investigation. + +After, you should generate a timeline of significant events. For this timeline, +include events from previous observations. Additionally, include significant +events from the inspected investigations. Group events together in a topic +if needed. Significant events are things like: an increase in errors, deployment +events, a drop to zero for access logs, etc. In most cases, you do not want to +mention individual log messages, unless it is a particularly significant event +by itself. + +For each event, mention: + +- the timestamp of the event +- the nature of the change, if applicable +- data from the event, such as specific log patterns, alerts or slos +- the meaning of the event and how it is related to the initial context + +Do not include: +- the time range from the investigation itself (start/end) +- other events that occurred during the investigation itself, like running +log analysis or other patterns + +## Correlating significant events + +When correlating significant events, pay close attention to the timestamp of +the mentioned change, and how it correlates to the timestamp of the change you +want to correlate it to, such as the start time of an alert. An alert might be +delayed, but if you see many changes around a specific timestamp, and some of +them being significantly earlier, or later, the latter group is likely not +relevant. + +## Context and reasoning + +Next, use the timeline of events and the new observations to revise your +analysis of the initial context and the ongoing investigation. Reason about +how changes could be related: are they close in time, or far removed, compared +to others? Is the type of change similar? Is the magnitude of the change similar?`; + +const SUGGEST_NEXT_STEPS_PROMPT = ` +Next, consider next steps. it's always important to contextualize the significant +in the initial context of the investigation. Focus on your strongest pieces of +evidence. Your observations should be related to finding out the cause of the +initial context of the investigation - you should not concern yourself with the +impact on _other_ entities. + +Suggest to conclude the process when: + +- there is a clear and obvious root cause +- you have investigated more than 10 entities +- OR you cannot find any unhealthy entities +- there are no more entities to investigate + +If the conclusion is you need to continue your investigation, mention the entities +that should be investigated. Do this only if there is a significant change one of +the related entities will give you new insights into the root cause (instead of +just the impact). DO NOT investigate an entity more than once.`; + +const CONCLUDE_PROCESS_PROMPT = ` +You must suggest to conclude the process and write the final report, as your +capabilities do not allow you go investigate more entities.`; + +function getInitialPrompts(initialContext: string) { + return { + system: `${RCA_SYSTEM_PROMPT_BASE} + + ${RCA_PROMPT_ENTITIES} + + ${RCA_PROMPT_CHANGES}`, + input: `## Context + + ${initialContext} + + ${INITIAL_OBSERVATION_TASK_GUIDE}`, + }; +} + +function getObserveInvestigationsPrompts({ + investigations, + summaries, + rcaContext, +}: { + investigations: EntityInvestigation[]; + summaries: ObservationStepSummary[]; + rcaContext: RootCauseAnalysisContext; +}) { + const previouslyInvestigatedEntities = getPreviouslyInvestigatedEntities(rcaContext); + + const canContinue = + summaries.length <= 5 && + investigations.filter((investigation) => 'summary' in investigation).length <= 10; + + const investigationsPrompt = `Observe the following investigations that recently concluded: + ${investigations + .map((investigation, index) => { + return `## ${index + 1}: investigation of ${formatEntity(investigation.entity)} + + ${toBlockquote(investigation.summary)} + + ${ + investigation.relatedEntities.length + ? `### Relationships to ${formatEntity(investigation.entity)} + + ${toBlockquote(JSON.stringify(investigation.relatedEntities))} + + ` + : `` + } + `; + }) + .join('\n\n')} + + ${INVESTIGATION_ADDENDUM} + + ${ + canContinue + ? `${SUGGEST_NEXT_STEPS_PROMPT} + + ${ + previouslyInvestigatedEntities.length + ? `The following entities have been investigated previously. + Do not investigate them again: + + ${previouslyInvestigatedEntities.map((entity) => `- ${JSON.stringify(entity)}`).join('\n')}` + : `` + } + + ` + : CONCLUDE_PROCESS_PROMPT + } + + `; + + const systemPrompt = `${RCA_SYSTEM_PROMPT_BASE} + + ${RCA_PROMPT_ENTITIES} + + ${stringifySummaries(rcaContext)}`; + + return { + system: systemPrompt, + input: investigationsPrompt, + }; +} + +export interface ObservationStepSummary { + investigations: EntityInvestigation[]; + content: string; +} + +export function observeInvestigationResults({ + rcaContext, + rcaContext: { logger, events, initialContext, inferenceClient, connectorId }, + investigations, +}: { + rcaContext: RootCauseAnalysisContext; + investigations: EntityInvestigation[]; +}): Promise<ObservationStepSummary> { + const summaries = events + .filter((event): event is ObservationToolMessage => { + return event.role === MessageRole.Tool && event.name === RCA_OBSERVE_TOOL_NAME; + }) + .map((event) => event.data); + + logger.debug( + () => + `Observing ${investigations.length} investigations (${summaries.length} previous summaries)` + ); + + const { system, input } = investigations.length + ? getObserveInvestigationsPrompts({ summaries, investigations, rcaContext }) + : getInitialPrompts(initialContext); + + return inferenceClient + .output({ + id: 'observe', + system, + input, + connectorId, + }) + .then((outputCompleteEvent) => { + return { + content: outputCompleteEvent.content, + investigations, + }; + }); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/write_entity_investigation_report/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/write_entity_investigation_report/index.ts new file mode 100644 index 0000000000000..58ef6f4ab5d04 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/write_entity_investigation_report/index.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { RCA_PROMPT_SIGNIFICANT_EVENTS, RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { formatEntity } from '../../util/format_entity'; +import { toBlockquote } from '../../util/to_blockquote'; +import { LogPatternDescription } from '../describe_log_patterns'; +import { getInvestigateEntityTaskPrompt } from '../investigate_entity/prompts'; + +export async function writeEntityInvestigationReport({ + inferenceClient, + connectorId, + entity, + contextForEntityInvestigation, + entityDescription, + logPatternDescription, +}: { + inferenceClient: InferenceClient; + connectorId: string; + entity: Record<string, string>; + contextForEntityInvestigation: string; + entityDescription: string; + logPatternDescription: LogPatternDescription; +}): Promise<string> { + const system = RCA_SYSTEM_PROMPT_BASE; + + const shouldGenerateTimeline = logPatternDescription.interestingPatternCount > 0; + + let input = `${getInvestigateEntityTaskPrompt({ entity, contextForEntityInvestigation })} + + ## Entity description + + ${toBlockquote(entityDescription)} + + ## Log pattern analysis + + ${toBlockquote(logPatternDescription.content)} + + # Current task + + Your current task is to write a report the investigation into ${formatEntity(entity)}. + The log pattern analysis and entity description will be added to your report (at the + top), so you don't need to repeat anything in it.`; + + if (shouldGenerateTimeline) { + input += `${RCA_PROMPT_SIGNIFICANT_EVENTS}\n\n`; + } + + input += `## Context and reasoning + + Reason about the role that the entity plays in the investigation, given the context. + mention evidence (hard pieces of data) when reasoning. + + Do not suggest next steps - this will happen in a follow-up task.`; + + if (shouldGenerateTimeline) { + input += `## Format + + Your reply should only contain two sections: + + - Timeline of significant events + - Context and reasoning + `; + } else { + input += `## Format + Your reply should only contain one section: + - Context and reasoning + `; + } + + const response = await inferenceClient.output({ + id: 'generate_entity_report', + connectorId, + input, + system, + }); + + return response.content; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/write_final_report/index.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/write_final_report/index.ts new file mode 100644 index 0000000000000..db7aa9f3b7aa3 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tasks/write_final_report/index.ts @@ -0,0 +1,191 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RCA_PROMPT_TIMELINE_GUIDE, RCA_SYSTEM_PROMPT_BASE } from '../../prompts'; +import { RootCauseAnalysisContext } from '../../types'; +import { stringifySummaries } from '../../util/stringify_summaries'; + +const SYSTEM_PROMPT_ADDENDUM = ` +# Guide: Writing a Root Cause Analysis (RCA) Report + +A Root Cause Analysis (RCA) report is the final step in a thorough +investigation. Its purpose is to provide a clear, evidence-backed explanation of +the underlying cause of an issue, as well as the impact. Even if no definitive +root cause is identified, the report should reflect the findings, the hypotheses +considered, and why certain assumptions were rejected. This guide will help +structure an RCA that distinguishes between cause and effect, organizes +evidence, and presents a timeline of key events. + +--- + +## 1. Introduction + +Start by summarizing the reason for the investigation. Provide a brief overview +of the incident, the affected services or entities, and the initial alerts or +issues that triggered the investigation. + +- **What prompted the investigation?** +- **Which entities were investigated?** +- **Was there a specific hypothesis proposed at the outset?** + +### Example: +- **Overview:** This RCA report investigates the elevated error rates in +\`myservice\` and its downstream dependencies, first identified through an SLO +breach for the \`/api/submit\` endpoint. The investigation considered multiple +entities and possible causes, including resource exhaustion and upstream service +failures. + +--- + +## 2. Investigation Summary + +Summarize the key steps of the investigation, outlining: +- **What hypotheses were proposed and why.** +- **Which entities were investigated (e.g., \`myservice\`, \`myotherservice\`, +\`notification-service\`).** +- **Which hypotheses were discarded and why.** + +For each hypothesis, present the supporting or contradicting evidence. + +- **Strong Indicators:** Clear, repeated evidence pointing toward or against a +hypothesis. +- **Weak Indicators:** Inconsistent or ambiguous data that did not provide +conclusive answers. + +#### Example Format: +- **Hypothesis 1:** Resource exhaustion in \`myservice\` caused elevated error +rates. + - **Evidence:** + - **Strong:** Memory usage exceeded 90% during the incident. + - **Weak:** CPU usage remained stable, making resource exhaustion a partial +explanation. + +- **Hypothesis 2:** Upstream latency from \`myotherservice\` caused delays. + - **Evidence:** + - **Strong:** API logs showed frequent retries and timeouts from +\`myotherservice\`. + - **Weak:** No errors were observed in \`myotherservice\` logs, suggesting an +issue isolated to \`myservice\`. + +--- + +## 3. Cause and Effect + +Differentiate between the **cause** (what initiated the issue) and the +**effect** (the impact or symptoms seen across the system). The cause should +focus on the root, while the effect describes the wider system response or +failure. + +- **Root Cause:** Identify the underlying problem, supported by strong evidence. +If no root cause is found, clearly state that the investigation did not lead to +a conclusive root cause. + +- **Impact:** Describe the downstream effects on other services, performance +degradation, or SLO violations. + +#### Example: +- **Cause:** The root cause of the elevated error rate was identified as a +memory leak in \`myservice\` that gradually led to resource exhaustion. +- **Effect:** This led to elevated latency and increased error rates at the +\`/api/submit\` endpoint, impacting downstream services like +\`notification-service\` that rely on responses from \`myservice\`. + +--- + +## 4. Evidence for Root Cause + +Present a structured section summarizing all the evidence that supports the +identified root cause. If no root cause is identified, outline the most +significant findings that guided or limited the investigation. + +- **Log Patterns:** Describe any abnormal log patterns observed, including +notable change points. +- **Alerts and SLOs:** Mention any alerts or breached SLOs that were triggered, +including their relevance to the investigation. +- **Data Analysis:** Include any data trends or patterns that were analyzed +(e.g., resource usage spikes, network traffic). + +#### Example: +- **Memory Usage:** Logs showed a steady increase in memory consumption starting +at 10:00 AM, peaking at 12:00 PM, where memory usage surpassed 90%, triggering +the alert. +- **Error Rate Logs:** Error rates for \`/api/submit\` began increasing around +11:30 AM, correlating with the memory pressure in \`myservice\`. +- **API Logs:** \`myotherservice\` API logs showed no internal errors, ruling out +an upstream dependency as the primary cause. + +--- + +## 5. Proposed Impact + +Even if the root cause is clear, it is important to mention the impact of the +issue on the system, users, and business operations. This includes: +- **Affected Services:** Identify the services impacted (e.g., downstream +dependencies). +- **Performance Degradation:** Describe any SLO breaches or performance +bottlenecks. +- **User Impact:** Explain how users or clients were affected (e.g., higher +latency, failed transactions). + +#### Example: +- **Impact:** The memory leak in \`myservice\` caused service degradation over a +2-hour window. This affected \`/api/submit\`, causing delays and failed +requests, ultimately impacting user-facing services relying on that endpoint. + +--- + +## 6. Timeline of Significant Events + +${RCA_PROMPT_TIMELINE_GUIDE} + +--- + +## 7. Conclusion and Next Steps + +Summarize the conclusions of the investigation: +- If a root cause was identified, confirm it with the strongest supporting +evidence. +- If no root cause was found, state that clearly and suggest areas for further +investigation or monitoring. + +Finally, outline the next steps: +- **Fixes or Mitigations:** Recommend any immediate actions (e.g., patch +deployment, configuration changes). +- **Monitoring Improvements:** Suggest new alerts or monitoring metrics based on +lessons learned. +- **Further Investigations:** If necessary, propose any follow-up investigations +to gather more evidence. + +#### Example: +- **Conclusion:** The root cause of the incident was a memory leak in +\`myservice\`, leading to resource exhaustion and elevated error rates at +\`/api/submit\`. The leak has been patched, and monitoring has been improved to +detect memory spikes earlier. +- **Next Steps:** Monitor memory usage for the next 24 hours to ensure no +recurrence. Investigate adding a memory ceiling for \`myservice\` to prevent +future resource exhaustion.`; + +export async function writeFinalReport({ + rcaContext, +}: { + rcaContext: RootCauseAnalysisContext; +}): Promise<string> { + const { inferenceClient, connectorId } = rcaContext; + + return await inferenceClient + .output({ + id: 'write_final_report', + connectorId, + system: `${RCA_SYSTEM_PROMPT_BASE} + + ${SYSTEM_PROMPT_ADDENDUM}`, + input: `Write the RCA report, based on the observations. + + ${stringifySummaries(rcaContext)}`, + }) + .then((event) => event.content); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tools.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tools.ts new file mode 100644 index 0000000000000..8c3082aa320c4 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/tools.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + RCA_END_PROCESS_TOOL_NAME, + RCA_INVESTIGATE_ENTITY_TOOL_NAME, + RCA_OBSERVE_TOOL_NAME, +} from '@kbn/observability-ai-common/root_cause_analysis/tool_names'; + +export const RCA_TOOLS = { + [RCA_OBSERVE_TOOL_NAME]: { + description: `Request an observation from another agent on + the results of the returned investigations. The title should + cover key new observations from the initial context or + completed investigations, not anything about next steps.`, + schema: { + type: 'object', + properties: { + title: { + type: 'string', + description: `A short title w/ the key new observations that will be displayed on top of a collapsible panel.`, + }, + }, + required: ['title'], + }, + }, + [RCA_END_PROCESS_TOOL_NAME]: { + description: `End the RCA process by requesting a + written report from another agent`, + schema: { + type: 'object', + properties: { + endProcess: { + type: 'boolean', + }, + }, + required: ['endProcess'], + }, + }, + [RCA_INVESTIGATE_ENTITY_TOOL_NAME]: { + description: `Investigate an entity`, + schema: { + type: 'object', + properties: { + context: { + type: 'string', + description: `Context that will be used in the investigation of the entity. Mention the initial context + of the investigation, a very short summary of the last observation if applicable, and pieces + of data that can be relevant for the investigation into the entity, such as timestamps or + keywords`, + }, + entity: { + type: 'object', + description: `The entity you want to investigate, such as a service. Use + the Elasticsearch field names and values. For example, for services, use + the following structure: ${JSON.stringify({ + entity: { field: 'service.name', value: 'opbeans-java' }, + })}`, + properties: { + field: { + type: 'string', + }, + value: { + type: 'string', + }, + }, + required: ['field', 'value'], + }, + }, + required: ['context', 'entity'], + }, + }, +} as const; diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/types.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/types.ts new file mode 100644 index 0000000000000..6b6fa1886309c --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/types.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ToolMessage, + UserMessage, + ToolCallsOf, + ToolChoice, + AssistantMessageOf, +} from '@kbn/inference-common'; +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { Logger } from '@kbn/logging'; +import { AlertsClient } from '@kbn/rule-registry-plugin/server'; +import { RulesClient } from '@kbn/alerting-plugin/server'; +import { ObservabilityAIAssistantClient } from '@kbn/observability-ai-assistant-plugin/server'; +import { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { + RCA_END_PROCESS_TOOL_NAME, + RCA_INVESTIGATE_ENTITY_TOOL_NAME, + RCA_OBSERVE_TOOL_NAME, +} from '@kbn/observability-ai-common/root_cause_analysis'; +import { ObservationStepSummary } from './tasks/observe_investigation_results'; +import { EntityInvestigation } from './tasks/investigate_entity'; +import { SignificantEventsTimeline } from './tasks/generate_timeline'; +import { RCA_TOOLS } from './tools'; + +export type EndProcessToolMessage = ToolMessage< + typeof RCA_END_PROCESS_TOOL_NAME, + { + report: string; + timeline: SignificantEventsTimeline; + } +>; + +export type ObservationToolMessage = ToolMessage< + typeof RCA_OBSERVE_TOOL_NAME, + { + content: string; + }, + ObservationStepSummary +>; + +export type InvestigateEntityToolMessage = ToolMessage< + typeof RCA_INVESTIGATE_ENTITY_TOOL_NAME, + Pick<EntityInvestigation, 'entity' | 'summary' | 'relatedEntities'>, + { attachments: EntityInvestigation['attachments'] } +>; + +export type ToolErrorMessage = ToolMessage< + 'error', + { + error: { + message: string; + }; + } +>; + +export type RootCauseAnalysisEvent = + | RootCauseAnalysisToolMessage + | ToolErrorMessage + | UserMessage + | AssistantMessageOf<{ + tools: typeof RCA_TOOLS; + toolChoice?: ToolChoice<keyof typeof RCA_TOOLS>; + }>; + +export type RootCauseAnalysisToolRequest< + TToolName extends keyof typeof RCA_TOOLS = keyof typeof RCA_TOOLS +> = ToolCallsOf<{ + tools: Pick<typeof RCA_TOOLS, TToolName>; +}>['toolCalls'][number]; + +export type RootCauseAnalysisToolMessage = + | EndProcessToolMessage + | InvestigateEntityToolMessage + | ObservationToolMessage; + +export interface RootCauseAnalysisContext { + initialContext: string; + start: number; + end: number; + events: RootCauseAnalysisEvent[]; + indices: { + logs: string[]; + traces: string[]; + sloSummaries: string[]; + }; + inferenceClient: InferenceClient; + tokenLimit: number; + connectorId: string; + esClient: ObservabilityElasticsearchClient; + alertsClient: AlertsClient; + rulesClient: RulesClient; + logger: Logger; + spaceId: string; + observabilityAIAssistantClient: ObservabilityAIAssistantClient; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/call_tools.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/call_tools.ts new file mode 100644 index 0000000000000..046d6d401c33a --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/call_tools.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 { + Message, + ToolDefinition, + ToolChoice, + ToolCallsOf, + withoutChunkEvents, + withoutTokenCountEvents, + ToolMessage, + MessageOf, + MessageRole, +} from '@kbn/inference-common'; +import { InferenceClient } from '@kbn/inference-plugin/server'; +import { Logger } from '@kbn/logging'; +import { + defer, + last, + merge, + Observable, + of, + OperatorFunction, + share, + switchMap, + toArray, +} from 'rxjs'; + +interface CallToolOptions extends CallToolTools { + system: string; + messages: Message[]; + inferenceClient: InferenceClient; + connectorId: string; + logger: Logger; +} + +interface CallToolTools { + tools: Record<string, ToolDefinition>; + toolChoice?: ToolChoice; +} + +type CallbackOf< + TCallToolTools extends CallToolTools, + TEmittedMessage extends Message +> = (parameters: { + messages: Message[]; + toolCalls: ToolCallsOf<TCallToolTools>['toolCalls']; +}) => Observable<TEmittedMessage>; + +type GetNextRequestCallback<TCallToolTools extends CallToolTools> = ({ + messages, + system, +}: { + messages: Message[]; + system: string; +}) => { system: string; messages: Message[] } & TCallToolTools; + +export function callTools<TCallToolOptions extends CallToolOptions>( + { system, messages, inferenceClient, connectorId, tools, toolChoice, logger }: TCallToolOptions, + callback: CallbackOf<TCallToolOptions, ToolMessage> +): Observable<MessageOf<TCallToolOptions>>; + +export function callTools< + TCallToolOptions extends Omit<CallToolOptions, 'tools' | 'toolChoice'> = never, + TCallToolTools extends CallToolTools = never, + TEmittedMessage extends Message = never +>( + options: TCallToolOptions, + getNextRequest: GetNextRequestCallback<TCallToolTools>, + callback: CallbackOf<TCallToolTools, TEmittedMessage> +): Observable<TEmittedMessage>; + +export function callTools( + { system, messages, inferenceClient, connectorId, tools, toolChoice, logger }: CallToolOptions, + ...callbacks: + | [GetNextRequestCallback<CallToolTools>, CallbackOf<CallToolOptions, ToolMessage>] + | [CallbackOf<CallToolTools, ToolMessage>] +): Observable<Message> { + const callback = callbacks.length === 2 ? callbacks[1] : callbacks[0]; + + const getNextRequest = + callbacks.length === 2 + ? callbacks[0] + : (next: { messages: Message[]; system: string }) => { + return { + ...next, + tools, + toolChoice, + }; + }; + + const nextRequest = getNextRequest({ system, messages }); + + const chatComplete$ = defer(() => + inferenceClient.chatComplete({ + connectorId, + stream: true, + ...nextRequest, + }) + ); + + const asCompletedMessages$ = chatComplete$.pipe( + withoutChunkEvents(), + withoutTokenCountEvents(), + switchMap((event) => { + return of({ + role: MessageRole.Assistant as const, + content: event.content, + toolCalls: event.toolCalls, + }); + }) + ); + + const withToolResponses$ = asCompletedMessages$ + .pipe( + switchMap((message) => { + if (message.toolCalls.length) { + return merge( + of(message), + callback({ toolCalls: message.toolCalls, messages: messages.concat(message) }) + ); + } + return of(message); + }) + ) + .pipe(handleNext()); + + return withToolResponses$; + + function handleNext(): OperatorFunction<Message, Message> { + return (source$) => { + const shared$ = source$.pipe(share()); + + const next$ = merge( + shared$, + shared$.pipe( + toArray(), + last(), + switchMap((nextMessages) => { + logger.debug(() => + JSON.stringify( + nextMessages.map((message) => { + return { + role: message.role, + toolCalls: 'toolCalls' in message ? message.toolCalls : undefined, + toolCallId: 'toolCallId' in message ? message.toolCallId : undefined, + }; + }) + ) + ); + + if (nextMessages[nextMessages.length - 1].role !== MessageRole.Assistant) { + const options: CallToolOptions = { + system, + connectorId, + inferenceClient, + messages: messages.concat(nextMessages), + tools, + toolChoice, + logger, + }; + const after$ = callTools(options, getNextRequest, callback); + return after$; + } + return of(); + }) + ) + ); + + return next$; + }; + } +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/chunk_output_calls.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/chunk_output_calls.ts new file mode 100644 index 0000000000000..0a174b6451604 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/chunk_output_calls.ts @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { encode } from 'gpt-tokenizer'; +import { uniqueId } from 'lodash'; + +interface TextWithId { + id: string; + text: string; +} + +interface Parameters { + system: string; + input: string; + tokenLimit: number; +} + +interface ChunkedOutputRequest { + input: string; + system: string; +} + +export function chunkOutputCalls({}: Parameters & { texts: string[] }): Array< + ChunkedOutputRequest & { + texts: string[]; + } +>; + +export function chunkOutputCalls({}: Parameters & { texts: TextWithId[] }): Array< + ChunkedOutputRequest & { + texts: TextWithId[]; + } +>; + +export function chunkOutputCalls({ + system, + input, + texts, + tokenLimit, +}: Parameters & { + texts: string[] | TextWithId[]; +}) { + const inputAndSystemPromptCount = encode(system).length + encode(input).length; + + if (!texts.length) { + return [{ system, input, texts: [] }]; + } + + const textWithIds = texts.map((text) => { + if (typeof text === 'string') { + return { + id: uniqueId(), + text, + }; + } + return text; + }); + + const textsWithCount = textWithIds.map(({ text, id }) => ({ + tokenCount: encode(text).length, + text, + id, + })); + + const chunks: Array<{ tokenCount: number; texts: TextWithId[] }> = []; + + textsWithCount.forEach(({ text, id, tokenCount }) => { + let chunkWithRoomLeft = chunks.find((chunk) => { + return chunk.tokenCount + tokenCount <= tokenLimit; + }); + + if (!chunkWithRoomLeft) { + chunkWithRoomLeft = { texts: [], tokenCount: inputAndSystemPromptCount }; + chunks.push(chunkWithRoomLeft); + } + chunkWithRoomLeft.texts.push({ text, id }); + chunkWithRoomLeft.tokenCount += tokenCount; + }); + + const hasTextWithIds = texts.some((text) => typeof text !== 'string'); + + return chunks.map((chunk) => { + const textsForChunk = hasTextWithIds + ? chunk.texts + : chunk.texts.map((text) => (typeof text === 'string' ? text : text.text)); + + return { + system, + input, + texts: textsForChunk, + }; + }); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/format_entity.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/format_entity.ts new file mode 100644 index 0000000000000..d4fa1e545653e --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/format_entity.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function formatEntity(entity: Record<string, string>) { + return Object.entries(entity) + .map(([field, value]) => `${field}:${value}`) + .join('/'); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/get_previously_investigated_entities.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/get_previously_investigated_entities.ts new file mode 100644 index 0000000000000..e42a6a8039e23 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/get_previously_investigated_entities.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MessageRole } from '@kbn/inference-common'; +import { RCA_INVESTIGATE_ENTITY_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { InvestigateEntityToolMessage, RootCauseAnalysisContext } from '../types'; + +export function getPreviouslyInvestigatedEntities({ + events, +}: Pick<RootCauseAnalysisContext, 'events'>) { + const investigationToolResponses = events.filter( + (event): event is InvestigateEntityToolMessage => { + return event.role === MessageRole.Tool && event.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME; + } + ); + + return investigationToolResponses.map((event) => event.response.entity); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/serialize_knowledge_base_entries.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/serialize_knowledge_base_entries.ts new file mode 100644 index 0000000000000..39bc1a5b9a603 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/serialize_knowledge_base_entries.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ScoredKnowledgeBaseEntry } from '../tasks/get_knowledge_base_entries'; +import { toBlockquote } from './to_blockquote'; + +export function serializeKnowledgeBaseEntries(entries: ScoredKnowledgeBaseEntry[]) { + if (!entries.length) { + return `## Knowledge base + + No relevant knowledge base entries were found. + `; + } + + const serializedEntries = entries + .filter((entry) => entry.score >= 3) + .map( + (entry) => `## Entry \`${entry.id}\ (score: ${entry.score}, ${ + entry.truncated ? `truncated` : `not truncated` + }) + + ${toBlockquote(entry.text)}` + ); + + return `## Knowledge base + + The following relevant entries were found in the knowledge base + + ${serializedEntries.join('\n\n')}`; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/stringify_summaries.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/stringify_summaries.ts new file mode 100644 index 0000000000000..80e2ab85a408b --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/stringify_summaries.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 { compact } from 'lodash'; +import { MessageRole } from '@kbn/inference-common'; +import { RCA_OBSERVE_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { formatEntity } from './format_entity'; +import { toBlockquote } from './to_blockquote'; +import { ObservationToolMessage, RootCauseAnalysisContext } from '../types'; + +export function stringifySummaries({ events }: RootCauseAnalysisContext): string { + const summaries = events + .filter((event): event is ObservationToolMessage => { + return event.role === MessageRole.Tool && event.name === RCA_OBSERVE_TOOL_NAME; + }) + .map((event) => event.data); + + if (!summaries.length) { + return `# Previous observations + + No previous observations`; + } + + return `# Previous observations + + ${summaries.map((summary, index) => { + const header = `## Observation #${index + 1}`; + + const entitiesHeader = summary.investigations.length + ? `### Investigated entities + + ${summary.investigations + .map((investigation) => `- ${formatEntity(investigation.entity)}`) + .join('\n')}` + : undefined; + + const summaryBody = `### Summary + + ${toBlockquote(summary.content)}`; + + return compact([header, entitiesHeader, summaryBody]).join('\n\n'); + })}`; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/to_blockquote.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/to_blockquote.ts new file mode 100644 index 0000000000000..38af158de611b --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/to_blockquote.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function toBlockquote(input: string): string { + return input + .split('\n') + .map((line) => `> ${line}`) + .join('\n'); +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/validate_investigate_entity_tool_call.ts b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/validate_investigate_entity_tool_call.ts new file mode 100644 index 0000000000000..76fa0fcc379a3 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/root_cause_analysis/util/validate_investigate_entity_tool_call.ts @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MessageRole, ToolCallsOf } from '@kbn/inference-common'; +import { entityQuery } from '@kbn/observability-utils-common/es/queries/entity_query'; +import { RCA_INVESTIGATE_ENTITY_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { isEqual } from 'lodash'; +import { getEntitiesByFuzzySearch } from '@kbn/observability-utils-server/entities/get_entities_by_fuzzy_search'; +import { RCA_TOOLS } from '../tools'; +import { + InvestigateEntityToolMessage, + RootCauseAnalysisContext, + RootCauseAnalysisToolRequest, +} from '../types'; +import { formatEntity } from './format_entity'; + +interface EntityExistsResultExists { + exists: true; + entity: Record<string, string>; +} + +interface EntityExistsResultDoesNotExist { + exists: false; + entity: Record<string, string>; + suggestions: string[]; +} + +type EntityExistsResult = EntityExistsResultExists | EntityExistsResultDoesNotExist; + +export async function validateInvestigateEntityToolCalls({ + rcaContext, + toolCalls, +}: { + rcaContext: Pick<RootCauseAnalysisContext, 'esClient' | 'indices' | 'start' | 'end' | 'events'>; + toolCalls: RootCauseAnalysisToolRequest[]; +}) { + const { events, esClient, indices, start, end } = rcaContext; + + const previouslyInvestigatedEntities = events + .filter( + (event): event is InvestigateEntityToolMessage => + event.role === MessageRole.Tool && event.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME + ) + .map((toolResponse) => toolResponse.response.entity); + + const investigateEntityToolCalls = toolCalls.filter( + ( + toolCall + ): toolCall is ToolCallsOf<{ + tools: Pick<typeof RCA_TOOLS, typeof RCA_INVESTIGATE_ENTITY_TOOL_NAME>; + }>['toolCalls'][number] => toolCall.function.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME + ); + + if (!investigateEntityToolCalls.length) { + return []; + } + + const entitiesToInvestigate = investigateEntityToolCalls.map((toolCall) => { + const { entity: entityToInvestigate } = toolCall.function.arguments; + return { + [entityToInvestigate.field]: entityToInvestigate.value, + }; + }); + const entityExistsResponses: EntityExistsResult[] = await Promise.all( + entitiesToInvestigate.map(async (entity) => { + const response = await esClient.search('find_data_for_entity', { + track_total_hits: 1, + size: 0, + timeout: '1ms', + index: indices.logs.concat(indices.traces), + query: { + bool: { + filter: [...entityQuery(entity)], + }, + }, + }); + + const exists = response.hits.total.value > 0; + if (!exists) { + return getEntitiesByFuzzySearch({ + start, + end, + esClient, + index: indices.logs.concat(indices.traces), + entity, + }).then((suggestions) => { + return { + entity, + exists, + suggestions, + }; + }); + } + + return { entity, exists }; + }) + ); + + const alreadyInvestigatedEntities = entitiesToInvestigate.filter((entity) => { + return previouslyInvestigatedEntities.some((prevEntity) => isEqual(entity, prevEntity)); + }); + + const errors = [ + ...entityExistsResponses + .filter( + (entityExistsResult): entityExistsResult is EntityExistsResultDoesNotExist => + !entityExistsResult.exists + ) + .map(({ suggestions, entity }) => { + return `Entity ${formatEntity( + entity + )} does not exist. Did you mean one of ${suggestions.join(', ')}?`; + }), + ...alreadyInvestigatedEntities.map((entity) => { + return `Entity ${formatEntity(entity)} was already investigated before.`; + }), + ]; + + return errors; +} diff --git a/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/tsconfig.json b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/tsconfig.json new file mode 100644 index 0000000000000..59f73df4273c8 --- /dev/null +++ b/x-pack/solutions/observability/packages/observability_ai/observability_ai_server/tsconfig.json @@ -0,0 +1,29 @@ +{ + "extends": "../../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/observability-utils-common", + "@kbn/alerting-plugin", + "@kbn/rule-registry-plugin", + "@kbn/inference-plugin", + "@kbn/logging", + "@kbn/calculate-auto", + "@kbn/observability-ai-assistant-plugin", + "@kbn/inference-common", + "@kbn/observability-ai-common", + "@kbn/observability-utils-server", + ] +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/jest_setup.js b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/jest_setup.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/jest_setup.js rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/jest_setup.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/main.js b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/main.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/main.js rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/main.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/preview.js b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/preview.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook/preview.js rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/preview.js diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/storybook_decorator.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/storybook_decorator.tsx new file mode 100644 index 0000000000000..ce283bbeccf0a --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/storybook_decorator.tsx @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { ComponentType } from 'react'; + +export function KibanaReactStorybookDecorator(Story: ComponentType) { + return <Story />; +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/README.md b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/README.md similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/README.md rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/README.md diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/changes/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/functions/changes/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/changes/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/functions/changes/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/lens.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/functions/lens.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/lens.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/functions/lens.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/visualize_esql.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/functions/visualize_esql.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/visualize_esql.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/functions/visualize_esql.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/rule_connector.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/common/rule_connector.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/common/rule_connector.ts diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/jest.config.js b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/jest.config.js new file mode 100644 index 0000000000000..5238f7a7cd889 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/jest.config.js @@ -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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../..', + roots: [ + '<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public', + '<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_app/common', + '<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server', + ], + setupFiles: [ + '<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_app/.storybook/jest_setup.js', + ], + collectCoverage: true, + collectCoverageFrom: [ + '<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_app/{common,public,server}/**/*.{js,ts,tsx}', + ], + + coverageReporters: ['html'], +}; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/kibana.jsonc similarity index 96% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/kibana.jsonc index 957ca0272c087..8d509e50059a7 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/kibana.jsonc @@ -33,6 +33,8 @@ "features", "inference", "logsDataAccess", + "spaces", + "slo", "llmTasks" ], "optionalPlugins": [ @@ -44,4 +46,4 @@ ], "extraPublicDirs": [] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/application.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/application.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/application.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/application.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/assets/elastic_ai_assistant.png b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/assets/elastic_ai_assistant.png similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/assets/elastic_ai_assistant.png rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/assets/elastic_ai_assistant.png diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/changes/change_list.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/changes/change_list.stories.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/changes/change_list.stories.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/changes/change_list.stories.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/changes/change_list.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/changes/change_list.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/changes/change_list.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/changes/change_list.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/charts/spark_plot.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/charts/spark_plot.tsx similarity index 67% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/charts/spark_plot.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/charts/spark_plot.tsx index ddb57a127fe19..afd7e9f4bceb3 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/charts/spark_plot.tsx +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/charts/spark_plot.tsx @@ -5,26 +5,45 @@ * 2.0. */ import { + AnnotationDomainType, BarSeries, Chart, CurveType, + LineAnnotation, LineSeries, PartialTheme, + Position, ScaleType, Settings, Tooltip, - LineAnnotation, - AnnotationDomainType, - Position, } from '@elastic/charts'; -import React from 'react'; +import { EuiFlexGroup, EuiPanel, EuiText } from '@elastic/eui'; +import { UI_SETTINGS } from '@kbn/data-service'; import { i18n } from '@kbn/i18n'; +import moment from 'moment'; +import React from 'react'; import { useChartTheme } from '../../hooks/use_chart_theme'; +import { useKibana } from '../../hooks/use_kibana'; + +function AnnotationTooltip({ timestamp, label }: { timestamp: number; label: React.ReactNode }) { + const dateFormat = useKibana().services.uiSettings.get(UI_SETTINGS.DATE_FORMAT); + const formattedTime = moment(timestamp).format(dateFormat); + + return ( + <EuiPanel paddingSize="s"> + <EuiFlexGroup direction="row" gutterSize="s" alignItems="center"> + <EuiText size="xs">{formattedTime}</EuiText> + <EuiText size="xs">{label}</EuiText> + </EuiFlexGroup> + </EuiPanel> + ); +} export function SparkPlot({ type, timeseries, annotations, + compressed, }: { type: 'line' | 'bar'; timeseries: Array<{ x: number; y: number | null }>; @@ -33,8 +52,9 @@ export function SparkPlot({ x: number; color: string; icon: React.ReactNode; - label: string; + label: React.ReactNode; }>; + compressed?: boolean; }) { const defaultChartTheme = useChartTheme(); @@ -56,7 +76,7 @@ export function SparkPlot({ <Chart size={{ width: 128, - height: 64, + height: compressed ? 64 : 48, }} > <Settings @@ -89,8 +109,9 @@ export function SparkPlot({ {annotations?.map((annotation) => { return ( <LineAnnotation + key={annotation.id} id={annotation.id} - dataValues={[{ dataValue: annotation.x, header: annotation.label }]} + dataValues={[{ dataValue: annotation.x, header: '' }]} domainType={AnnotationDomainType.XDomain} marker={annotation.icon} markerPosition={Position.Bottom} @@ -100,6 +121,14 @@ export function SparkPlot({ stroke: annotation.color, }, }} + customTooltip={({ datum }) => { + return ( + <AnnotationTooltip + timestamp={(datum as { dataValue: number }).dataValue} + label={annotation.label} + /> + ); + }} /> ); })} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/nav_control/index.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/nav_control/index.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/lazy_nav_control.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/nav_control/lazy_nav_control.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/lazy_nav_control.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/nav_control/lazy_nav_control.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/page_template.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/page_template.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/page_template.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/page_template.tsx diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/entity_badge/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/entity_badge/index.tsx new file mode 100644 index 0000000000000..edfc956a448d1 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/entity_badge/index.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 { EuiBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import React from 'react'; + +export function EntityBadge({ + entity, + color, +}: { + entity: Record<string, string>; + color?: React.ComponentProps<typeof EuiBadge>['color']; +}) { + return ( + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + {Object.entries(entity).map(([field, value]) => ( + <EuiFlexItem grow> + <EuiBadge key={field} color={color ?? 'ghost'}>{`${field}:${value}`}</EuiBadge> + </EuiFlexItem> + ))} + </EuiFlexGroup> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/mock/complete_root_cause_analysis.json b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/mock/complete_root_cause_analysis.json new file mode 100644 index 0000000000000..ec2ce7810bc97 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/mock/complete_root_cause_analysis.json @@ -0,0 +1,19532 @@ +[ + { + "role": "assistant", + "content": "", + "toolCalls": [ + { + "toolCallId": "call_IURenJnAu7MGepsXonmWtEbx", + "function": { + "name": "observe", + "arguments": { + "observe": true + } + } + } + ] + }, + { + "name": "observe", + "response": { + "content": "## Observations\n\nThe alert indicates that the `controller` service is experiencing a high number of 500 errors for the `/api/cart` endpoint. The error rate is 98.78%, significantly above the threshold of 1% over a 1-minute period. This is a pronounced and rapid onset of errors that suggests a severe and immediate issue with the `controller` service or its dependencies starting at `2024-11-02T10:56:42.498Z`.\n\n## Symptoms\n\n- **Onset**: Rapid\n- **Severity**: Pronounced\n- **Time of Change**: `2024-11-02T10:56:42.498Z`\n\nGiven the sudden and high volume of errors, the symptoms suggest a significant event such as a deployment, configuration change, or a failure in a critical dependency.\n\n## Next Steps\n\nThe next step is to further investigate the logs for the `controller` service to identify any changes or error patterns around the specified time.\n\n**Entity to Investigate**:\n- `service.name`: `controller`" + }, + "data": { + "content": "## Observations\n\nThe alert indicates that the `controller` service is experiencing a high number of 500 errors for the `/api/cart` endpoint. The error rate is 98.78%, significantly above the threshold of 1% over a 1-minute period. This is a pronounced and rapid onset of errors that suggests a severe and immediate issue with the `controller` service or its dependencies starting at `2024-11-02T10:56:42.498Z`.\n\n## Symptoms\n\n- **Onset**: Rapid\n- **Severity**: Pronounced\n- **Time of Change**: `2024-11-02T10:56:42.498Z`\n\nGiven the sudden and high volume of errors, the symptoms suggest a significant event such as a deployment, configuration change, or a failure in a critical dependency.\n\n## Next Steps\n\nThe next step is to further investigate the logs for the `controller` service to identify any changes or error patterns around the specified time.\n\n**Entity to Investigate**:\n- `service.name`: `controller`", + "investigations": [] + }, + "role": "tool", + "toolCallId": "call_IURenJnAu7MGepsXonmWtEbx" + }, + { + "role": "assistant", + "content": "", + "toolCalls": [ + { + "toolCallId": "call_6Vcfeg2e2IUC0gSX0bwejZl1", + "function": { + "name": "investigateEntity", + "arguments": { + "context": "Investigating the alert for the controller service, which indicates a high number of 500 errors for the /api/cart endpoint. Error rate is 98.78%, above the threshold of 1% over a 1-minute duration. Start time of the issue is 2024-11-02T10:56:42.498Z. Will review controller service logs for changes or error patterns around this time.", + "entity": { + "field": "service.name", + "value": "controller" + } + } + } + } + ] + }, + { + "name": "investigateEntity", + "role": "tool", + "toolCallId": "call_6Vcfeg2e2IUC0gSX0bwejZl1", + "response": { + "entity": { + "service.name": "controller" + }, + "relatedEntities": [ + { + "entity": { + "service.name": "frontend" + }, + "reason": "The frontend service interacts closely with the controller (ingress-nginx-controller). Requests directed to /api/cart initiate from frontendproxy which routes to frontend. Given the high error rate at the /api/cart endpoint, the issue might involve downstream calls from frontend to dependent services.", + "confidence": "high" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "The /api/cart endpoint directly involves manipulating or retrieving data from cartservice. Given the 500 errors on requests routed via the controller, it's likely that cartservice might be either causing or being affected by these failures.", + "confidence": "high" + }, + { + "entity": { + "service.name": "frontend-web" + }, + "reason": "URL referrer and path fragments suggest client-side interactions impacting the controller's ingress. Issues in the client's request construction or timing might be indirectly impacting how the controller handles these requests.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "checkoutservice" + }, + "reason": "Though the controller deals directly with cart interactions, completion of cart actions could trigger subsequent processes in checkoutservice. Errors during cart operations could thereby propagate issues if mismanaged upstream.", + "confidence": "low" + }, + { + "entity": { + "service.name": "coredns" + }, + "reason": "DNS resolution issues could lead to inability to locate the correct backend service IP for controller, causing errors in routing HTTP requests.", + "confidence": "low" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The `frontend` service is called by the `frontendproxy`, which is indicated as the `attributes.upstream.name` in `controller` logs. In the context provided, the `frontend` communicates with other backend services to process user interactions and might be an upstream dependency for the `controller`. The problem might cascade from `frontendproxy` to `frontend`.", + "confidence": "high" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "The `cartservice` handles shopping cart actions which map the `controller`'s `/api/cart` endpoint. If the `cartservice` has issues, they would cascade to the `controller` /api/cart endpoint that depends on this service for cart management functions.", + "confidence": "high" + }, + { + "entity": { + "service.name": "currencyservice" + }, + "reason": "Handling currency conversions, indirectly connected to cart operations. The issues might arise if currency conversion fails during cart operations, contributing to the 500 errors in the `controller`.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "frauddetectionservice" + }, + "reason": "No specific logs point directly; contextual relevance due to transaction handling. If fraud detection triggers false flags, it can affect cart transactions.", + "confidence": "low" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "The `cartservice` directly manages shopping cart operations over the gRPC protocol, and errors here could lead to repeated 500 errors in the `controller`.", + "confidence": "high" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The `frontend` service handles user interactions that are passed to the `controller`. Issues in `frontend` could lead to failures in `controller`, resulting in 500 errors.", + "confidence": "medium to high" + }, + { + "entity": { + "service.name": "loadgenerator" + }, + "reason": "The `loadgenerator` simulates high user traffic which might strain other services and indirectly cause 500 errors in the `controller`.", + "confidence": "medium" + }, + { + "entity": { + "service.name": "etcd" + }, + "reason": "As a control plane activity tracker for Ingress, indirect impacts from `etcd` inconsistencies can propagate as issues in services interacting via Ingress, including `controller`.", + "confidence": "medium" + } + ], + "summary": "### Characteristics of the `controller` Entity\n\n**1. Infrastructure & Environment:**\n\nThe `controller` service is deployed within a Kubernetes environment, specifically in the `ingress-nginx` namespace. The service is associated with a `controller` container running within the `ingress-nginx-controller-bc57996ff-r6blf` pod. This pod is scheduled on a node identified as `minikube`, and the service is part of the `ingress-nginx-controller` deployment. Additionally, the infrastructure is based on an ARM64 architecture, running Ubuntu 24.04.1 LTS, with deployment environment set to `opentelemetry-demo`.\n\n**2. Communication Characteristics:**\n\nThe `controller` service functions as an Ingress controller, managing incoming traffic and routing it to backend services. It processes HTTP requests, typically version 1.1, and communicates with other services via HTTP protocols. Key endpoints involved in the communication include:\n- Inbound requests are received at endpoints like `/api/cart` and `/api/checkout`.\n- Outbound requests are routed primarily to the `frontendproxy` service, evidenced by the upstream address `10.244.0.26:8080`.\n\nThe service handles both `GET` and `POST` requests, and its communication paths include requests from user agents like \"HeadlessChrome\" and \"python-requests\".\n\n**3. Context of Entity in Investigation:**\n\n**Reason for Investigation:**\nThe `controller` service is currently under investigation due to an alert triggered by a high number of 500 errors (98.78% error rate) occurring at the `/api/cart` endpoint. The significant spike in error rates is concerning and suggests a potential issue within the service or its interaction with dependencies.\n\n**Relation to Other Entities:**\nThe high error rates on the `controller` are likely impacting the overall user experience of the application, notably through the `/api/cart` functionality, which interacts with the `cartservice`. As the `controller` service forwards requests to the `frontendproxy`, which in turn interacts with various backend services like `cartservice`, `checkoutservice`, `currencyservice`, and others, the ripple effect of these errors might be felt across multiple services in the architecture. This interconnectedness necessitates thorough investigation of `controller's` logs and error patterns to isolate the root cause and mitigate the disruption in the flow of HTTP requests.\n\nBy understanding the behavior and interaction of the `controller` service within the broader microservices architecture, we aim to identify and resolve the underlying issue causing the increase in 500 errors. This involves examining logs for patterns, determining if recent changes or specific conditions triggered the fault, and analyzing dependencies that could contribute to the error rates observed. This step is integral to restoring normal operation and maintaining service reliability and user satisfaction.\n\n### Analysis of Log Patterns for service.name:controller\n\n#### Pattern Group: Request Errors\n- **Pattern:**\n ```\n .*?10\\\\.244\\\\.0\\\\.38.+?02.+?2024.+?10.+?0000.+?api.+?HTTP.+?1\\\\.1.+?python.+?requests.+?2\\\\.31\\\\.0.+?default.+?my.+?otel.+?demo.+?frontendproxy.+?8080.+?10\\\\.244\\\\.0\\\\.26.+?8080.*?\n ```\n - **Sample:**\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n - **Description:** This pattern represents request logs where an HTTP POST request to the `/api/cart` endpoint resulted in a `500 Internal Server Error`. The requests are from a client using `python-requests/2.31.0`.\n\n- **Count:** 263 occurrences\n\n- **Timeseries Analysis:**\n - **Trend:** The number of occurrences show fluctuation with no significant change in the pattern.\n - **Log Counts:** \n - Example timestamps and counts:\n - `2024-11-02T10:56:00.000Z: 6`\n - `2024-11-02T10:56:30.000Z: 2`\n - `2024-11-02T10:57:00.000Z: 0`\n\n### Summary\nBased on the provided logs patterns, the `controller` service is experiencing a high number of `500 Internal Server Errors` when handling POST requests to the `/api/cart` endpoint. This is evident from the consistent error logs observed at different timestamps. The alert threshold breach likely correlates with these error occurrences.\n\nNo other unusual patterns such as connection issues, startup messages, or garbage collection messages were identified in the logs around the error events. Further investigation on the backend or potential dependency issues (e.g., `cartservice`) might be needed to determine the exact cause of these errors.\n\n### Timeline of significant events\n\n- **2024-11-02T10:56:42.498Z**\n - **Alert Triggered**: High number of 500 errors for the /api/cart endpoint. Error rate is 98.78%, above the threshold of 1% over a 1-minute duration.\n \n- **2024-11-02T10:56:00.000Z**\n - **Log Entry**: 6 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - **Example Log**:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n \n- **2024-11-02T10:56:30.000Z**\n - **Log Entry**: 2 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - **Example Log**:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:35 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n\n### Context and reasoning\n\nThe `controller` service plays a critical role in handling incoming HTTP requests within the Kubernetes environment, specifically acting as an Ingress controller within the `ingress-nginx` namespace. The recent alert, triggered by a high number of 500 errors, indicates a significant disruption in the normal operations of the `controller` service, particularly impacting the `/api/cart` endpoint. The log entries leading up to and following the alert highlight a pattern of consistent `500 Internal Server Error` responses, specifically around the timestamp in question.\n\nThe pattern group identified, related to request errors, shows repeated failures for HTTP POST requests from a client using `python-requests/2.31.0`, likely directed towards the `cartservice` via the `frontendproxy`. This high error rate suggests an underlying issue either within the `controller` service itself, its communication path to the `frontendproxy`, or potentially further downstream with the backend services like `cartservice`.\n\nNo other unusual log patterns, such as connection issues or any system degradation messages were noted, indicating the problem is likely concentrated around the interaction between `controller` and its immediate dependencies rather than a broader system-wide issue. By correlating the timestamps and repeated error logs, a clear link can be drawn between the `500 Internal Server Error` responses and the timeline, further supporting the hypothesis of a specific fault affecting the `/api/cart` endpoint.\n\nFurther investigation into the dependencies of the `controller` service, especially focusing on the interactions with the `frontendproxy` and subsequently `cartservice`, is warranted to isolate and rectify the root cause of these error patterns." + }, + "data": { + "attachments": { + "alerts": [ + { + "kibana.alert.reason": "500 Errors is 98.78049, above the threshold of 1. (duration: 1 min, data view: otel_logs_data (Automated by Demo CLI), group: controller,/api/cart)", + "kibana.alert.evaluation.values": [ + 98.78048780487805 + ], + "kibana.alert.evaluation.threshold": [ + 1 + ], + "kibana.alert.group": [ + { + "field": "service.name", + "value": "controller" + }, + { + "field": "url.path", + "value": "/api/cart" + } + ], + "tags": [ + "demo", + "cli-created" + ], + "service.name": "controller", + "kibana.alert.rule.category": "Custom threshold", + "kibana.alert.rule.consumer": "logs", + "kibana.alert.rule.execution.uuid": "4187827d-686e-4098-98e3-21e13495798e", + "kibana.alert.rule.name": "NGINX 500s", + "kibana.alert.rule.parameters": { + "criteria": [ + { + "comparator": ">", + "metrics": [ + { + "name": "A", + "filter": "http.response.status_code:*", + "aggType": "count" + }, + { + "name": "B", + "filter": "http.response.status_code>=500", + "aggType": "count" + } + ], + "threshold": [ + 1 + ], + "timeSize": 1, + "timeUnit": "m", + "equation": "(B/A) * 100", + "label": "500 Errors" + } + ], + "alertOnNoData": false, + "alertOnGroupDisappear": false, + "searchConfiguration": { + "query": { + "query": "k8s.namespace.name: \"ingress-nginx\" AND url.path: /api/*", + "language": "kuery" + }, + "index": "otel_logs_data" + }, + "groupBy": [ + "service.name", + "url.path" + ] + }, + "kibana.alert.rule.producer": "observability", + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.rule_type_id": "observability.rules.custom_threshold", + "kibana.alert.rule.tags": [ + "demo", + "cli-created" + ], + "kibana.alert.rule.uuid": "9055220c-8fb1-4f9f-be7c-0a33eb2bafc5", + "kibana.space_ids": [ + "default" + ], + "@timestamp": "2024-11-02T10:56:42.498Z", + "event.action": "open", + "event.kind": "signal", + "kibana.alert.rule.execution.timestamp": "2024-11-02T10:56:42.498Z", + "kibana.alert.action_group": "custom_threshold.fired", + "kibana.alert.flapping": false, + "kibana.alert.flapping_history": [ + true + ], + "kibana.alert.instance.id": "controller,/api/cart", + "kibana.alert.maintenance_window_ids": [], + "kibana.alert.consecutive_matches": 1, + "kibana.alert.status": "active", + "kibana.alert.uuid": "b97a1b20-d14b-4835-b948-bd7a423284eb", + "kibana.alert.severity_improving": false, + "kibana.alert.workflow_status": "open", + "kibana.alert.duration.us": 0, + "kibana.alert.start": "2024-11-02T10:56:42.498Z", + "kibana.alert.time_range": { + "gte": "2024-11-02T10:56:42.498Z" + }, + "kibana.version": "9.0.0" + }, + { + "kibana.alert.reason": "500 Errors is 100, above the threshold of 1. (duration: 1 min, data view: otel_logs_data (Automated by Demo CLI), group: controller,/api/checkout)", + "kibana.alert.evaluation.values": [ + 100 + ], + "kibana.alert.evaluation.threshold": [ + 1 + ], + "kibana.alert.group": [ + { + "field": "service.name", + "value": "controller" + }, + { + "field": "url.path", + "value": "/api/checkout" + } + ], + "tags": [ + "demo", + "cli-created" + ], + "service.name": "controller", + "kibana.alert.rule.category": "Custom threshold", + "kibana.alert.rule.consumer": "logs", + "kibana.alert.rule.execution.uuid": "4187827d-686e-4098-98e3-21e13495798e", + "kibana.alert.rule.name": "NGINX 500s", + "kibana.alert.rule.parameters": { + "criteria": [ + { + "comparator": ">", + "metrics": [ + { + "name": "A", + "filter": "http.response.status_code:*", + "aggType": "count" + }, + { + "name": "B", + "filter": "http.response.status_code>=500", + "aggType": "count" + } + ], + "threshold": [ + 1 + ], + "timeSize": 1, + "timeUnit": "m", + "equation": "(B/A) * 100", + "label": "500 Errors" + } + ], + "alertOnNoData": false, + "alertOnGroupDisappear": false, + "searchConfiguration": { + "query": { + "query": "k8s.namespace.name: \"ingress-nginx\" AND url.path: /api/*", + "language": "kuery" + }, + "index": "otel_logs_data" + }, + "groupBy": [ + "service.name", + "url.path" + ] + }, + "kibana.alert.rule.producer": "observability", + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.rule_type_id": "observability.rules.custom_threshold", + "kibana.alert.rule.tags": [ + "demo", + "cli-created" + ], + "kibana.alert.rule.uuid": "9055220c-8fb1-4f9f-be7c-0a33eb2bafc5", + "kibana.space_ids": [ + "default" + ], + "@timestamp": "2024-11-02T10:56:42.498Z", + "event.action": "open", + "event.kind": "signal", + "kibana.alert.rule.execution.timestamp": "2024-11-02T10:56:42.498Z", + "kibana.alert.action_group": "custom_threshold.fired", + "kibana.alert.flapping": false, + "kibana.alert.flapping_history": [ + true + ], + "kibana.alert.instance.id": "controller,/api/checkout", + "kibana.alert.maintenance_window_ids": [], + "kibana.alert.consecutive_matches": 1, + "kibana.alert.status": "active", + "kibana.alert.uuid": "78472a9c-63a2-41ba-9812-47cebd48d833", + "kibana.alert.severity_improving": false, + "kibana.alert.workflow_status": "open", + "kibana.alert.duration.us": 0, + "kibana.alert.start": "2024-11-02T10:56:42.498Z", + "kibana.alert.time_range": { + "gte": "2024-11-02T10:56:42.498Z" + }, + "kibana.version": "9.0.0" + } + ], + "slos": [], + "analysis": { + "total": 56181, + "sampled": 1000, + "fields": [ + "@timestamp:date - 994 distinct values", + "app.label.component:keyword - 1 distinct values (`controller`)", + "attributes.event.name.text:text - 1 distinct values (`nginx.ingress.controller.error`)", + "attributes.event.name:keyword - 1 distinct values (`nginx.ingress.controller.error`)", + "attributes.http.request.id:keyword - 1000 distinct values (`87c973a800b3bd34d3679f0a12263c40`, `ee99fada68450d77be61deaae1f04008`, `80312e7e98e9171c8010e442784e7a04`, `a931c4f7d964f91f0a0750f3221dfa50`, `8c2e99672e225b279a7741671c976c93`, `eed4ff70db044f81adeda15bc1f3ad4c`, `dd730f83b894fc2adedfaf950cf5884c`, `4e35653560a824d6693d1e024906e9ce`, `36d6dfae2fe5d6fecbfaadd4fac5bde1`, `43c774bea806c21478f7ee57a449222b`, 990 more values)", + "attributes.http.request.method:keyword - 2 distinct values (`POST`, `GET`)", + "attributes.http.request.referrer:keyword - 2 distinct values (`http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/`, `http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart`)", + "attributes.http.request.size:long - 61 distinct values (`351`, `374`, `373`, `809`, `383`, `506`, `342`, `350`, `538`, `479`, 51 more values)", + "attributes.http.request.time:float - 90 distinct values (`3.172`, `1.103`, `0.053`, `4.434`, `0.019`, `3.328`, `1.01`, `3.197`, `3.133`, `2.566`, 80 more values)", + "attributes.http.response.body.size:long - 130 distinct values (`1144`, `1120`, `1024`, `19`, `1336`, `1198`, `1070`, `111157`, `111163`, `1271`, 120 more values)", + "attributes.http.response.status_code:long - 4 distinct values (`499`, `500`, `308`, `200`)", + "attributes.http.version:keyword - 1 distinct values (`1.1`)", + "attributes.log.file.path.text:text - 1 distinct values (`/var/log/pods/ingress-nginx_ingress-nginx-controller-bc57996ff-r6blf_35200065-5cde-4a7e-9018-0f0a4e2c5bb4/controller/0.log`)", + "attributes.log.file.path:keyword - 1 distinct values (`/var/log/pods/ingress-nginx_ingress-nginx-controller-bc57996ff-r6blf_35200065-5cde-4a7e-9018-0f0a4e2c5bb4/controller/0.log`)", + "attributes.log.iostream:keyword - 1 distinct values (`stdout`)", + "attributes.network.protocol.name.text:text - 1 distinct values (`http`)", + "attributes.network.protocol.name:keyword - 1 distinct values (`http`)", + "attributes.source.address:keyword - 1 distinct values (`10.244.0.38`)", + "attributes.upstream.address:keyword - 1 distinct values (`10.244.0.26:8080`)", + "attributes.upstream.name.text:text - 1 distinct values (`default-my-otel-demo-frontendproxy-8080`)", + "attributes.upstream.name:keyword - 1 distinct values (`default-my-otel-demo-frontendproxy-8080`)", + "attributes.upstream.response.size:keyword - 117 distinct values (`1149`, `1120`, `1029`, `19`, `1336`, `1203`, `1070`, `1276`, `1356`, `1105`, 107 more values)", + "attributes.upstream.response.status_code:keyword - 3 distinct values (`500`, `308`, `200`)", + "attributes.upstream.response.time:keyword - 89 distinct values (`3.171`, `1.007`, `1.103`, `0.053`, `4.434`, `3.328`, `1.010`, `3.197`, `3.132`, `2.565`, 79 more values)", + "attributes.url.domain:keyword - 2 distinct values (`icons`, ``)", + "attributes.url.extension:keyword - 7 distinct values (`css`, `Service/ResolveAll`, `Service/EventStream`, `png`, `svg`, `jpg`, `js`)", + "attributes.url.original.text:text - 167 distinct values (`/api/recommendations?productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, 165 more values)", + "attributes.url.original:keyword - 167 distinct values (`/api/recommendations?productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `/api/recommendations?productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `/api/cart?sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `/api/recommendations?productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `/api/data/`, `/api/cart?sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `/api/recommendations?productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `/api/recommendations?productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `/api/cart?sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, 157 more values)", + "attributes.url.path:keyword - 43 distinct values (`/api/products/0PUK6V6EV0`, `/api/products/9SIQT8TOJO`, `/api/products/LS4PSXUNUM`, `/api/data/`, `/api/products/L9ECAV7KIM`, `/api/data`, `/api/products/66VCHSJNUP`, `/api/products/2ZYFJ3GM2N`, `/cart`, `/images/products/NationalParkFoundationExplorascope.jpg`, 33 more values)", + "attributes.url.query:keyword - 126 distinct values (`productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, `productIds=&sessionId=0c122e28-e8fb-4ab5-9889-ac797b5f17cf¤cyCode=USD`, 116 more values)", + "attributes.url.scheme:keyword - 1 distinct values (``)", + "attributes.user_agent.name.text:text - 2 distinct values (`Python Requests`, `HeadlessChrome`)", + "attributes.user_agent.name:keyword - 2 distinct values (`Python Requests`, `HeadlessChrome`)", + "attributes.user_agent.original.text:text - 2 distinct values (`python-requests/2.31.0`, `Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36`)", + "attributes.user_agent.original:keyword - 2 distinct values (`python-requests/2.31.0`, `Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36`)", + "attributes.user_agent.version:keyword - 2 distinct values (`2.31`, `120.0.6099`)", + "body.text:text - 1000 distinct values (`10.244.0.38 - - [02/Nov/2024:10:37:56 +0000] \"GET /api/currency? HTTP/1.1\" 200 199 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 598 0.007 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 199 0.007 200 87c973a800b3bd34d3679f0a12263c40\n`, `10.244.0.38 - - [02/Nov/2024:10:46:11 +0000] \"GET /_next/static/chunks/pages/_app-c923ae378a182a07.js HTTP/1.1\" 200 111150 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 484 0.017 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 111008 0.018 200 ee99fada68450d77be61deaae1f04008\n`, 998 more values)", + "data_stream.dataset:keyword - 1 distinct values (`nginx_ingress_controller.error.otel`)", + "data_stream.namespace:keyword - 1 distinct values (`default`)", + "data_stream.type:keyword - 1 distinct values (`logs`)", + "deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "dropped_attributes_count:long - 1 distinct values (`0`)", + "event.dataset:keyword - 1 distinct values (`nginx_ingress_controller.error.otel`)", + "event.name:keyword - 1 distinct values (`nginx.ingress.controller.error`)", + "host.arch:keyword - 1 distinct values (`arm64`)", + "host.architecture:keyword - 1 distinct values (`arm64`)", + "host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "host.cpu.family:keyword - 1 distinct values (``)", + "host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "host.cpu.model.name:keyword - 1 distinct values (``)", + "host.cpu.stepping:keyword - 1 distinct values (`0`)", + "host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "host.os.full:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "host.os.platform:keyword - 1 distinct values (`linux`)", + "http.request.id:keyword - 1000 distinct values (`87c973a800b3bd34d3679f0a12263c40`, `ee99fada68450d77be61deaae1f04008`, `80312e7e98e9171c8010e442784e7a04`, `a931c4f7d964f91f0a0750f3221dfa50`, `8c2e99672e225b279a7741671c976c93`, `eed4ff70db044f81adeda15bc1f3ad4c`, `dd730f83b894fc2adedfaf950cf5884c`, `4e35653560a824d6693d1e024906e9ce`, `36d6dfae2fe5d6fecbfaadd4fac5bde1`, `43c774bea806c21478f7ee57a449222b`, 990 more values)", + "http.request.method:keyword - 2 distinct values (`POST`, `GET`)", + "http.request.referrer:keyword - 2 distinct values (`http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/`, `http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart`)", + "http.request.size:long - 61 distinct values (`351`, `374`, `373`, `809`, `383`, `506`, `342`, `350`, `538`, `479`, 51 more values)", + "http.request.time:float - 90 distinct values (`3.172`, `1.103`, `0.053`, `4.434`, `0.019`, `3.328`, `1.01`, `3.197`, `3.133`, `2.566`, 80 more values)", + "http.response.body.size:long - 130 distinct values (`1144`, `1120`, `1024`, `19`, `1336`, `1198`, `1070`, `111157`, `111163`, `1271`, 120 more values)", + "http.response.status_code:long - 4 distinct values (`499`, `500`, `308`, `200`)", + "http.version:keyword - 1 distinct values (`1.1`)", + "k8s.container.name:keyword - 1 distinct values (`controller`)", + "k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "k8s.deployment.name:keyword - 1 distinct values (`ingress-nginx-controller`)", + "k8s.namespace.name:keyword - 1 distinct values (`ingress-nginx`)", + "k8s.node.name:keyword - 1 distinct values (`minikube`)", + "k8s.pod.name:keyword - 1 distinct values (`ingress-nginx-controller-bc57996ff-r6blf`)", + "k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T08:56:56Z`)", + "k8s.pod.uid:keyword - 1 distinct values (`35200065-5cde-4a7e-9018-0f0a4e2c5bb4`)", + "kubernetes.deployment.name:keyword - 1 distinct values (`ingress-nginx-controller`)", + "kubernetes.namespace:keyword - 1 distinct values (`ingress-nginx`)", + "kubernetes.node.name:keyword - 1 distinct values (`minikube`)", + "kubernetes.pod.name:keyword - 1 distinct values (`ingress-nginx-controller-bc57996ff-r6blf`)", + "kubernetes.pod.uid:keyword - 1 distinct values (`35200065-5cde-4a7e-9018-0f0a4e2c5bb4`)", + "log.file.path:keyword - 1 distinct values (`/var/log/pods/ingress-nginx_ingress-nginx-controller-bc57996ff-r6blf_35200065-5cde-4a7e-9018-0f0a4e2c5bb4/controller/0.log`)", + "log.iostream:keyword - 1 distinct values (`stdout`)", + "message:text - 1000 distinct values (`10.244.0.38 - - [02/Nov/2024:10:37:56 +0000] \"GET /api/currency? HTTP/1.1\" 200 199 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 598 0.007 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 199 0.007 200 87c973a800b3bd34d3679f0a12263c40\n`, `10.244.0.38 - - [02/Nov/2024:10:46:11 +0000] \"GET /_next/static/chunks/pages/_app-c923ae378a182a07.js HTTP/1.1\" 200 111150 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 484 0.017 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 111008 0.018 200 ee99fada68450d77be61deaae1f04008\n`, 998 more values)", + "network.protocol.name:keyword - 1 distinct values (`http`)", + "observed_timestamp:date_nanos - 1000 distinct values (`2024-11-02T10:37:56.158731715Z`, `2024-11-02T10:46:11.961228541Z`, `2024-11-02T10:38:02.758802635Z`, `2024-11-02T10:54:51.563521629Z`, `2024-11-02T10:37:05.149442469Z`, `2024-11-02T10:49:01.961126259Z`, `2024-11-02T10:56:19.96308167Z`, `2024-11-02T10:42:06.760264887Z`, `2024-11-02T10:49:45.76210446Z`, `2024-11-02T10:54:02.562840801Z`, 990 more values)", + "os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.app.label.component:keyword - 1 distinct values (`controller`)", + "resource.attributes.deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "resource.attributes.host.arch:keyword - 1 distinct values (`arm64`)", + "resource.attributes.host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "resource.attributes.host.cpu.family:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "resource.attributes.host.cpu.model.name.text:text - 1 distinct values (``)", + "resource.attributes.host.cpu.model.name:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.stepping:keyword - 1 distinct values (`0`)", + "resource.attributes.host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "resource.attributes.host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "resource.attributes.host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "resource.attributes.host.name:keyword - 1 distinct values (`otel-daemonset-opentelemetry-collector-agent-7jlpk`)", + "resource.attributes.k8s.container.name.text:text - 1 distinct values (`controller`)", + "resource.attributes.k8s.container.name:keyword - 1 distinct values (`controller`)", + "resource.attributes.k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "resource.attributes.k8s.deployment.name:keyword - 1 distinct values (`ingress-nginx-controller`)", + "resource.attributes.k8s.namespace.name:keyword - 1 distinct values (`ingress-nginx`)", + "resource.attributes.k8s.node.name:keyword - 1 distinct values (`minikube`)", + "resource.attributes.k8s.pod.name:keyword - 1 distinct values (`ingress-nginx-controller-bc57996ff-r6blf`)", + "resource.attributes.k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T08:56:56Z`)", + "resource.attributes.k8s.pod.uid:keyword - 1 distinct values (`35200065-5cde-4a7e-9018-0f0a4e2c5bb4`)", + "resource.attributes.os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "resource.attributes.os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.service.name.text:text - 1 distinct values (`controller`)", + "resource.attributes.service.name:keyword - 1 distinct values (`controller`)", + "resource.dropped_attributes_count:long - 1 distinct values (`0`)", + "resource.schema_url:keyword - 1 distinct values (`https://opentelemetry.io/schemas/1.6.1`)", + "scope.dropped_attributes_count:long - 1 distinct values (`0`)", + "service.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "service.name:keyword - 1 distinct values (`controller`)", + "severity_number:byte - 1 distinct values (`0`)", + "source.address:keyword - 1 distinct values (`10.244.0.38`)", + "upstream.address:keyword - 1 distinct values (`10.244.0.26:8080`)", + "upstream.name:keyword - 1 distinct values (`default-my-otel-demo-frontendproxy-8080`)", + "upstream.response.size:keyword - 117 distinct values (`1149`, `1120`, `1029`, `19`, `1336`, `1203`, `1070`, `1276`, `1356`, `1105`, 107 more values)", + "upstream.response.status_code:keyword - 3 distinct values (`500`, `308`, `200`)", + "upstream.response.time:keyword - 89 distinct values (`3.171`, `1.007`, `1.103`, `0.053`, `4.434`, `3.328`, `1.010`, `3.197`, `3.132`, `2.565`, 79 more values)", + "url.domain:keyword - 2 distinct values (`icons`, ``)", + "url.extension:keyword - 7 distinct values (`css`, `Service/ResolveAll`, `Service/EventStream`, `png`, `svg`, `jpg`, `js`)", + "url.original:keyword - 167 distinct values (`/api/recommendations?productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `/api/recommendations?productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `/api/cart?sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `/api/recommendations?productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `/api/data/`, `/api/cart?sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `/api/recommendations?productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `/api/recommendations?productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `/api/cart?sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, 157 more values)", + "url.path:keyword - 43 distinct values (`/api/products/0PUK6V6EV0`, `/api/products/9SIQT8TOJO`, `/api/products/LS4PSXUNUM`, `/api/data/`, `/api/products/L9ECAV7KIM`, `/api/data`, `/api/products/66VCHSJNUP`, `/api/products/2ZYFJ3GM2N`, `/cart`, `/images/products/NationalParkFoundationExplorascope.jpg`, 33 more values)", + "url.query:keyword - 126 distinct values (`productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, `productIds=&sessionId=0c122e28-e8fb-4ab5-9889-ac797b5f17cf¤cyCode=USD`, 116 more values)", + "url.scheme:keyword - 1 distinct values (``)", + "user_agent.name:keyword - 2 distinct values (`Python Requests`, `HeadlessChrome`)", + "user_agent.original:keyword - 2 distinct values (`python-requests/2.31.0`, `Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36`)", + "user_agent.version:keyword - 2 distinct values (`2.31`, `120.0.6099`)" + ] + }, + "ownPatterns": [ + { + "field": "message", + "count": 54850, + "pattern": "HTTP/1.1 Mozilla/5.0 X11 Linux aarch64 AppleWebKit/537.36 KHTML like Gecko HeadlessChrome/120.0.6099.28 Safari/537.36 default-my-otel-demo-frontendproxy-8080", + "regex": ".*?HTTP/1\\.1.+?Mozilla/5\\.0.+?X11.+?Linux.+?aarch64.+?AppleWebKit/537\\.36.+?KHTML.+?like.+?Gecko.+?HeadlessChrome/120\\.0\\.6099\\.28.+?Safari/537\\.36.+?default-my-otel-demo-frontendproxy-8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:54:54 +0000] \"GET /icons/Chevron.svg HTTP/1.1\" 200 805 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 508 0.001 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 810 0.001 200 8693bfefd0668ca27fff0e929785a2c5\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:54:54 +0000] \"GET /icons/Chevron.svg HTTP/1.1\" 200 805 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 508 0.001 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 810 0.001 200 8693bfefd0668ca27fff0e929785a2c5\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.057Z", + "lastOccurrence": "2024-11-02T10:56:59.420Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 1385 + }, + { + "x": 1730543820000, + "y": 1172 + }, + { + "x": 1730543850000, + "y": 1520 + }, + { + "x": 1730543880000, + "y": 1312 + }, + { + "x": 1730543910000, + "y": 986 + }, + { + "x": 1730543940000, + "y": 1030 + }, + { + "x": 1730543970000, + "y": 1248 + }, + { + "x": 1730544000000, + "y": 1395 + }, + { + "x": 1730544030000, + "y": 1371 + }, + { + "x": 1730544060000, + "y": 1289 + }, + { + "x": 1730544090000, + "y": 1467 + }, + { + "x": 1730544120000, + "y": 1223 + }, + { + "x": 1730544150000, + "y": 1429 + }, + { + "x": 1730544180000, + "y": 1329 + }, + { + "x": 1730544210000, + "y": 1224 + }, + { + "x": 1730544240000, + "y": 1424 + }, + { + "x": 1730544270000, + "y": 1409 + }, + { + "x": 1730544300000, + "y": 1405 + }, + { + "x": 1730544330000, + "y": 1322 + }, + { + "x": 1730544360000, + "y": 1326 + }, + { + "x": 1730544390000, + "y": 1416 + }, + { + "x": 1730544420000, + "y": 1391 + }, + { + "x": 1730544450000, + "y": 1320 + }, + { + "x": 1730544480000, + "y": 1384 + }, + { + "x": 1730544510000, + "y": 1457 + }, + { + "x": 1730544540000, + "y": 1415 + }, + { + "x": 1730544570000, + "y": 1386 + }, + { + "x": 1730544600000, + "y": 1337 + }, + { + "x": 1730544630000, + "y": 1315 + }, + { + "x": 1730544660000, + "y": 1259 + }, + { + "x": 1730544690000, + "y": 1403 + }, + { + "x": 1730544720000, + "y": 1352 + }, + { + "x": 1730544750000, + "y": 1396 + }, + { + "x": 1730544780000, + "y": 1325 + }, + { + "x": 1730544810000, + "y": 1365 + }, + { + "x": 1730544840000, + "y": 1387 + }, + { + "x": 1730544870000, + "y": 1414 + }, + { + "x": 1730544900000, + "y": 1210 + }, + { + "x": 1730544930000, + "y": 1344 + }, + { + "x": 1730544960000, + "y": 1444 + }, + { + "x": 1730544990000, + "y": 1264 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "dip", + "significance": "medium", + "change_point": 4, + "p_value": 0.00005345763188668862, + "timestamp": "2024-11-02T10:38:30.000Z" + }, + "shortId": "hhpu", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1069, + "pattern": "GET HTTP/1.1 python-requests/2.31.0 default-my-otel-demo-frontendproxy-8080", + "regex": ".*?GET.+?HTTP/1\\.1.+?python-requests/2\\.31\\.0.+?default-my-otel-demo-frontendproxy-8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:55:01 +0000] \"GET /api/data HTTP/1.1\" 200 177 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 177 0.003 200 6cf0fcfd1259f68166701125d3c9761c\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:55:01 +0000] \"GET /api/data HTTP/1.1\" 200 177 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 177 0.003 200 6cf0fcfd1259f68166701125d3c9761c\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:32.391Z", + "lastOccurrence": "2024-11-02T10:56:57.316Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 25 + }, + { + "x": 1730543820000, + "y": 27 + }, + { + "x": 1730543850000, + "y": 26 + }, + { + "x": 1730543880000, + "y": 26 + }, + { + "x": 1730543910000, + "y": 26 + }, + { + "x": 1730543940000, + "y": 27 + }, + { + "x": 1730543970000, + "y": 24 + }, + { + "x": 1730544000000, + "y": 25 + }, + { + "x": 1730544030000, + "y": 22 + }, + { + "x": 1730544060000, + "y": 27 + }, + { + "x": 1730544090000, + "y": 20 + }, + { + "x": 1730544120000, + "y": 23 + }, + { + "x": 1730544150000, + "y": 29 + }, + { + "x": 1730544180000, + "y": 25 + }, + { + "x": 1730544210000, + "y": 23 + }, + { + "x": 1730544240000, + "y": 27 + }, + { + "x": 1730544270000, + "y": 26 + }, + { + "x": 1730544300000, + "y": 27 + }, + { + "x": 1730544330000, + "y": 25 + }, + { + "x": 1730544360000, + "y": 31 + }, + { + "x": 1730544390000, + "y": 21 + }, + { + "x": 1730544420000, + "y": 27 + }, + { + "x": 1730544450000, + "y": 25 + }, + { + "x": 1730544480000, + "y": 29 + }, + { + "x": 1730544510000, + "y": 23 + }, + { + "x": 1730544540000, + "y": 27 + }, + { + "x": 1730544570000, + "y": 24 + }, + { + "x": 1730544600000, + "y": 31 + }, + { + "x": 1730544630000, + "y": 22 + }, + { + "x": 1730544660000, + "y": 24 + }, + { + "x": 1730544690000, + "y": 27 + }, + { + "x": 1730544720000, + "y": 27 + }, + { + "x": 1730544750000, + "y": 27 + }, + { + "x": 1730544780000, + "y": 24 + }, + { + "x": 1730544810000, + "y": 25 + }, + { + "x": 1730544840000, + "y": 26 + }, + { + "x": 1730544870000, + "y": 29 + }, + { + "x": 1730544900000, + "y": 33 + }, + { + "x": 1730544930000, + "y": 34 + }, + { + "x": 1730544960000, + "y": 25 + }, + { + "x": 1730544990000, + "y": 28 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "jmoh", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1068, + "pattern": "10.244.0.38 02 2024 10 0000 GET HTTP 1.1 python requests 2.31.0 default my otel demo frontendproxy 8080 10.244.0.26 8080", + "regex": ".*?10\\.244\\.0\\.38.+?02.+?2024.+?10.+?0000.+?GET.+?HTTP.+?1\\.1.+?python.+?requests.+?2\\.31\\.0.+?default.+?my.+?otel.+?demo.+?frontendproxy.+?8080.+?10\\.244\\.0\\.26.+?8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:55:06 +0000] \"GET /api/cart HTTP/1.1\" 200 24 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 24 0.003 200 33934468a35902ed5b6dde14b1aca6a0\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:55:06 +0000] \"GET /api/cart HTTP/1.1\" 200 24 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 24 0.003 200 33934468a35902ed5b6dde14b1aca6a0\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:32.391Z", + "lastOccurrence": "2024-11-02T10:56:57.316Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 25 + }, + { + "x": 1730543820000, + "y": 27 + }, + { + "x": 1730543850000, + "y": 26 + }, + { + "x": 1730543880000, + "y": 26 + }, + { + "x": 1730543910000, + "y": 26 + }, + { + "x": 1730543940000, + "y": 27 + }, + { + "x": 1730543970000, + "y": 24 + }, + { + "x": 1730544000000, + "y": 25 + }, + { + "x": 1730544030000, + "y": 22 + }, + { + "x": 1730544060000, + "y": 27 + }, + { + "x": 1730544090000, + "y": 20 + }, + { + "x": 1730544120000, + "y": 23 + }, + { + "x": 1730544150000, + "y": 29 + }, + { + "x": 1730544180000, + "y": 25 + }, + { + "x": 1730544210000, + "y": 23 + }, + { + "x": 1730544240000, + "y": 27 + }, + { + "x": 1730544270000, + "y": 26 + }, + { + "x": 1730544300000, + "y": 27 + }, + { + "x": 1730544330000, + "y": 25 + }, + { + "x": 1730544360000, + "y": 31 + }, + { + "x": 1730544390000, + "y": 21 + }, + { + "x": 1730544420000, + "y": 27 + }, + { + "x": 1730544450000, + "y": 25 + }, + { + "x": 1730544480000, + "y": 29 + }, + { + "x": 1730544510000, + "y": 23 + }, + { + "x": 1730544540000, + "y": 27 + }, + { + "x": 1730544570000, + "y": 24 + }, + { + "x": 1730544600000, + "y": 31 + }, + { + "x": 1730544630000, + "y": 22 + }, + { + "x": 1730544660000, + "y": 24 + }, + { + "x": 1730544690000, + "y": 27 + }, + { + "x": 1730544720000, + "y": 27 + }, + { + "x": 1730544750000, + "y": 27 + }, + { + "x": 1730544780000, + "y": 24 + }, + { + "x": 1730544810000, + "y": 25 + }, + { + "x": 1730544840000, + "y": 26 + }, + { + "x": 1730544870000, + "y": 29 + }, + { + "x": 1730544900000, + "y": 32 + }, + { + "x": 1730544930000, + "y": 34 + }, + { + "x": 1730544960000, + "y": 25 + }, + { + "x": 1730544990000, + "y": 28 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "vzwi", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 262, + "pattern": "POST HTTP/1.1 python-requests/2.31.0 default-my-otel-demo-frontendproxy-8080", + "regex": ".*?POST.+?HTTP/1\\.1.+?python-requests/2\\.31\\.0.+?default-my-otel-demo-frontendproxy-8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:55:03 +0000] \"POST /api/checkout HTTP/1.1\" 200 984 \"-\" \"python-requests/2.31.0\" 780 0.068 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 984 0.069 200 f87d6397ec8b5740f05f1f3ca07adf50\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:55:03 +0000] \"POST /api/checkout HTTP/1.1\" 200 984 \"-\" \"python-requests/2.31.0\" 780 0.068 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 984 0.069 200 f87d6397ec8b5740f05f1f3ca07adf50\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.220Z", + "lastOccurrence": "2024-11-02T10:56:45.575Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 5 + }, + { + "x": 1730543820000, + "y": 10 + }, + { + "x": 1730543850000, + "y": 14 + }, + { + "x": 1730543880000, + "y": 3 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 12 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 6 + }, + { + "x": 1730544030000, + "y": 7 + }, + { + "x": 1730544060000, + "y": 5 + }, + { + "x": 1730544090000, + "y": 5 + }, + { + "x": 1730544120000, + "y": 5 + }, + { + "x": 1730544150000, + "y": 5 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 9 + }, + { + "x": 1730544240000, + "y": 5 + }, + { + "x": 1730544270000, + "y": 6 + }, + { + "x": 1730544300000, + "y": 14 + }, + { + "x": 1730544330000, + "y": 7 + }, + { + "x": 1730544360000, + "y": 10 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 4 + }, + { + "x": 1730544450000, + "y": 6 + }, + { + "x": 1730544480000, + "y": 6 + }, + { + "x": 1730544510000, + "y": 2 + }, + { + "x": 1730544540000, + "y": 3 + }, + { + "x": 1730544570000, + "y": 9 + }, + { + "x": 1730544600000, + "y": 5 + }, + { + "x": 1730544630000, + "y": 9 + }, + { + "x": 1730544660000, + "y": 3 + }, + { + "x": 1730544690000, + "y": 14 + }, + { + "x": 1730544720000, + "y": 13 + }, + { + "x": 1730544750000, + "y": 2 + }, + { + "x": 1730544780000, + "y": 5 + }, + { + "x": 1730544810000, + "y": 3 + }, + { + "x": 1730544840000, + "y": 7 + }, + { + "x": 1730544870000, + "y": 5 + }, + { + "x": 1730544900000, + "y": 11 + }, + { + "x": 1730544930000, + "y": 11 + }, + { + "x": 1730544960000, + "y": 6 + }, + { + "x": 1730544990000, + "y": 2 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "vdjm", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 263, + "pattern": "10.244.0.38 02 2024 10 0000 api HTTP 1.1 python requests 2.31.0 default my otel demo frontendproxy 8080 10.244.0.26 8080", + "regex": ".*?10\\.244\\.0\\.38.+?02.+?2024.+?10.+?0000.+?api.+?HTTP.+?1\\.1.+?python.+?requests.+?2\\.31\\.0.+?default.+?my.+?otel.+?demo.+?frontendproxy.+?8080.+?10\\.244\\.0\\.26.+?8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.220Z", + "lastOccurrence": "2024-11-02T10:56:45.575Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 5 + }, + { + "x": 1730543820000, + "y": 10 + }, + { + "x": 1730543850000, + "y": 14 + }, + { + "x": 1730543880000, + "y": 3 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 12 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 6 + }, + { + "x": 1730544030000, + "y": 7 + }, + { + "x": 1730544060000, + "y": 5 + }, + { + "x": 1730544090000, + "y": 5 + }, + { + "x": 1730544120000, + "y": 5 + }, + { + "x": 1730544150000, + "y": 5 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 9 + }, + { + "x": 1730544240000, + "y": 5 + }, + { + "x": 1730544270000, + "y": 6 + }, + { + "x": 1730544300000, + "y": 14 + }, + { + "x": 1730544330000, + "y": 7 + }, + { + "x": 1730544360000, + "y": 10 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 4 + }, + { + "x": 1730544450000, + "y": 6 + }, + { + "x": 1730544480000, + "y": 6 + }, + { + "x": 1730544510000, + "y": 2 + }, + { + "x": 1730544540000, + "y": 3 + }, + { + "x": 1730544570000, + "y": 9 + }, + { + "x": 1730544600000, + "y": 5 + }, + { + "x": 1730544630000, + "y": 9 + }, + { + "x": 1730544660000, + "y": 3 + }, + { + "x": 1730544690000, + "y": 14 + }, + { + "x": 1730544720000, + "y": 13 + }, + { + "x": 1730544750000, + "y": 2 + }, + { + "x": 1730544780000, + "y": 5 + }, + { + "x": 1730544810000, + "y": 3 + }, + { + "x": 1730544840000, + "y": 7 + }, + { + "x": 1730544870000, + "y": 5 + }, + { + "x": 1730544900000, + "y": 12 + }, + { + "x": 1730544930000, + "y": 11 + }, + { + "x": 1730544960000, + "y": 6 + }, + { + "x": 1730544990000, + "y": 2 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "hxyo", + "relevance": "critical", + "interesting": true + } + ], + "patternsFromOtherEntities": [], + "searches": [ + { + "fragments": [ + "10.244.0.38:8080", + "10.244.0.38", + "8080" + ], + "appearsAs": "This IP address and port are referenced as attributes.source.address, attributes.upstream.address in the investigated entity service.name:controller." + }, + { + "fragments": [ + "http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart", + "/api/cart" + ], + "appearsAs": "These URL fragments appear as attributes.http.request.referrer, attributes.url.original in the investigated entity service.name:controller." + }, + { + "fragments": [ + "/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF", + "sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57", + "currencyCode=CHF" + ], + "appearsAs": "These URL fragments appear as attributes.url.query in the investigated entity service.name:controller." + }, + { + "fragments": [ + "default-my-otel-demo-frontendproxy-8080", + "frontendproxy", + "frontend" + ], + "appearsAs": "These service names appear as attributes.upstream.name in the investigated entity service.name:controller." + }, + { + "fragments": [ + "e6bae77cfb5b598f1d725bc6cc52d06d", + "506" + ], + "appearsAs": " These fragments appear as attributes.http.request.time, attributes.http.response.status_code in the investigated entity service.name:controller." + } + ], + "relatedEntitiesSummaries": [ + "### Related Entities Analysis\n\n#### 1. Entity: service.name:frontend\n- **Indicators (Strength: Average to Strong):**\n - Field: `attributes.upstream.name` in service.name:controller - `default-my-otel-demo-frontendproxy-8080`\n - Field: `kubernetes.pod.name.text` in service.name:frontend - `<em>my</em>-<em>otel</em>-<em>demo</em>-<em>frontend</em>-5bbf4d78bc-qtwdr`\n - URL paths in logs that suggest interactions with the frontend service, specifically `/api/cart`.\n- **Reasoning:** The `frontend` service interacts closely with the `controller` (ingress-nginx-controller). Requests directed to `/api/cart` initiate from `frontendproxy` which routes to `frontend`. Given the high error rate at the `/api/cart` endpoint, the issue might involve downstream calls from `frontend` to dependent services.\n- **Overall Likeliness:** High. The `frontend` service is one of the primary services processing requests (user interactions) that subsequently hit the `controller`.\n\n#### 2. Entity: service.name:cartservice\n- **Indicators (Strength: Strong):**\n - Correspondence of session IDs in the request URLs or logs between controller and cartservice.\n - Mention of cart failures in `frontend` interactions - indicated by error logs involving failed RPC calls to `cartservice`.\n - Logs for service.name:cartservice with messages such as `GetCartAsync called with userId=<em>1d9f48dd</em>`.\n- **Reasoning:** The `/api/cart` endpoint directly involves manipulating or retrieving data from `cartservice`. Given the 500 errors on requests routed via the `controller`, it's likely that `cartservice` might be either causing or being affected by these failures.\n- **Overall Likeliness:** High. Direct involvement of `cartservice` is plausible given the issue is associated specifically with cart interactions.\n\n#### 3. Entity: service.name:frontend-web\n- **Indicators (Strength: Average):**\n - URL referrer and path fragments suggest client-side interactions impact the controller’s ingress.\n - URL fields from both controller logs and frontend-web logs such as `http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart`.\n- **Reasoning:** `frontend-web` represents the client-side application layer. Issues in the client's request construction or timing might be indirectly impacting how the `controller` handles these requests.\n- **Overall Likeliness:** Moderate. While not directly involved in backend processing, interactions originating from the frontend-web could potentially impact the backend flow.\n\n#### 4. Entity: service.name:checkoutservice\n- **Indicators (Strength: Weak):**\n - Shared URL fragments related to the checkout process (`/api/cart` could be an intermediate step).\n - Common use of `sessionId` and `currencyCode` seen in request attributes.\n- **Reasoning:** Though the controller deals directly with cart interactions, completion of cart actions could trigger subsequent processes in `checkoutservice`. Errors during cart operations could thereby propagate issues if mismanaged upstream.\n- **Overall Likeliness:** Low to Moderate. Contextually relevant but perhaps indirectly linked unless specific error propagation is identified.\n\n#### 5. Entity: service.name:coredns\n- **Indicators (Strength: Weak to Average):**\n - DNS logs showing interactions such as `10.244.0.38:45693 - 8080 \"A IN ingress-nginx-controller.ingress-nginx.svc.cluster.local. UDP 74`.\n- **Reasoning:** DNS resolution issues could lead to inability to locate the correct backend service IP for `controller`, causing errors in routing HTTP requests.\n- **Overall Likeliness:** Low. Potential indirect influence but less likely to be the primary cause.\n\n#### Possible Relationship Summary\nGiven these findings:\n\n1. **frontend** and **cartservice** are the most relevant entities with strong indicators of their dependencies and direct involvement in handling requests relevant to the `/api/cart` endpoint. Investigating these services in conjunction with `controller` will likely reveal root causes.\n2. **frontend-web** could be examined for potential client-side initiation issues leading to increased errors, but it remains secondary.\n3. **checkoutservice** may be potentially linked through a sequence of dependencies initiated post-cart operations but is less immediate.\n4. **coredns** could be impacting resolution, yet this remains an unlikely principal cause unless supported by specific DNS errors.\n\nFocus on examining logs and dependencies from `cartservice` and `frontend` to pinpoint exact causes for the reported 500 errors at the `/api/cart` endpoint managed by the controller service.", + "## Analysis and Identification of Related Entities\n\n### Relationship 1: `frontendproxy` (default-my-otel-demo-frontendproxy-8080)\n- **Related entity:** `service.name:frontendproxy`\n- **Indicator strength:** Strong, based on the matching `attributes.upstream.name` field.\n - **Indications:**\n - From `controller` logs: `attributes.upstream.name` = `default-my-otel-demo-frontendproxy-8080`\n - Upstream IP address: `attributes.upstream.address` = `10.244.0.26:8080` in controller logs coinciding with requests that resulted in `500` errors.\n- **Reason:** The `frontendproxy` service routes traffic to the backend services, including the `controller`. Since the `controller` service receives requests and directs traffic to `frontendproxy`, it points to a possible upstream dependency causing the 500 errors during the requests to `/api/cart`.\n- **Overall likeliness:** High. This entity is directly involved since it routes traffic within the system, and its downstream performance or errors reflect on the `controller`.\n\n### Relationship 2: `frontend`\n- **Related entity:** `service.name:frontend`\n- **Indicator strength:** Moderate, observing the infrastructure context and the dependency chain.\n - **Indications:** \n - The `frontend` service is called by the `frontendproxy`, which is indicated as the `attributes.upstream.name` in `controller` logs.\n- **Reason:** In the context provided, the `frontend` communicates with other backend services to process user interactions and might be an upstream dependency for the `controller`. The problem might cascade from `frontendproxy` to `frontend`.\n- **Overall likeliness:** High. This service is critical in handling user interactions, and problems here could cause issue propagation to `controller`.\n\n### Relationship 3: `cartservice`\n- **Related entity:** `service.name:cartservice`\n- **Indicator strength:** Moderate, based on its role in the architecture and likely correlation.\n - **Indications:**\n - The `cartservice` handles shopping cart actions which map the `controller`'s `/api/cart` endpoint.\n - **Reason:** If the `cartservice` has issues, they would cascade to the `controller` /api/cart endpoint that depends on this service for cart management functions.\n- **Overall likeliness:** High. It closely correlates with the endpoint's functionality and possible 500 errors due to backend service inconsistencies.\n\n### Relationship 4: `currencyservice`\n- **Related entity:** `service.name:currencyservice`\n- **Indicator strength:** Weak, contextual dependency but crucial interplay with `cart` operations.\n - **Indications:**\n - Handling currency conversions, indirectly connected to cart operations.\n- **Reason:** The issues might arise if currency conversion fails during cart operations, contributing to the 500 errors in the `controller`.\n- **Overall likeliness:** Moderate. Essential for part of the request chains during cart operations, but primary errors might occur upstream.\n\n### Relationship 5: `productcatalogservice`\n- **Related entity:** `service.name:productcatalogservice`\n- **Indicator strength:** Weak, as no direct log correlation but relevant in the context.\n - **Indications:**\n - Provides product data, indirectly required during cart operations.\n- **Reason:** Cart operations fetching/validating product data might fail, contributing to the `controller` errors when /api/cart requests involve fetching product data.\n- **Overall likeliness:** Moderate. Possible issues here can impact `cartservice` processes and propagate as 500 errors.\n\n### Relationship 6: `frauddetectionservice`\n- **Related entity:** `service.name:frauddetectionservice`\n- **Indicator strength:** Weak, speculative and based more on potential correlation.\n - **Indications:**\n - No specific logs point directly; contextual relevance due to transaction handling.\n- **Reason:** If fraud detection triggers false flags, it can affect cart transactions.\n- **Overall likeliness:** Low. Unlikely direct contributor and more as a consequential involvement in transaction failures.\n\n### Summary\n\nThe `frontendproxy`, `frontend`, and `cartservice` are the most probable related entities with high relevance to the errors indicated in the `controller` service. Investigations should focus on these first, focusing on log patterns and errors cascading through these entities causing the 500 errors on `/api/cart`. Indirect relations like `currencyservice`, `productcatalogservice`, and `frauddetectionservice` can also be explored as part of the broader context.", + "During the investigation of the alert for the `controller` service, we are identifying possible relationships to other entities. We will meticulously examine the evidence from logs, traces, and other relevant data to uncover dependencies and potential causes for the high number of 500 errors on the `/api/cart` endpoint.\n\n### Highly Relevant Entities and Relationships\n\n#### 1. Entity: service.name:frontendproxy\n\n- **Indicators of Evidence**\n - **Strong Indicator**: `attributes.upstream.name: default-my-otel-demo-frontendproxy-8080`\n - **Field Values in Investigated Entity (`controller`)**:\n - `\"attributes.upstream.name\": \"default-my-otel-demo-frontendproxy-8080\"`\n - `\"attributes.upstream.response.status_code\": [\"500\", \"200\", \"308\"]`\n - **Fingerprinting Evidence**:\n - `\"message\": \"10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \\\"POST /api/cart HTTP/1.1\\\" 500 32 \\\"-\\\" \\\"python-requests/2.31.0\\\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\"`\n\n- **Relationship and Context**\n - The `frontendproxy` service acts as the reverse proxy, routing incoming HTTP traffic to different backend services, including the `controller`. The errors appearing in the `controller` log indicate communication issues between the `controller` and the `frontendproxy`.\n\n- **Overall Likeliness**: High\n - Given the primary role of the `frontendproxy` in routing traffic to `controller`, coupled with the direct evidence in the logs, this entity is crucial to the situation at hand.\n\n#### 2. Entity: service.name:frontend\n\n- **Indicators of Evidence**\n - **Average Indicator**: `features.service.name: frontend`\n - **Field Values in Investigated Entity (`controller`)**:\n - `\"attributes.http.request.origin\": \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\"`\n - `\"/api/cart` endpoint related queries`\n\n- **Relationship and Context**:\n - The `frontend` service handles key operations related to user interactions before requests are passed to various backend services, including the `controller`. Issues in `frontend`, like poor handling of requests or incorrect data forwarding, might cascade downstream, resulting in 500 errors in the `controller`.\n\n- **Overall Likeliness**: Medium to High\n - Given the data pathway from user interactions handled by `frontend`, it’s essential to determine if `frontend` anomalies are contributing to the failure in `controller`.\n\n#### 3. Entity: service.name:cartservice\n\n- **Indicators of Evidence**\n - **Average Indicator**: `/api/cart` requests typically involving `cartservice`\n - **Field Values in Investigated Entity (`controller`)**:\n - `500 errors at \"/api/cart\"`\n\n- **Relationship and Context**:\n - The `cartservice` directly manages shopping cart operations over the gRPC protocol. While the HTTP API from `controller` might indicate communication failures with `cartservice`, these errors could also originate from improper data requests or transaction handling within `cartservice`.\n\n- **Overall Likeliness**: High\n - Investigating the interaction with `cartservice` can help distinguish if business logic errors or miscommunication between services lead to repeated 500 errors.\n\n### Moderately Relevant Entities\n\n#### 4. Entity: service.name:loadgenerator\n\n- **Indicators of Evidence**\n - **Weak Indicator**: Simulated high traffic which might put strain on other services causing errors.\n - **Field Values in Investigated Entity (`controller`)**:\n - General logged high traffic instances or increased load around the alert time.\n\n- **Relationship and Context**:\n - The `loadgenerator` mimics external user traffic managed by the Ingress and ultimately passed through nodes like `controller`. Excessive load can manifest as backend service overloads or timeouts, indirectly causing 500 errors in `controller`.\n\n- **Overall Likeliness**: Medium\n - Given the traffic simulation aspect, its role is probable but direct correlation to specific error occurrences in `controller` needs corroboration with other data points.\n\n### Less Likely but Contextually Relevant Entities\n\n#### 5. Entity: service.name:etcd\n\n- **Indicators of Evidence**\n - **Weak Indicator**: General mention in logs for Ingress control plane activity\n - **Field Values in Investigated Entity (`controller`)**:\n - `\"response count\": 0`, signifying Ingress data handling might be amiss during high traffic\n\n- **Relationship and Context**:\n - Possible indirect impact wherein control plane malfunctions or data inconsistencies in the `etcd` state can propagate as issues dispersed across services interacting via Ingress, including `controller`.\n\n- **Overall Likeliness**: Medium\n - This needs verifying integration with upstream Ingress state logs to validate contributions to observed `controller` issues.\n\n### Further Investigations and Likelihood Summary\n\nBased on logs and identified relationships, we will prioritize looking into:\n\n1. **Frontendproxy** - Checking its health, routing efficiency, and connections to `controller`.\n2. **Frontend** - Verifying its data handling during user interactions that lead to API cart errors.\n3. **Cartservice** - Ensuring logical transactions and gRPC communications, ruling out core service bugs.\n\nWe will cross-reference error logs, API traces, and dependency interactions tightly intertwined with the `controller` to form a comprehensive approach to resolution." + ], + "kbEntries": [ + { + "id": "System architecture", + "text": "The architecture described here outlines a microservices-based system, where each service is implemented in a distinct programming language and communicates via gRPC, HTTP, or TCP. This system is designed to handle simulated user traffic, supported by a variety of interconnected services and components.\n\n### System Architecture\n\n1. **`loadgenerator`** - Simulates external user traffic by sending HTTP requests, which are managed by an Nginx ingress controller. This ingress directs traffic to the `frontendproxy` service.\n\n2. **`frontendproxy` (Envoy)** - Acts as a reverse proxy, routing incoming traffic from `loadgenerator` to `frontend`.\n\n3. **`frontend` (Node.js)** - The core service for user interactions, receiving HTTP traffic from `frontendproxy` and interfacing with various backend services to fulfill requests.\n\n4. **`frontend-web` (RUM)** - A Real User Monitoring (RUM) layer that runs in the user's browser, enabling insights into end-user experiences and frontend performance.\n\n5. **`adservice`** - Delivers advertisements to the `frontend` using gRPC, enhancing the user experience with relevant ad content.\n\n6. **`cartservice`** - Manages shopping cart data, including adding and removing items. It communicates over gRPC and leverages a Redis cache for data persistence.\n\n7. **`currencyservice`** - Handles currency conversions and facilitates interactions between `cartservice` and `checkoutservice` over gRPC.\n\n8. **`checkoutservice`** - Coordinates the checkout process, calling various services for payments, shipping, and emails. It utilizes both gRPC and HTTP protocols to aggregate the necessary information for order completion.\n\n9. **`emailservice`** - Sends order confirmation emails to users via gRPC, triggered by interactions with `checkoutservice`.\n\n10. **`productcatalogservice`** - Maintains the product catalog, storing details about available items and providing this data to other services via gRPC.\n\n11. **`recommendationservice`** - Generates personalized product recommendations, accessed by `frontend` over gRPC.\n\n12. **`shippingservice`** - Manages shipping information, providing essential data to `checkoutservice` over gRPC.\n\n13. **`quoteservice`** - Supplies shipping quotes over HTTP, which are accessed by `shippingservice` to estimate shipping costs.\n\n14. **`paymentservice`** - Processes payment transactions through gRPC, enabling secure and efficient payments for `checkoutservice`.\n\n15. **`accountingservice`** - Responsible for recording transactions, it connects to a Kafka queue and interacts over TCP.\n\n16. **`frauddetectionservice`** - Monitors orders for potential fraud, also interfacing with the Kafka queue over TCP to receive relevant transaction data.\n\n17. **`imageprovider` (Nginx)** - Serves static images for the frontend interface, accessible over HTTP.\n\n18. **`queue` (Kafka)** - Acts as a central message broker, facilitating communication between `accountingservice` and `frauddetectionservice`.\n\n### Key Components\nThe system is structured to enable robust, distributed communication across services, allowing each component to focus on a specific aspect of the user experience or business logic. The ingress controller, in particular, plays a critical role in directing traffic, ensuring that incoming requests from `loadgenerator` are correctly routed through `frontendproxy` and into the system’s core services.\n\nThis architecture ensures that the system can handle high traffic loads and provides a modular, flexible framework to meet user demands while monitoring for performance and security.\n", + "tokens": 733, + "score": 3 + } + ] + } + } + }, + { + "role": "assistant", + "content": "", + "toolCalls": [ + { + "toolCallId": "call_DB13TclS3Gc9zUgCrWLrvDuu", + "function": { + "name": "observe", + "arguments": { + "observe": true + } + } + } + ] + }, + { + "name": "observe", + "response": { + "content": "### Context and Ongoing Investigation\n\nThe initial context indicated that the `controller` service was experiencing an alert due to a high number of `500 Internal Server Errors` on the `/api/cart` endpoint. The error rate was significantly high (98.78%), suggesting a severe issue within the `controller` service or its dependencies. During the initial investigation of the `controller` service, it was determined that the errors resulted from HTTP POST requests to the `/api/cart` endpoint emanating from a client using `python-requests/2.31.0`.\n\n### Key Observations and Analysis from Investigations\n\n#### 1. `controller` Service Characteristics\n\n- **Environment**: The `controller` service runs in a Kubernetes environment (`ingress-nginx` namespace), with the pod named `ingress-nginx-controller-bc57996ff-r6blf` on node `minikube`.\n- **Functionality**: Acts as an Ingress controller managing HTTP requests routing to backend services including the `frontendproxy`.\n- **Observations**:\n - Pattern showing consistent `500 Internal Server Error` for POST requests to `/api/cart`.\n - Most of these errors originate from requests routed through the `frontendproxy`.\n\n#### 2. Related Entities and Their Possible Impact\n\nEntities that closely interact with `controller` or are otherwise significant to `controller’s` functionality were assessed:\n\n1. **`frontend`**:\n - Interacts with the `controller` for routing requests.\n - Downstream dependencies and interactions might propagate errors.\n\n2. **`cartservice`**:\n - Directly involved in handling requests for the `/api/cart` endpoint.\n - Any issues here could cause `controller` errors.\n\n3. **`frontend-web`**:\n - Client-side interactions leading to requests to `/api/cart` via `controller`.\n - Potential timing or construction issues in requests.\n\n4. **Other entities (`checkoutservice`, `coredns`)**:\n - Indirectly related with varying degrees of confidence on impact.\n\n### Timeline of Significant Events\n\n1. **2024-11-02T10:56:00.000Z**:\n - **Observation**:\n - 6 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - Example Log:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n\n2. **2024-11-02T10:56:30.000Z**:\n - **Observation**:\n - 2 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - Example Log:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:35 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n\n3. **2024-11-02T10:56:42.498Z**:\n - **Alert Triggered**:\n - High number of 500 errors for the /api/cart endpoint. Error rate is 98.78%, above the threshold of 1% over a 1-minute duration.\n\n### Context and Reasoning\n\nThe `controller` service functions as the main ingress gateway, routing HTTP requests to the appropriate backend services including the `frontendproxy`, and more specifically the downstream `cartservice`. The nature of the high error rates observed at `/api/cart`, particularly for POST requests, suggests the problem could originate either at the `cartservice` backend or along the routing path between `controller`, `frontendproxy`, and `cartservice`.\n\n#### Potential Root Causes\n- **Backend Service Issue**:\n Given the direct involvement of `cartservice` in `/api/cart` operations, issues here could easily propagate into repeated 500 errors seen by the `controller`.\n- **Routing/Network Issues**:\n Communication path issues (e.g., `frontendproxy` to `cartservice`) causing errors in routing HTTP requests could result in these errors.\n\n### Next Steps\n\nGiven the strong patterns:\n\n1. **Investigate `cartservice`**:\n - As the downstream service handling `/api/cart` requests, issues here would directly contribute to the observed error patterns in `controller`.\n\n2. **Investigate `frontendproxy`**:\n - Since requests are routed through this service to `cartservice`, any routing or network issues here might also contribute to the errors.\n\nUpon investigating both entities, performing more detailed inspections of the logs and interactions might reveal issues that propagate these failures. This should help isolate the fault in the communication path or within the specific services causing the `500 Internal Server Errors` seen in `controller`.\n\n**Entities to Investigate Next**:\n- **cartservice**\n- **frontendproxy**\n\nThese investigations will provide further insights into whether the root cause is localized to `cartservice` itself or issues are emergent from the routing path involving `frontendproxy`." + }, + "data": { + "content": "### Context and Ongoing Investigation\n\nThe initial context indicated that the `controller` service was experiencing an alert due to a high number of `500 Internal Server Errors` on the `/api/cart` endpoint. The error rate was significantly high (98.78%), suggesting a severe issue within the `controller` service or its dependencies. During the initial investigation of the `controller` service, it was determined that the errors resulted from HTTP POST requests to the `/api/cart` endpoint emanating from a client using `python-requests/2.31.0`.\n\n### Key Observations and Analysis from Investigations\n\n#### 1. `controller` Service Characteristics\n\n- **Environment**: The `controller` service runs in a Kubernetes environment (`ingress-nginx` namespace), with the pod named `ingress-nginx-controller-bc57996ff-r6blf` on node `minikube`.\n- **Functionality**: Acts as an Ingress controller managing HTTP requests routing to backend services including the `frontendproxy`.\n- **Observations**:\n - Pattern showing consistent `500 Internal Server Error` for POST requests to `/api/cart`.\n - Most of these errors originate from requests routed through the `frontendproxy`.\n\n#### 2. Related Entities and Their Possible Impact\n\nEntities that closely interact with `controller` or are otherwise significant to `controller’s` functionality were assessed:\n\n1. **`frontend`**:\n - Interacts with the `controller` for routing requests.\n - Downstream dependencies and interactions might propagate errors.\n\n2. **`cartservice`**:\n - Directly involved in handling requests for the `/api/cart` endpoint.\n - Any issues here could cause `controller` errors.\n\n3. **`frontend-web`**:\n - Client-side interactions leading to requests to `/api/cart` via `controller`.\n - Potential timing or construction issues in requests.\n\n4. **Other entities (`checkoutservice`, `coredns`)**:\n - Indirectly related with varying degrees of confidence on impact.\n\n### Timeline of Significant Events\n\n1. **2024-11-02T10:56:00.000Z**:\n - **Observation**:\n - 6 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - Example Log:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n\n2. **2024-11-02T10:56:30.000Z**:\n - **Observation**:\n - 2 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - Example Log:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:35 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n\n3. **2024-11-02T10:56:42.498Z**:\n - **Alert Triggered**:\n - High number of 500 errors for the /api/cart endpoint. Error rate is 98.78%, above the threshold of 1% over a 1-minute duration.\n\n### Context and Reasoning\n\nThe `controller` service functions as the main ingress gateway, routing HTTP requests to the appropriate backend services including the `frontendproxy`, and more specifically the downstream `cartservice`. The nature of the high error rates observed at `/api/cart`, particularly for POST requests, suggests the problem could originate either at the `cartservice` backend or along the routing path between `controller`, `frontendproxy`, and `cartservice`.\n\n#### Potential Root Causes\n- **Backend Service Issue**:\n Given the direct involvement of `cartservice` in `/api/cart` operations, issues here could easily propagate into repeated 500 errors seen by the `controller`.\n- **Routing/Network Issues**:\n Communication path issues (e.g., `frontendproxy` to `cartservice`) causing errors in routing HTTP requests could result in these errors.\n\n### Next Steps\n\nGiven the strong patterns:\n\n1. **Investigate `cartservice`**:\n - As the downstream service handling `/api/cart` requests, issues here would directly contribute to the observed error patterns in `controller`.\n\n2. **Investigate `frontendproxy`**:\n - Since requests are routed through this service to `cartservice`, any routing or network issues here might also contribute to the errors.\n\nUpon investigating both entities, performing more detailed inspections of the logs and interactions might reveal issues that propagate these failures. This should help isolate the fault in the communication path or within the specific services causing the `500 Internal Server Errors` seen in `controller`.\n\n**Entities to Investigate Next**:\n- **cartservice**\n- **frontendproxy**\n\nThese investigations will provide further insights into whether the root cause is localized to `cartservice` itself or issues are emergent from the routing path involving `frontendproxy`.", + "investigations": [ + { + "attachments": { + "alerts": [ + { + "kibana.alert.reason": "500 Errors is 98.78049, above the threshold of 1. (duration: 1 min, data view: otel_logs_data (Automated by Demo CLI), group: controller,/api/cart)", + "kibana.alert.evaluation.values": [ + 98.78048780487805 + ], + "kibana.alert.evaluation.threshold": [ + 1 + ], + "kibana.alert.group": [ + { + "field": "service.name", + "value": "controller" + }, + { + "field": "url.path", + "value": "/api/cart" + } + ], + "tags": [ + "demo", + "cli-created" + ], + "service.name": "controller", + "kibana.alert.rule.category": "Custom threshold", + "kibana.alert.rule.consumer": "logs", + "kibana.alert.rule.execution.uuid": "4187827d-686e-4098-98e3-21e13495798e", + "kibana.alert.rule.name": "NGINX 500s", + "kibana.alert.rule.parameters": { + "criteria": [ + { + "comparator": ">", + "metrics": [ + { + "name": "A", + "filter": "http.response.status_code:*", + "aggType": "count" + }, + { + "name": "B", + "filter": "http.response.status_code>=500", + "aggType": "count" + } + ], + "threshold": [ + 1 + ], + "timeSize": 1, + "timeUnit": "m", + "equation": "(B/A) * 100", + "label": "500 Errors" + } + ], + "alertOnNoData": false, + "alertOnGroupDisappear": false, + "searchConfiguration": { + "query": { + "query": "k8s.namespace.name: \"ingress-nginx\" AND url.path: /api/*", + "language": "kuery" + }, + "index": "otel_logs_data" + }, + "groupBy": [ + "service.name", + "url.path" + ] + }, + "kibana.alert.rule.producer": "observability", + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.rule_type_id": "observability.rules.custom_threshold", + "kibana.alert.rule.tags": [ + "demo", + "cli-created" + ], + "kibana.alert.rule.uuid": "9055220c-8fb1-4f9f-be7c-0a33eb2bafc5", + "kibana.space_ids": [ + "default" + ], + "@timestamp": "2024-11-02T10:56:42.498Z", + "event.action": "open", + "event.kind": "signal", + "kibana.alert.rule.execution.timestamp": "2024-11-02T10:56:42.498Z", + "kibana.alert.action_group": "custom_threshold.fired", + "kibana.alert.flapping": false, + "kibana.alert.flapping_history": [ + true + ], + "kibana.alert.instance.id": "controller,/api/cart", + "kibana.alert.maintenance_window_ids": [], + "kibana.alert.consecutive_matches": 1, + "kibana.alert.status": "active", + "kibana.alert.uuid": "b97a1b20-d14b-4835-b948-bd7a423284eb", + "kibana.alert.severity_improving": false, + "kibana.alert.workflow_status": "open", + "kibana.alert.duration.us": 0, + "kibana.alert.start": "2024-11-02T10:56:42.498Z", + "kibana.alert.time_range": { + "gte": "2024-11-02T10:56:42.498Z" + }, + "kibana.version": "9.0.0" + }, + { + "kibana.alert.reason": "500 Errors is 100, above the threshold of 1. (duration: 1 min, data view: otel_logs_data (Automated by Demo CLI), group: controller,/api/checkout)", + "kibana.alert.evaluation.values": [ + 100 + ], + "kibana.alert.evaluation.threshold": [ + 1 + ], + "kibana.alert.group": [ + { + "field": "service.name", + "value": "controller" + }, + { + "field": "url.path", + "value": "/api/checkout" + } + ], + "tags": [ + "demo", + "cli-created" + ], + "service.name": "controller", + "kibana.alert.rule.category": "Custom threshold", + "kibana.alert.rule.consumer": "logs", + "kibana.alert.rule.execution.uuid": "4187827d-686e-4098-98e3-21e13495798e", + "kibana.alert.rule.name": "NGINX 500s", + "kibana.alert.rule.parameters": { + "criteria": [ + { + "comparator": ">", + "metrics": [ + { + "name": "A", + "filter": "http.response.status_code:*", + "aggType": "count" + }, + { + "name": "B", + "filter": "http.response.status_code>=500", + "aggType": "count" + } + ], + "threshold": [ + 1 + ], + "timeSize": 1, + "timeUnit": "m", + "equation": "(B/A) * 100", + "label": "500 Errors" + } + ], + "alertOnNoData": false, + "alertOnGroupDisappear": false, + "searchConfiguration": { + "query": { + "query": "k8s.namespace.name: \"ingress-nginx\" AND url.path: /api/*", + "language": "kuery" + }, + "index": "otel_logs_data" + }, + "groupBy": [ + "service.name", + "url.path" + ] + }, + "kibana.alert.rule.producer": "observability", + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.rule_type_id": "observability.rules.custom_threshold", + "kibana.alert.rule.tags": [ + "demo", + "cli-created" + ], + "kibana.alert.rule.uuid": "9055220c-8fb1-4f9f-be7c-0a33eb2bafc5", + "kibana.space_ids": [ + "default" + ], + "@timestamp": "2024-11-02T10:56:42.498Z", + "event.action": "open", + "event.kind": "signal", + "kibana.alert.rule.execution.timestamp": "2024-11-02T10:56:42.498Z", + "kibana.alert.action_group": "custom_threshold.fired", + "kibana.alert.flapping": false, + "kibana.alert.flapping_history": [ + true + ], + "kibana.alert.instance.id": "controller,/api/checkout", + "kibana.alert.maintenance_window_ids": [], + "kibana.alert.consecutive_matches": 1, + "kibana.alert.status": "active", + "kibana.alert.uuid": "78472a9c-63a2-41ba-9812-47cebd48d833", + "kibana.alert.severity_improving": false, + "kibana.alert.workflow_status": "open", + "kibana.alert.duration.us": 0, + "kibana.alert.start": "2024-11-02T10:56:42.498Z", + "kibana.alert.time_range": { + "gte": "2024-11-02T10:56:42.498Z" + }, + "kibana.version": "9.0.0" + } + ], + "slos": [], + "analysis": { + "total": 56181, + "sampled": 1000, + "fields": [ + "@timestamp:date - 994 distinct values", + "app.label.component:keyword - 1 distinct values (`controller`)", + "attributes.event.name.text:text - 1 distinct values (`nginx.ingress.controller.error`)", + "attributes.event.name:keyword - 1 distinct values (`nginx.ingress.controller.error`)", + "attributes.http.request.id:keyword - 1000 distinct values (`87c973a800b3bd34d3679f0a12263c40`, `ee99fada68450d77be61deaae1f04008`, `80312e7e98e9171c8010e442784e7a04`, `a931c4f7d964f91f0a0750f3221dfa50`, `8c2e99672e225b279a7741671c976c93`, `eed4ff70db044f81adeda15bc1f3ad4c`, `dd730f83b894fc2adedfaf950cf5884c`, `4e35653560a824d6693d1e024906e9ce`, `36d6dfae2fe5d6fecbfaadd4fac5bde1`, `43c774bea806c21478f7ee57a449222b`, 990 more values)", + "attributes.http.request.method:keyword - 2 distinct values (`POST`, `GET`)", + "attributes.http.request.referrer:keyword - 2 distinct values (`http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/`, `http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart`)", + "attributes.http.request.size:long - 61 distinct values (`351`, `374`, `373`, `809`, `383`, `506`, `342`, `350`, `538`, `479`, 51 more values)", + "attributes.http.request.time:float - 90 distinct values (`3.172`, `1.103`, `0.053`, `4.434`, `0.019`, `3.328`, `1.01`, `3.197`, `3.133`, `2.566`, 80 more values)", + "attributes.http.response.body.size:long - 130 distinct values (`1144`, `1120`, `1024`, `19`, `1336`, `1198`, `1070`, `111157`, `111163`, `1271`, 120 more values)", + "attributes.http.response.status_code:long - 4 distinct values (`499`, `500`, `308`, `200`)", + "attributes.http.version:keyword - 1 distinct values (`1.1`)", + "attributes.log.file.path.text:text - 1 distinct values (`/var/log/pods/ingress-nginx_ingress-nginx-controller-bc57996ff-r6blf_35200065-5cde-4a7e-9018-0f0a4e2c5bb4/controller/0.log`)", + "attributes.log.file.path:keyword - 1 distinct values (`/var/log/pods/ingress-nginx_ingress-nginx-controller-bc57996ff-r6blf_35200065-5cde-4a7e-9018-0f0a4e2c5bb4/controller/0.log`)", + "attributes.log.iostream:keyword - 1 distinct values (`stdout`)", + "attributes.network.protocol.name.text:text - 1 distinct values (`http`)", + "attributes.network.protocol.name:keyword - 1 distinct values (`http`)", + "attributes.source.address:keyword - 1 distinct values (`10.244.0.38`)", + "attributes.upstream.address:keyword - 1 distinct values (`10.244.0.26:8080`)", + "attributes.upstream.name.text:text - 1 distinct values (`default-my-otel-demo-frontendproxy-8080`)", + "attributes.upstream.name:keyword - 1 distinct values (`default-my-otel-demo-frontendproxy-8080`)", + "attributes.upstream.response.size:keyword - 117 distinct values (`1149`, `1120`, `1029`, `19`, `1336`, `1203`, `1070`, `1276`, `1356`, `1105`, 107 more values)", + "attributes.upstream.response.status_code:keyword - 3 distinct values (`500`, `308`, `200`)", + "attributes.upstream.response.time:keyword - 89 distinct values (`3.171`, `1.007`, `1.103`, `0.053`, `4.434`, `3.328`, `1.010`, `3.197`, `3.132`, `2.565`, 79 more values)", + "attributes.url.domain:keyword - 2 distinct values (`icons`, ``)", + "attributes.url.extension:keyword - 7 distinct values (`css`, `Service/ResolveAll`, `Service/EventStream`, `png`, `svg`, `jpg`, `js`)", + "attributes.url.original.text:text - 167 distinct values (`/api/recommendations?productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, 165 more values)", + "attributes.url.original:keyword - 167 distinct values (`/api/recommendations?productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `/api/recommendations?productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `/api/cart?sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `/api/recommendations?productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `/api/data/`, `/api/cart?sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `/api/recommendations?productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `/api/recommendations?productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `/api/cart?sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, 157 more values)", + "attributes.url.path:keyword - 43 distinct values (`/api/products/0PUK6V6EV0`, `/api/products/9SIQT8TOJO`, `/api/products/LS4PSXUNUM`, `/api/data/`, `/api/products/L9ECAV7KIM`, `/api/data`, `/api/products/66VCHSJNUP`, `/api/products/2ZYFJ3GM2N`, `/cart`, `/images/products/NationalParkFoundationExplorascope.jpg`, 33 more values)", + "attributes.url.query:keyword - 126 distinct values (`productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, `productIds=&sessionId=0c122e28-e8fb-4ab5-9889-ac797b5f17cf¤cyCode=USD`, 116 more values)", + "attributes.url.scheme:keyword - 1 distinct values (``)", + "attributes.user_agent.name.text:text - 2 distinct values (`Python Requests`, `HeadlessChrome`)", + "attributes.user_agent.name:keyword - 2 distinct values (`Python Requests`, `HeadlessChrome`)", + "attributes.user_agent.original.text:text - 2 distinct values (`python-requests/2.31.0`, `Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36`)", + "attributes.user_agent.original:keyword - 2 distinct values (`python-requests/2.31.0`, `Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36`)", + "attributes.user_agent.version:keyword - 2 distinct values (`2.31`, `120.0.6099`)", + "body.text:text - 1000 distinct values (`10.244.0.38 - - [02/Nov/2024:10:37:56 +0000] \"GET /api/currency? HTTP/1.1\" 200 199 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 598 0.007 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 199 0.007 200 87c973a800b3bd34d3679f0a12263c40\n`, `10.244.0.38 - - [02/Nov/2024:10:46:11 +0000] \"GET /_next/static/chunks/pages/_app-c923ae378a182a07.js HTTP/1.1\" 200 111150 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 484 0.017 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 111008 0.018 200 ee99fada68450d77be61deaae1f04008\n`, 998 more values)", + "data_stream.dataset:keyword - 1 distinct values (`nginx_ingress_controller.error.otel`)", + "data_stream.namespace:keyword - 1 distinct values (`default`)", + "data_stream.type:keyword - 1 distinct values (`logs`)", + "deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "dropped_attributes_count:long - 1 distinct values (`0`)", + "event.dataset:keyword - 1 distinct values (`nginx_ingress_controller.error.otel`)", + "event.name:keyword - 1 distinct values (`nginx.ingress.controller.error`)", + "host.arch:keyword - 1 distinct values (`arm64`)", + "host.architecture:keyword - 1 distinct values (`arm64`)", + "host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "host.cpu.family:keyword - 1 distinct values (``)", + "host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "host.cpu.model.name:keyword - 1 distinct values (``)", + "host.cpu.stepping:keyword - 1 distinct values (`0`)", + "host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "host.os.full:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "host.os.platform:keyword - 1 distinct values (`linux`)", + "http.request.id:keyword - 1000 distinct values (`87c973a800b3bd34d3679f0a12263c40`, `ee99fada68450d77be61deaae1f04008`, `80312e7e98e9171c8010e442784e7a04`, `a931c4f7d964f91f0a0750f3221dfa50`, `8c2e99672e225b279a7741671c976c93`, `eed4ff70db044f81adeda15bc1f3ad4c`, `dd730f83b894fc2adedfaf950cf5884c`, `4e35653560a824d6693d1e024906e9ce`, `36d6dfae2fe5d6fecbfaadd4fac5bde1`, `43c774bea806c21478f7ee57a449222b`, 990 more values)", + "http.request.method:keyword - 2 distinct values (`POST`, `GET`)", + "http.request.referrer:keyword - 2 distinct values (`http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/`, `http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart`)", + "http.request.size:long - 61 distinct values (`351`, `374`, `373`, `809`, `383`, `506`, `342`, `350`, `538`, `479`, 51 more values)", + "http.request.time:float - 90 distinct values (`3.172`, `1.103`, `0.053`, `4.434`, `0.019`, `3.328`, `1.01`, `3.197`, `3.133`, `2.566`, 80 more values)", + "http.response.body.size:long - 130 distinct values (`1144`, `1120`, `1024`, `19`, `1336`, `1198`, `1070`, `111157`, `111163`, `1271`, 120 more values)", + "http.response.status_code:long - 4 distinct values (`499`, `500`, `308`, `200`)", + "http.version:keyword - 1 distinct values (`1.1`)", + "k8s.container.name:keyword - 1 distinct values (`controller`)", + "k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "k8s.deployment.name:keyword - 1 distinct values (`ingress-nginx-controller`)", + "k8s.namespace.name:keyword - 1 distinct values (`ingress-nginx`)", + "k8s.node.name:keyword - 1 distinct values (`minikube`)", + "k8s.pod.name:keyword - 1 distinct values (`ingress-nginx-controller-bc57996ff-r6blf`)", + "k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T08:56:56Z`)", + "k8s.pod.uid:keyword - 1 distinct values (`35200065-5cde-4a7e-9018-0f0a4e2c5bb4`)", + "kubernetes.deployment.name:keyword - 1 distinct values (`ingress-nginx-controller`)", + "kubernetes.namespace:keyword - 1 distinct values (`ingress-nginx`)", + "kubernetes.node.name:keyword - 1 distinct values (`minikube`)", + "kubernetes.pod.name:keyword - 1 distinct values (`ingress-nginx-controller-bc57996ff-r6blf`)", + "kubernetes.pod.uid:keyword - 1 distinct values (`35200065-5cde-4a7e-9018-0f0a4e2c5bb4`)", + "log.file.path:keyword - 1 distinct values (`/var/log/pods/ingress-nginx_ingress-nginx-controller-bc57996ff-r6blf_35200065-5cde-4a7e-9018-0f0a4e2c5bb4/controller/0.log`)", + "log.iostream:keyword - 1 distinct values (`stdout`)", + "message:text - 1000 distinct values (`10.244.0.38 - - [02/Nov/2024:10:37:56 +0000] \"GET /api/currency? HTTP/1.1\" 200 199 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 598 0.007 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 199 0.007 200 87c973a800b3bd34d3679f0a12263c40\n`, `10.244.0.38 - - [02/Nov/2024:10:46:11 +0000] \"GET /_next/static/chunks/pages/_app-c923ae378a182a07.js HTTP/1.1\" 200 111150 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 484 0.017 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 111008 0.018 200 ee99fada68450d77be61deaae1f04008\n`, 998 more values)", + "network.protocol.name:keyword - 1 distinct values (`http`)", + "observed_timestamp:date_nanos - 1000 distinct values (`2024-11-02T10:37:56.158731715Z`, `2024-11-02T10:46:11.961228541Z`, `2024-11-02T10:38:02.758802635Z`, `2024-11-02T10:54:51.563521629Z`, `2024-11-02T10:37:05.149442469Z`, `2024-11-02T10:49:01.961126259Z`, `2024-11-02T10:56:19.96308167Z`, `2024-11-02T10:42:06.760264887Z`, `2024-11-02T10:49:45.76210446Z`, `2024-11-02T10:54:02.562840801Z`, 990 more values)", + "os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.app.label.component:keyword - 1 distinct values (`controller`)", + "resource.attributes.deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "resource.attributes.host.arch:keyword - 1 distinct values (`arm64`)", + "resource.attributes.host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "resource.attributes.host.cpu.family:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "resource.attributes.host.cpu.model.name.text:text - 1 distinct values (``)", + "resource.attributes.host.cpu.model.name:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.stepping:keyword - 1 distinct values (`0`)", + "resource.attributes.host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "resource.attributes.host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "resource.attributes.host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "resource.attributes.host.name:keyword - 1 distinct values (`otel-daemonset-opentelemetry-collector-agent-7jlpk`)", + "resource.attributes.k8s.container.name.text:text - 1 distinct values (`controller`)", + "resource.attributes.k8s.container.name:keyword - 1 distinct values (`controller`)", + "resource.attributes.k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "resource.attributes.k8s.deployment.name:keyword - 1 distinct values (`ingress-nginx-controller`)", + "resource.attributes.k8s.namespace.name:keyword - 1 distinct values (`ingress-nginx`)", + "resource.attributes.k8s.node.name:keyword - 1 distinct values (`minikube`)", + "resource.attributes.k8s.pod.name:keyword - 1 distinct values (`ingress-nginx-controller-bc57996ff-r6blf`)", + "resource.attributes.k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T08:56:56Z`)", + "resource.attributes.k8s.pod.uid:keyword - 1 distinct values (`35200065-5cde-4a7e-9018-0f0a4e2c5bb4`)", + "resource.attributes.os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "resource.attributes.os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.service.name.text:text - 1 distinct values (`controller`)", + "resource.attributes.service.name:keyword - 1 distinct values (`controller`)", + "resource.dropped_attributes_count:long - 1 distinct values (`0`)", + "resource.schema_url:keyword - 1 distinct values (`https://opentelemetry.io/schemas/1.6.1`)", + "scope.dropped_attributes_count:long - 1 distinct values (`0`)", + "service.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "service.name:keyword - 1 distinct values (`controller`)", + "severity_number:byte - 1 distinct values (`0`)", + "source.address:keyword - 1 distinct values (`10.244.0.38`)", + "upstream.address:keyword - 1 distinct values (`10.244.0.26:8080`)", + "upstream.name:keyword - 1 distinct values (`default-my-otel-demo-frontendproxy-8080`)", + "upstream.response.size:keyword - 117 distinct values (`1149`, `1120`, `1029`, `19`, `1336`, `1203`, `1070`, `1276`, `1356`, `1105`, 107 more values)", + "upstream.response.status_code:keyword - 3 distinct values (`500`, `308`, `200`)", + "upstream.response.time:keyword - 89 distinct values (`3.171`, `1.007`, `1.103`, `0.053`, `4.434`, `3.328`, `1.010`, `3.197`, `3.132`, `2.565`, 79 more values)", + "url.domain:keyword - 2 distinct values (`icons`, ``)", + "url.extension:keyword - 7 distinct values (`css`, `Service/ResolveAll`, `Service/EventStream`, `png`, `svg`, `jpg`, `js`)", + "url.original:keyword - 167 distinct values (`/api/recommendations?productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `/api/recommendations?productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `/api/cart?sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `/api/recommendations?productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `/api/data/`, `/api/cart?sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `/api/recommendations?productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `/api/recommendations?productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `/api/cart?sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, 157 more values)", + "url.path:keyword - 43 distinct values (`/api/products/0PUK6V6EV0`, `/api/products/9SIQT8TOJO`, `/api/products/LS4PSXUNUM`, `/api/data/`, `/api/products/L9ECAV7KIM`, `/api/data`, `/api/products/66VCHSJNUP`, `/api/products/2ZYFJ3GM2N`, `/cart`, `/images/products/NationalParkFoundationExplorascope.jpg`, 33 more values)", + "url.query:keyword - 126 distinct values (`productIds=&sessionId=cc71f7a4-0303-4404-8864-820628e21ca0¤cyCode=USD`, `sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF`, `productIds=&sessionId=389794a9-8298-4921-a2fd-523803ed73c3¤cyCode=`, `sessionId=140befa2-624a-4e98-a1c2-fa9d9ccbfbdd¤cyCode=`, `productIds=&sessionId=4cbd2d72-6719-4619-b0a8-09415f9ea500¤cyCode=USD`, `sessionId=b9f19d90-1824-463c-b9f6-95c894a8fc64¤cyCode=`, `productIds=&sessionId=933d52cf-c574-49e7-8432-86f958764dbe¤cyCode=`, `productIds=&sessionId=213624a6-bf31-46c4-aa67-8e2c102a8763¤cyCode=USD`, `sessionId=221a8b46-29b7-4d66-9536-62e1a0d3ad75¤cyCode=CHF`, `productIds=&sessionId=0c122e28-e8fb-4ab5-9889-ac797b5f17cf¤cyCode=USD`, 116 more values)", + "url.scheme:keyword - 1 distinct values (``)", + "user_agent.name:keyword - 2 distinct values (`Python Requests`, `HeadlessChrome`)", + "user_agent.original:keyword - 2 distinct values (`python-requests/2.31.0`, `Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36`)", + "user_agent.version:keyword - 2 distinct values (`2.31`, `120.0.6099`)" + ] + }, + "ownPatterns": [ + { + "field": "message", + "count": 54850, + "pattern": "HTTP/1.1 Mozilla/5.0 X11 Linux aarch64 AppleWebKit/537.36 KHTML like Gecko HeadlessChrome/120.0.6099.28 Safari/537.36 default-my-otel-demo-frontendproxy-8080", + "regex": ".*?HTTP/1\\.1.+?Mozilla/5\\.0.+?X11.+?Linux.+?aarch64.+?AppleWebKit/537\\.36.+?KHTML.+?like.+?Gecko.+?HeadlessChrome/120\\.0\\.6099\\.28.+?Safari/537\\.36.+?default-my-otel-demo-frontendproxy-8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:54:54 +0000] \"GET /icons/Chevron.svg HTTP/1.1\" 200 805 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 508 0.001 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 810 0.001 200 8693bfefd0668ca27fff0e929785a2c5\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:54:54 +0000] \"GET /icons/Chevron.svg HTTP/1.1\" 200 805 \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/\" \"Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.6099.28 Safari/537.36\" 508 0.001 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 810 0.001 200 8693bfefd0668ca27fff0e929785a2c5\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.057Z", + "lastOccurrence": "2024-11-02T10:56:59.420Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 1385 + }, + { + "x": 1730543820000, + "y": 1172 + }, + { + "x": 1730543850000, + "y": 1520 + }, + { + "x": 1730543880000, + "y": 1312 + }, + { + "x": 1730543910000, + "y": 986 + }, + { + "x": 1730543940000, + "y": 1030 + }, + { + "x": 1730543970000, + "y": 1248 + }, + { + "x": 1730544000000, + "y": 1395 + }, + { + "x": 1730544030000, + "y": 1371 + }, + { + "x": 1730544060000, + "y": 1289 + }, + { + "x": 1730544090000, + "y": 1467 + }, + { + "x": 1730544120000, + "y": 1223 + }, + { + "x": 1730544150000, + "y": 1429 + }, + { + "x": 1730544180000, + "y": 1329 + }, + { + "x": 1730544210000, + "y": 1224 + }, + { + "x": 1730544240000, + "y": 1424 + }, + { + "x": 1730544270000, + "y": 1409 + }, + { + "x": 1730544300000, + "y": 1405 + }, + { + "x": 1730544330000, + "y": 1322 + }, + { + "x": 1730544360000, + "y": 1326 + }, + { + "x": 1730544390000, + "y": 1416 + }, + { + "x": 1730544420000, + "y": 1391 + }, + { + "x": 1730544450000, + "y": 1320 + }, + { + "x": 1730544480000, + "y": 1384 + }, + { + "x": 1730544510000, + "y": 1457 + }, + { + "x": 1730544540000, + "y": 1415 + }, + { + "x": 1730544570000, + "y": 1386 + }, + { + "x": 1730544600000, + "y": 1337 + }, + { + "x": 1730544630000, + "y": 1315 + }, + { + "x": 1730544660000, + "y": 1259 + }, + { + "x": 1730544690000, + "y": 1403 + }, + { + "x": 1730544720000, + "y": 1352 + }, + { + "x": 1730544750000, + "y": 1396 + }, + { + "x": 1730544780000, + "y": 1325 + }, + { + "x": 1730544810000, + "y": 1365 + }, + { + "x": 1730544840000, + "y": 1387 + }, + { + "x": 1730544870000, + "y": 1414 + }, + { + "x": 1730544900000, + "y": 1210 + }, + { + "x": 1730544930000, + "y": 1344 + }, + { + "x": 1730544960000, + "y": 1444 + }, + { + "x": 1730544990000, + "y": 1264 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "dip", + "significance": "medium", + "change_point": 4, + "p_value": 0.00005345763188668862, + "timestamp": "2024-11-02T10:38:30.000Z" + }, + "shortId": "hhpu", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1069, + "pattern": "GET HTTP/1.1 python-requests/2.31.0 default-my-otel-demo-frontendproxy-8080", + "regex": ".*?GET.+?HTTP/1\\.1.+?python-requests/2\\.31\\.0.+?default-my-otel-demo-frontendproxy-8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:55:01 +0000] \"GET /api/data HTTP/1.1\" 200 177 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 177 0.003 200 6cf0fcfd1259f68166701125d3c9761c\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:55:01 +0000] \"GET /api/data HTTP/1.1\" 200 177 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 177 0.003 200 6cf0fcfd1259f68166701125d3c9761c\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:32.391Z", + "lastOccurrence": "2024-11-02T10:56:57.316Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 25 + }, + { + "x": 1730543820000, + "y": 27 + }, + { + "x": 1730543850000, + "y": 26 + }, + { + "x": 1730543880000, + "y": 26 + }, + { + "x": 1730543910000, + "y": 26 + }, + { + "x": 1730543940000, + "y": 27 + }, + { + "x": 1730543970000, + "y": 24 + }, + { + "x": 1730544000000, + "y": 25 + }, + { + "x": 1730544030000, + "y": 22 + }, + { + "x": 1730544060000, + "y": 27 + }, + { + "x": 1730544090000, + "y": 20 + }, + { + "x": 1730544120000, + "y": 23 + }, + { + "x": 1730544150000, + "y": 29 + }, + { + "x": 1730544180000, + "y": 25 + }, + { + "x": 1730544210000, + "y": 23 + }, + { + "x": 1730544240000, + "y": 27 + }, + { + "x": 1730544270000, + "y": 26 + }, + { + "x": 1730544300000, + "y": 27 + }, + { + "x": 1730544330000, + "y": 25 + }, + { + "x": 1730544360000, + "y": 31 + }, + { + "x": 1730544390000, + "y": 21 + }, + { + "x": 1730544420000, + "y": 27 + }, + { + "x": 1730544450000, + "y": 25 + }, + { + "x": 1730544480000, + "y": 29 + }, + { + "x": 1730544510000, + "y": 23 + }, + { + "x": 1730544540000, + "y": 27 + }, + { + "x": 1730544570000, + "y": 24 + }, + { + "x": 1730544600000, + "y": 31 + }, + { + "x": 1730544630000, + "y": 22 + }, + { + "x": 1730544660000, + "y": 24 + }, + { + "x": 1730544690000, + "y": 27 + }, + { + "x": 1730544720000, + "y": 27 + }, + { + "x": 1730544750000, + "y": 27 + }, + { + "x": 1730544780000, + "y": 24 + }, + { + "x": 1730544810000, + "y": 25 + }, + { + "x": 1730544840000, + "y": 26 + }, + { + "x": 1730544870000, + "y": 29 + }, + { + "x": 1730544900000, + "y": 33 + }, + { + "x": 1730544930000, + "y": 34 + }, + { + "x": 1730544960000, + "y": 25 + }, + { + "x": 1730544990000, + "y": 28 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "jmoh", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1068, + "pattern": "10.244.0.38 02 2024 10 0000 GET HTTP 1.1 python requests 2.31.0 default my otel demo frontendproxy 8080 10.244.0.26 8080", + "regex": ".*?10\\.244\\.0\\.38.+?02.+?2024.+?10.+?0000.+?GET.+?HTTP.+?1\\.1.+?python.+?requests.+?2\\.31\\.0.+?default.+?my.+?otel.+?demo.+?frontendproxy.+?8080.+?10\\.244\\.0\\.26.+?8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:55:06 +0000] \"GET /api/cart HTTP/1.1\" 200 24 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 24 0.003 200 33934468a35902ed5b6dde14b1aca6a0\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:55:06 +0000] \"GET /api/cart HTTP/1.1\" 200 24 \"-\" \"python-requests/2.31.0\" 350 0.003 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 24 0.003 200 33934468a35902ed5b6dde14b1aca6a0\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:32.391Z", + "lastOccurrence": "2024-11-02T10:56:57.316Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 25 + }, + { + "x": 1730543820000, + "y": 27 + }, + { + "x": 1730543850000, + "y": 26 + }, + { + "x": 1730543880000, + "y": 26 + }, + { + "x": 1730543910000, + "y": 26 + }, + { + "x": 1730543940000, + "y": 27 + }, + { + "x": 1730543970000, + "y": 24 + }, + { + "x": 1730544000000, + "y": 25 + }, + { + "x": 1730544030000, + "y": 22 + }, + { + "x": 1730544060000, + "y": 27 + }, + { + "x": 1730544090000, + "y": 20 + }, + { + "x": 1730544120000, + "y": 23 + }, + { + "x": 1730544150000, + "y": 29 + }, + { + "x": 1730544180000, + "y": 25 + }, + { + "x": 1730544210000, + "y": 23 + }, + { + "x": 1730544240000, + "y": 27 + }, + { + "x": 1730544270000, + "y": 26 + }, + { + "x": 1730544300000, + "y": 27 + }, + { + "x": 1730544330000, + "y": 25 + }, + { + "x": 1730544360000, + "y": 31 + }, + { + "x": 1730544390000, + "y": 21 + }, + { + "x": 1730544420000, + "y": 27 + }, + { + "x": 1730544450000, + "y": 25 + }, + { + "x": 1730544480000, + "y": 29 + }, + { + "x": 1730544510000, + "y": 23 + }, + { + "x": 1730544540000, + "y": 27 + }, + { + "x": 1730544570000, + "y": 24 + }, + { + "x": 1730544600000, + "y": 31 + }, + { + "x": 1730544630000, + "y": 22 + }, + { + "x": 1730544660000, + "y": 24 + }, + { + "x": 1730544690000, + "y": 27 + }, + { + "x": 1730544720000, + "y": 27 + }, + { + "x": 1730544750000, + "y": 27 + }, + { + "x": 1730544780000, + "y": 24 + }, + { + "x": 1730544810000, + "y": 25 + }, + { + "x": 1730544840000, + "y": 26 + }, + { + "x": 1730544870000, + "y": 29 + }, + { + "x": 1730544900000, + "y": 32 + }, + { + "x": 1730544930000, + "y": 34 + }, + { + "x": 1730544960000, + "y": 25 + }, + { + "x": 1730544990000, + "y": 28 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "vzwi", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 262, + "pattern": "POST HTTP/1.1 python-requests/2.31.0 default-my-otel-demo-frontendproxy-8080", + "regex": ".*?POST.+?HTTP/1\\.1.+?python-requests/2\\.31\\.0.+?default-my-otel-demo-frontendproxy-8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:55:03 +0000] \"POST /api/checkout HTTP/1.1\" 200 984 \"-\" \"python-requests/2.31.0\" 780 0.068 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 984 0.069 200 f87d6397ec8b5740f05f1f3ca07adf50\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:55:03 +0000] \"POST /api/checkout HTTP/1.1\" 200 984 \"-\" \"python-requests/2.31.0\" 780 0.068 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 984 0.069 200 f87d6397ec8b5740f05f1f3ca07adf50\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.220Z", + "lastOccurrence": "2024-11-02T10:56:45.575Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 5 + }, + { + "x": 1730543820000, + "y": 10 + }, + { + "x": 1730543850000, + "y": 14 + }, + { + "x": 1730543880000, + "y": 3 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 12 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 6 + }, + { + "x": 1730544030000, + "y": 7 + }, + { + "x": 1730544060000, + "y": 5 + }, + { + "x": 1730544090000, + "y": 5 + }, + { + "x": 1730544120000, + "y": 5 + }, + { + "x": 1730544150000, + "y": 5 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 9 + }, + { + "x": 1730544240000, + "y": 5 + }, + { + "x": 1730544270000, + "y": 6 + }, + { + "x": 1730544300000, + "y": 14 + }, + { + "x": 1730544330000, + "y": 7 + }, + { + "x": 1730544360000, + "y": 10 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 4 + }, + { + "x": 1730544450000, + "y": 6 + }, + { + "x": 1730544480000, + "y": 6 + }, + { + "x": 1730544510000, + "y": 2 + }, + { + "x": 1730544540000, + "y": 3 + }, + { + "x": 1730544570000, + "y": 9 + }, + { + "x": 1730544600000, + "y": 5 + }, + { + "x": 1730544630000, + "y": 9 + }, + { + "x": 1730544660000, + "y": 3 + }, + { + "x": 1730544690000, + "y": 14 + }, + { + "x": 1730544720000, + "y": 13 + }, + { + "x": 1730544750000, + "y": 2 + }, + { + "x": 1730544780000, + "y": 5 + }, + { + "x": 1730544810000, + "y": 3 + }, + { + "x": 1730544840000, + "y": 7 + }, + { + "x": 1730544870000, + "y": 5 + }, + { + "x": 1730544900000, + "y": 11 + }, + { + "x": 1730544930000, + "y": 11 + }, + { + "x": 1730544960000, + "y": 6 + }, + { + "x": 1730544990000, + "y": 2 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "vdjm", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 263, + "pattern": "10.244.0.38 02 2024 10 0000 api HTTP 1.1 python requests 2.31.0 default my otel demo frontendproxy 8080 10.244.0.26 8080", + "regex": ".*?10\\.244\\.0\\.38.+?02.+?2024.+?10.+?0000.+?api.+?HTTP.+?1\\.1.+?python.+?requests.+?2\\.31\\.0.+?default.+?my.+?otel.+?demo.+?frontendproxy.+?8080.+?10\\.244\\.0\\.26.+?8080.*?", + "sample": "10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n", + "highlight": { + "service.name": [ + "<em>controller</em>" + ], + "resource.attributes.service.name": [ + "<em>controller</em>" + ] + }, + "metadata": { + "message": [ + "10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.220Z", + "lastOccurrence": "2024-11-02T10:56:45.575Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 5 + }, + { + "x": 1730543820000, + "y": 10 + }, + { + "x": 1730543850000, + "y": 14 + }, + { + "x": 1730543880000, + "y": 3 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 12 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 6 + }, + { + "x": 1730544030000, + "y": 7 + }, + { + "x": 1730544060000, + "y": 5 + }, + { + "x": 1730544090000, + "y": 5 + }, + { + "x": 1730544120000, + "y": 5 + }, + { + "x": 1730544150000, + "y": 5 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 9 + }, + { + "x": 1730544240000, + "y": 5 + }, + { + "x": 1730544270000, + "y": 6 + }, + { + "x": 1730544300000, + "y": 14 + }, + { + "x": 1730544330000, + "y": 7 + }, + { + "x": 1730544360000, + "y": 10 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 4 + }, + { + "x": 1730544450000, + "y": 6 + }, + { + "x": 1730544480000, + "y": 6 + }, + { + "x": 1730544510000, + "y": 2 + }, + { + "x": 1730544540000, + "y": 3 + }, + { + "x": 1730544570000, + "y": 9 + }, + { + "x": 1730544600000, + "y": 5 + }, + { + "x": 1730544630000, + "y": 9 + }, + { + "x": 1730544660000, + "y": 3 + }, + { + "x": 1730544690000, + "y": 14 + }, + { + "x": 1730544720000, + "y": 13 + }, + { + "x": 1730544750000, + "y": 2 + }, + { + "x": 1730544780000, + "y": 5 + }, + { + "x": 1730544810000, + "y": 3 + }, + { + "x": 1730544840000, + "y": 7 + }, + { + "x": 1730544870000, + "y": 5 + }, + { + "x": 1730544900000, + "y": 12 + }, + { + "x": 1730544930000, + "y": 11 + }, + { + "x": 1730544960000, + "y": 6 + }, + { + "x": 1730544990000, + "y": 2 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "hxyo", + "relevance": "critical", + "interesting": true + } + ], + "patternsFromOtherEntities": [], + "searches": [ + { + "fragments": [ + "10.244.0.38:8080", + "10.244.0.38", + "8080" + ], + "appearsAs": "This IP address and port are referenced as attributes.source.address, attributes.upstream.address in the investigated entity service.name:controller." + }, + { + "fragments": [ + "http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart", + "/api/cart" + ], + "appearsAs": "These URL fragments appear as attributes.http.request.referrer, attributes.url.original in the investigated entity service.name:controller." + }, + { + "fragments": [ + "/api/cart?sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57¤cyCode=CHF", + "sessionId=1d9f48dd-3313-4f9f-b83b-ff87635eca57", + "currencyCode=CHF" + ], + "appearsAs": "These URL fragments appear as attributes.url.query in the investigated entity service.name:controller." + }, + { + "fragments": [ + "default-my-otel-demo-frontendproxy-8080", + "frontendproxy", + "frontend" + ], + "appearsAs": "These service names appear as attributes.upstream.name in the investigated entity service.name:controller." + }, + { + "fragments": [ + "e6bae77cfb5b598f1d725bc6cc52d06d", + "506" + ], + "appearsAs": " These fragments appear as attributes.http.request.time, attributes.http.response.status_code in the investigated entity service.name:controller." + } + ], + "relatedEntitiesSummaries": [ + "### Related Entities Analysis\n\n#### 1. Entity: service.name:frontend\n- **Indicators (Strength: Average to Strong):**\n - Field: `attributes.upstream.name` in service.name:controller - `default-my-otel-demo-frontendproxy-8080`\n - Field: `kubernetes.pod.name.text` in service.name:frontend - `<em>my</em>-<em>otel</em>-<em>demo</em>-<em>frontend</em>-5bbf4d78bc-qtwdr`\n - URL paths in logs that suggest interactions with the frontend service, specifically `/api/cart`.\n- **Reasoning:** The `frontend` service interacts closely with the `controller` (ingress-nginx-controller). Requests directed to `/api/cart` initiate from `frontendproxy` which routes to `frontend`. Given the high error rate at the `/api/cart` endpoint, the issue might involve downstream calls from `frontend` to dependent services.\n- **Overall Likeliness:** High. The `frontend` service is one of the primary services processing requests (user interactions) that subsequently hit the `controller`.\n\n#### 2. Entity: service.name:cartservice\n- **Indicators (Strength: Strong):**\n - Correspondence of session IDs in the request URLs or logs between controller and cartservice.\n - Mention of cart failures in `frontend` interactions - indicated by error logs involving failed RPC calls to `cartservice`.\n - Logs for service.name:cartservice with messages such as `GetCartAsync called with userId=<em>1d9f48dd</em>`.\n- **Reasoning:** The `/api/cart` endpoint directly involves manipulating or retrieving data from `cartservice`. Given the 500 errors on requests routed via the `controller`, it's likely that `cartservice` might be either causing or being affected by these failures.\n- **Overall Likeliness:** High. Direct involvement of `cartservice` is plausible given the issue is associated specifically with cart interactions.\n\n#### 3. Entity: service.name:frontend-web\n- **Indicators (Strength: Average):**\n - URL referrer and path fragments suggest client-side interactions impact the controller’s ingress.\n - URL fields from both controller logs and frontend-web logs such as `http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart`.\n- **Reasoning:** `frontend-web` represents the client-side application layer. Issues in the client's request construction or timing might be indirectly impacting how the `controller` handles these requests.\n- **Overall Likeliness:** Moderate. While not directly involved in backend processing, interactions originating from the frontend-web could potentially impact the backend flow.\n\n#### 4. Entity: service.name:checkoutservice\n- **Indicators (Strength: Weak):**\n - Shared URL fragments related to the checkout process (`/api/cart` could be an intermediate step).\n - Common use of `sessionId` and `currencyCode` seen in request attributes.\n- **Reasoning:** Though the controller deals directly with cart interactions, completion of cart actions could trigger subsequent processes in `checkoutservice`. Errors during cart operations could thereby propagate issues if mismanaged upstream.\n- **Overall Likeliness:** Low to Moderate. Contextually relevant but perhaps indirectly linked unless specific error propagation is identified.\n\n#### 5. Entity: service.name:coredns\n- **Indicators (Strength: Weak to Average):**\n - DNS logs showing interactions such as `10.244.0.38:45693 - 8080 \"A IN ingress-nginx-controller.ingress-nginx.svc.cluster.local. UDP 74`.\n- **Reasoning:** DNS resolution issues could lead to inability to locate the correct backend service IP for `controller`, causing errors in routing HTTP requests.\n- **Overall Likeliness:** Low. Potential indirect influence but less likely to be the primary cause.\n\n#### Possible Relationship Summary\nGiven these findings:\n\n1. **frontend** and **cartservice** are the most relevant entities with strong indicators of their dependencies and direct involvement in handling requests relevant to the `/api/cart` endpoint. Investigating these services in conjunction with `controller` will likely reveal root causes.\n2. **frontend-web** could be examined for potential client-side initiation issues leading to increased errors, but it remains secondary.\n3. **checkoutservice** may be potentially linked through a sequence of dependencies initiated post-cart operations but is less immediate.\n4. **coredns** could be impacting resolution, yet this remains an unlikely principal cause unless supported by specific DNS errors.\n\nFocus on examining logs and dependencies from `cartservice` and `frontend` to pinpoint exact causes for the reported 500 errors at the `/api/cart` endpoint managed by the controller service.", + "## Analysis and Identification of Related Entities\n\n### Relationship 1: `frontendproxy` (default-my-otel-demo-frontendproxy-8080)\n- **Related entity:** `service.name:frontendproxy`\n- **Indicator strength:** Strong, based on the matching `attributes.upstream.name` field.\n - **Indications:**\n - From `controller` logs: `attributes.upstream.name` = `default-my-otel-demo-frontendproxy-8080`\n - Upstream IP address: `attributes.upstream.address` = `10.244.0.26:8080` in controller logs coinciding with requests that resulted in `500` errors.\n- **Reason:** The `frontendproxy` service routes traffic to the backend services, including the `controller`. Since the `controller` service receives requests and directs traffic to `frontendproxy`, it points to a possible upstream dependency causing the 500 errors during the requests to `/api/cart`.\n- **Overall likeliness:** High. This entity is directly involved since it routes traffic within the system, and its downstream performance or errors reflect on the `controller`.\n\n### Relationship 2: `frontend`\n- **Related entity:** `service.name:frontend`\n- **Indicator strength:** Moderate, observing the infrastructure context and the dependency chain.\n - **Indications:** \n - The `frontend` service is called by the `frontendproxy`, which is indicated as the `attributes.upstream.name` in `controller` logs.\n- **Reason:** In the context provided, the `frontend` communicates with other backend services to process user interactions and might be an upstream dependency for the `controller`. The problem might cascade from `frontendproxy` to `frontend`.\n- **Overall likeliness:** High. This service is critical in handling user interactions, and problems here could cause issue propagation to `controller`.\n\n### Relationship 3: `cartservice`\n- **Related entity:** `service.name:cartservice`\n- **Indicator strength:** Moderate, based on its role in the architecture and likely correlation.\n - **Indications:**\n - The `cartservice` handles shopping cart actions which map the `controller`'s `/api/cart` endpoint.\n - **Reason:** If the `cartservice` has issues, they would cascade to the `controller` /api/cart endpoint that depends on this service for cart management functions.\n- **Overall likeliness:** High. It closely correlates with the endpoint's functionality and possible 500 errors due to backend service inconsistencies.\n\n### Relationship 4: `currencyservice`\n- **Related entity:** `service.name:currencyservice`\n- **Indicator strength:** Weak, contextual dependency but crucial interplay with `cart` operations.\n - **Indications:**\n - Handling currency conversions, indirectly connected to cart operations.\n- **Reason:** The issues might arise if currency conversion fails during cart operations, contributing to the 500 errors in the `controller`.\n- **Overall likeliness:** Moderate. Essential for part of the request chains during cart operations, but primary errors might occur upstream.\n\n### Relationship 5: `productcatalogservice`\n- **Related entity:** `service.name:productcatalogservice`\n- **Indicator strength:** Weak, as no direct log correlation but relevant in the context.\n - **Indications:**\n - Provides product data, indirectly required during cart operations.\n- **Reason:** Cart operations fetching/validating product data might fail, contributing to the `controller` errors when /api/cart requests involve fetching product data.\n- **Overall likeliness:** Moderate. Possible issues here can impact `cartservice` processes and propagate as 500 errors.\n\n### Relationship 6: `frauddetectionservice`\n- **Related entity:** `service.name:frauddetectionservice`\n- **Indicator strength:** Weak, speculative and based more on potential correlation.\n - **Indications:**\n - No specific logs point directly; contextual relevance due to transaction handling.\n- **Reason:** If fraud detection triggers false flags, it can affect cart transactions.\n- **Overall likeliness:** Low. Unlikely direct contributor and more as a consequential involvement in transaction failures.\n\n### Summary\n\nThe `frontendproxy`, `frontend`, and `cartservice` are the most probable related entities with high relevance to the errors indicated in the `controller` service. Investigations should focus on these first, focusing on log patterns and errors cascading through these entities causing the 500 errors on `/api/cart`. Indirect relations like `currencyservice`, `productcatalogservice`, and `frauddetectionservice` can also be explored as part of the broader context.", + "During the investigation of the alert for the `controller` service, we are identifying possible relationships to other entities. We will meticulously examine the evidence from logs, traces, and other relevant data to uncover dependencies and potential causes for the high number of 500 errors on the `/api/cart` endpoint.\n\n### Highly Relevant Entities and Relationships\n\n#### 1. Entity: service.name:frontendproxy\n\n- **Indicators of Evidence**\n - **Strong Indicator**: `attributes.upstream.name: default-my-otel-demo-frontendproxy-8080`\n - **Field Values in Investigated Entity (`controller`)**:\n - `\"attributes.upstream.name\": \"default-my-otel-demo-frontendproxy-8080\"`\n - `\"attributes.upstream.response.status_code\": [\"500\", \"200\", \"308\"]`\n - **Fingerprinting Evidence**:\n - `\"message\": \"10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \\\"POST /api/cart HTTP/1.1\\\" 500 32 \\\"-\\\" \\\"python-requests/2.31.0\\\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\"`\n\n- **Relationship and Context**\n - The `frontendproxy` service acts as the reverse proxy, routing incoming HTTP traffic to different backend services, including the `controller`. The errors appearing in the `controller` log indicate communication issues between the `controller` and the `frontendproxy`.\n\n- **Overall Likeliness**: High\n - Given the primary role of the `frontendproxy` in routing traffic to `controller`, coupled with the direct evidence in the logs, this entity is crucial to the situation at hand.\n\n#### 2. Entity: service.name:frontend\n\n- **Indicators of Evidence**\n - **Average Indicator**: `features.service.name: frontend`\n - **Field Values in Investigated Entity (`controller`)**:\n - `\"attributes.http.request.origin\": \"http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart\"`\n - `\"/api/cart` endpoint related queries`\n\n- **Relationship and Context**:\n - The `frontend` service handles key operations related to user interactions before requests are passed to various backend services, including the `controller`. Issues in `frontend`, like poor handling of requests or incorrect data forwarding, might cascade downstream, resulting in 500 errors in the `controller`.\n\n- **Overall Likeliness**: Medium to High\n - Given the data pathway from user interactions handled by `frontend`, it’s essential to determine if `frontend` anomalies are contributing to the failure in `controller`.\n\n#### 3. Entity: service.name:cartservice\n\n- **Indicators of Evidence**\n - **Average Indicator**: `/api/cart` requests typically involving `cartservice`\n - **Field Values in Investigated Entity (`controller`)**:\n - `500 errors at \"/api/cart\"`\n\n- **Relationship and Context**:\n - The `cartservice` directly manages shopping cart operations over the gRPC protocol. While the HTTP API from `controller` might indicate communication failures with `cartservice`, these errors could also originate from improper data requests or transaction handling within `cartservice`.\n\n- **Overall Likeliness**: High\n - Investigating the interaction with `cartservice` can help distinguish if business logic errors or miscommunication between services lead to repeated 500 errors.\n\n### Moderately Relevant Entities\n\n#### 4. Entity: service.name:loadgenerator\n\n- **Indicators of Evidence**\n - **Weak Indicator**: Simulated high traffic which might put strain on other services causing errors.\n - **Field Values in Investigated Entity (`controller`)**:\n - General logged high traffic instances or increased load around the alert time.\n\n- **Relationship and Context**:\n - The `loadgenerator` mimics external user traffic managed by the Ingress and ultimately passed through nodes like `controller`. Excessive load can manifest as backend service overloads or timeouts, indirectly causing 500 errors in `controller`.\n\n- **Overall Likeliness**: Medium\n - Given the traffic simulation aspect, its role is probable but direct correlation to specific error occurrences in `controller` needs corroboration with other data points.\n\n### Less Likely but Contextually Relevant Entities\n\n#### 5. Entity: service.name:etcd\n\n- **Indicators of Evidence**\n - **Weak Indicator**: General mention in logs for Ingress control plane activity\n - **Field Values in Investigated Entity (`controller`)**:\n - `\"response count\": 0`, signifying Ingress data handling might be amiss during high traffic\n\n- **Relationship and Context**:\n - Possible indirect impact wherein control plane malfunctions or data inconsistencies in the `etcd` state can propagate as issues dispersed across services interacting via Ingress, including `controller`.\n\n- **Overall Likeliness**: Medium\n - This needs verifying integration with upstream Ingress state logs to validate contributions to observed `controller` issues.\n\n### Further Investigations and Likelihood Summary\n\nBased on logs and identified relationships, we will prioritize looking into:\n\n1. **Frontendproxy** - Checking its health, routing efficiency, and connections to `controller`.\n2. **Frontend** - Verifying its data handling during user interactions that lead to API cart errors.\n3. **Cartservice** - Ensuring logical transactions and gRPC communications, ruling out core service bugs.\n\nWe will cross-reference error logs, API traces, and dependency interactions tightly intertwined with the `controller` to form a comprehensive approach to resolution." + ], + "kbEntries": [ + { + "id": "System architecture", + "text": "The architecture described here outlines a microservices-based system, where each service is implemented in a distinct programming language and communicates via gRPC, HTTP, or TCP. This system is designed to handle simulated user traffic, supported by a variety of interconnected services and components.\n\n### System Architecture\n\n1. **`loadgenerator`** - Simulates external user traffic by sending HTTP requests, which are managed by an Nginx ingress controller. This ingress directs traffic to the `frontendproxy` service.\n\n2. **`frontendproxy` (Envoy)** - Acts as a reverse proxy, routing incoming traffic from `loadgenerator` to `frontend`.\n\n3. **`frontend` (Node.js)** - The core service for user interactions, receiving HTTP traffic from `frontendproxy` and interfacing with various backend services to fulfill requests.\n\n4. **`frontend-web` (RUM)** - A Real User Monitoring (RUM) layer that runs in the user's browser, enabling insights into end-user experiences and frontend performance.\n\n5. **`adservice`** - Delivers advertisements to the `frontend` using gRPC, enhancing the user experience with relevant ad content.\n\n6. **`cartservice`** - Manages shopping cart data, including adding and removing items. It communicates over gRPC and leverages a Redis cache for data persistence.\n\n7. **`currencyservice`** - Handles currency conversions and facilitates interactions between `cartservice` and `checkoutservice` over gRPC.\n\n8. **`checkoutservice`** - Coordinates the checkout process, calling various services for payments, shipping, and emails. It utilizes both gRPC and HTTP protocols to aggregate the necessary information for order completion.\n\n9. **`emailservice`** - Sends order confirmation emails to users via gRPC, triggered by interactions with `checkoutservice`.\n\n10. **`productcatalogservice`** - Maintains the product catalog, storing details about available items and providing this data to other services via gRPC.\n\n11. **`recommendationservice`** - Generates personalized product recommendations, accessed by `frontend` over gRPC.\n\n12. **`shippingservice`** - Manages shipping information, providing essential data to `checkoutservice` over gRPC.\n\n13. **`quoteservice`** - Supplies shipping quotes over HTTP, which are accessed by `shippingservice` to estimate shipping costs.\n\n14. **`paymentservice`** - Processes payment transactions through gRPC, enabling secure and efficient payments for `checkoutservice`.\n\n15. **`accountingservice`** - Responsible for recording transactions, it connects to a Kafka queue and interacts over TCP.\n\n16. **`frauddetectionservice`** - Monitors orders for potential fraud, also interfacing with the Kafka queue over TCP to receive relevant transaction data.\n\n17. **`imageprovider` (Nginx)** - Serves static images for the frontend interface, accessible over HTTP.\n\n18. **`queue` (Kafka)** - Acts as a central message broker, facilitating communication between `accountingservice` and `frauddetectionservice`.\n\n### Key Components\nThe system is structured to enable robust, distributed communication across services, allowing each component to focus on a specific aspect of the user experience or business logic. The ingress controller, in particular, plays a critical role in directing traffic, ensuring that incoming requests from `loadgenerator` are correctly routed through `frontendproxy` and into the system’s core services.\n\nThis architecture ensures that the system can handle high traffic loads and provides a modular, flexible framework to meet user demands while monitoring for performance and security.\n", + "tokens": 733, + "score": 3 + } + ] + }, + "entity": { + "service.name": "controller" + }, + "relatedEntities": [ + { + "entity": { + "service.name": "frontend" + }, + "reason": "The frontend service interacts closely with the controller (ingress-nginx-controller). Requests directed to /api/cart initiate from frontendproxy which routes to frontend. Given the high error rate at the /api/cart endpoint, the issue might involve downstream calls from frontend to dependent services.", + "confidence": "high" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "The /api/cart endpoint directly involves manipulating or retrieving data from cartservice. Given the 500 errors on requests routed via the controller, it's likely that cartservice might be either causing or being affected by these failures.", + "confidence": "high" + }, + { + "entity": { + "service.name": "frontend-web" + }, + "reason": "URL referrer and path fragments suggest client-side interactions impacting the controller's ingress. Issues in the client's request construction or timing might be indirectly impacting how the controller handles these requests.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "checkoutservice" + }, + "reason": "Though the controller deals directly with cart interactions, completion of cart actions could trigger subsequent processes in checkoutservice. Errors during cart operations could thereby propagate issues if mismanaged upstream.", + "confidence": "low" + }, + { + "entity": { + "service.name": "coredns" + }, + "reason": "DNS resolution issues could lead to inability to locate the correct backend service IP for controller, causing errors in routing HTTP requests.", + "confidence": "low" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The `frontend` service is called by the `frontendproxy`, which is indicated as the `attributes.upstream.name` in `controller` logs. In the context provided, the `frontend` communicates with other backend services to process user interactions and might be an upstream dependency for the `controller`. The problem might cascade from `frontendproxy` to `frontend`.", + "confidence": "high" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "The `cartservice` handles shopping cart actions which map the `controller`'s `/api/cart` endpoint. If the `cartservice` has issues, they would cascade to the `controller` /api/cart endpoint that depends on this service for cart management functions.", + "confidence": "high" + }, + { + "entity": { + "service.name": "currencyservice" + }, + "reason": "Handling currency conversions, indirectly connected to cart operations. The issues might arise if currency conversion fails during cart operations, contributing to the 500 errors in the `controller`.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "frauddetectionservice" + }, + "reason": "No specific logs point directly; contextual relevance due to transaction handling. If fraud detection triggers false flags, it can affect cart transactions.", + "confidence": "low" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "The `cartservice` directly manages shopping cart operations over the gRPC protocol, and errors here could lead to repeated 500 errors in the `controller`.", + "confidence": "high" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The `frontend` service handles user interactions that are passed to the `controller`. Issues in `frontend` could lead to failures in `controller`, resulting in 500 errors.", + "confidence": "medium to high" + }, + { + "entity": { + "service.name": "loadgenerator" + }, + "reason": "The `loadgenerator` simulates high user traffic which might strain other services and indirectly cause 500 errors in the `controller`.", + "confidence": "medium" + }, + { + "entity": { + "service.name": "etcd" + }, + "reason": "As a control plane activity tracker for Ingress, indirect impacts from `etcd` inconsistencies can propagate as issues in services interacting via Ingress, including `controller`.", + "confidence": "medium" + } + ], + "summary": "### Characteristics of the `controller` Entity\n\n**1. Infrastructure & Environment:**\n\nThe `controller` service is deployed within a Kubernetes environment, specifically in the `ingress-nginx` namespace. The service is associated with a `controller` container running within the `ingress-nginx-controller-bc57996ff-r6blf` pod. This pod is scheduled on a node identified as `minikube`, and the service is part of the `ingress-nginx-controller` deployment. Additionally, the infrastructure is based on an ARM64 architecture, running Ubuntu 24.04.1 LTS, with deployment environment set to `opentelemetry-demo`.\n\n**2. Communication Characteristics:**\n\nThe `controller` service functions as an Ingress controller, managing incoming traffic and routing it to backend services. It processes HTTP requests, typically version 1.1, and communicates with other services via HTTP protocols. Key endpoints involved in the communication include:\n- Inbound requests are received at endpoints like `/api/cart` and `/api/checkout`.\n- Outbound requests are routed primarily to the `frontendproxy` service, evidenced by the upstream address `10.244.0.26:8080`.\n\nThe service handles both `GET` and `POST` requests, and its communication paths include requests from user agents like \"HeadlessChrome\" and \"python-requests\".\n\n**3. Context of Entity in Investigation:**\n\n**Reason for Investigation:**\nThe `controller` service is currently under investigation due to an alert triggered by a high number of 500 errors (98.78% error rate) occurring at the `/api/cart` endpoint. The significant spike in error rates is concerning and suggests a potential issue within the service or its interaction with dependencies.\n\n**Relation to Other Entities:**\nThe high error rates on the `controller` are likely impacting the overall user experience of the application, notably through the `/api/cart` functionality, which interacts with the `cartservice`. As the `controller` service forwards requests to the `frontendproxy`, which in turn interacts with various backend services like `cartservice`, `checkoutservice`, `currencyservice`, and others, the ripple effect of these errors might be felt across multiple services in the architecture. This interconnectedness necessitates thorough investigation of `controller's` logs and error patterns to isolate the root cause and mitigate the disruption in the flow of HTTP requests.\n\nBy understanding the behavior and interaction of the `controller` service within the broader microservices architecture, we aim to identify and resolve the underlying issue causing the increase in 500 errors. This involves examining logs for patterns, determining if recent changes or specific conditions triggered the fault, and analyzing dependencies that could contribute to the error rates observed. This step is integral to restoring normal operation and maintaining service reliability and user satisfaction.\n\n### Analysis of Log Patterns for service.name:controller\n\n#### Pattern Group: Request Errors\n- **Pattern:**\n ```\n .*?10\\\\.244\\\\.0\\\\.38.+?02.+?2024.+?10.+?0000.+?api.+?HTTP.+?1\\\\.1.+?python.+?requests.+?2\\\\.31\\\\.0.+?default.+?my.+?otel.+?demo.+?frontendproxy.+?8080.+?10\\\\.244\\\\.0\\\\.26.+?8080.*?\n ```\n - **Sample:**\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n - **Description:** This pattern represents request logs where an HTTP POST request to the `/api/cart` endpoint resulted in a `500 Internal Server Error`. The requests are from a client using `python-requests/2.31.0`.\n\n- **Count:** 263 occurrences\n\n- **Timeseries Analysis:**\n - **Trend:** The number of occurrences show fluctuation with no significant change in the pattern.\n - **Log Counts:** \n - Example timestamps and counts:\n - `2024-11-02T10:56:00.000Z: 6`\n - `2024-11-02T10:56:30.000Z: 2`\n - `2024-11-02T10:57:00.000Z: 0`\n\n### Summary\nBased on the provided logs patterns, the `controller` service is experiencing a high number of `500 Internal Server Errors` when handling POST requests to the `/api/cart` endpoint. This is evident from the consistent error logs observed at different timestamps. The alert threshold breach likely correlates with these error occurrences.\n\nNo other unusual patterns such as connection issues, startup messages, or garbage collection messages were identified in the logs around the error events. Further investigation on the backend or potential dependency issues (e.g., `cartservice`) might be needed to determine the exact cause of these errors.\n\n### Timeline of significant events\n\n- **2024-11-02T10:56:42.498Z**\n - **Alert Triggered**: High number of 500 errors for the /api/cart endpoint. Error rate is 98.78%, above the threshold of 1% over a 1-minute duration.\n \n- **2024-11-02T10:56:00.000Z**\n - **Log Entry**: 6 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - **Example Log**:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:08 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n \n- **2024-11-02T10:56:30.000Z**\n - **Log Entry**: 2 occurrences of HTTP POST requests to the `/api/cart` endpoint resulting in `500 Internal Server Error`.\n - **Example Log**:\n ```\n 10.244.0.38 - - [02/Nov/2024:10:56:35 +0000] \"POST /api/cart HTTP/1.1\" 500 32 \"-\" \"python-requests/2.31.0\" 506 0.002 [default-my-otel-demo-frontendproxy-8080] [] 10.244.0.26:8080 32 0.002 500 e6bae77cfb5b598f1d725bc6cc52d06d\n ```\n\n### Context and reasoning\n\nThe `controller` service plays a critical role in handling incoming HTTP requests within the Kubernetes environment, specifically acting as an Ingress controller within the `ingress-nginx` namespace. The recent alert, triggered by a high number of 500 errors, indicates a significant disruption in the normal operations of the `controller` service, particularly impacting the `/api/cart` endpoint. The log entries leading up to and following the alert highlight a pattern of consistent `500 Internal Server Error` responses, specifically around the timestamp in question.\n\nThe pattern group identified, related to request errors, shows repeated failures for HTTP POST requests from a client using `python-requests/2.31.0`, likely directed towards the `cartservice` via the `frontendproxy`. This high error rate suggests an underlying issue either within the `controller` service itself, its communication path to the `frontendproxy`, or potentially further downstream with the backend services like `cartservice`.\n\nNo other unusual log patterns, such as connection issues or any system degradation messages were noted, indicating the problem is likely concentrated around the interaction between `controller` and its immediate dependencies rather than a broader system-wide issue. By correlating the timestamps and repeated error logs, a clear link can be drawn between the `500 Internal Server Error` responses and the timeline, further supporting the hypothesis of a specific fault affecting the `/api/cart` endpoint.\n\nFurther investigation into the dependencies of the `controller` service, especially focusing on the interactions with the `frontendproxy` and subsequently `cartservice`, is warranted to isolate and rectify the root cause of these error patterns." + } + ] + }, + "role": "tool", + "toolCallId": "call_DB13TclS3Gc9zUgCrWLrvDuu" + }, + { + "role": "assistant", + "content": "", + "toolCalls": [ + { + "toolCallId": "call_kstyq8qXoaWRX4CJQkC6wbhR", + "function": { + "name": "investigateEntity", + "arguments": { + "context": "As the downstream service handling /api/cart requests, issues here would directly contribute to error patterns in controller. High errors were observed in the controller for POST requests to the /api/cart endpoint resulting in '500 Internal Server Error'. Starting error rate was significantly high (98.78%), around 2024-11-02T10:56:42.498Z.", + "entity": { + "field": "service.name", + "value": "cartservice" + } + } + } + }, + { + "toolCallId": "call_zNoUwjdb2DJhxjhshLkgqlZw", + "function": { + "name": "investigateEntity", + "arguments": { + "context": "Requests are routed through this service to cartservice. Any routing or network issues here might also contribute to the 500 errors seen in controller. High error rate (98.78%) in controller for POST requests to the /api/cart endpoint starting at 2024-11-02T10:56:42.498Z.", + "entity": { + "field": "service.name", + "value": "frontend" + } + } + } + } + ] + }, + { + "name": "investigateEntity", + "role": "tool", + "toolCallId": "call_zNoUwjdb2DJhxjhshLkgqlZw", + "response": { + "entity": { + "service.name": "frontend" + }, + "relatedEntities": [ + { + "entity": { + "service.name": "controller" + }, + "reason": "`controller` service handles endpoints like `/api/cart`, which corresponds to failed transactions. They share common IP address and port patterns, indicating network interaction.", + "confidence": "very high" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "`frontend` service attempts to interact with `cartservice`. Connection errors from `frontend` indicate it is calling `cartservice` and facing issues getting responses, potentially causing the 500 errors.", + "confidence": "very high" + }, + { + "entity": { + "service.name": "frontend-web" + }, + "reason": "`frontend-web` captures real user interactions with the `/api/cart` endpoint. Helps trace the errors and delays externally perceived by users.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "coredns" + }, + "reason": "`coredns` is responsible for DNS resolution within the cluster and issues here could result in connectivity problems seen in `frontend`.", + "confidence": "moderate" + } + ], + "summary": "### Investigation of Entity `service.name:frontend`\n\n#### Context of Investigation\n\nThe `frontend` service is critical in this investigation due to its role in the overall request handling and the observed high error rate (98.78%) in the `controller` service for POST requests to the `/api/cart` endpoint. This issue began at `2024-11-02T10:56:42.498Z`. The `frontend` service routes requests to `cartservice`, a key interaction in this error occurrence.\n\n#### Infrastructure & Environment\n\n- **Environment**: The `frontend` operates within the `opentelemetry-demo` deployment environment.\n- **Deployment**: It is deployed on Kubernetes (k8s), specifically within the `default` namespace. \n- **Pod Information**: The pod name is `my-otel-demo-frontend-5bbf4d78bc-qtwdr`, on the `minikube` node. Each pod has a unique UID (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`), with logs stored at `/var/log/pods/`.\n- **Resource Attributes**: Hosts `Apple` Arm64 architecture processor (`host.cpu.vendor.id: Apple`), running `Ubuntu 24.04.1 LTS (Noble Numbat)`, indicating a Linux-based system.\n\n#### Communication Characteristics \n\n- **Protocols**: \n - The `frontend` service communicates primarily using HTTP for inbound requests and gRPC for backend service interactions. \n - gRPC is specifically used when the `frontend` communicates with `cartservice`, highlighted by recorded RPC errors in the logs.\n- **Endpoints**:\n - The `frontend` gets requests from `frontendproxy` (Envoy), acting as the reverse proxy.\n - The service then routes these requests to different backend services, including `cartservice`, via gRPC.\n - The critical IP noted in logs is `10.110.191.164:8080`, pointing to a potential endpoint for the `cartservice`.\n\n#### Context of Entity in Investigation\n\n- **Reason for Investigation**: The `frontend` service is under scrutiny due to its pivotal role in processing and routing incoming user requests. Any disruption in its communication or processing mechanism directly affects the functionality of connected services, notably `cartservice`, leading to high error rates observed in the `controller`.\n- **Relation to Other Entities**:\n - **Previous Entity**: `controller` - The `controller` service logs indicate a high number of 500 errors were triggered during POST requests to `/api/cart`.\n - **Dependencies**: `frontend` relies on successful communication with `cartservice` to fulfill these cart-related requests.\n- **Architectural Role**: The `frontend` is the nucleus for user interactions within this microservices architecture. Any network or communication issue in `frontend` can cascade, influencing its backend dependencies like `cartservice` and leading to broader service disruptions.\n\nThis comprehensive analysis of the `frontend` service’s infrastructure, communication protocols, and its investigative context emphasizes its critical position in the service chain responsible for the reported errors. Further scrutiny of the communication logs, particularly focusing on the gRPC interactions with `cartservice`, is essential to identify and mitigate the root cause of these failures.\n\nObservations for service `frontend`.\n\n### Connection Issues to Upstream Dependency\n\n1. **Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Sample**: \"14 UNAVAILABLE: No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080 (2024-11-02T10:56:12.143Z)\"\n - **Timeseries Observations**: \n - No occurrences before 2024-11-02T10:55:30.000Z.\n - Sharp increase at 2024-11-02T10:55:30.000Z (291 occurrences).\n - Further increase at 2024-11-02T10:56:00.000Z (381 occurrences).\n - Next timestamp at 2024-11-02T10:57:00.000Z showing a return to 0 occurrences.\n\n2. **Pattern**: \"INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"\n - **Sample**: \"13 INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"\n - **Timeseries Observations**:\n - No occurrences before 2024-11-02T10:55:30.000Z.\n - Slight increase at 2024-11-02T10:55:30.000Z (2 occurrences).\n - One more occurrence at 2024-11-02T10:56:00.000Z (1 occurrence).\n - No occurrences after 2024-11-02T10:56:30.000Z.\n\nThe significant spike in connection errors starting from 2024-11-02T10:55:30.000Z aligns with the high error rate in the `controller` service, suggesting a strong correlation between these established connection issues in the `frontend` service and the 500 errors seen in the `controller` service for POST requests to the `/api/cart` endpoint around the same time.\n\n### Possibly Relevant Log Patterns from coredns\n\n1. **Pattern**: \"INFO 10.244.0.26 AAAA IN my-otel-demo-frontend udp 39 false 512 NXDOMAIN qr,rd,ra 39\"\n - **Sample**: \"[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-frontend. udp 39 false 512\" NXDOMAIN qr,rd,ra 39 0.003716084s\"\n - **Timeseries Observations**:\n - Frequent steady occurrences of 6 events every 30 seconds.\n - No notable changes or spikes coinciding with the connection issues observed in the `frontend` service.\n\nFrom these observations, it appears that the connection refusal errors in the `frontend` service are likely caused by issues in communication with the `cartservice`, potentially as a result of intermittent network disruptions or dependency service failures at the IP 10.110.191.164. Further investigation should focus on the health and connectivity status of the `cartservice` around the specified time period.\n\n### Timeline of Significant Events\n\n1. **2024-11-02T10:55:30.000Z**\n - **Event**: Sharp increase in connection error logs.\n - **Log Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Details**: 291 occurrences reported.\n\n2. **2024-11-02T10:55:30.000Z**\n - **Event**: Appearance of an internal error in accessing cart services.\n - **Log Pattern**: \"INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error\"\n - **Details**: 2 occurrences reported.\n\n3. **2024-11-02T10:56:00.000Z**\n - **Event**: Further increase in connection error logs.\n - **Log Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Details**: 381 occurrences reported.\n\n4. **2024-11-02T10:56:00.000Z**\n - **Event**: Additional occurrence of an internal error in accessing cart services.\n - **Log Pattern**: \"INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error\"\n - **Details**: 1 occurrence reported.\n\n5. **2024-11-02T10:56:42.498Z**\n - **Event**: High error rate (98.78%) in the `controller` service for POST requests to the `/api/cart` endpoint begins.\n - **Details**: Corresponds to the timing of observed spikes in connection errors in the `frontend` service.\n\n6. **2024-11-02T10:57:00.000Z**\n - **Event**: Connection error logs return to zero occurrences.\n - **Log Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Details**: 0 occurrences reported.\n\n### Context and Reasoning\n\nThe `frontend` service is critical in this investigation due to its role in routing requests to the `cartservice`. The high error rates observed in the `controller` service's POST requests to the `/api/cart` endpoint started precisely at 2024-11-02T10:56:42.498Z, which is within the timeframe when the `frontend` service experienced significant connection issues with the `cartservice`.\n\nUpon analyzing log patterns, it is evident that the communication disruptions between the `frontend` service and the `cartservice` began at 2024-11-02T10:55:30.000Z with a sharp increase in connection errors, and these errors persisted until approximately 2024-11-02T10:57:00.000Z. During this period, numerous `ECONNREFUSED` errors were logged, indicating the `frontend` service's inability to establish a connection to the `cartservice` (IP 10.110.191.164:8080). This aligns with the timeline of the high error rates in the `controller` service, suggesting a direct correlation.\n\nFurthermore, the internal errors logged by the `frontend` service related to RPC errors and failed attempts to get the user cart during checkout reaffirm these connection problems. These errors underscore an impaired communication pathway to the `cartservice`, affecting the `controller` service's ability to process POST requests to the `/api/cart` endpoint.\n\nTherefore, the evidence strongly indicates that network or connection failures between the `frontend` service and its upstream dependency, `cartservice`, are the principal cause of the cascading 500 errors seen in the `controller` service. This highlights the critical position of the `frontend` service in ensuring stable communication pathways within the microservice architecture." + }, + "data": { + "attachments": { + "alerts": [], + "slos": [], + "analysis": { + "total": 98017, + "sampled": 1000, + "fields": [ + "@timestamp:date - 327 distinct values", + "app.label.component:keyword - 1 distinct values (`frontend`)", + "attributes.log.file.path.text:text - 1 distinct values (`/var/log/pods/default_my-otel-demo-frontend-5bbf4d78bc-qtwdr_a9fcfff9-3524-411e-8ac9-4e4341c1a121/frontend/0.log`)", + "attributes.log.file.path:keyword - 1 distinct values (`/var/log/pods/default_my-otel-demo-frontend-5bbf4d78bc-qtwdr_a9fcfff9-3524-411e-8ac9-4e4341c1a121/frontend/0.log`)", + "attributes.log.iostream:keyword - 1 distinct values (`stderr`)", + "body.text:text - 36 distinct values (` code: 13,\n`, ` details: 'cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"',\n`, 34 more values)", + "data_stream.dataset:keyword - 1 distinct values (`generic.otel`)", + "data_stream.namespace:keyword - 1 distinct values (`default`)", + "data_stream.type:keyword - 1 distinct values (`logs`)", + "deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "dropped_attributes_count:long - 1 distinct values (`0`)", + "event.dataset:keyword - 1 distinct values (`generic.otel`)", + "host.arch:keyword - 1 distinct values (`arm64`)", + "host.architecture:keyword - 1 distinct values (`arm64`)", + "host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "host.cpu.family:keyword - 1 distinct values (``)", + "host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "host.cpu.model.name:keyword - 1 distinct values (``)", + "host.cpu.stepping:keyword - 1 distinct values (`0`)", + "host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "host.os.full:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "host.os.platform:keyword - 1 distinct values (`linux`)", + "k8s.container.name:keyword - 1 distinct values (`frontend`)", + "k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "k8s.deployment.name:keyword - 1 distinct values (`my-otel-demo-frontend`)", + "k8s.namespace.name:keyword - 1 distinct values (`default`)", + "k8s.node.name:keyword - 1 distinct values (`minikube`)", + "k8s.pod.name:keyword - 1 distinct values (`my-otel-demo-frontend-5bbf4d78bc-qtwdr`)", + "k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T09:00:25Z`)", + "k8s.pod.uid:keyword - 1 distinct values (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`)", + "kubernetes.deployment.name:keyword - 1 distinct values (`my-otel-demo-frontend`)", + "kubernetes.namespace:keyword - 1 distinct values (`default`)", + "kubernetes.node.name:keyword - 1 distinct values (`minikube`)", + "kubernetes.pod.name:keyword - 1 distinct values (`my-otel-demo-frontend-5bbf4d78bc-qtwdr`)", + "kubernetes.pod.uid:keyword - 1 distinct values (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`)", + "log.file.path:keyword - 1 distinct values (`/var/log/pods/default_my-otel-demo-frontend-5bbf4d78bc-qtwdr_a9fcfff9-3524-411e-8ac9-4e4341c1a121/frontend/0.log`)", + "log.iostream:keyword - 1 distinct values (`stderr`)", + "message:text - 36 distinct values (` code: 13,\n`, ` details: 'cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"',\n`, 34 more values)", + "observed_timestamp:date_nanos - 1000 distinct values (`2024-11-02T10:56:50.564274379Z`, `2024-11-02T10:55:46.563453752Z`, `2024-11-02T10:56:52.76272763Z`, `2024-11-02T10:56:14.764728626Z`, `2024-11-02T10:55:51.964080879Z`, `2024-11-02T10:55:51.764216463Z`, `2024-11-02T10:56:50.564063629Z`, `2024-11-02T10:55:38.563141804Z`, `2024-11-02T10:55:53.963540672Z`, `2024-11-02T10:56:32.762493176Z`, 990 more values)", + "os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.app.label.component:keyword - 1 distinct values (`frontend`)", + "resource.attributes.deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "resource.attributes.host.arch:keyword - 1 distinct values (`arm64`)", + "resource.attributes.host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "resource.attributes.host.cpu.family:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "resource.attributes.host.cpu.model.name.text:text - 1 distinct values (``)", + "resource.attributes.host.cpu.model.name:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.stepping:keyword - 1 distinct values (`0`)", + "resource.attributes.host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "resource.attributes.host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "resource.attributes.host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "resource.attributes.host.name:keyword - 1 distinct values (`otel-daemonset-opentelemetry-collector-agent-7jlpk`)", + "resource.attributes.k8s.container.name.text:text - 1 distinct values (`frontend`)", + "resource.attributes.k8s.container.name:keyword - 1 distinct values (`frontend`)", + "resource.attributes.k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "resource.attributes.k8s.deployment.name:keyword - 1 distinct values (`my-otel-demo-frontend`)", + "resource.attributes.k8s.namespace.name:keyword - 1 distinct values (`default`)", + "resource.attributes.k8s.node.name:keyword - 1 distinct values (`minikube`)", + "resource.attributes.k8s.pod.name:keyword - 1 distinct values (`my-otel-demo-frontend-5bbf4d78bc-qtwdr`)", + "resource.attributes.k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T09:00:25Z`)", + "resource.attributes.k8s.pod.uid:keyword - 1 distinct values (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`)", + "resource.attributes.os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "resource.attributes.os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.service.name.text:text - 1 distinct values (`frontend`)", + "resource.attributes.service.name:keyword - 1 distinct values (`frontend`)", + "resource.dropped_attributes_count:long - 1 distinct values (`0`)", + "resource.schema_url:keyword - 1 distinct values (`https://opentelemetry.io/schemas/1.6.1`)", + "scope.dropped_attributes_count:long - 1 distinct values (`0`)", + "service.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "service.name:keyword - 1 distinct values (`frontend`)", + "severity_number:byte - 1 distinct values (`0`)" + ] + }, + "ownPatterns": [ + { + "field": "message", + "count": 3756, + "pattern": "at", + "regex": ".*?at.*?", + "sample": " at /app/.next/server/pages/api/cart.js:1:1025\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at /app/.next/server/pages/api/cart.js:1:1025\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 1103 + }, + { + "x": 1730544960000, + "y": 1411 + }, + { + "x": 1730544990000, + "y": 1242 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "qlqu", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 2366, + "pattern": "at app node_modules grpc grpc js build src", + "regex": ".*?at.+?app.+?node_modules.+?grpc.+?grpc.+?js.+?build.+?src.*?", + "sample": " at Object.onReceiveStatus (/app/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at Object.onReceiveStatus (/app/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 693 + }, + { + "x": 1730544960000, + "y": 896 + }, + { + "x": 1730544990000, + "y": 777 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "roms", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1014, + "pattern": "at app node_modules opentelemetry instrumentation grpc build src", + "regex": ".*?at.+?app.+?node_modules.+?opentelemetry.+?instrumentation.+?grpc.+?build.+?src.*?", + "sample": " at ServiceClientImpl.clientMethodTrace [as getCart] (/app/node_modules/@opentelemetry/instrumentation-grpc/build/src/instrumentation.js:211:42)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ServiceClientImpl.clientMethodTrace [as getCart] (/app/node_modules/@opentelemetry/instrumentation-grpc/build/src/instrumentation.js:211:42)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 297 + }, + { + "x": 1730544960000, + "y": 384 + }, + { + "x": 1730544990000, + "y": 333 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "eyqk", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 351, + "pattern": "at node:internal process task_queues", + "regex": ".*?at.+?node:internal.+?process.+?task_queues.*?", + "sample": " at process.processTicksAndRejections (node:internal/process/task_queues:77:11)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at process.processTicksAndRejections (node:internal/process/task_queues:77:11)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 104 + }, + { + "x": 1730544960000, + "y": 129 + }, + { + "x": 1730544990000, + "y": 118 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "mpyi", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at AsyncLocalStorage.run node:async_hooks 346 14", + "regex": ".*?at.+?AsyncLocalStorage\\.run.+?node:async_hooks.+?346.+?14.*?", + "sample": " at AsyncLocalStorage.run (node:async_hooks:346:14)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at AsyncLocalStorage.run (node:async_hooks:346:14)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "jsoq", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at AsyncLocalStorageContextManager.with app node_modules opentelemetry context async hooks build src AsyncLocalStorageContextManager.js 33 40", + "regex": ".*?at.+?AsyncLocalStorageContextManager\\.with.+?app.+?node_modules.+?opentelemetry.+?context.+?async.+?hooks.+?build.+?src.+?AsyncLocalStorageContextManager\\.js.+?33.+?40.*?", + "sample": " at AsyncLocalStorageContextManager.with (/app/node_modules/@opentelemetry/context-async-hooks/build/src/AsyncLocalStorageContextManager.js:33:40)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at AsyncLocalStorageContextManager.with (/app/node_modules/@opentelemetry/context-async-hooks/build/src/AsyncLocalStorageContextManager.js:33:40)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "viwd", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at ContextAPI.with app node_modules opentelemetry api build src api context.js 60 46", + "regex": ".*?at.+?ContextAPI\\.with.+?app.+?node_modules.+?opentelemetry.+?api.+?build.+?src.+?api.+?context\\.js.+?60.+?46.*?", + "sample": " at ContextAPI.with (/app/node_modules/@opentelemetry/api/build/src/api/context.js:60:46)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ContextAPI.with (/app/node_modules/@opentelemetry/api/build/src/api/context.js:60:46)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "agsa", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at new ZoneAwarePromise app node_modules zone.js bundles zone.umd.js 1340 33", + "regex": ".*?at.+?new.+?ZoneAwarePromise.+?app.+?node_modules.+?zone\\.js.+?bundles.+?zone\\.umd\\.js.+?1340.+?33.*?", + "sample": " at new ZoneAwarePromise (/app/node_modules/zone.js/bundles/zone.umd.js:1340:33) {\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at new ZoneAwarePromise (/app/node_modules/zone.js/bundles/zone.umd.js:1340:33) {\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "dhes", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "code", + "regex": ".*?code.*?", + "sample": " code: 14,\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " code: 14,\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "feod", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "for call at", + "regex": ".*?for.+?call.+?at.*?", + "sample": "for call at\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + "for call at\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "enzg", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at ServiceClientImpl anonymous /app/node_modules/@grpc/grpc-js/build/src/make-client.js", + "regex": ".*?at.+?ServiceClientImpl.+?anonymous.+?/app/node_modules/@grpc/grpc-js/build/src/make-client\\.js.*?", + "sample": " at ServiceClientImpl.<anonymous> (/app/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ServiceClientImpl.<anonymous> (/app/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "iook", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at ServiceClientImpl.makeUnaryRequest /app/node_modules/@grpc/grpc-js/build/src/client.js", + "regex": ".*?at.+?ServiceClientImpl\\.makeUnaryRequest.+?/app/node_modules/@grpc/grpc-js/build/src/client\\.js.*?", + "sample": " at ServiceClientImpl.makeUnaryRequest (/app/node_modules/@grpc/grpc-js/build/src/client.js:161:32)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ServiceClientImpl.makeUnaryRequest (/app/node_modules/@grpc/grpc-js/build/src/client.js:161:32)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "jvlx", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 335, + "pattern": "metadata Metadata internalRepr Map 0 options", + "regex": ".*?metadata.+?Metadata.+?internalRepr.+?Map.+?0.+?options.*?", + "sample": " metadata: Metadata { internalRepr: Map(0) {}, options: {} }\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " metadata: Metadata { internalRepr: Map(0) {}, options: {} }\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 97 + }, + { + "x": 1730544960000, + "y": 127 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "wczz", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 3, + "pattern": "internalRepr Map content-type Array", + "regex": ".*?internalRepr.+?Map.+?content-type.+?Array.*?", + "sample": " internalRepr: Map(1) { 'content-type' => [Array] },\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " internalRepr: Map(1) { 'content-type' => [Array] },\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.039Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "pcyb", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 3, + "pattern": "metadata Metadata", + "regex": ".*?metadata.+?Metadata.*?", + "sample": " metadata: Metadata {\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " metadata: Metadata {\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.039Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "tcak", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 3, + "pattern": "options", + "regex": ".*?options.*?", + "sample": " options: {}\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " options: {}\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.039Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "xbsw", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1005, + "pattern": "No connection established Last error connect ECONNREFUSED 10.110.191.164 8080 2024 11 02T10", + "regex": ".*?No.+?connection.+?established.+?Last.+?error.+?connect.+?ECONNREFUSED.+?10\\.110\\.191\\.164.+?8080.+?2024.+?11.+?02T10.*?", + "sample": "14 UNAVAILABLE: No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080 (2024-11-02T10:56:12.143Z)", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + "14 UNAVAILABLE: No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080 (2024-11-02T10:56:12.143Z)" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.676Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 291 + }, + { + "x": 1730544960000, + "y": 381 + }, + { + "x": 1730544990000, + "y": 333 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "pssf", + "relevance": "critical", + "interesting": true + }, + { + "field": "error.exception.message", + "count": 3, + "pattern": "INTERNAL cart failure failed to get user cart during checkout rpc error code Unavailable desc connection error desc transport Error while dialing dial tcp connect connection refused", + "regex": ".*?INTERNAL.+?cart.+?failure.+?failed.+?to.+?get.+?user.+?cart.+?during.+?checkout.+?rpc.+?error.+?code.+?Unavailable.+?desc.+?connection.+?error.+?desc.+?transport.+?Error.+?while.+?dialing.+?dial.+?tcp.+?connect.+?connection.+?refused.*?", + "sample": "13 INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "error.exception.message": [ + "13 INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.038Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "crai", + "relevance": "critical", + "interesting": true + } + ], + "patternsFromOtherEntities": [ + { + "field": "message", + "count": 246, + "pattern": "INFO 10.244.0.26 AAAA IN my otel demo frontend udp 39 false 512 NXDOMAIN qr rd ra 39", + "regex": ".*?INFO.+?10\\.244\\.0\\.26.+?AAAA.+?IN.+?my.+?otel.+?demo.+?frontend.+?udp.+?39.+?false.+?512.+?NXDOMAIN.+?qr.+?rd.+?ra.+?39.*?", + "sample": "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-frontend. udp 39 false 512\" NXDOMAIN qr,rd,ra 39 0.003716084s\n", + "highlight": { + "body.text": [ + "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-<em>frontend</em>. udp 39 false 512\" NXDOMAIN qr,rd,ra" + ], + "message": [ + "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-<em>frontend</em>. udp 39 false 512\" NXDOMAIN qr,rd,ra" + ] + }, + "metadata": { + "service.name": [ + "coredns" + ], + "message": [ + "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-frontend. udp 39 false 512\" NXDOMAIN qr,rd,ra 39 0.003716084s\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.917Z", + "lastOccurrence": "2024-11-02T10:56:58.646Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 6 + }, + { + "x": 1730543820000, + "y": 6 + }, + { + "x": 1730543850000, + "y": 6 + }, + { + "x": 1730543880000, + "y": 6 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 6 + }, + { + "x": 1730543970000, + "y": 6 + }, + { + "x": 1730544000000, + "y": 6 + }, + { + "x": 1730544030000, + "y": 6 + }, + { + "x": 1730544060000, + "y": 6 + }, + { + "x": 1730544090000, + "y": 6 + }, + { + "x": 1730544120000, + "y": 6 + }, + { + "x": 1730544150000, + "y": 6 + }, + { + "x": 1730544180000, + "y": 6 + }, + { + "x": 1730544210000, + "y": 6 + }, + { + "x": 1730544240000, + "y": 6 + }, + { + "x": 1730544270000, + "y": 6 + }, + { + "x": 1730544300000, + "y": 6 + }, + { + "x": 1730544330000, + "y": 6 + }, + { + "x": 1730544360000, + "y": 6 + }, + { + "x": 1730544390000, + "y": 6 + }, + { + "x": 1730544420000, + "y": 6 + }, + { + "x": 1730544450000, + "y": 6 + }, + { + "x": 1730544480000, + "y": 6 + }, + { + "x": 1730544510000, + "y": 6 + }, + { + "x": 1730544540000, + "y": 6 + }, + { + "x": 1730544570000, + "y": 6 + }, + { + "x": 1730544600000, + "y": 6 + }, + { + "x": 1730544630000, + "y": 6 + }, + { + "x": 1730544660000, + "y": 6 + }, + { + "x": 1730544690000, + "y": 6 + }, + { + "x": 1730544720000, + "y": 6 + }, + { + "x": 1730544750000, + "y": 6 + }, + { + "x": 1730544780000, + "y": 6 + }, + { + "x": 1730544810000, + "y": 6 + }, + { + "x": 1730544840000, + "y": 6 + }, + { + "x": 1730544870000, + "y": 6 + }, + { + "x": 1730544900000, + "y": 6 + }, + { + "x": 1730544930000, + "y": 6 + }, + { + "x": 1730544960000, + "y": 6 + }, + { + "x": 1730544990000, + "y": 6 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "rlzf", + "relevance": "normal", + "interesting": false + } + ], + "searches": [ + { + "fragments": [ + "10.110.191.164:8080", + "10.110.191.164", + "8080" + ], + "appearsAs": "This IP address and port are referenced in the investigated entity 'frontend'." + }, + { + "fragments": [ + "/api/cart", + "cartservice", + "/api" + ], + "appearsAs": "These URL fragments appear as attributes.request.url in the investigated entity 'frontend'. They could be related to 'cartservice'." + }, + { + "fragments": [ + "000aa", + "000bbb" + ], + "appearsAs": "These ids appear as span.id and parent.id in the investigated entity 'frontend'. They could be referring to spans found on upstream or downstream services" + } + ], + "relatedEntitiesSummaries": [ + "## Possible Relationships to `service.name:frontend`\n\n### 1. Entity: `service.name:controller`\n- **Indicators:**\n - #### Average Indicator:\n - **IP Address and Port:**\n - `frontend`: `10.110.191.164:8080`\n - `controller`: `10.244.0.26:8080`\n - **URL Fragment:**\n - `frontend`: `/api/cart`\n - `controller`: `/<em>api</em>/<em>cart</em>?session`\n- **Relationship Reasoning:**\n - The `controller` service is highly likely to be making requests to, or routing through, the `frontend` service as evidenced by the URL fragments referring to the `/api/cart` endpoint seen in both entities. Additionally, they share common IP address and port patterns indicating network interaction.\n- **Relevance Assessment:**\n - **Very High**: Given that the `controller` service handles endpoints like `/api/cart`, which directly correspond to transactions failing with a high error rate, this entity is a critical part of the interaction chain and should be closely examined.\n\n### 2. Entity: `service.name:cartservice`\n- **Indicators:**\n - #### Strong Indicator:\n - **Direct Call References:**\n - `frontend`: `details: 'cart failure: failed to get user cart during checkout: rpc error: ... desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"'\n - `cartservice`: `url.full.text:\"http://my-otel-demo-cartservice:8080/oteldemo.CartService/GetCart\"`\n- **Relationship Reasoning:**\n - The `frontend` service attempts to interact with the `cartservice` as observed by the endpoint `/oteldemo.CartService/GetCart`. Connection errors from `frontend` indicate it is calling `cartservice` and facing issues getting responses, potentially causing the 500 errors.\n- **Relevance Assessment:**\n - **Very High**: Since `cartservice` manages user cart data and the connection errors reported in `frontend` logs directly correspond to attempts to communicate with `cartservice`, this entity is a probable cause of the service failures being observed.\n\n### 3. Entity: `service.name:frontend-web`\n- **Indicators:**\n - #### Average Indicator:\n - **URL Fragment:**\n - `frontend`: `/api/cart`\n - `frontend-web`: `/api/cart`\n - #### Weak Indicator:\n - **RUM Layer Mentions:**\n - `frontend`: `frontend-web (RUM)`\n - `frontend-web`: Described in System Architecture.\n- **Relationship Reasoning:**\n - `frontend-web` captures real user interactions with the `/api/cart` endpoint providing insights into the `frontend` service which might help trace the errors and delays externally perceived by users.\n- **Relevance Assessment:**\n - **Moderate**: While `frontend-web` can show the surface errors users are experiencing, it is more of an observability layer rather than directly causing the 500 errors or impacting the service interactions upstream.\n\n### 4. Entity: `service.name:frontendproxy`\n- **Indicators:**\n - #### Average Indicator:\n - **Network Routing Indicator:**\n - `frontend`: Receives traffic from `frontendproxy`\n - `frontendproxy`: Directs traffic to `frontend`\n - #### IP Address Mention:\n - Both services reference `8080`, indicating shared routing or proxying.\n- **Relationship Reasoning:**\n - `frontendproxy` routes traffic from external sources, including simulated user requests, to `frontend`. Any issues in this proxy layer could impact the incoming traffic to `frontend`, causing errors.\n- **Relevance Assessment:**\n - **High**: Considering `frontendproxy` handles traffic routing, any misconfiguration or failures here could lead to the issues observed on the `frontend`.\n\n### 5. Entity: `service.name:coredns`\n- **Indicators:**\n - #### Weak Indicators:\n - **DNS Resolution Events:**\n - Logs showing DNS queries involving `frontend`.\n - **IP Address and Port:**\n - Shared network interactions over common ports like `8080`.\n- **Relationship Reasoning:**\n - While not directly related to application logic, `coredns` is responsible for DNS resolution within the cluster, and issues here could result in connectivity problems seen in `frontend` when trying to reach `cartservice`.\n- **Relevance Assessment:**\n - **Moderate**: While less likely to be the root cause, DNS misconfigurations or failures could indirectly contribute to connectivity issues within services like `frontend`.\n\n### Summary\n\n1. **service.name:controller** - Very High relevance due to direct endpoint interaction.\n2. **service.name:cartservice** - Very High relevance for being the direct interaction target with observed failures.\n3. **service.name:frontend-web** - Moderate relevance in monitoring layer but not direct interaction.\n4. **service.name:frontendproxy** - High relevance for routing traffic to `frontend`.\n5. **service.name:coredns** - Moderate relevance for possible DNS resolution issues." + ], + "kbEntries": [ + { + "id": "System architecture", + "text": "The architecture described here outlines a microservices-based system, where each service is implemented in a distinct programming language and communicates via gRPC, HTTP, or TCP. This system is designed to handle simulated user traffic, supported by a variety of interconnected services and components.\n\n### System Architecture\n\n1. **`loadgenerator`** - Simulates external user traffic by sending HTTP requests, which are managed by an Nginx ingress controller. This ingress directs traffic to the `frontendproxy` service.\n\n2. **`frontendproxy` (Envoy)** - Acts as a reverse proxy, routing incoming traffic from `loadgenerator` to `frontend`.\n\n3. **`frontend` (Node.js)** - The core service for user interactions, receiving HTTP traffic from `frontendproxy` and interfacing with various backend services to fulfill requests.\n\n4. **`frontend-web` (RUM)** - A Real User Monitoring (RUM) layer that runs in the user's browser, enabling insights into end-user experiences and frontend performance.\n\n5. **`adservice`** - Delivers advertisements to the `frontend` using gRPC, enhancing the user experience with relevant ad content.\n\n6. **`cartservice`** - Manages shopping cart data, including adding and removing items. It communicates over gRPC and leverages a Redis cache for data persistence.\n\n7. **`currencyservice`** - Handles currency conversions and facilitates interactions between `cartservice` and `checkoutservice` over gRPC.\n\n8. **`checkoutservice`** - Coordinates the checkout process, calling various services for payments, shipping, and emails. It utilizes both gRPC and HTTP protocols to aggregate the necessary information for order completion.\n\n9. **`emailservice`** - Sends order confirmation emails to users via gRPC, triggered by interactions with `checkoutservice`.\n\n10. **`productcatalogservice`** - Maintains the product catalog, storing details about available items and providing this data to other services via gRPC.\n\n11. **`recommendationservice`** - Generates personalized product recommendations, accessed by `frontend` over gRPC.\n\n12. **`shippingservice`** - Manages shipping information, providing essential data to `checkoutservice` over gRPC.\n\n13. **`quoteservice`** - Supplies shipping quotes over HTTP, which are accessed by `shippingservice` to estimate shipping costs.\n\n14. **`paymentservice`** - Processes payment transactions through gRPC, enabling secure and efficient payments for `checkoutservice`.\n\n15. **`accountingservice`** - Responsible for recording transactions, it connects to a Kafka queue and interacts over TCP.\n\n16. **`frauddetectionservice`** - Monitors orders for potential fraud, also interfacing with the Kafka queue over TCP to receive relevant transaction data.\n\n17. **`imageprovider` (Nginx)** - Serves static images for the frontend interface, accessible over HTTP.\n\n18. **`queue` (Kafka)** - Acts as a central message broker, facilitating communication between `accountingservice` and `frauddetectionservice`.\n\n### Key Components\nThe system is structured to enable robust, distributed communication across services, allowing each component to focus on a specific aspect of the user experience or business logic. The ingress controller, in particular, plays a critical role in directing traffic, ensuring that incoming requests from `loadgenerator` are correctly routed through `frontendproxy` and into the system’s core services.\n\nThis architecture ensures that the system can handle high traffic loads and provides a modular, flexible framework to meet user demands while monitoring for performance and security.\n", + "tokens": 733, + "score": 5 + } + ] + } + } + }, + { + "name": "investigateEntity", + "role": "tool", + "toolCallId": "call_kstyq8qXoaWRX4CJQkC6wbhR", + "response": { + "entity": { + "service.name": "cartservice" + }, + "relatedEntities": [ + { + "entity": { + "service.name": "controller" + }, + "reason": "The controller service is responsible for managing /api/cart requests. Thus, it acts as a direct upstream service to cartservice. High errors were observed in the controller when interacting with cartservice.", + "confidence": "high" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The frontend service interacts directly with the controller, handling user interactions that lead to /api/cart requests which are eventually processed by cartservice.", + "confidence": "high" + }, + { + "entity": { + "service.name": "currencyservice" + }, + "reason": "The currencyservice interacts with cartservice to handle currency conversions, acting as an upstream dependency for cartservice when performing currency-related operations on cart items.", + "confidence": "medium-high" + }, + { + "entity": { + "service.name": "checkoutservice" + }, + "reason": "The checkoutservice relies on cart data from cartservice during the checkout process, making it a downstream service dependent on the correct functioning of cartservice.", + "confidence": "medium" + }, + { + "entity": { + "service.name": "loadgenerator" + }, + "reason": "The loadgenerator service generates simulated traffic which impacts cartservice directly when testing the system's resilience.", + "confidence": "medium" + }, + { + "entity": { + "service.name": "adservice" + }, + "reason": "The adservice might indirectly impact cartservice through the frontend service by affecting the overall user experience and potentially causing indirect latency.", + "confidence": "low-medium" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The `frontend` service is highly likely to be relevant as it has a direct interaction with the `cartservice` and would be significantly impacted by any issues within the `cartservice`.", + "confidence": "very high" + }, + { + "entity": { + "service.name": "valkey" + }, + "reason": "The `valkey` service is highly relevant because it is the data store for `cartservice`, directly affecting its behavior and performance.", + "confidence": "high" + }, + { + "entity": { + "service.name": "currencyservice" + }, + "reason": "The `currencyservice` may interact with `cartservice` to handle price conversions for the items in the cart. Problems with currency conversion could cause unexpected data formats or communication failures, leading to `500 Internal Server Error` in `cartservice`.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "checkoutservice" + }, + "reason": "The `checkoutservice` could potentially depend on `cartservice` to validate and finalize items in the user's cart as part of the checkout process. If the `cartservice` fails during these operations, it could propagate errors back up to the user level through `checkoutservice`.", + "confidence": "moderate" + } + ], + "summary": "Based on the context provided, including the system architecture and data samples, the entity `service.name:cartservice` can be described as follows:\n\n### Infrastructure & Environment\n`cartservice` operates within a microservices-based architecture. It is containerized and runs within a Kubernetes environment. Specifically, the data sample indicates that the service is deployed in the `default` Kubernetes namespace and is running on a pod named `my-otel-demo-cartservice-67575c6f84-vngzw` with an IP address of `10.244.0.61`. The service environment is tagged as `opentelemetry-demo`, indicating the use of OpenTelemetry for observability purposes. The infrastructure includes a Redis cache used by the cart service for data persistence.\n\n### Communication Characteristics (Protocols and Endpoints)\n`cartservice` primarily communicates using gRPC. It handles shopping cart data including adding and removing items. The service interacts with Redis (as indicated by the `labels.db_redis_flags` attribute). Additionally, the service integrates with external feature flag providers as seen from the `feature_flag_key` and `feature_flag_provider_name` attributes, which suggests it evaluates feature flags, possibly targeting the feature key `cartServiceFailure`. \n\nThe communication endpoints and protocols from the sample data are:\n- gRPC methods: `/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`\n- HTTP endpoint: `http://my-otel-demo-flagd:8013/flagd.evaluation.v1.Service/ResolveBoolean`\n- Redis database interactions: `HGET`, `HMSET`, `EXPIRE` commands targeting various identifiers like `my-otel-demo-valkey:6379`.\n\n### Context of Entity in Investigation\nThe cart service (`cartservice`) is being investigated as it is the downstream service handling `/api/cart` requests. Issues in `cartservice` are directly contributing to the error patterns in the controller layer for the `/api/cart` endpoint. A high error rate, culminating in `500 Internal Server Error` responses, started around `2024-11-02T10:56:42.498Z`. The context indicates that the cart service plays a crucial role in managing shopping cart operations.\n\nGiven the observed high error rates and the 500 errors, `cartservice` may be experiencing issues in processing gRPC calls, feature flag evaluations, or Redis caching, which could be causing failures that propagate upstream to the controller.\n\n### Related Entities and Previous Investigations\nPreviously, errors in the controller for POST requests to `/api/cart` have been observed. This investigation is a continuation, focusing on the downstream `cartservice` which is responsible for handling these requests. This service's interaction with other entities such as Redis (for caching cart data) and external feature flag services (potentially toggling functionality) suggest that any issues in these integrations could impact the `cartservice` performance and result in the observed errors upstream in the controller.\n\nThis detailed analysis moves us to further inspect specific logs, traces, and any interdependent service metrics that may provide clues about the root cause of the high error rate in `cartservice`.\n\n### Observations for service.name:cartservice\n\n#### Startup Messages\n1. **Pattern: \"OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated.\"**\n - **Count:** 78\n - **Trend:** There was a spike at **2024-11-02T10:55:30.000Z** with 78 occurrences. Before this timestamp, the value was consistently 0.\n\n2. **Pattern: \"OTEL-SDK: [224] 'MeterProvider' Disposed.\"**\n - **Count:** 4\n - **Trend:** Occurrences were persistently recorded as 0 until a brief spike at **2024-11-02T10:55:30.000Z** with 4 instances.\n\n3. **Pattern: \"exiting...\"**\n - **Count:** 3\n - **Trend:** Consistently 0 until a minor rise at **2024-11-02T10:55:30.000Z**, with 3 instances recorded.\n\n4. **Pattern: \"Application is shutting down...\"**\n - **Count:** 2\n - **Trend:** Log entries were consistently at 0 with a brief spike at **2024-11-02T10:55:30.000Z** showing 2 instances.\n\n#### Fatal Errors\n5. **Pattern: \"FATAL: Could not start, bad entrypoint!\"**\n - **Count:** 3\n - **Trend:** This pattern shows a significant change at **2024-11-02T10:55:30.000Z** with 2 occurrences at the change point and one additional at **2024-11-02T10:56:30.000Z**. Before this period, the occurrence rate was consistently 0.\n\n### Conclusion\n\nThe patterns observed indicate that there were significant startup issues with the `cartservice` around the **2024-11-02T10:55:30.000Z** mark. Specifically, the `cartservice` encountered a fatal error (\"FATAL: Could not start, bad entrypoint!\") that aligns precisely with the rise in errors noted during this period. This error indicates that the service failed to start due to a misconfiguration or issues with the entry point. This corresponds with the sudden spike in errors and `500 Internal Server Error` responses observed in the downstream controller making POST requests to the `/api/cart` endpoint. Furthermore, logs related to the service's deactivation and shutdown support the perspective that the service was not running successfully or consistently after this time.\n\n### Timeline of significant events\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated.”\n - **Description**: Spike detected with 78 occurrences, suggesting a potential issue within the service's runtime environment.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “OTEL-SDK: [224] 'MeterProvider' Disposed.”\n - **Description**: Sudden spike of 4 occurrences suggesting a significant change in the service’s telemetry setup or a potential abnormal shutdown initiation.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “exiting...”\n - **Description**: Log entries rose to 3 incidences, signaling the cart service may be initiating an unexpected exit.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “Application is shutting down...”\n - **Description**: 2 instances of this log message indicating the application is attempting to shut down around this time.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “FATAL: Could not start, bad entrypoint!”\n - **Description**: Abrupt fatal error occurs 2 times, implying a critical misconfiguration or startup failure.\n\n- **2024-11-02T10:56:30.000Z**: \n - **Log Message**: “FATAL: Could not start, bad entrypoint!”\n - **Description**: Another occurrence of the critical fatal error, indicating the issue persisted beyond the initial spike and may have contributed to continued disruptions.\n\n- **2024-11-02T10:56:42.498Z**: \n - **Alert**: High error rate observed in the controller (98.78% error rate for POST requests to /api/cart).\n - **Description**: Starts the period of significantly high error rates contributing to 500 Internal Server Error responses. \n\n### Context and reasoning\n\nGiven the high error rate (98.78%) starting from **2024-11-02T10:56:42.498Z** for POST requests to `/api/cart`, the `cartservice` is a critical component for investigation as it handles these requests directly. From logs, there is a clear indication that significant problems began around **2024-11-02T10:55:30.000Z**, approximately one minute before the heightened error rate was observed in the upstream controller.\n\n**1. Startup Issues**: Multiple startup-related log patterns such as instruments deactivation, disposal of the MeterProvider, and application exit/shutdown messages indicate that cartservice experienced troubles initializing. Notably, the log entries “FATAL: Could not start, bad entrypoint!” directly show critical failures in service entry points likely causing the downstream failures.\n\n**2. Fatal Errors**: The fatal errors precisely correlate with the timeframe where errors spiked in the upstream service (controller). The error messages “FATAL: Could not start, bad entrypoint!” occurring multiple times reflect a misconfiguration or critical code issue that prevented the service from running properly.\n\nThus, the evidence from log patterns strongly suggests that startup and initialization problems in `cartservice`, resulting in its inconsistent availability and operational failures, is the root cause of the observed high error rates and 500 Internal Server Errors in the controller's POST requests to `/api/cart`." + }, + "data": { + "attachments": { + "alerts": [], + "slos": [], + "analysis": { + "total": 41440, + "sampled": 1000, + "fields": [ + "@timestamp:date - 964 distinct values", + "agent.name.text:text - 1 distinct values (`opentelemetry/dotnet/elastic-dotnet`)", + "agent.name:keyword - 1 distinct values (`opentelemetry/dotnet/elastic-dotnet`)", + "agent.version:keyword - 1 distinct values (`1.0.0-alpha.4`)", + "container.id:keyword - 1 distinct values (`577d6250ad96a5d0016a42ed87bd5c3a63b86edd2af0a0c04b54a1cec2a1a50a`)", + "data_stream.dataset:keyword - 1 distinct values (`apm`)", + "data_stream.namespace:keyword - 1 distinct values (`default`)", + "data_stream.type:keyword - 1 distinct values (`traces`)", + "destination.address:keyword - 2 distinct values (`my-otel-demo-flagd`, `my-otel-demo-valkey`)", + "destination.port:long - 2 distinct values (`8013`, `6379`)", + "event.outcome:keyword - 1 distinct values (`success`)", + "event.success_count:byte - 1 distinct values (`1`)", + "host.hostname:keyword - 1 distinct values (`minikube`)", + "host.name.text:text - 1 distinct values (`minikube`)", + "host.name:keyword - 1 distinct values (`minikube`)", + "http.request.method:keyword - 1 distinct values (`POST`)", + "http.response.status_code:long - 1 distinct values (`200`)", + "kubernetes.namespace:keyword - 1 distinct values (`default`)", + "kubernetes.node.name.text:text - 1 distinct values (`minikube`)", + "kubernetes.node.name:keyword - 1 distinct values (`minikube`)", + "kubernetes.pod.name.text:text - 1 distinct values (`my-otel-demo-cartservice-67575c6f84-vngzw`)", + "kubernetes.pod.name:keyword - 1 distinct values (`my-otel-demo-cartservice-67575c6f84-vngzw`)", + "kubernetes.pod.uid:keyword - 1 distinct values (`8e441d5c-4d52-42f2-937e-1f3b84a6baed`)", + "labels.app_product_id:keyword - 8 distinct values (`66VCHSJNUP`, `L9ECAV7KIM`, `OLJCESPC7Z`, `0PUK6V6EV0`, `9SIQT8TOJO`, `LS4PSXUNUM`, `HQTGWGPNH4`, `6E92ZMYYFZ`)", + "labels.app_user_id:keyword - 418 distinct values (`11c5f5d4-37b4-46d4-a04e-a97fd71b8597`, `9017f637-12af-4671-b18c-0f86a58a7bbe`, `349478d0-862e-4b14-9d54-3120dd57865f`, `2a55d360-40c5-4a32-844b-4182e8050ca3`, `b9944e91-18d6-430c-90a5-4969e1917a2d`, `1ffeffe2-4e4a-47c4-8b33-e691f116c8cc`, `92ac0a92-4a23-4aa7-866b-44cd6b5d6e26`, `76765dfc-80f8-49db-8377-249e6930dd35`, `d5c375cc-6e38-45f8-b121-30fcb3ae1001`, `bdc5ebd9-a2ee-4dbf-8dae-b88a2b2b3643`, 408 more values)", + "labels.db_redis_flags:keyword - 2 distinct values (`DemandMaster`, `None`)", + "labels.feature_flag_key:keyword - 1 distinct values (`cartServiceFailure`)", + "labels.feature_flag_provider_name:keyword - 1 distinct values (`flagd Provider`)", + "labels.feature_flag_variant:keyword - 1 distinct values (`off`)", + "labels.grpc_method:keyword - 3 distinct values (`/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "labels.grpc_status_code:keyword - 1 distinct values (`0`)", + "labels.http_route:keyword - 3 distinct values (`/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "labels.k8s_deployment_name:keyword - 1 distinct values (`my-otel-demo-cartservice`)", + "labels.k8s_pod_ip:ip - 1 distinct values (`10.244.0.61`)", + "labels.k8s_pod_start_time:keyword - 1 distinct values (`2024-11-02T10:23:09Z`)", + "labels.network_protocol_version:keyword - 1 distinct values (`2`)", + "labels.service_namespace:keyword - 1 distinct values (`opentelemetry-demo`)", + "labels.transaction_id:keyword - 995 distinct values (`6b71cc6a08847a01`, `796c855656f17eb0`, `aaa6049d68006044`, `60ad645003eda9b7`, `be3e883fd0dd1a58`, `47247987037e78b3`, `180228f348c3d599`, `587dca65bb2463f3`, `c438d3e7c15d9a4f`, `0a9f738aa8e11c7e`, 985 more values)", + "numeric_labels.app_cart_items_count:scaled_float - 10 distinct values (`8`, `1`, `16`, `2`, `20`, `5`, `4`, `10`, `3`, `0`)", + "numeric_labels.app_product_quantity:scaled_float - 6 distinct values (`5`, `1`, `2`, `10`, `3`, `4`)", + "numeric_labels.db_redis_database_index:scaled_float - 1 distinct values (`0`)", + "observer.hostname:keyword - 1 distinct values (`Darios-MacBook-Pro-2.local`)", + "observer.type:keyword - 1 distinct values (`apm-server`)", + "observer.version:keyword - 1 distinct values (`8.15.0`)", + "parent.id:keyword - 999 distinct values (`76a22c35a2b363fb`, `6e363f007dd857fc`, `499ee35b7e0dc791`, `f05ead7365bb815b`, `46709d74aeb1ac57`, `c1e7aeb4f3b66351`, `d6e80a03ce62827e`, `5eff08ed000af546`, `80be4180f1c8985e`, `9154a028a223da28`, 989 more values)", + "processor.event:keyword - 2 distinct values (`transaction`, `span`)", + "service.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "service.framework.name.text:text - 1 distinct values (`Microsoft.AspNetCore`)", + "service.framework.name:keyword - 1 distinct values (`Microsoft.AspNetCore`)", + "service.language.name.text:text - 1 distinct values (`dotnet`)", + "service.language.name:keyword - 1 distinct values (`dotnet`)", + "service.name.text:text - 1 distinct values (`cartservice`)", + "service.name:keyword - 1 distinct values (`cartservice`)", + "service.node.name.text:text - 1 distinct values (`8e441d5c-4d52-42f2-937e-1f3b84a6baed`)", + "service.node.name:keyword - 1 distinct values (`8e441d5c-4d52-42f2-937e-1f3b84a6baed`)", + "service.target.name.text:text - 3 distinct values (`my-otel-demo-flagd:8013`, `flagd.evaluation.v1.Service`, 1 more values)", + "service.target.name:keyword - 3 distinct values (`my-otel-demo-flagd:8013`, `flagd.evaluation.v1.Service`, `my-otel-demo-valkey:6379`)", + "service.target.type:keyword - 3 distinct values (`http`, `grpc`, `redis`)", + "span.db.statement:keyword - 455 distinct values (`HGET dd1f04f3-aaf1-4a76-85e4-8c64a930684e`, `EXPIRE 2538c162-9908-11ef-8217-d64fba5f23b1`, `HGET 958266ce-2169-4a2a-bcd5-090fd75cf50b`, `HGET ba92c7a8-6623-4267-8512-9cf0cb23bbf8`, `HGET d96a9e44-a9ed-4f64-8f46-5d4acd05a1fa`, `HGET 4a0d4f33-09ee-4008-a826-027dd6e889c6`, `HGET 5bc59fca-3c11-4d71-9496-c9c29b9d37d1`, `HGET 0497c8a8-2da2-4ff7-80a7-ce647916277c`, `HGET 87d37a8f-cc58-483a-aad0-fc0c91421544`, `HGET 4dea82bc-1c58-4f0a-97fd-3a1369544dc0`, 445 more values)", + "span.db.type:keyword - 1 distinct values (`redis`)", + "span.destination.service.name.text:text - 3 distinct values (`http://my-otel-demo-flagd:8013`, `my-otel-demo-flagd:8013`, 1 more values)", + "span.destination.service.name:keyword - 3 distinct values (`http://my-otel-demo-flagd:8013`, `my-otel-demo-flagd:8013`, `my-otel-demo-valkey:6379`)", + "span.destination.service.resource:keyword - 2 distinct values (`my-otel-demo-flagd:8013`, `my-otel-demo-valkey:6379`)", + "span.destination.service.type:keyword - 2 distinct values (`external`, `db`)", + "span.duration.us:long - 399 distinct values (`501`, `154`, `355`, `3766`, `818`, `657`, `203`, `127`, `715`, `1092`, 389 more values)", + "span.id:keyword - 1000 distinct values (`6b71cc6a08847a01`, `796c855656f17eb0`, `aaa6049d68006044`, `60ad645003eda9b7`, `be3e883fd0dd1a58`, `47247987037e78b3`, `180228f348c3d599`, `587dca65bb2463f3`, `c438d3e7c15d9a4f`, `0a9f738aa8e11c7e`, 990 more values)", + "span.name.text:text - 5 distinct values (`POST`, `flagd.evaluation.v1.Service/ResolveBoolean`, 3 more values)", + "span.name:keyword - 5 distinct values (`POST`, `flagd.evaluation.v1.Service/ResolveBoolean`, `HMSET`, `EXPIRE`, `HGET`)", + "span.representative_count:scaled_float - 1 distinct values (`1`)", + "span.subtype:keyword - 3 distinct values (`http`, `grpc`, `redis`)", + "span.type:keyword - 2 distinct values (`external`, `db`)", + "tags:keyword - 1 distinct values (`_geoip_database_unavailable_GeoLite2-City.mmdb`)", + "timestamp.us:long - 1000 distinct values (`1730544111451828`, `1730544606786118`, `1730544573583321`, `1730544068214001`, `1730543971566630`, `1730544035740835`, `1730543892242334`, `1730544845301548`, `1730543919324800`, `1730544697032712`, 990 more values)", + "trace.id:keyword - 920 distinct values (`de1ed71d39ca87650a8401ae46f2cac0`, `1283785f372e3335e30ab82c53008ea6`, `be3fc18a45763f00d43954ef09300042`, `bffb395c41d9a23aa7acc6b1993f64c6`, `68df2f10f7b09e787c688046ae76f6ff`, `3ba13e99d34a48133415c71b9b523321`, `6405704384b681e891e1067b1c1e6e68`, `b137359ec568679804d48c699dd49df5`, `cce045bbbdbb711a2f5cae192c337cb3`, `85743f477e557162900c88409231222a`, 910 more values)", + "transaction.duration.us:long - 441 distinct values (`2497`, `2659`, `610`, `458`, `3158`, `1484`, `436`, `536`, `2602`, `3472`, 431 more values)", + "transaction.id:keyword - 469 distinct values (`60ad645003eda9b7`, `be3e883fd0dd1a58`, `180228f348c3d599`, `0a9f738aa8e11c7e`, `66622c930742b62b`, `2493315b88140ec7`, `7950f85af72baaa0`, `0fda0e8c0af2a975`, `0504e94fae4dd7f8`, `25ec77d0c132ceef`, 459 more values)", + "transaction.name.text:text - 3 distinct values (`POST /oteldemo.CartService/EmptyCart`, `POST /oteldemo.CartService/AddItem`, 1 more values)", + "transaction.name:keyword - 3 distinct values (`POST /oteldemo.CartService/EmptyCart`, `POST /oteldemo.CartService/AddItem`, `POST /oteldemo.CartService/GetCart`)", + "transaction.representative_count:scaled_float - 1 distinct values (`1`)", + "transaction.result:keyword - 1 distinct values (`HTTP 2xx`)", + "transaction.sampled:boolean - 1 distinct values (`true`)", + "transaction.type:keyword - 1 distinct values (`request`)", + "url.domain:keyword - 1 distinct values (`my-otel-demo-cartservice`)", + "url.full.text:text - 3 distinct values (`http://my-otel-demo-cartservice:8080/oteldemo.CartService/EmptyCart`, `http://my-otel-demo-cartservice:8080/oteldemo.CartService/AddItem`, 1 more values)", + "url.full:keyword - 3 distinct values (`http://my-otel-demo-cartservice:8080/oteldemo.CartService/EmptyCart`, `http://my-otel-demo-cartservice:8080/oteldemo.CartService/AddItem`, `http://my-otel-demo-cartservice:8080/oteldemo.CartService/GetCart`)", + "url.original.text:text - 4 distinct values (`http://my-otel-demo-flagd:8013/flagd.evaluation.v1.Service/ResolveBoolean`, `/oteldemo.CartService/EmptyCart`, 2 more values)", + "url.original:keyword - 4 distinct values (`http://my-otel-demo-flagd:8013/flagd.evaluation.v1.Service/ResolveBoolean`, `/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "url.path:keyword - 3 distinct values (`/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "url.port:long - 1 distinct values (`8080`)", + "url.scheme:keyword - 1 distinct values (`http`)", + "user_agent.device.name.text:text - 1 distinct values (`Other`)", + "user_agent.device.name:keyword - 1 distinct values (`Other`)", + "user_agent.name.text:text - 1 distinct values (`Other`)", + "user_agent.name:keyword - 1 distinct values (`Other`)", + "user_agent.original.text:text - 2 distinct values (`grpc-go/1.64.0`, `grpc-node-js/1.10.11`)", + "user_agent.original:keyword - 2 distinct values (`grpc-go/1.64.0`, `grpc-node-js/1.10.11`)" + ] + }, + "ownPatterns": [ + { + "field": "message", + "count": 8414, + "pattern": "called with userId", + "regex": ".*?called.+?with.+?userId.*?", + "sample": "GetCartAsync called with userId=f96ee88a-4745-45f1-885a-16c3de0c668a", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "GetCartAsync called with userId=f96ee88a-4745-45f1-885a-16c3de0c668a" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 226 + }, + { + "x": 1730543820000, + "y": 194 + }, + { + "x": 1730543850000, + "y": 270 + }, + { + "x": 1730543880000, + "y": 200 + }, + { + "x": 1730543910000, + "y": 164 + }, + { + "x": 1730543940000, + "y": 198 + }, + { + "x": 1730543970000, + "y": 192 + }, + { + "x": 1730544000000, + "y": 228 + }, + { + "x": 1730544030000, + "y": 230 + }, + { + "x": 1730544060000, + "y": 212 + }, + { + "x": 1730544090000, + "y": 222 + }, + { + "x": 1730544120000, + "y": 210 + }, + { + "x": 1730544150000, + "y": 240 + }, + { + "x": 1730544180000, + "y": 200 + }, + { + "x": 1730544210000, + "y": 204 + }, + { + "x": 1730544240000, + "y": 222 + }, + { + "x": 1730544270000, + "y": 216 + }, + { + "x": 1730544300000, + "y": 254 + }, + { + "x": 1730544330000, + "y": 218 + }, + { + "x": 1730544360000, + "y": 228 + }, + { + "x": 1730544390000, + "y": 214 + }, + { + "x": 1730544420000, + "y": 220 + }, + { + "x": 1730544450000, + "y": 218 + }, + { + "x": 1730544480000, + "y": 224 + }, + { + "x": 1730544510000, + "y": 228 + }, + { + "x": 1730544540000, + "y": 228 + }, + { + "x": 1730544570000, + "y": 232 + }, + { + "x": 1730544600000, + "y": 218 + }, + { + "x": 1730544630000, + "y": 232 + }, + { + "x": 1730544660000, + "y": 212 + }, + { + "x": 1730544690000, + "y": 236 + }, + { + "x": 1730544720000, + "y": 246 + }, + { + "x": 1730544750000, + "y": 218 + }, + { + "x": 1730544780000, + "y": 214 + }, + { + "x": 1730544810000, + "y": 210 + }, + { + "x": 1730544840000, + "y": 228 + }, + { + "x": 1730544870000, + "y": 228 + }, + { + "x": 1730544900000, + "y": 224 + }, + { + "x": 1730544930000, + "y": 56 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "bfeu", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4835, + "pattern": "Enqueued", + "regex": ".*?Enqueued.*?", + "sample": "Enqueued", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Enqueued" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 126 + }, + { + "x": 1730543820000, + "y": 121 + }, + { + "x": 1730543850000, + "y": 171 + }, + { + "x": 1730543880000, + "y": 109 + }, + { + "x": 1730543910000, + "y": 96 + }, + { + "x": 1730543940000, + "y": 134 + }, + { + "x": 1730543970000, + "y": 99 + }, + { + "x": 1730544000000, + "y": 130 + }, + { + "x": 1730544030000, + "y": 132 + }, + { + "x": 1730544060000, + "y": 119 + }, + { + "x": 1730544090000, + "y": 126 + }, + { + "x": 1730544120000, + "y": 118 + }, + { + "x": 1730544150000, + "y": 133 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 125 + }, + { + "x": 1730544240000, + "y": 124 + }, + { + "x": 1730544270000, + "y": 124 + }, + { + "x": 1730544300000, + "y": 161 + }, + { + "x": 1730544330000, + "y": 126 + }, + { + "x": 1730544360000, + "y": 140 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 120 + }, + { + "x": 1730544450000, + "y": 125 + }, + { + "x": 1730544480000, + "y": 128 + }, + { + "x": 1730544510000, + "y": 120 + }, + { + "x": 1730544540000, + "y": 123 + }, + { + "x": 1730544570000, + "y": 135 + }, + { + "x": 1730544600000, + "y": 120 + }, + { + "x": 1730544630000, + "y": 139 + }, + { + "x": 1730544660000, + "y": 113 + }, + { + "x": 1730544690000, + "y": 154 + }, + { + "x": 1730544720000, + "y": 154 + }, + { + "x": 1730544750000, + "y": 115 + }, + { + "x": 1730544780000, + "y": 120 + }, + { + "x": 1730544810000, + "y": 114 + }, + { + "x": 1730544840000, + "y": 133 + }, + { + "x": 1730544870000, + "y": 127 + }, + { + "x": 1730544900000, + "y": 139 + }, + { + "x": 1730544930000, + "y": 35 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "oacl", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4835, + "pattern": "ResponseReceived", + "regex": ".*?ResponseReceived.*?", + "sample": "ResponseReceived", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "ResponseReceived" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 126 + }, + { + "x": 1730543820000, + "y": 121 + }, + { + "x": 1730543850000, + "y": 171 + }, + { + "x": 1730543880000, + "y": 109 + }, + { + "x": 1730543910000, + "y": 96 + }, + { + "x": 1730543940000, + "y": 134 + }, + { + "x": 1730543970000, + "y": 99 + }, + { + "x": 1730544000000, + "y": 130 + }, + { + "x": 1730544030000, + "y": 132 + }, + { + "x": 1730544060000, + "y": 119 + }, + { + "x": 1730544090000, + "y": 126 + }, + { + "x": 1730544120000, + "y": 118 + }, + { + "x": 1730544150000, + "y": 133 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 125 + }, + { + "x": 1730544240000, + "y": 124 + }, + { + "x": 1730544270000, + "y": 124 + }, + { + "x": 1730544300000, + "y": 161 + }, + { + "x": 1730544330000, + "y": 126 + }, + { + "x": 1730544360000, + "y": 140 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 120 + }, + { + "x": 1730544450000, + "y": 125 + }, + { + "x": 1730544480000, + "y": 128 + }, + { + "x": 1730544510000, + "y": 120 + }, + { + "x": 1730544540000, + "y": 123 + }, + { + "x": 1730544570000, + "y": 135 + }, + { + "x": 1730544600000, + "y": 120 + }, + { + "x": 1730544630000, + "y": 139 + }, + { + "x": 1730544660000, + "y": 113 + }, + { + "x": 1730544690000, + "y": 154 + }, + { + "x": 1730544720000, + "y": 154 + }, + { + "x": 1730544750000, + "y": 115 + }, + { + "x": 1730544780000, + "y": 120 + }, + { + "x": 1730544810000, + "y": 114 + }, + { + "x": 1730544840000, + "y": 133 + }, + { + "x": 1730544870000, + "y": 127 + }, + { + "x": 1730544900000, + "y": 139 + }, + { + "x": 1730544930000, + "y": 35 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "hhud", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4835, + "pattern": "Sent", + "regex": ".*?Sent.*?", + "sample": "Sent", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Sent" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 126 + }, + { + "x": 1730543820000, + "y": 121 + }, + { + "x": 1730543850000, + "y": 171 + }, + { + "x": 1730543880000, + "y": 109 + }, + { + "x": 1730543910000, + "y": 96 + }, + { + "x": 1730543940000, + "y": 134 + }, + { + "x": 1730543970000, + "y": 99 + }, + { + "x": 1730544000000, + "y": 130 + }, + { + "x": 1730544030000, + "y": 132 + }, + { + "x": 1730544060000, + "y": 119 + }, + { + "x": 1730544090000, + "y": 126 + }, + { + "x": 1730544120000, + "y": 118 + }, + { + "x": 1730544150000, + "y": 133 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 125 + }, + { + "x": 1730544240000, + "y": 124 + }, + { + "x": 1730544270000, + "y": 124 + }, + { + "x": 1730544300000, + "y": 161 + }, + { + "x": 1730544330000, + "y": 126 + }, + { + "x": 1730544360000, + "y": 140 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 120 + }, + { + "x": 1730544450000, + "y": 125 + }, + { + "x": 1730544480000, + "y": 128 + }, + { + "x": 1730544510000, + "y": 120 + }, + { + "x": 1730544540000, + "y": 123 + }, + { + "x": 1730544570000, + "y": 135 + }, + { + "x": 1730544600000, + "y": 120 + }, + { + "x": 1730544630000, + "y": 139 + }, + { + "x": 1730544660000, + "y": 113 + }, + { + "x": 1730544690000, + "y": 154 + }, + { + "x": 1730544720000, + "y": 154 + }, + { + "x": 1730544750000, + "y": 115 + }, + { + "x": 1730544780000, + "y": 120 + }, + { + "x": 1730544810000, + "y": 114 + }, + { + "x": 1730544840000, + "y": 133 + }, + { + "x": 1730544870000, + "y": 127 + }, + { + "x": 1730544900000, + "y": 139 + }, + { + "x": 1730544930000, + "y": 35 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ttbh", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4441, + "pattern": "info 0", + "regex": ".*?info.+?0.*?", + "sample": "info: cartservice.cartstore.ValkeyCartStore[0]\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "info: cartservice.cartstore.ValkeyCartStore[0]\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.586Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 117 + }, + { + "x": 1730543820000, + "y": 104 + }, + { + "x": 1730543850000, + "y": 146 + }, + { + "x": 1730543880000, + "y": 103 + }, + { + "x": 1730543910000, + "y": 86 + }, + { + "x": 1730543940000, + "y": 110 + }, + { + "x": 1730543970000, + "y": 97 + }, + { + "x": 1730544000000, + "y": 119 + }, + { + "x": 1730544030000, + "y": 120 + }, + { + "x": 1730544060000, + "y": 110 + }, + { + "x": 1730544090000, + "y": 116 + }, + { + "x": 1730544120000, + "y": 109 + }, + { + "x": 1730544150000, + "y": 124 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 109 + }, + { + "x": 1730544240000, + "y": 115 + }, + { + "x": 1730544270000, + "y": 113 + }, + { + "x": 1730544300000, + "y": 137 + }, + { + "x": 1730544330000, + "y": 114 + }, + { + "x": 1730544360000, + "y": 122 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 113 + }, + { + "x": 1730544450000, + "y": 114 + }, + { + "x": 1730544480000, + "y": 117 + }, + { + "x": 1730544510000, + "y": 116 + }, + { + "x": 1730544540000, + "y": 117 + }, + { + "x": 1730544570000, + "y": 121 + }, + { + "x": 1730544600000, + "y": 112 + }, + { + "x": 1730544630000, + "y": 123 + }, + { + "x": 1730544660000, + "y": 108 + }, + { + "x": 1730544690000, + "y": 129 + }, + { + "x": 1730544720000, + "y": 132 + }, + { + "x": 1730544750000, + "y": 111 + }, + { + "x": 1730544780000, + "y": 111 + }, + { + "x": 1730544810000, + "y": 108 + }, + { + "x": 1730544840000, + "y": 120 + }, + { + "x": 1730544870000, + "y": 118 + }, + { + "x": 1730544900000, + "y": 120 + }, + { + "x": 1730544930000, + "y": 73 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "eahn", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4152, + "pattern": "Fetch cart", + "regex": ".*?Fetch.+?cart.*?", + "sample": "Fetch cart", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Fetch cart" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 112 + }, + { + "x": 1730543820000, + "y": 94 + }, + { + "x": 1730543850000, + "y": 132 + }, + { + "x": 1730543880000, + "y": 100 + }, + { + "x": 1730543910000, + "y": 80 + }, + { + "x": 1730543940000, + "y": 97 + }, + { + "x": 1730543970000, + "y": 96 + }, + { + "x": 1730544000000, + "y": 113 + }, + { + "x": 1730544030000, + "y": 113 + }, + { + "x": 1730544060000, + "y": 105 + }, + { + "x": 1730544090000, + "y": 111 + }, + { + "x": 1730544120000, + "y": 104 + }, + { + "x": 1730544150000, + "y": 119 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 100 + }, + { + "x": 1730544240000, + "y": 110 + }, + { + "x": 1730544270000, + "y": 107 + }, + { + "x": 1730544300000, + "y": 123 + }, + { + "x": 1730544330000, + "y": 107 + }, + { + "x": 1730544360000, + "y": 112 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 109 + }, + { + "x": 1730544450000, + "y": 108 + }, + { + "x": 1730544480000, + "y": 111 + }, + { + "x": 1730544510000, + "y": 114 + }, + { + "x": 1730544540000, + "y": 114 + }, + { + "x": 1730544570000, + "y": 112 + }, + { + "x": 1730544600000, + "y": 107 + }, + { + "x": 1730544630000, + "y": 114 + }, + { + "x": 1730544660000, + "y": 105 + }, + { + "x": 1730544690000, + "y": 115 + }, + { + "x": 1730544720000, + "y": 119 + }, + { + "x": 1730544750000, + "y": 109 + }, + { + "x": 1730544780000, + "y": 106 + }, + { + "x": 1730544810000, + "y": 105 + }, + { + "x": 1730544840000, + "y": 113 + }, + { + "x": 1730544870000, + "y": 113 + }, + { + "x": 1730544900000, + "y": 109 + }, + { + "x": 1730544930000, + "y": 27 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "xpjx", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 602, + "pattern": "called with userId 11ef 8217 d64fba5f23b1", + "regex": ".*?called.+?with.+?userId.+?11ef.+?8217.+?d64fba5f23b1.*?", + "sample": "GetCartAsync called with userId=fb462b14-9908-11ef-8217-d64fba5f23b1", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "GetCartAsync called with userId=fb462b14-9908-11ef-8217-d64fba5f23b1" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.219Z", + "lastOccurrence": "2024-11-02T10:55:34.364Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 12 + }, + { + "x": 1730543820000, + "y": 26 + }, + { + "x": 1730543850000, + "y": 34 + }, + { + "x": 1730543880000, + "y": 6 + }, + { + "x": 1730543910000, + "y": 16 + }, + { + "x": 1730543940000, + "y": 30 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 14 + }, + { + "x": 1730544030000, + "y": 18 + }, + { + "x": 1730544060000, + "y": 12 + }, + { + "x": 1730544090000, + "y": 10 + }, + { + "x": 1730544120000, + "y": 12 + }, + { + "x": 1730544150000, + "y": 12 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 22 + }, + { + "x": 1730544240000, + "y": 12 + }, + { + "x": 1730544270000, + "y": 14 + }, + { + "x": 1730544300000, + "y": 36 + }, + { + "x": 1730544330000, + "y": 18 + }, + { + "x": 1730544360000, + "y": 24 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 10 + }, + { + "x": 1730544450000, + "y": 14 + }, + { + "x": 1730544480000, + "y": 14 + }, + { + "x": 1730544510000, + "y": 4 + }, + { + "x": 1730544540000, + "y": 6 + }, + { + "x": 1730544570000, + "y": 26 + }, + { + "x": 1730544600000, + "y": 14 + }, + { + "x": 1730544630000, + "y": 22 + }, + { + "x": 1730544660000, + "y": 8 + }, + { + "x": 1730544690000, + "y": 34 + }, + { + "x": 1730544720000, + "y": 34 + }, + { + "x": 1730544750000, + "y": 4 + }, + { + "x": 1730544780000, + "y": 12 + }, + { + "x": 1730544810000, + "y": 6 + }, + { + "x": 1730544840000, + "y": 16 + }, + { + "x": 1730544870000, + "y": 12 + }, + { + "x": 1730544900000, + "y": 28 + }, + { + "x": 1730544930000, + "y": 8 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ckdv", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 382, + "pattern": "AddItemAsync called with userId 11ef 8217 d64fba5f23b1 productId quantity", + "regex": ".*?AddItemAsync.+?called.+?with.+?userId.+?11ef.+?8217.+?d64fba5f23b1.+?productId.+?quantity.*?", + "sample": "AddItemAsync called with userId=fc4e8196-9908-11ef-8217-d64fba5f23b1, productId=1YMWWN1N4O, quantity=10", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "AddItemAsync called with userId=fc4e8196-9908-11ef-8217-d64fba5f23b1, productId=1YMWWN1N4O, quantity=10" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.216Z", + "lastOccurrence": "2024-11-02T10:55:34.363Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 8 + }, + { + "x": 1730543820000, + "y": 14 + }, + { + "x": 1730543850000, + "y": 22 + }, + { + "x": 1730543880000, + "y": 6 + }, + { + "x": 1730543910000, + "y": 8 + }, + { + "x": 1730543940000, + "y": 22 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 10 + }, + { + "x": 1730544030000, + "y": 10 + }, + { + "x": 1730544060000, + "y": 8 + }, + { + "x": 1730544090000, + "y": 10 + }, + { + "x": 1730544120000, + "y": 8 + }, + { + "x": 1730544150000, + "y": 8 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 14 + }, + { + "x": 1730544240000, + "y": 8 + }, + { + "x": 1730544270000, + "y": 10 + }, + { + "x": 1730544300000, + "y": 20 + }, + { + "x": 1730544330000, + "y": 10 + }, + { + "x": 1730544360000, + "y": 16 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 6 + }, + { + "x": 1730544450000, + "y": 10 + }, + { + "x": 1730544480000, + "y": 10 + }, + { + "x": 1730544510000, + "y": 4 + }, + { + "x": 1730544540000, + "y": 6 + }, + { + "x": 1730544570000, + "y": 10 + }, + { + "x": 1730544600000, + "y": 6 + }, + { + "x": 1730544630000, + "y": 14 + }, + { + "x": 1730544660000, + "y": 4 + }, + { + "x": 1730544690000, + "y": 22 + }, + { + "x": 1730544720000, + "y": 18 + }, + { + "x": 1730544750000, + "y": 4 + }, + { + "x": 1730544780000, + "y": 8 + }, + { + "x": 1730544810000, + "y": 6 + }, + { + "x": 1730544840000, + "y": 12 + }, + { + "x": 1730544870000, + "y": 8 + }, + { + "x": 1730544900000, + "y": 16 + }, + { + "x": 1730544930000, + "y": 4 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "habq", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 216, + "pattern": "GetCartAsync called with userId", + "regex": ".*?GetCartAsync.+?called.+?with.+?userId.*?", + "sample": "GetCartAsync called with userId=", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "GetCartAsync called with userId=" + ] + }, + "firstOccurrence": "2024-11-02T10:36:36.912Z", + "lastOccurrence": "2024-11-02T10:55:33.022Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 10 + }, + { + "x": 1730543820000, + "y": 4 + }, + { + "x": 1730543850000, + "y": 6 + }, + { + "x": 1730543880000, + "y": 4 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 4 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 10 + }, + { + "x": 1730544030000, + "y": 10 + }, + { + "x": 1730544060000, + "y": 6 + }, + { + "x": 1730544090000, + "y": 2 + }, + { + "x": 1730544120000, + "y": 8 + }, + { + "x": 1730544150000, + "y": 8 + }, + { + "x": 1730544180000, + "y": 4 + }, + { + "x": 1730544210000, + "y": 6 + }, + { + "x": 1730544240000, + "y": 2 + }, + { + "x": 1730544270000, + "y": 4 + }, + { + "x": 1730544300000, + "y": 8 + }, + { + "x": 1730544330000, + "y": 4 + }, + { + "x": 1730544360000, + "y": 4 + }, + { + "x": 1730544390000, + "y": 2 + }, + { + "x": 1730544420000, + "y": 8 + }, + { + "x": 1730544450000, + "y": 4 + }, + { + "x": 1730544480000, + "y": 10 + }, + { + "x": 1730544510000, + "y": 2 + }, + { + "x": 1730544540000, + "y": 12 + }, + { + "x": 1730544570000, + "y": 8 + }, + { + "x": 1730544600000, + "y": 8 + }, + { + "x": 1730544630000, + "y": 6 + }, + { + "x": 1730544660000, + "y": 6 + }, + { + "x": 1730544690000, + "y": 2 + }, + { + "x": 1730544720000, + "y": 6 + }, + { + "x": 1730544750000, + "y": 6 + }, + { + "x": 1730544780000, + "y": 4 + }, + { + "x": 1730544810000, + "y": 2 + }, + { + "x": 1730544840000, + "y": 6 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 8 + }, + { + "x": 1730544930000, + "y": 4 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "tzfi", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 55, + "pattern": "Empty cart", + "regex": ".*?Empty.+?cart.*?", + "sample": "Empty cart", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Empty cart" + ] + }, + "firstOccurrence": "2024-11-02T10:36:41.806Z", + "lastOccurrence": "2024-11-02T10:55:32.654Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 1 + }, + { + "x": 1730543820000, + "y": 3 + }, + { + "x": 1730543850000, + "y": 3 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 2 + }, + { + "x": 1730543940000, + "y": 2 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 1 + }, + { + "x": 1730544030000, + "y": 2 + }, + { + "x": 1730544060000, + "y": 1 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 1 + }, + { + "x": 1730544150000, + "y": 1 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 2 + }, + { + "x": 1730544240000, + "y": 1 + }, + { + "x": 1730544270000, + "y": 1 + }, + { + "x": 1730544300000, + "y": 4 + }, + { + "x": 1730544330000, + "y": 2 + }, + { + "x": 1730544360000, + "y": 2 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 1 + }, + { + "x": 1730544450000, + "y": 1 + }, + { + "x": 1730544480000, + "y": 1 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 4 + }, + { + "x": 1730544600000, + "y": 2 + }, + { + "x": 1730544630000, + "y": 2 + }, + { + "x": 1730544660000, + "y": 1 + }, + { + "x": 1730544690000, + "y": 3 + }, + { + "x": 1730544720000, + "y": 4 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 1 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 1 + }, + { + "x": 1730544870000, + "y": 1 + }, + { + "x": 1730544900000, + "y": 3 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ldwf", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 55, + "pattern": "feature_flag", + "regex": ".*?feature_flag.*?", + "sample": "feature_flag", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "feature_flag" + ] + }, + "firstOccurrence": "2024-11-02T10:36:41.809Z", + "lastOccurrence": "2024-11-02T10:55:32.655Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 1 + }, + { + "x": 1730543820000, + "y": 3 + }, + { + "x": 1730543850000, + "y": 3 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 2 + }, + { + "x": 1730543940000, + "y": 2 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 1 + }, + { + "x": 1730544030000, + "y": 2 + }, + { + "x": 1730544060000, + "y": 1 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 1 + }, + { + "x": 1730544150000, + "y": 1 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 2 + }, + { + "x": 1730544240000, + "y": 1 + }, + { + "x": 1730544270000, + "y": 1 + }, + { + "x": 1730544300000, + "y": 4 + }, + { + "x": 1730544330000, + "y": 2 + }, + { + "x": 1730544360000, + "y": 2 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 1 + }, + { + "x": 1730544450000, + "y": 1 + }, + { + "x": 1730544480000, + "y": 1 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 4 + }, + { + "x": 1730544600000, + "y": 2 + }, + { + "x": 1730544630000, + "y": 2 + }, + { + "x": 1730544660000, + "y": 1 + }, + { + "x": 1730544690000, + "y": 3 + }, + { + "x": 1730544720000, + "y": 4 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 1 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 1 + }, + { + "x": 1730544870000, + "y": 1 + }, + { + "x": 1730544900000, + "y": 3 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "noer", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 2, + "pattern": "OTEL-SDK BatchActivityExportProcessor exporting to OtlpTraceExporter dropped items", + "regex": ".*?OTEL-SDK.+?BatchActivityExportProcessor.+?exporting.+?to.+?OtlpTraceExporter.+?dropped.+?items.*?", + "sample": "OTEL-SDK: [224] 'BatchActivityExportProcessor' exporting to 'OtlpTraceExporter' dropped '0' items.", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "OTEL-SDK: [224] 'BatchActivityExportProcessor' exporting to 'OtlpTraceExporter' dropped '0' items." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.580Z", + "lastOccurrence": "2024-11-02T10:55:36.580Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "fiia", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1, + "pattern": "my-otel-demo-valkey open", + "regex": ".*?my-otel-demo-valkey.+?open.*?", + "sample": "my-otel-demo-valkey (10.106.38.244:6379) open\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "my-otel-demo-valkey (10.106.38.244:6379) open\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:34.993Z", + "lastOccurrence": "2024-11-02T10:55:34.993Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "uzyf", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 78, + "pattern": "OTEL-SDK Instrument Meter has been deactivated", + "regex": ".*?OTEL-SDK.+?Instrument.+?Meter.+?has.+?been.+?deactivated.*?", + "sample": "OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated.", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.585Z", + "lastOccurrence": "2024-11-02T10:55:36.586Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 78 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "lciw", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 4, + "pattern": "OTEL-SDK Disposed", + "regex": ".*?OTEL-SDK.+?Disposed.*?", + "sample": "OTEL-SDK: [224] 'MeterProvider' Disposed.", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "OTEL-SDK: [224] 'MeterProvider' Disposed." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.581Z", + "lastOccurrence": "2024-11-02T10:55:36.586Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 4 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "woqa", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 3, + "pattern": "exiting", + "regex": ".*?exiting.*?", + "sample": "exiting...\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "exiting...\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:55.622Z", + "lastOccurrence": "2024-11-02T10:56:51.618Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 1 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ucuj", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 2, + "pattern": "Application is shutting down", + "regex": ".*?Application.+?is.+?shutting.+?down.*?", + "sample": "Application is shutting down...", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Application is shutting down..." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.560Z", + "lastOccurrence": "2024-11-02T10:55:36.560Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "cgip", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 3, + "pattern": "FATAL Could not start entrypoint", + "regex": ".*?FATAL.+?Could.+?not.+?start.+?entrypoint.*?", + "sample": "FATAL: Could not start, bad entrypoint!\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "FATAL: Could not start, bad entrypoint!\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:35.618Z", + "lastOccurrence": "2024-11-02T10:56:31.617Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 1 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "spike", + "significance": "high", + "change_point": 38, + "p_value": 1.8274885276877215e-20, + "timestamp": "2024-11-02T10:55:30.000Z" + }, + "shortId": "reqc", + "relevance": "critical", + "interesting": true + } + ], + "patternsFromOtherEntities": [ + { + "field": "message", + "count": 26, + "pattern": "I1102 replica_set.go Finished syncing logger replicaset-controller kind ReplicaSet key duration", + "regex": ".*?I1102.+?replica_set\\.go.+?Finished.+?syncing.+?logger.+?replicaset-controller.+?kind.+?ReplicaSet.+?key.+?duration.*?", + "sample": "I1102 10:55:33.013871 1 replica_set.go:679] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-cartservice-7b585f4fb7\" duration=\"101.333µs\"\n", + "highlight": { + "body.text": [ + "] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-<em>cartservice</em>" + ], + "message": [ + "] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-<em>cartservice</em>" + ] + }, + "metadata": { + "service.name": [ + "kube-controller-manager" + ], + "message": [ + "I1102 10:55:33.013871 1 replica_set.go:679] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-cartservice-7b585f4fb7\" duration=\"101.333µs\"\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:33.014Z", + "lastOccurrence": "2024-11-02T10:56:52.568Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 19 + }, + { + "x": 1730544960000, + "y": 2 + }, + { + "x": 1730544990000, + "y": 5 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "spike", + "significance": "high", + "change_point": 38, + "p_value": 7.313742705200763e-147, + "timestamp": "2024-11-02T10:55:30.000Z" + }, + "shortId": "ofdx", + "relevance": "normal", + "interesting": true + }, + { + "field": "message", + "count": 21, + "pattern": "object apiVersion events.k8s.io/v1 deprecatedCount deprecatedFirstTimestamp deprecatedLastTimestamp deprecatedSource component eventTime null kind Event metadata creationTimestamp managedFields apiVersion v1 fieldsType FieldsV1 fieldsV1", + "regex": ".*?object.+?apiVersion.+?events\\.k8s\\.io/v1.+?deprecatedCount.+?deprecatedFirstTimestamp.+?deprecatedLastTimestamp.+?deprecatedSource.+?component.+?eventTime.+?null.+?kind.+?Event.+?metadata.+?creationTimestamp.+?managedFields.+?apiVersion.+?v1.+?fieldsType.+?FieldsV1.+?fieldsV1.*?", + "sample": "{\"object\":{\"apiVersion\":\"events.k8s.io/v1\",\"deprecatedCount\":2,\"deprecatedFirstTimestamp\":\"2024-11-02T10:56:17Z\",\"deprecatedLastTimestamp\":\"2024-11-02T10:56:52Z\",\"deprecatedSource\":{\"component\":\"kubelet\",\"host\":\"minikube\"},\"eventTime\":null,\"kind\":\"Event\",\"metadata\":{\"creationTimestamp\":\"2024-11-02T10:56:17Z\",\"managedFields\":[{\"apiVersion\":\"v1\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:count\":{},\"f:firstTimestamp\":{},\"f:involvedObject\":{},\"f:lastTimestamp\":{},\"f:message\":{},\"f:reason\":{},\"f:reportingComponent\":{},\"f:reportingInstance\":{},\"f:source\":{\"f:component\":{},\"f:host\":{}},\"f:type\":{}},\"manager\":\"kubelet\",\"operation\":\"Update\",\"time\":\"2024-11-02T10:56:52Z\"}],\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz.1804217ce2cb3041\",\"namespace\":\"default\",\"resourceVersion\":\"375301\",\"uid\":\"cf211b63-a5e4-40c4-bed3-fe90aea76a38\"},\"note\":\"Back-off restarting failed container cartservice in pod my-otel-demo-cartservice-7b585f4fb7-79ccz_default(9580334a-7ef9-4ad5-baf6-0ad10ae49853)\",\"reason\":\"BackOff\",\"regarding\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.containers{cartservice}\",\"kind\":\"Pod\",\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz\",\"namespace\":\"default\",\"resourceVersion\":\"375163\",\"uid\":\"9580334a-7ef9-4ad5-baf6-0ad10ae49853\"},\"reportingController\":\"kubelet\",\"reportingInstance\":\"minikube\",\"type\":\"Warning\"},\"type\":\"MODIFIED\"}", + "highlight": { + "message": [ + "},\"manager\":\"kubelet\",\"operation\":\"Update\",\"time\":\"2024-11-02T10:56:52Z\"}],\"name\":\"my-otel-demo-<em>cartservice</em>", + "375301\",\"uid\":\"cf211b63-a5e4-40c4-bed3-fe90aea76a38\"},\"note\":\"Back-off restarting failed container <em>cartservice</em>", + "in pod my-otel-demo-<em>cartservice</em>-7b585f4fb7-79ccz_default(9580334a-7ef9-4ad5-baf6-0ad10ae49853)\",\"reason", + "\":\"BackOff\",\"regarding\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.containers{<em>cartservice</em>}\",\"kind\":\"Pod\",\"name", + "\":\"my-otel-demo-<em>cartservice</em>-7b585f4fb7-79ccz\",\"namespace\":\"default\",\"resourceVersion\":\"375163\",\"uid\":" + ] + }, + "metadata": { + "service.name": [ + "unknown" + ], + "message": [ + "{\"object\":{\"apiVersion\":\"events.k8s.io/v1\",\"deprecatedCount\":2,\"deprecatedFirstTimestamp\":\"2024-11-02T10:56:17Z\",\"deprecatedLastTimestamp\":\"2024-11-02T10:56:52Z\",\"deprecatedSource\":{\"component\":\"kubelet\",\"host\":\"minikube\"},\"eventTime\":null,\"kind\":\"Event\",\"metadata\":{\"creationTimestamp\":\"2024-11-02T10:56:17Z\",\"managedFields\":[{\"apiVersion\":\"v1\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:count\":{},\"f:firstTimestamp\":{},\"f:involvedObject\":{},\"f:lastTimestamp\":{},\"f:message\":{},\"f:reason\":{},\"f:reportingComponent\":{},\"f:reportingInstance\":{},\"f:source\":{\"f:component\":{},\"f:host\":{}},\"f:type\":{}},\"manager\":\"kubelet\",\"operation\":\"Update\",\"time\":\"2024-11-02T10:56:52Z\"}],\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz.1804217ce2cb3041\",\"namespace\":\"default\",\"resourceVersion\":\"375301\",\"uid\":\"cf211b63-a5e4-40c4-bed3-fe90aea76a38\"},\"note\":\"Back-off restarting failed container cartservice in pod my-otel-demo-cartservice-7b585f4fb7-79ccz_default(9580334a-7ef9-4ad5-baf6-0ad10ae49853)\",\"reason\":\"BackOff\",\"regarding\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.containers{cartservice}\",\"kind\":\"Pod\",\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz\",\"namespace\":\"default\",\"resourceVersion\":\"375163\",\"uid\":\"9580334a-7ef9-4ad5-baf6-0ad10ae49853\"},\"reportingController\":\"kubelet\",\"reportingInstance\":\"minikube\",\"type\":\"Warning\"},\"type\":\"MODIFIED\"}" + ] + }, + "firstOccurrence": "2024-11-02T10:55:33.051Z", + "lastOccurrence": "2024-11-02T10:56:52.563Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 16 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 4 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "spike", + "significance": "high", + "change_point": 38, + "p_value": 2.9750218550484796e-168, + "timestamp": "2024-11-02T10:55:30.000Z" + }, + "shortId": "lqan", + "relevance": "critical", + "interesting": true + } + ], + "searches": [ + { + "fragments": [ + "AddItemAsync called with userId", + "productId", + "quantity" + ], + "appearsAs": "userId, productId, and quantity are referenced in the request handling log entries in cartservice." + }, + { + "fragments": [ + "GetCartAsync called with userId" + ], + "appearsAs": "userId is referenced in the request handling log entries in cartservice." + }, + { + "fragments": [ + "Empty cart" + ], + "appearsAs": "Empty cart operation logs in cartservice." + }, + { + "fragments": [ + "cartServiceFailure" + ], + "appearsAs": "Feature flag 'cartServiceFailure' in cartservice." + }, + { + "fragments": [ + "10.244.0.61" + ], + "appearsAs": "IP address of the cartservice pod." + }, + { + "fragments": [ + "my-otel-demo-cartservice-67575c6f84-vngzw" + ], + "appearsAs": "Pod name of cartservice." + }, + { + "fragments": [ + "my-otel-demo-valkey:6379" + ], + "appearsAs": "Redis service used by cartservice." + }, + { + "fragments": [ + "/oteldemo.CartService/AddItem", + "/oteldemo.CartService/GetCart", + "/oteldemo.CartService/EmptyCart" + ], + "appearsAs": "Endpoints handled by cartservice." + }, + { + "fragments": [ + "flagd.evaluation.v1.Service" + ], + "appearsAs": "gRPC service involved in feature flag evaluation by cartservice." + }, + { + "fragments": [ + "HGET", + "EXPIRE", + "HMSET" + ], + "appearsAs": "Redis commands executed by cartservice." + } + ], + "relatedEntitiesSummaries": [ + "Based on the context provided, the following entities are potentially related to `service.name:cartservice` as either upstream or downstream dependencies. Below is a detailed analysis based on the indicators of relationships obtained from the observability data:\n\n### 1. Related Entity: `service.name:controller`\n- **Indicators**: \n - **Average Indicator**: The logs highlight high error rates (500 Internal Server Error) in the controller when POST requests to the `/api/cart` endpoint are made.\n - **Field values**: In controller logs, `message` contains references to the `/api/cart` endpoint, which is handled by `cartservice`.\n- **Reasoning**: \n - The `controller` service is responsible for managing /api/cart requests. Thus, it acts as a direct upstream service to `cartservice`.\n - It implies `controller` calls `cartservice` as part of handling requests, leading to the observed errors.\n- **Likeliness**: High\n - The `controller` service is likely a highly relevant entity since it directly interfaces with `cartservice`, with the errors surfacing in it when interacting with `cartservice`.\n\n### 2. Related Entity: `service.name:frontend`\n- **Indicators**:\n - **Strong Indicator**: The system architecture documentation shows that `frontend` interacts with various backend services, including those for user interactions such as adding items to the cart.\n - **Field values**: In the knowledge base, `frontend` receives HTTP traffic routed through `frontendproxy` and interacts with `cartservice`.\n- **Reasoning**:\n - `frontend` would act as a direct upstream service that communicates with `controller`, providing requests that eventually hit `cartservice`.\n- **Likeliness**: High\n - As `frontend` handles initial user interactions and routes requests to `cartservice`, it is essential in the request flow leading to `/api/cart` errors.\n\n### 3. Related Entity: `service.name:currencyservice`\n- **Indicators**:\n - **Strong Indicator**: The architecture description indicates `currencyservice` interacts with `cartservice` to handle currency conversions.\n - **Field values**: The entries show gRPC calls between `cartservice` and `currencyservice` for conversion operations.\n- **Reasoning**:\n - `currencyservice` may be an upstream dependency for `cartservice` for any currency-related manipulations on cart items.\n- **Likeliness**: Medium-High\n - While `currencyservice` interacts with `cartservice`, its exact influence on the direct issue might not be as strong as `controller` or `frontend`.\n\n### 4. Related Entity: `service.name:checkoutservice`\n- **Indicators**:\n - **Strong Indicator**: The architecture documentation lists `checkoutservice` as coordinating the checkout process involving interactions with `cartservice`.\n - **Field values**: Distributed tracing data could show `checkoutservice` making gRPC or HTTP calls to `cartservice`.\n- **Reasoning**:\n - `checkoutservice` is likely a downstream service that relies on the correct functioning of `cartservice` to gather cart data before proceeding to checkout operations.\n- **Likeliness**: Medium\n - Although primarily a downstream dependency, it processes important data from `cartservice`.\n\n### 5. Related Entity: `service.name:adservice`\n- **Indicators**:\n - **Weak Indicator**: `adservice` interfaces with `frontend` via gRPC to deliver ad content, it also might indirectly influence `cartservice` interactions if ads are part of the cart page.\n - **Field values**: Architectural details state `adservice` operates in the background to enhance user experience but no direct interaction with `cartservice`.\n- **Reasoning**:\n - While not directly connected, any latency in `adservice` may affect the overall user experience, causing indirect latency in calls that reach `cartservice`.\n- **Likeliness**: Low-Medium\n - Indirect connection and latent repercussions on user interactions with cart functionality.\n\n### 6. Related Entity: `service.name:loadgenerator`\n- **Indicators**:\n - **Average Indicator**: The `loadgenerator` service generates simulated traffic, handled by `frontendproxy` to stress-test services like `cartservice`.\n - **Field values**: Traffic from `loadgenerator` is routed through `frontendproxy` to reach core services, including `cartservice`.\n- **Reasoning**:\n - As an external input simulator, its traffic generation directly impacts `cartservice` when testing load resilience.\n- **Likeliness**: Medium\n - The errors can be a result of load tests conducted by `loadgenerator` surfacing bottlenecks in `cartservice`.\n\n### Summary\n\nTo conclude, the following entities are likely relevant to the issue in `service.name:cartservice`:\n\n1. **controller**: Direct upstream causing the 500 errors - High relevance.\n2. **frontend**: Upstream service initiating user interactions - High relevance.\n3. **currencyservice**: Upstream service for currency conversion - Medium-High relevance.\n4. **checkoutservice**: Downstream service relying on cart data - Medium relevance.\n5. **adservice**: Possible indirect impact due to latency - Low-Medium relevance.\n6. **loadgenerator**: Simulated traffic testing the system's resilience - Medium relevance.\n\nBy analyzing these entities, you can prioritize investigating `controller`, `frontend`, and `currencyservice` first, as they have the most direct and potentially impactful interactions with `cartservice`.", + "Based on the context provided, the architecture outlined in the knowledge base entry, the document analysis for the `cartservice`, and search keywords, several possible relationships with the `cartservice` can be identified. Below are the entities identified as highly relevant to the `cartservice`, along with the indicators, evidence, reasoning, and overall relevance.\n\n### 1. Entity: `service.name:frontend`\n\n#### Indicators and Evidence\n- **Average Indicator - URL Paths:**\n - `http://my-otel-demo-cartservice:8080/oteldemo.CartService/AddItem`\n - `http://my-otel-demo-cartservice:8080/oteldemo.CartService/GetCart`\n - `http://my-otel-demo-cartservice:8080/oteldemo.CartService/EmptyCart`\n- **Average Indicator - Logs:**\n - Observed in the search highlights for `service.name:frontend`: `@opentelemetry/api/build/src/api/context.js:60:46) at ServiceClientImpl.clientMethodTrace [as getCart]`\n- **Knowledge Base:**\n - The `frontend` is the core service for user interactions, receiving HTTP traffic and making requests to the `cartservice`.\n\n#### Relationship and Reasoning\nThe `frontend` service interacts directly with the `cartservice` by making requests to handle user shopping cart operations, such as adding items, retrieving the cart, and emptying the cart. Given the observed log entries and URL paths, it is reasonable to infer that the `frontend` service acts as a caller, while the `cartservice` acts as the callee. The high error rates observed in the context likely originate from the `frontend` making POST requests to the `/api/cart` endpoint handled by the `cartservice`.\n\n#### Likelihood of Relevance\n- **Very High:** The `frontend` service is highly likely to be relevant as it has a direct interaction with the `cartservice` and would be significantly impacted by any issues within the `cartservice`.\n\n### 2. Entity: `service.name:valkey`\n\n#### Indicators and Evidence\n- **Average Indicator - Redis Service:**\n - `my-otel-demo-valkey:6379`\n- **Average Indicator - Log Entries:**\n - Log patterns show Redis command execution by `cartservice`: `HGET`, `EXPIRE`, `HMSET`\n\n#### Relationship and Reasoning\nThe `valkey` service corresponds to the Redis instance that `cartservice` uses for data persistence. The `cartservice` makes frequent calls to Redis to perform operations such as fetching, expiring, and setting data, which is crucial for managing shopping cart state. As Redis is an upstream dependency, connection or data integrity issues here could directly contribute to the `500 Internal Server Errors` observed in the `cartservice`.\n\n#### Likelihood of Relevance\n- **High:** The `valkey` service is highly relevant because it is the data store for `cartservice`, directly affecting its behavior and performance.\n\n### 3. Entity: `service.name:currencyservice`\n\n#### Indicators and Evidence\n- **Average Indicator - gRPC Services:**\n - Mentioned in the architecture as handling currency conversions.\n- **Knowledge Base:**\n - Communicates with `cartservice` over gRPC to facilitate currency operations.\n\n#### Relationship and Reasoning\nThe `currencyservice` may interact with `cartservice` to handle price conversions for the items in the cart. Problems with currency conversion could cause unexpected data formats or communication failures, leading to `500 Internal Server Errors` in `cartservice`.\n\n#### Likelihood of Relevance\n- **Moderate:** While the interaction exists, whether it directly contributes to the 500 errors specifically observed at `/api/cart` endpoints would require further investigation.\n\n### 4. Entity: `service.name:checkoutservice`\n\n#### Indicators and Evidence\n- **Strong Indicator - gRPC Services:**\n - Interacts with `checkoutservice` during the checkout process.\n- **Knowledge Base:**\n - Handles interactions including calls to `cartservice` for finalizing orders.\n\n#### Relationship and Reasoning\nThe `checkoutservice` could potentially depend on `cartservice` to validate and finalize items in the user's cart as part of the checkout process. If the `cartservice` fails during these operations, it could propagate errors back up to the user level through `checkoutservice`.\n\n#### Likelihood of Relevance\n- **Moderate:** The relevance depends on whether the observed errors are occurring during checkout processes or general cart manipulations.\n\n### 5. Entity: `service.name:flagd`\n\n#### Indicators and Evidence\n- **Average Indicator - Feature Flag Evaluation:**\n - `flagd.evaluation.v1.Service`\n- **Log Metadata:**\n - `labels.feature_flag_key:keyword - cartServiceFailure`\n- **Trace Destination Service:**\n - `my-otel-demo-flagd:8013`\n\n#### Relationship and Reasoning\nThe `flagd` service is responsible for evaluating feature flags, such as the `cartServiceFailure`. If the feature flagging system is improperly toggled (e.g.: feature flag set to fail operations), it might contribute to the high error rates observed in `cartservice`.\n\n#### Likelihood of Relevance\n- **Moderate:** The feature flags might be causing or amplifying existing issues within the `cartservice`.\n\n### Summary\nFrom the observed data, the following entities are highly likely to be related to `cartservice` with respect to the given context:\n\n1. **`frontend`** - High relevance due to direct HTTP interaction with `cartservice`.\n2. **`valkey`** - High relevance as the Redis data store for `cartservice`.\n\nEntities with moderate likelihood:\n\n1. **`currencyservice`** - Related via gRPC for currency operations.\n2. **`checkoutservice`** - Potentially related during checkout processes.\n3. **`flagd`** - Related to feature flag evaluations involving `cartservice`.\n\nThese relationships cover both upstream dependencies affecting `cartservice` and downstream services impacted by `cartservice` issues, aiding in comprehensive issue diagnosis." + ], + "kbEntries": [ + { + "id": "System architecture", + "text": "The architecture described here outlines a microservices-based system, where each service is implemented in a distinct programming language and communicates via gRPC, HTTP, or TCP. This system is designed to handle simulated user traffic, supported by a variety of interconnected services and components.\n\n### System Architecture\n\n1. **`loadgenerator`** - Simulates external user traffic by sending HTTP requests, which are managed by an Nginx ingress controller. This ingress directs traffic to the `frontendproxy` service.\n\n2. **`frontendproxy` (Envoy)** - Acts as a reverse proxy, routing incoming traffic from `loadgenerator` to `frontend`.\n\n3. **`frontend` (Node.js)** - The core service for user interactions, receiving HTTP traffic from `frontendproxy` and interfacing with various backend services to fulfill requests.\n\n4. **`frontend-web` (RUM)** - A Real User Monitoring (RUM) layer that runs in the user's browser, enabling insights into end-user experiences and frontend performance.\n\n5. **`adservice`** - Delivers advertisements to the `frontend` using gRPC, enhancing the user experience with relevant ad content.\n\n6. **`cartservice`** - Manages shopping cart data, including adding and removing items. It communicates over gRPC and leverages a Redis cache for data persistence.\n\n7. **`currencyservice`** - Handles currency conversions and facilitates interactions between `cartservice` and `checkoutservice` over gRPC.\n\n8. **`checkoutservice`** - Coordinates the checkout process, calling various services for payments, shipping, and emails. It utilizes both gRPC and HTTP protocols to aggregate the necessary information for order completion.\n\n9. **`emailservice`** - Sends order confirmation emails to users via gRPC, triggered by interactions with `checkoutservice`.\n\n10. **`productcatalogservice`** - Maintains the product catalog, storing details about available items and providing this data to other services via gRPC.\n\n11. **`recommendationservice`** - Generates personalized product recommendations, accessed by `frontend` over gRPC.\n\n12. **`shippingservice`** - Manages shipping information, providing essential data to `checkoutservice` over gRPC.\n\n13. **`quoteservice`** - Supplies shipping quotes over HTTP, which are accessed by `shippingservice` to estimate shipping costs.\n\n14. **`paymentservice`** - Processes payment transactions through gRPC, enabling secure and efficient payments for `checkoutservice`.\n\n15. **`accountingservice`** - Responsible for recording transactions, it connects to a Kafka queue and interacts over TCP.\n\n16. **`frauddetectionservice`** - Monitors orders for potential fraud, also interfacing with the Kafka queue over TCP to receive relevant transaction data.\n\n17. **`imageprovider` (Nginx)** - Serves static images for the frontend interface, accessible over HTTP.\n\n18. **`queue` (Kafka)** - Acts as a central message broker, facilitating communication between `accountingservice` and `frauddetectionservice`.\n\n### Key Components\nThe system is structured to enable robust, distributed communication across services, allowing each component to focus on a specific aspect of the user experience or business logic. The ingress controller, in particular, plays a critical role in directing traffic, ensuring that incoming requests from `loadgenerator` are correctly routed through `frontendproxy` and into the system’s core services.\n\nThis architecture ensures that the system can handle high traffic loads and provides a modular, flexible framework to meet user demands while monitoring for performance and security.\n", + "tokens": 733, + "score": 5 + } + ] + } + } + }, + { + "role": "assistant", + "content": "", + "toolCalls": [ + { + "toolCallId": "call_KJwmI3xgY1gcstI4MVd4Olcf", + "function": { + "name": "observe", + "arguments": { + "observe": true + } + } + } + ] + }, + { + "name": "observe", + "response": { + "content": "### Acknowledgement of Investigations\n\nThe investigations of the `cartservice` and `frontend` services have provided valuable insights into the root cause of the high error rates observed in the `controller` service for POST requests to the `/api/cart` endpoint. The initial context indicated a severe and rapid onset of errors beginning at `2024-11-02T10:56:42.498Z`.\n\n### Key Observations\n\n**Investigation of Service `cartservice`**:\n- **Infrastructure & Environment**: The `cartservice` runs in a Kubernetes environment within the `default` namespace and uses Redis for data persistence.\n- **Log Patterns**:\n - Significant startup issues and fatal errors around `2024-11-02T10:55:30.000Z`.\n - A fatal \"bad entrypoint\" error prevented the service from starting correctly, leading to high error rates.\n- **Communication Endpoints**:\n - gRPC methods targeting shopping cart data.\n- **Critical Errors**:\n - \"FATAL: Could not start, bad entrypoint!\" log messages indicate critical failure.\n- **Implications**:\n - Startup issues likely prevented `cartservice` from responding to requests, causing downstream problems observed in the `controller` service.\n\n**Investigation of Service `frontend`**:\n- **Infrastructure & Environment**: The `frontend` service operates within a Kubernetes environment, communicating primarily via HTTP and gRPC.\n- **Log Patterns**:\n - Sharp increase in connection errors to the `cartservice` starting around `2024-11-02T10:55:30.000Z`.\n - \"ECONNREFUSED\" errors indicate failed attempts to connect to the `cartservice`.\n- **Communication Endpoints**:\n - Interacts with `cartservice` via gRPC.\n- **Critical Errors**:\n - \"No connection established\" and \"failed to get user cart during checkout\" errors.\n- **Implications**:\n - Communication failures between `frontend` and `cartservice` are strongly correlated with the high error rates in the `controller` service.\n\n### Timeline of Significant Events\n\n**2024-11-02T10:55:30.000Z**:\n- **`cartservice` Logs**:\n - \"OTEL-SDK: Instrument deactivation\" (78 occurrences), \"MeterProvider Disposed\" (4 occurrences), \"exiting...\" (3 occurrences), \"Application is shutting down...\" (2 occurrences), \"FATAL: Could not start, bad entrypoint!\" (2 occurrences).\n - **Meaning**: Indicates various startup and shutdown issues, especially the fatal entrypoint error that likely prevented the service from running correctly.\n\n**2024-11-02T10:55:30.000Z**:\n- **`frontend` Logs**:\n - \"No connection established\" errors (291 occurrences) and \"cart failure due to connection error\" (2 occurrences).\n - **Meaning**: Indicates immediate connection issues between `frontend` and `cartservice`.\n\n**2024-11-02T10:56:00.000Z**:\n- **`frontend` Logs**:\n - Further increase in \"No connection established\" errors (381 occurrences).\n - **Meaning**: Continued significant connection issues.\n\n**2024-11-02T10:56:30.000Z**:\n- **`cartservice` Logs**:\n - Another \"bad entrypoint\" fatal error (1 additional occurrence).\n - **Meaning**: Persistent startup issues continue to cause service failures.\n\n**2024-11-02T10:56:42.498Z**:\n- **Alert Triggered**:\n - High error rate (98.78%) in `controller` for POST requests to `/api/cart`.\n - **Meaning**: The timing aligns closely with the observed spikes in connection errors and startup issues, indicating a direct correlation.\n\n**2024-11-02T10:57:00.000Z**:\n- **`frontend` Logs**:\n - Connection errors return to zero occurrences.\n - **Meaning**: The immediate spike in connection issues appears to have subsided.\n\n### Context and Reasoning\n\nThe investigations reveal a clear temporal correlation and a logical causal pathway leading from the critical errors in `cartservice` to the observed high error rates in the `controller` service. The startup and initialization issues in `cartservice` around `2024-11-02T10:55:30.000Z` prevented it from functioning correctly, leading to connection refusal errors when `frontend` tried to access it. In turn, these failures propagated upstream, causing the `controller` to report high error rates for POST requests to the `/api/cart` endpoint.\n\n### Next Steps and Conclusion\n\n**Conclusion**:\n- The root cause of the high error rates in the `controller` service is the startup failure and persistent initialization issues in the `cartservice`.\n- These failures led to widespread connection refusal errors in `frontend`, which directly affected the ability of the `controller` to process requests to the `/api/cart` endpoint.\n\n**Recommendation**:\n- Address the misconfiguration or code issues in `cartservice` that are causing the fatal startup errors.\n- Ensure `cartservice` can reliably start and maintain stable communication with `frontend`.\n\nHaving thoroughly investigated the involved services, identified the key issues, and established the root cause, there is no need to further investigate other entities at this time. Conclude the investigation upon resolving the identified startup and initialization issues in `cartservice`." + }, + "data": { + "content": "### Acknowledgement of Investigations\n\nThe investigations of the `cartservice` and `frontend` services have provided valuable insights into the root cause of the high error rates observed in the `controller` service for POST requests to the `/api/cart` endpoint. The initial context indicated a severe and rapid onset of errors beginning at `2024-11-02T10:56:42.498Z`.\n\n### Key Observations\n\n**Investigation of Service `cartservice`**:\n- **Infrastructure & Environment**: The `cartservice` runs in a Kubernetes environment within the `default` namespace and uses Redis for data persistence.\n- **Log Patterns**:\n - Significant startup issues and fatal errors around `2024-11-02T10:55:30.000Z`.\n - A fatal \"bad entrypoint\" error prevented the service from starting correctly, leading to high error rates.\n- **Communication Endpoints**:\n - gRPC methods targeting shopping cart data.\n- **Critical Errors**:\n - \"FATAL: Could not start, bad entrypoint!\" log messages indicate critical failure.\n- **Implications**:\n - Startup issues likely prevented `cartservice` from responding to requests, causing downstream problems observed in the `controller` service.\n\n**Investigation of Service `frontend`**:\n- **Infrastructure & Environment**: The `frontend` service operates within a Kubernetes environment, communicating primarily via HTTP and gRPC.\n- **Log Patterns**:\n - Sharp increase in connection errors to the `cartservice` starting around `2024-11-02T10:55:30.000Z`.\n - \"ECONNREFUSED\" errors indicate failed attempts to connect to the `cartservice`.\n- **Communication Endpoints**:\n - Interacts with `cartservice` via gRPC.\n- **Critical Errors**:\n - \"No connection established\" and \"failed to get user cart during checkout\" errors.\n- **Implications**:\n - Communication failures between `frontend` and `cartservice` are strongly correlated with the high error rates in the `controller` service.\n\n### Timeline of Significant Events\n\n**2024-11-02T10:55:30.000Z**:\n- **`cartservice` Logs**:\n - \"OTEL-SDK: Instrument deactivation\" (78 occurrences), \"MeterProvider Disposed\" (4 occurrences), \"exiting...\" (3 occurrences), \"Application is shutting down...\" (2 occurrences), \"FATAL: Could not start, bad entrypoint!\" (2 occurrences).\n - **Meaning**: Indicates various startup and shutdown issues, especially the fatal entrypoint error that likely prevented the service from running correctly.\n\n**2024-11-02T10:55:30.000Z**:\n- **`frontend` Logs**:\n - \"No connection established\" errors (291 occurrences) and \"cart failure due to connection error\" (2 occurrences).\n - **Meaning**: Indicates immediate connection issues between `frontend` and `cartservice`.\n\n**2024-11-02T10:56:00.000Z**:\n- **`frontend` Logs**:\n - Further increase in \"No connection established\" errors (381 occurrences).\n - **Meaning**: Continued significant connection issues.\n\n**2024-11-02T10:56:30.000Z**:\n- **`cartservice` Logs**:\n - Another \"bad entrypoint\" fatal error (1 additional occurrence).\n - **Meaning**: Persistent startup issues continue to cause service failures.\n\n**2024-11-02T10:56:42.498Z**:\n- **Alert Triggered**:\n - High error rate (98.78%) in `controller` for POST requests to `/api/cart`.\n - **Meaning**: The timing aligns closely with the observed spikes in connection errors and startup issues, indicating a direct correlation.\n\n**2024-11-02T10:57:00.000Z**:\n- **`frontend` Logs**:\n - Connection errors return to zero occurrences.\n - **Meaning**: The immediate spike in connection issues appears to have subsided.\n\n### Context and Reasoning\n\nThe investigations reveal a clear temporal correlation and a logical causal pathway leading from the critical errors in `cartservice` to the observed high error rates in the `controller` service. The startup and initialization issues in `cartservice` around `2024-11-02T10:55:30.000Z` prevented it from functioning correctly, leading to connection refusal errors when `frontend` tried to access it. In turn, these failures propagated upstream, causing the `controller` to report high error rates for POST requests to the `/api/cart` endpoint.\n\n### Next Steps and Conclusion\n\n**Conclusion**:\n- The root cause of the high error rates in the `controller` service is the startup failure and persistent initialization issues in the `cartservice`.\n- These failures led to widespread connection refusal errors in `frontend`, which directly affected the ability of the `controller` to process requests to the `/api/cart` endpoint.\n\n**Recommendation**:\n- Address the misconfiguration or code issues in `cartservice` that are causing the fatal startup errors.\n- Ensure `cartservice` can reliably start and maintain stable communication with `frontend`.\n\nHaving thoroughly investigated the involved services, identified the key issues, and established the root cause, there is no need to further investigate other entities at this time. Conclude the investigation upon resolving the identified startup and initialization issues in `cartservice`.", + "investigations": [ + { + "attachments": { + "alerts": [], + "slos": [], + "analysis": { + "total": 41440, + "sampled": 1000, + "fields": [ + "@timestamp:date - 964 distinct values", + "agent.name.text:text - 1 distinct values (`opentelemetry/dotnet/elastic-dotnet`)", + "agent.name:keyword - 1 distinct values (`opentelemetry/dotnet/elastic-dotnet`)", + "agent.version:keyword - 1 distinct values (`1.0.0-alpha.4`)", + "container.id:keyword - 1 distinct values (`577d6250ad96a5d0016a42ed87bd5c3a63b86edd2af0a0c04b54a1cec2a1a50a`)", + "data_stream.dataset:keyword - 1 distinct values (`apm`)", + "data_stream.namespace:keyword - 1 distinct values (`default`)", + "data_stream.type:keyword - 1 distinct values (`traces`)", + "destination.address:keyword - 2 distinct values (`my-otel-demo-flagd`, `my-otel-demo-valkey`)", + "destination.port:long - 2 distinct values (`8013`, `6379`)", + "event.outcome:keyword - 1 distinct values (`success`)", + "event.success_count:byte - 1 distinct values (`1`)", + "host.hostname:keyword - 1 distinct values (`minikube`)", + "host.name.text:text - 1 distinct values (`minikube`)", + "host.name:keyword - 1 distinct values (`minikube`)", + "http.request.method:keyword - 1 distinct values (`POST`)", + "http.response.status_code:long - 1 distinct values (`200`)", + "kubernetes.namespace:keyword - 1 distinct values (`default`)", + "kubernetes.node.name.text:text - 1 distinct values (`minikube`)", + "kubernetes.node.name:keyword - 1 distinct values (`minikube`)", + "kubernetes.pod.name.text:text - 1 distinct values (`my-otel-demo-cartservice-67575c6f84-vngzw`)", + "kubernetes.pod.name:keyword - 1 distinct values (`my-otel-demo-cartservice-67575c6f84-vngzw`)", + "kubernetes.pod.uid:keyword - 1 distinct values (`8e441d5c-4d52-42f2-937e-1f3b84a6baed`)", + "labels.app_product_id:keyword - 8 distinct values (`66VCHSJNUP`, `L9ECAV7KIM`, `OLJCESPC7Z`, `0PUK6V6EV0`, `9SIQT8TOJO`, `LS4PSXUNUM`, `HQTGWGPNH4`, `6E92ZMYYFZ`)", + "labels.app_user_id:keyword - 418 distinct values (`11c5f5d4-37b4-46d4-a04e-a97fd71b8597`, `9017f637-12af-4671-b18c-0f86a58a7bbe`, `349478d0-862e-4b14-9d54-3120dd57865f`, `2a55d360-40c5-4a32-844b-4182e8050ca3`, `b9944e91-18d6-430c-90a5-4969e1917a2d`, `1ffeffe2-4e4a-47c4-8b33-e691f116c8cc`, `92ac0a92-4a23-4aa7-866b-44cd6b5d6e26`, `76765dfc-80f8-49db-8377-249e6930dd35`, `d5c375cc-6e38-45f8-b121-30fcb3ae1001`, `bdc5ebd9-a2ee-4dbf-8dae-b88a2b2b3643`, 408 more values)", + "labels.db_redis_flags:keyword - 2 distinct values (`DemandMaster`, `None`)", + "labels.feature_flag_key:keyword - 1 distinct values (`cartServiceFailure`)", + "labels.feature_flag_provider_name:keyword - 1 distinct values (`flagd Provider`)", + "labels.feature_flag_variant:keyword - 1 distinct values (`off`)", + "labels.grpc_method:keyword - 3 distinct values (`/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "labels.grpc_status_code:keyword - 1 distinct values (`0`)", + "labels.http_route:keyword - 3 distinct values (`/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "labels.k8s_deployment_name:keyword - 1 distinct values (`my-otel-demo-cartservice`)", + "labels.k8s_pod_ip:ip - 1 distinct values (`10.244.0.61`)", + "labels.k8s_pod_start_time:keyword - 1 distinct values (`2024-11-02T10:23:09Z`)", + "labels.network_protocol_version:keyword - 1 distinct values (`2`)", + "labels.service_namespace:keyword - 1 distinct values (`opentelemetry-demo`)", + "labels.transaction_id:keyword - 995 distinct values (`6b71cc6a08847a01`, `796c855656f17eb0`, `aaa6049d68006044`, `60ad645003eda9b7`, `be3e883fd0dd1a58`, `47247987037e78b3`, `180228f348c3d599`, `587dca65bb2463f3`, `c438d3e7c15d9a4f`, `0a9f738aa8e11c7e`, 985 more values)", + "numeric_labels.app_cart_items_count:scaled_float - 10 distinct values (`8`, `1`, `16`, `2`, `20`, `5`, `4`, `10`, `3`, `0`)", + "numeric_labels.app_product_quantity:scaled_float - 6 distinct values (`5`, `1`, `2`, `10`, `3`, `4`)", + "numeric_labels.db_redis_database_index:scaled_float - 1 distinct values (`0`)", + "observer.hostname:keyword - 1 distinct values (`Darios-MacBook-Pro-2.local`)", + "observer.type:keyword - 1 distinct values (`apm-server`)", + "observer.version:keyword - 1 distinct values (`8.15.0`)", + "parent.id:keyword - 999 distinct values (`76a22c35a2b363fb`, `6e363f007dd857fc`, `499ee35b7e0dc791`, `f05ead7365bb815b`, `46709d74aeb1ac57`, `c1e7aeb4f3b66351`, `d6e80a03ce62827e`, `5eff08ed000af546`, `80be4180f1c8985e`, `9154a028a223da28`, 989 more values)", + "processor.event:keyword - 2 distinct values (`transaction`, `span`)", + "service.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "service.framework.name.text:text - 1 distinct values (`Microsoft.AspNetCore`)", + "service.framework.name:keyword - 1 distinct values (`Microsoft.AspNetCore`)", + "service.language.name.text:text - 1 distinct values (`dotnet`)", + "service.language.name:keyword - 1 distinct values (`dotnet`)", + "service.name.text:text - 1 distinct values (`cartservice`)", + "service.name:keyword - 1 distinct values (`cartservice`)", + "service.node.name.text:text - 1 distinct values (`8e441d5c-4d52-42f2-937e-1f3b84a6baed`)", + "service.node.name:keyword - 1 distinct values (`8e441d5c-4d52-42f2-937e-1f3b84a6baed`)", + "service.target.name.text:text - 3 distinct values (`my-otel-demo-flagd:8013`, `flagd.evaluation.v1.Service`, 1 more values)", + "service.target.name:keyword - 3 distinct values (`my-otel-demo-flagd:8013`, `flagd.evaluation.v1.Service`, `my-otel-demo-valkey:6379`)", + "service.target.type:keyword - 3 distinct values (`http`, `grpc`, `redis`)", + "span.db.statement:keyword - 455 distinct values (`HGET dd1f04f3-aaf1-4a76-85e4-8c64a930684e`, `EXPIRE 2538c162-9908-11ef-8217-d64fba5f23b1`, `HGET 958266ce-2169-4a2a-bcd5-090fd75cf50b`, `HGET ba92c7a8-6623-4267-8512-9cf0cb23bbf8`, `HGET d96a9e44-a9ed-4f64-8f46-5d4acd05a1fa`, `HGET 4a0d4f33-09ee-4008-a826-027dd6e889c6`, `HGET 5bc59fca-3c11-4d71-9496-c9c29b9d37d1`, `HGET 0497c8a8-2da2-4ff7-80a7-ce647916277c`, `HGET 87d37a8f-cc58-483a-aad0-fc0c91421544`, `HGET 4dea82bc-1c58-4f0a-97fd-3a1369544dc0`, 445 more values)", + "span.db.type:keyword - 1 distinct values (`redis`)", + "span.destination.service.name.text:text - 3 distinct values (`http://my-otel-demo-flagd:8013`, `my-otel-demo-flagd:8013`, 1 more values)", + "span.destination.service.name:keyword - 3 distinct values (`http://my-otel-demo-flagd:8013`, `my-otel-demo-flagd:8013`, `my-otel-demo-valkey:6379`)", + "span.destination.service.resource:keyword - 2 distinct values (`my-otel-demo-flagd:8013`, `my-otel-demo-valkey:6379`)", + "span.destination.service.type:keyword - 2 distinct values (`external`, `db`)", + "span.duration.us:long - 399 distinct values (`501`, `154`, `355`, `3766`, `818`, `657`, `203`, `127`, `715`, `1092`, 389 more values)", + "span.id:keyword - 1000 distinct values (`6b71cc6a08847a01`, `796c855656f17eb0`, `aaa6049d68006044`, `60ad645003eda9b7`, `be3e883fd0dd1a58`, `47247987037e78b3`, `180228f348c3d599`, `587dca65bb2463f3`, `c438d3e7c15d9a4f`, `0a9f738aa8e11c7e`, 990 more values)", + "span.name.text:text - 5 distinct values (`POST`, `flagd.evaluation.v1.Service/ResolveBoolean`, 3 more values)", + "span.name:keyword - 5 distinct values (`POST`, `flagd.evaluation.v1.Service/ResolveBoolean`, `HMSET`, `EXPIRE`, `HGET`)", + "span.representative_count:scaled_float - 1 distinct values (`1`)", + "span.subtype:keyword - 3 distinct values (`http`, `grpc`, `redis`)", + "span.type:keyword - 2 distinct values (`external`, `db`)", + "tags:keyword - 1 distinct values (`_geoip_database_unavailable_GeoLite2-City.mmdb`)", + "timestamp.us:long - 1000 distinct values (`1730544111451828`, `1730544606786118`, `1730544573583321`, `1730544068214001`, `1730543971566630`, `1730544035740835`, `1730543892242334`, `1730544845301548`, `1730543919324800`, `1730544697032712`, 990 more values)", + "trace.id:keyword - 920 distinct values (`de1ed71d39ca87650a8401ae46f2cac0`, `1283785f372e3335e30ab82c53008ea6`, `be3fc18a45763f00d43954ef09300042`, `bffb395c41d9a23aa7acc6b1993f64c6`, `68df2f10f7b09e787c688046ae76f6ff`, `3ba13e99d34a48133415c71b9b523321`, `6405704384b681e891e1067b1c1e6e68`, `b137359ec568679804d48c699dd49df5`, `cce045bbbdbb711a2f5cae192c337cb3`, `85743f477e557162900c88409231222a`, 910 more values)", + "transaction.duration.us:long - 441 distinct values (`2497`, `2659`, `610`, `458`, `3158`, `1484`, `436`, `536`, `2602`, `3472`, 431 more values)", + "transaction.id:keyword - 469 distinct values (`60ad645003eda9b7`, `be3e883fd0dd1a58`, `180228f348c3d599`, `0a9f738aa8e11c7e`, `66622c930742b62b`, `2493315b88140ec7`, `7950f85af72baaa0`, `0fda0e8c0af2a975`, `0504e94fae4dd7f8`, `25ec77d0c132ceef`, 459 more values)", + "transaction.name.text:text - 3 distinct values (`POST /oteldemo.CartService/EmptyCart`, `POST /oteldemo.CartService/AddItem`, 1 more values)", + "transaction.name:keyword - 3 distinct values (`POST /oteldemo.CartService/EmptyCart`, `POST /oteldemo.CartService/AddItem`, `POST /oteldemo.CartService/GetCart`)", + "transaction.representative_count:scaled_float - 1 distinct values (`1`)", + "transaction.result:keyword - 1 distinct values (`HTTP 2xx`)", + "transaction.sampled:boolean - 1 distinct values (`true`)", + "transaction.type:keyword - 1 distinct values (`request`)", + "url.domain:keyword - 1 distinct values (`my-otel-demo-cartservice`)", + "url.full.text:text - 3 distinct values (`http://my-otel-demo-cartservice:8080/oteldemo.CartService/EmptyCart`, `http://my-otel-demo-cartservice:8080/oteldemo.CartService/AddItem`, 1 more values)", + "url.full:keyword - 3 distinct values (`http://my-otel-demo-cartservice:8080/oteldemo.CartService/EmptyCart`, `http://my-otel-demo-cartservice:8080/oteldemo.CartService/AddItem`, `http://my-otel-demo-cartservice:8080/oteldemo.CartService/GetCart`)", + "url.original.text:text - 4 distinct values (`http://my-otel-demo-flagd:8013/flagd.evaluation.v1.Service/ResolveBoolean`, `/oteldemo.CartService/EmptyCart`, 2 more values)", + "url.original:keyword - 4 distinct values (`http://my-otel-demo-flagd:8013/flagd.evaluation.v1.Service/ResolveBoolean`, `/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "url.path:keyword - 3 distinct values (`/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`)", + "url.port:long - 1 distinct values (`8080`)", + "url.scheme:keyword - 1 distinct values (`http`)", + "user_agent.device.name.text:text - 1 distinct values (`Other`)", + "user_agent.device.name:keyword - 1 distinct values (`Other`)", + "user_agent.name.text:text - 1 distinct values (`Other`)", + "user_agent.name:keyword - 1 distinct values (`Other`)", + "user_agent.original.text:text - 2 distinct values (`grpc-go/1.64.0`, `grpc-node-js/1.10.11`)", + "user_agent.original:keyword - 2 distinct values (`grpc-go/1.64.0`, `grpc-node-js/1.10.11`)" + ] + }, + "ownPatterns": [ + { + "field": "message", + "count": 8414, + "pattern": "called with userId", + "regex": ".*?called.+?with.+?userId.*?", + "sample": "GetCartAsync called with userId=f96ee88a-4745-45f1-885a-16c3de0c668a", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "GetCartAsync called with userId=f96ee88a-4745-45f1-885a-16c3de0c668a" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 226 + }, + { + "x": 1730543820000, + "y": 194 + }, + { + "x": 1730543850000, + "y": 270 + }, + { + "x": 1730543880000, + "y": 200 + }, + { + "x": 1730543910000, + "y": 164 + }, + { + "x": 1730543940000, + "y": 198 + }, + { + "x": 1730543970000, + "y": 192 + }, + { + "x": 1730544000000, + "y": 228 + }, + { + "x": 1730544030000, + "y": 230 + }, + { + "x": 1730544060000, + "y": 212 + }, + { + "x": 1730544090000, + "y": 222 + }, + { + "x": 1730544120000, + "y": 210 + }, + { + "x": 1730544150000, + "y": 240 + }, + { + "x": 1730544180000, + "y": 200 + }, + { + "x": 1730544210000, + "y": 204 + }, + { + "x": 1730544240000, + "y": 222 + }, + { + "x": 1730544270000, + "y": 216 + }, + { + "x": 1730544300000, + "y": 254 + }, + { + "x": 1730544330000, + "y": 218 + }, + { + "x": 1730544360000, + "y": 228 + }, + { + "x": 1730544390000, + "y": 214 + }, + { + "x": 1730544420000, + "y": 220 + }, + { + "x": 1730544450000, + "y": 218 + }, + { + "x": 1730544480000, + "y": 224 + }, + { + "x": 1730544510000, + "y": 228 + }, + { + "x": 1730544540000, + "y": 228 + }, + { + "x": 1730544570000, + "y": 232 + }, + { + "x": 1730544600000, + "y": 218 + }, + { + "x": 1730544630000, + "y": 232 + }, + { + "x": 1730544660000, + "y": 212 + }, + { + "x": 1730544690000, + "y": 236 + }, + { + "x": 1730544720000, + "y": 246 + }, + { + "x": 1730544750000, + "y": 218 + }, + { + "x": 1730544780000, + "y": 214 + }, + { + "x": 1730544810000, + "y": 210 + }, + { + "x": 1730544840000, + "y": 228 + }, + { + "x": 1730544870000, + "y": 228 + }, + { + "x": 1730544900000, + "y": 224 + }, + { + "x": 1730544930000, + "y": 56 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "bfeu", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4835, + "pattern": "Enqueued", + "regex": ".*?Enqueued.*?", + "sample": "Enqueued", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Enqueued" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 126 + }, + { + "x": 1730543820000, + "y": 121 + }, + { + "x": 1730543850000, + "y": 171 + }, + { + "x": 1730543880000, + "y": 109 + }, + { + "x": 1730543910000, + "y": 96 + }, + { + "x": 1730543940000, + "y": 134 + }, + { + "x": 1730543970000, + "y": 99 + }, + { + "x": 1730544000000, + "y": 130 + }, + { + "x": 1730544030000, + "y": 132 + }, + { + "x": 1730544060000, + "y": 119 + }, + { + "x": 1730544090000, + "y": 126 + }, + { + "x": 1730544120000, + "y": 118 + }, + { + "x": 1730544150000, + "y": 133 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 125 + }, + { + "x": 1730544240000, + "y": 124 + }, + { + "x": 1730544270000, + "y": 124 + }, + { + "x": 1730544300000, + "y": 161 + }, + { + "x": 1730544330000, + "y": 126 + }, + { + "x": 1730544360000, + "y": 140 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 120 + }, + { + "x": 1730544450000, + "y": 125 + }, + { + "x": 1730544480000, + "y": 128 + }, + { + "x": 1730544510000, + "y": 120 + }, + { + "x": 1730544540000, + "y": 123 + }, + { + "x": 1730544570000, + "y": 135 + }, + { + "x": 1730544600000, + "y": 120 + }, + { + "x": 1730544630000, + "y": 139 + }, + { + "x": 1730544660000, + "y": 113 + }, + { + "x": 1730544690000, + "y": 154 + }, + { + "x": 1730544720000, + "y": 154 + }, + { + "x": 1730544750000, + "y": 115 + }, + { + "x": 1730544780000, + "y": 120 + }, + { + "x": 1730544810000, + "y": 114 + }, + { + "x": 1730544840000, + "y": 133 + }, + { + "x": 1730544870000, + "y": 127 + }, + { + "x": 1730544900000, + "y": 139 + }, + { + "x": 1730544930000, + "y": 35 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "oacl", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4835, + "pattern": "ResponseReceived", + "regex": ".*?ResponseReceived.*?", + "sample": "ResponseReceived", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "ResponseReceived" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 126 + }, + { + "x": 1730543820000, + "y": 121 + }, + { + "x": 1730543850000, + "y": 171 + }, + { + "x": 1730543880000, + "y": 109 + }, + { + "x": 1730543910000, + "y": 96 + }, + { + "x": 1730543940000, + "y": 134 + }, + { + "x": 1730543970000, + "y": 99 + }, + { + "x": 1730544000000, + "y": 130 + }, + { + "x": 1730544030000, + "y": 132 + }, + { + "x": 1730544060000, + "y": 119 + }, + { + "x": 1730544090000, + "y": 126 + }, + { + "x": 1730544120000, + "y": 118 + }, + { + "x": 1730544150000, + "y": 133 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 125 + }, + { + "x": 1730544240000, + "y": 124 + }, + { + "x": 1730544270000, + "y": 124 + }, + { + "x": 1730544300000, + "y": 161 + }, + { + "x": 1730544330000, + "y": 126 + }, + { + "x": 1730544360000, + "y": 140 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 120 + }, + { + "x": 1730544450000, + "y": 125 + }, + { + "x": 1730544480000, + "y": 128 + }, + { + "x": 1730544510000, + "y": 120 + }, + { + "x": 1730544540000, + "y": 123 + }, + { + "x": 1730544570000, + "y": 135 + }, + { + "x": 1730544600000, + "y": 120 + }, + { + "x": 1730544630000, + "y": 139 + }, + { + "x": 1730544660000, + "y": 113 + }, + { + "x": 1730544690000, + "y": 154 + }, + { + "x": 1730544720000, + "y": 154 + }, + { + "x": 1730544750000, + "y": 115 + }, + { + "x": 1730544780000, + "y": 120 + }, + { + "x": 1730544810000, + "y": 114 + }, + { + "x": 1730544840000, + "y": 133 + }, + { + "x": 1730544870000, + "y": 127 + }, + { + "x": 1730544900000, + "y": 139 + }, + { + "x": 1730544930000, + "y": 35 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "hhud", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4835, + "pattern": "Sent", + "regex": ".*?Sent.*?", + "sample": "Sent", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Sent" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 126 + }, + { + "x": 1730543820000, + "y": 121 + }, + { + "x": 1730543850000, + "y": 171 + }, + { + "x": 1730543880000, + "y": 109 + }, + { + "x": 1730543910000, + "y": 96 + }, + { + "x": 1730543940000, + "y": 134 + }, + { + "x": 1730543970000, + "y": 99 + }, + { + "x": 1730544000000, + "y": 130 + }, + { + "x": 1730544030000, + "y": 132 + }, + { + "x": 1730544060000, + "y": 119 + }, + { + "x": 1730544090000, + "y": 126 + }, + { + "x": 1730544120000, + "y": 118 + }, + { + "x": 1730544150000, + "y": 133 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 125 + }, + { + "x": 1730544240000, + "y": 124 + }, + { + "x": 1730544270000, + "y": 124 + }, + { + "x": 1730544300000, + "y": 161 + }, + { + "x": 1730544330000, + "y": 126 + }, + { + "x": 1730544360000, + "y": 140 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 120 + }, + { + "x": 1730544450000, + "y": 125 + }, + { + "x": 1730544480000, + "y": 128 + }, + { + "x": 1730544510000, + "y": 120 + }, + { + "x": 1730544540000, + "y": 123 + }, + { + "x": 1730544570000, + "y": 135 + }, + { + "x": 1730544600000, + "y": 120 + }, + { + "x": 1730544630000, + "y": 139 + }, + { + "x": 1730544660000, + "y": 113 + }, + { + "x": 1730544690000, + "y": 154 + }, + { + "x": 1730544720000, + "y": 154 + }, + { + "x": 1730544750000, + "y": 115 + }, + { + "x": 1730544780000, + "y": 120 + }, + { + "x": 1730544810000, + "y": 114 + }, + { + "x": 1730544840000, + "y": 133 + }, + { + "x": 1730544870000, + "y": 127 + }, + { + "x": 1730544900000, + "y": 139 + }, + { + "x": 1730544930000, + "y": 35 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ttbh", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4441, + "pattern": "info 0", + "regex": ".*?info.+?0.*?", + "sample": "info: cartservice.cartstore.ValkeyCartStore[0]\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "info: cartservice.cartstore.ValkeyCartStore[0]\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.586Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 117 + }, + { + "x": 1730543820000, + "y": 104 + }, + { + "x": 1730543850000, + "y": 146 + }, + { + "x": 1730543880000, + "y": 103 + }, + { + "x": 1730543910000, + "y": 86 + }, + { + "x": 1730543940000, + "y": 110 + }, + { + "x": 1730543970000, + "y": 97 + }, + { + "x": 1730544000000, + "y": 119 + }, + { + "x": 1730544030000, + "y": 120 + }, + { + "x": 1730544060000, + "y": 110 + }, + { + "x": 1730544090000, + "y": 116 + }, + { + "x": 1730544120000, + "y": 109 + }, + { + "x": 1730544150000, + "y": 124 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 109 + }, + { + "x": 1730544240000, + "y": 115 + }, + { + "x": 1730544270000, + "y": 113 + }, + { + "x": 1730544300000, + "y": 137 + }, + { + "x": 1730544330000, + "y": 114 + }, + { + "x": 1730544360000, + "y": 122 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 113 + }, + { + "x": 1730544450000, + "y": 114 + }, + { + "x": 1730544480000, + "y": 117 + }, + { + "x": 1730544510000, + "y": 116 + }, + { + "x": 1730544540000, + "y": 117 + }, + { + "x": 1730544570000, + "y": 121 + }, + { + "x": 1730544600000, + "y": 112 + }, + { + "x": 1730544630000, + "y": 123 + }, + { + "x": 1730544660000, + "y": 108 + }, + { + "x": 1730544690000, + "y": 129 + }, + { + "x": 1730544720000, + "y": 132 + }, + { + "x": 1730544750000, + "y": 111 + }, + { + "x": 1730544780000, + "y": 111 + }, + { + "x": 1730544810000, + "y": 108 + }, + { + "x": 1730544840000, + "y": 120 + }, + { + "x": 1730544870000, + "y": 118 + }, + { + "x": 1730544900000, + "y": 120 + }, + { + "x": 1730544930000, + "y": 73 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "eahn", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 4152, + "pattern": "Fetch cart", + "regex": ".*?Fetch.+?cart.*?", + "sample": "Fetch cart", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Fetch cart" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.398Z", + "lastOccurrence": "2024-11-02T10:55:36.349Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 112 + }, + { + "x": 1730543820000, + "y": 94 + }, + { + "x": 1730543850000, + "y": 132 + }, + { + "x": 1730543880000, + "y": 100 + }, + { + "x": 1730543910000, + "y": 80 + }, + { + "x": 1730543940000, + "y": 97 + }, + { + "x": 1730543970000, + "y": 96 + }, + { + "x": 1730544000000, + "y": 113 + }, + { + "x": 1730544030000, + "y": 113 + }, + { + "x": 1730544060000, + "y": 105 + }, + { + "x": 1730544090000, + "y": 111 + }, + { + "x": 1730544120000, + "y": 104 + }, + { + "x": 1730544150000, + "y": 119 + }, + { + "x": 1730544180000, + "y": 100 + }, + { + "x": 1730544210000, + "y": 100 + }, + { + "x": 1730544240000, + "y": 110 + }, + { + "x": 1730544270000, + "y": 107 + }, + { + "x": 1730544300000, + "y": 123 + }, + { + "x": 1730544330000, + "y": 107 + }, + { + "x": 1730544360000, + "y": 112 + }, + { + "x": 1730544390000, + "y": 107 + }, + { + "x": 1730544420000, + "y": 109 + }, + { + "x": 1730544450000, + "y": 108 + }, + { + "x": 1730544480000, + "y": 111 + }, + { + "x": 1730544510000, + "y": 114 + }, + { + "x": 1730544540000, + "y": 114 + }, + { + "x": 1730544570000, + "y": 112 + }, + { + "x": 1730544600000, + "y": 107 + }, + { + "x": 1730544630000, + "y": 114 + }, + { + "x": 1730544660000, + "y": 105 + }, + { + "x": 1730544690000, + "y": 115 + }, + { + "x": 1730544720000, + "y": 119 + }, + { + "x": 1730544750000, + "y": 109 + }, + { + "x": 1730544780000, + "y": 106 + }, + { + "x": 1730544810000, + "y": 105 + }, + { + "x": 1730544840000, + "y": 113 + }, + { + "x": 1730544870000, + "y": 113 + }, + { + "x": 1730544900000, + "y": 109 + }, + { + "x": 1730544930000, + "y": 27 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "xpjx", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 602, + "pattern": "called with userId 11ef 8217 d64fba5f23b1", + "regex": ".*?called.+?with.+?userId.+?11ef.+?8217.+?d64fba5f23b1.*?", + "sample": "GetCartAsync called with userId=fb462b14-9908-11ef-8217-d64fba5f23b1", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "GetCartAsync called with userId=fb462b14-9908-11ef-8217-d64fba5f23b1" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.219Z", + "lastOccurrence": "2024-11-02T10:55:34.364Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 12 + }, + { + "x": 1730543820000, + "y": 26 + }, + { + "x": 1730543850000, + "y": 34 + }, + { + "x": 1730543880000, + "y": 6 + }, + { + "x": 1730543910000, + "y": 16 + }, + { + "x": 1730543940000, + "y": 30 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 14 + }, + { + "x": 1730544030000, + "y": 18 + }, + { + "x": 1730544060000, + "y": 12 + }, + { + "x": 1730544090000, + "y": 10 + }, + { + "x": 1730544120000, + "y": 12 + }, + { + "x": 1730544150000, + "y": 12 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 22 + }, + { + "x": 1730544240000, + "y": 12 + }, + { + "x": 1730544270000, + "y": 14 + }, + { + "x": 1730544300000, + "y": 36 + }, + { + "x": 1730544330000, + "y": 18 + }, + { + "x": 1730544360000, + "y": 24 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 10 + }, + { + "x": 1730544450000, + "y": 14 + }, + { + "x": 1730544480000, + "y": 14 + }, + { + "x": 1730544510000, + "y": 4 + }, + { + "x": 1730544540000, + "y": 6 + }, + { + "x": 1730544570000, + "y": 26 + }, + { + "x": 1730544600000, + "y": 14 + }, + { + "x": 1730544630000, + "y": 22 + }, + { + "x": 1730544660000, + "y": 8 + }, + { + "x": 1730544690000, + "y": 34 + }, + { + "x": 1730544720000, + "y": 34 + }, + { + "x": 1730544750000, + "y": 4 + }, + { + "x": 1730544780000, + "y": 12 + }, + { + "x": 1730544810000, + "y": 6 + }, + { + "x": 1730544840000, + "y": 16 + }, + { + "x": 1730544870000, + "y": 12 + }, + { + "x": 1730544900000, + "y": 28 + }, + { + "x": 1730544930000, + "y": 8 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ckdv", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 382, + "pattern": "AddItemAsync called with userId 11ef 8217 d64fba5f23b1 productId quantity", + "regex": ".*?AddItemAsync.+?called.+?with.+?userId.+?11ef.+?8217.+?d64fba5f23b1.+?productId.+?quantity.*?", + "sample": "AddItemAsync called with userId=fc4e8196-9908-11ef-8217-d64fba5f23b1, productId=1YMWWN1N4O, quantity=10", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "AddItemAsync called with userId=fc4e8196-9908-11ef-8217-d64fba5f23b1, productId=1YMWWN1N4O, quantity=10" + ] + }, + "firstOccurrence": "2024-11-02T10:36:34.216Z", + "lastOccurrence": "2024-11-02T10:55:34.363Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 8 + }, + { + "x": 1730543820000, + "y": 14 + }, + { + "x": 1730543850000, + "y": 22 + }, + { + "x": 1730543880000, + "y": 6 + }, + { + "x": 1730543910000, + "y": 8 + }, + { + "x": 1730543940000, + "y": 22 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 10 + }, + { + "x": 1730544030000, + "y": 10 + }, + { + "x": 1730544060000, + "y": 8 + }, + { + "x": 1730544090000, + "y": 10 + }, + { + "x": 1730544120000, + "y": 8 + }, + { + "x": 1730544150000, + "y": 8 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 14 + }, + { + "x": 1730544240000, + "y": 8 + }, + { + "x": 1730544270000, + "y": 10 + }, + { + "x": 1730544300000, + "y": 20 + }, + { + "x": 1730544330000, + "y": 10 + }, + { + "x": 1730544360000, + "y": 16 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 6 + }, + { + "x": 1730544450000, + "y": 10 + }, + { + "x": 1730544480000, + "y": 10 + }, + { + "x": 1730544510000, + "y": 4 + }, + { + "x": 1730544540000, + "y": 6 + }, + { + "x": 1730544570000, + "y": 10 + }, + { + "x": 1730544600000, + "y": 6 + }, + { + "x": 1730544630000, + "y": 14 + }, + { + "x": 1730544660000, + "y": 4 + }, + { + "x": 1730544690000, + "y": 22 + }, + { + "x": 1730544720000, + "y": 18 + }, + { + "x": 1730544750000, + "y": 4 + }, + { + "x": 1730544780000, + "y": 8 + }, + { + "x": 1730544810000, + "y": 6 + }, + { + "x": 1730544840000, + "y": 12 + }, + { + "x": 1730544870000, + "y": 8 + }, + { + "x": 1730544900000, + "y": 16 + }, + { + "x": 1730544930000, + "y": 4 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "habq", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 216, + "pattern": "GetCartAsync called with userId", + "regex": ".*?GetCartAsync.+?called.+?with.+?userId.*?", + "sample": "GetCartAsync called with userId=", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "GetCartAsync called with userId=" + ] + }, + "firstOccurrence": "2024-11-02T10:36:36.912Z", + "lastOccurrence": "2024-11-02T10:55:33.022Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 10 + }, + { + "x": 1730543820000, + "y": 4 + }, + { + "x": 1730543850000, + "y": 6 + }, + { + "x": 1730543880000, + "y": 4 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 4 + }, + { + "x": 1730543970000, + "y": 2 + }, + { + "x": 1730544000000, + "y": 10 + }, + { + "x": 1730544030000, + "y": 10 + }, + { + "x": 1730544060000, + "y": 6 + }, + { + "x": 1730544090000, + "y": 2 + }, + { + "x": 1730544120000, + "y": 8 + }, + { + "x": 1730544150000, + "y": 8 + }, + { + "x": 1730544180000, + "y": 4 + }, + { + "x": 1730544210000, + "y": 6 + }, + { + "x": 1730544240000, + "y": 2 + }, + { + "x": 1730544270000, + "y": 4 + }, + { + "x": 1730544300000, + "y": 8 + }, + { + "x": 1730544330000, + "y": 4 + }, + { + "x": 1730544360000, + "y": 4 + }, + { + "x": 1730544390000, + "y": 2 + }, + { + "x": 1730544420000, + "y": 8 + }, + { + "x": 1730544450000, + "y": 4 + }, + { + "x": 1730544480000, + "y": 10 + }, + { + "x": 1730544510000, + "y": 2 + }, + { + "x": 1730544540000, + "y": 12 + }, + { + "x": 1730544570000, + "y": 8 + }, + { + "x": 1730544600000, + "y": 8 + }, + { + "x": 1730544630000, + "y": 6 + }, + { + "x": 1730544660000, + "y": 6 + }, + { + "x": 1730544690000, + "y": 2 + }, + { + "x": 1730544720000, + "y": 6 + }, + { + "x": 1730544750000, + "y": 6 + }, + { + "x": 1730544780000, + "y": 4 + }, + { + "x": 1730544810000, + "y": 2 + }, + { + "x": 1730544840000, + "y": 6 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 8 + }, + { + "x": 1730544930000, + "y": 4 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "tzfi", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 55, + "pattern": "Empty cart", + "regex": ".*?Empty.+?cart.*?", + "sample": "Empty cart", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Empty cart" + ] + }, + "firstOccurrence": "2024-11-02T10:36:41.806Z", + "lastOccurrence": "2024-11-02T10:55:32.654Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 1 + }, + { + "x": 1730543820000, + "y": 3 + }, + { + "x": 1730543850000, + "y": 3 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 2 + }, + { + "x": 1730543940000, + "y": 2 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 1 + }, + { + "x": 1730544030000, + "y": 2 + }, + { + "x": 1730544060000, + "y": 1 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 1 + }, + { + "x": 1730544150000, + "y": 1 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 2 + }, + { + "x": 1730544240000, + "y": 1 + }, + { + "x": 1730544270000, + "y": 1 + }, + { + "x": 1730544300000, + "y": 4 + }, + { + "x": 1730544330000, + "y": 2 + }, + { + "x": 1730544360000, + "y": 2 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 1 + }, + { + "x": 1730544450000, + "y": 1 + }, + { + "x": 1730544480000, + "y": 1 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 4 + }, + { + "x": 1730544600000, + "y": 2 + }, + { + "x": 1730544630000, + "y": 2 + }, + { + "x": 1730544660000, + "y": 1 + }, + { + "x": 1730544690000, + "y": 3 + }, + { + "x": 1730544720000, + "y": 4 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 1 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 1 + }, + { + "x": 1730544870000, + "y": 1 + }, + { + "x": 1730544900000, + "y": 3 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ldwf", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 55, + "pattern": "feature_flag", + "regex": ".*?feature_flag.*?", + "sample": "feature_flag", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "feature_flag" + ] + }, + "firstOccurrence": "2024-11-02T10:36:41.809Z", + "lastOccurrence": "2024-11-02T10:55:32.655Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 1 + }, + { + "x": 1730543820000, + "y": 3 + }, + { + "x": 1730543850000, + "y": 3 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 2 + }, + { + "x": 1730543940000, + "y": 2 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 1 + }, + { + "x": 1730544030000, + "y": 2 + }, + { + "x": 1730544060000, + "y": 1 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 1 + }, + { + "x": 1730544150000, + "y": 1 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 2 + }, + { + "x": 1730544240000, + "y": 1 + }, + { + "x": 1730544270000, + "y": 1 + }, + { + "x": 1730544300000, + "y": 4 + }, + { + "x": 1730544330000, + "y": 2 + }, + { + "x": 1730544360000, + "y": 2 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 1 + }, + { + "x": 1730544450000, + "y": 1 + }, + { + "x": 1730544480000, + "y": 1 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 4 + }, + { + "x": 1730544600000, + "y": 2 + }, + { + "x": 1730544630000, + "y": 2 + }, + { + "x": 1730544660000, + "y": 1 + }, + { + "x": 1730544690000, + "y": 3 + }, + { + "x": 1730544720000, + "y": 4 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 1 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 1 + }, + { + "x": 1730544870000, + "y": 1 + }, + { + "x": 1730544900000, + "y": 3 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "noer", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 2, + "pattern": "OTEL-SDK BatchActivityExportProcessor exporting to OtlpTraceExporter dropped items", + "regex": ".*?OTEL-SDK.+?BatchActivityExportProcessor.+?exporting.+?to.+?OtlpTraceExporter.+?dropped.+?items.*?", + "sample": "OTEL-SDK: [224] 'BatchActivityExportProcessor' exporting to 'OtlpTraceExporter' dropped '0' items.", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "OTEL-SDK: [224] 'BatchActivityExportProcessor' exporting to 'OtlpTraceExporter' dropped '0' items." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.580Z", + "lastOccurrence": "2024-11-02T10:55:36.580Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "fiia", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1, + "pattern": "my-otel-demo-valkey open", + "regex": ".*?my-otel-demo-valkey.+?open.*?", + "sample": "my-otel-demo-valkey (10.106.38.244:6379) open\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "my-otel-demo-valkey (10.106.38.244:6379) open\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:34.993Z", + "lastOccurrence": "2024-11-02T10:55:34.993Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "uzyf", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 78, + "pattern": "OTEL-SDK Instrument Meter has been deactivated", + "regex": ".*?OTEL-SDK.+?Instrument.+?Meter.+?has.+?been.+?deactivated.*?", + "sample": "OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated.", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.585Z", + "lastOccurrence": "2024-11-02T10:55:36.586Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 78 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "lciw", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 4, + "pattern": "OTEL-SDK Disposed", + "regex": ".*?OTEL-SDK.+?Disposed.*?", + "sample": "OTEL-SDK: [224] 'MeterProvider' Disposed.", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "OTEL-SDK: [224] 'MeterProvider' Disposed." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.581Z", + "lastOccurrence": "2024-11-02T10:55:36.586Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 4 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "woqa", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 3, + "pattern": "exiting", + "regex": ".*?exiting.*?", + "sample": "exiting...\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "exiting...\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:55.622Z", + "lastOccurrence": "2024-11-02T10:56:51.618Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 1 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 1 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "ucuj", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 2, + "pattern": "Application is shutting down", + "regex": ".*?Application.+?is.+?shutting.+?down.*?", + "sample": "Application is shutting down...", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "Application is shutting down..." + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.560Z", + "lastOccurrence": "2024-11-02T10:55:36.560Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "cgip", + "relevance": "unusual", + "interesting": true + }, + { + "field": "message", + "count": 3, + "pattern": "FATAL Could not start entrypoint", + "regex": ".*?FATAL.+?Could.+?not.+?start.+?entrypoint.*?", + "sample": "FATAL: Could not start, bad entrypoint!\n", + "highlight": { + "service.name": [ + "<em>cartservice</em>" + ], + "resource.attributes.service.name": [ + "<em>cartservice</em>" + ] + }, + "metadata": { + "message": [ + "FATAL: Could not start, bad entrypoint!\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:35.618Z", + "lastOccurrence": "2024-11-02T10:56:31.617Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 0 + }, + { + "x": 1730544990000, + "y": 1 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "spike", + "significance": "high", + "change_point": 38, + "p_value": 1.8274885276877215e-20, + "timestamp": "2024-11-02T10:55:30.000Z" + }, + "shortId": "reqc", + "relevance": "critical", + "interesting": true + } + ], + "patternsFromOtherEntities": [ + { + "field": "message", + "count": 26, + "pattern": "I1102 replica_set.go Finished syncing logger replicaset-controller kind ReplicaSet key duration", + "regex": ".*?I1102.+?replica_set\\.go.+?Finished.+?syncing.+?logger.+?replicaset-controller.+?kind.+?ReplicaSet.+?key.+?duration.*?", + "sample": "I1102 10:55:33.013871 1 replica_set.go:679] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-cartservice-7b585f4fb7\" duration=\"101.333µs\"\n", + "highlight": { + "body.text": [ + "] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-<em>cartservice</em>" + ], + "message": [ + "] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-<em>cartservice</em>" + ] + }, + "metadata": { + "service.name": [ + "kube-controller-manager" + ], + "message": [ + "I1102 10:55:33.013871 1 replica_set.go:679] \"Finished syncing\" logger=\"replicaset-controller\" kind=\"ReplicaSet\" key=\"default/my-otel-demo-cartservice-7b585f4fb7\" duration=\"101.333µs\"\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:33.014Z", + "lastOccurrence": "2024-11-02T10:56:52.568Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 19 + }, + { + "x": 1730544960000, + "y": 2 + }, + { + "x": 1730544990000, + "y": 5 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "spike", + "significance": "high", + "change_point": 38, + "p_value": 7.313742705200763e-147, + "timestamp": "2024-11-02T10:55:30.000Z" + }, + "shortId": "ofdx", + "relevance": "normal", + "interesting": true + }, + { + "field": "message", + "count": 21, + "pattern": "object apiVersion events.k8s.io/v1 deprecatedCount deprecatedFirstTimestamp deprecatedLastTimestamp deprecatedSource component eventTime null kind Event metadata creationTimestamp managedFields apiVersion v1 fieldsType FieldsV1 fieldsV1", + "regex": ".*?object.+?apiVersion.+?events\\.k8s\\.io/v1.+?deprecatedCount.+?deprecatedFirstTimestamp.+?deprecatedLastTimestamp.+?deprecatedSource.+?component.+?eventTime.+?null.+?kind.+?Event.+?metadata.+?creationTimestamp.+?managedFields.+?apiVersion.+?v1.+?fieldsType.+?FieldsV1.+?fieldsV1.*?", + "sample": "{\"object\":{\"apiVersion\":\"events.k8s.io/v1\",\"deprecatedCount\":2,\"deprecatedFirstTimestamp\":\"2024-11-02T10:56:17Z\",\"deprecatedLastTimestamp\":\"2024-11-02T10:56:52Z\",\"deprecatedSource\":{\"component\":\"kubelet\",\"host\":\"minikube\"},\"eventTime\":null,\"kind\":\"Event\",\"metadata\":{\"creationTimestamp\":\"2024-11-02T10:56:17Z\",\"managedFields\":[{\"apiVersion\":\"v1\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:count\":{},\"f:firstTimestamp\":{},\"f:involvedObject\":{},\"f:lastTimestamp\":{},\"f:message\":{},\"f:reason\":{},\"f:reportingComponent\":{},\"f:reportingInstance\":{},\"f:source\":{\"f:component\":{},\"f:host\":{}},\"f:type\":{}},\"manager\":\"kubelet\",\"operation\":\"Update\",\"time\":\"2024-11-02T10:56:52Z\"}],\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz.1804217ce2cb3041\",\"namespace\":\"default\",\"resourceVersion\":\"375301\",\"uid\":\"cf211b63-a5e4-40c4-bed3-fe90aea76a38\"},\"note\":\"Back-off restarting failed container cartservice in pod my-otel-demo-cartservice-7b585f4fb7-79ccz_default(9580334a-7ef9-4ad5-baf6-0ad10ae49853)\",\"reason\":\"BackOff\",\"regarding\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.containers{cartservice}\",\"kind\":\"Pod\",\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz\",\"namespace\":\"default\",\"resourceVersion\":\"375163\",\"uid\":\"9580334a-7ef9-4ad5-baf6-0ad10ae49853\"},\"reportingController\":\"kubelet\",\"reportingInstance\":\"minikube\",\"type\":\"Warning\"},\"type\":\"MODIFIED\"}", + "highlight": { + "message": [ + "},\"manager\":\"kubelet\",\"operation\":\"Update\",\"time\":\"2024-11-02T10:56:52Z\"}],\"name\":\"my-otel-demo-<em>cartservice</em>", + "375301\",\"uid\":\"cf211b63-a5e4-40c4-bed3-fe90aea76a38\"},\"note\":\"Back-off restarting failed container <em>cartservice</em>", + "in pod my-otel-demo-<em>cartservice</em>-7b585f4fb7-79ccz_default(9580334a-7ef9-4ad5-baf6-0ad10ae49853)\",\"reason", + "\":\"BackOff\",\"regarding\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.containers{<em>cartservice</em>}\",\"kind\":\"Pod\",\"name", + "\":\"my-otel-demo-<em>cartservice</em>-7b585f4fb7-79ccz\",\"namespace\":\"default\",\"resourceVersion\":\"375163\",\"uid\":" + ] + }, + "metadata": { + "service.name": [ + "unknown" + ], + "message": [ + "{\"object\":{\"apiVersion\":\"events.k8s.io/v1\",\"deprecatedCount\":2,\"deprecatedFirstTimestamp\":\"2024-11-02T10:56:17Z\",\"deprecatedLastTimestamp\":\"2024-11-02T10:56:52Z\",\"deprecatedSource\":{\"component\":\"kubelet\",\"host\":\"minikube\"},\"eventTime\":null,\"kind\":\"Event\",\"metadata\":{\"creationTimestamp\":\"2024-11-02T10:56:17Z\",\"managedFields\":[{\"apiVersion\":\"v1\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:count\":{},\"f:firstTimestamp\":{},\"f:involvedObject\":{},\"f:lastTimestamp\":{},\"f:message\":{},\"f:reason\":{},\"f:reportingComponent\":{},\"f:reportingInstance\":{},\"f:source\":{\"f:component\":{},\"f:host\":{}},\"f:type\":{}},\"manager\":\"kubelet\",\"operation\":\"Update\",\"time\":\"2024-11-02T10:56:52Z\"}],\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz.1804217ce2cb3041\",\"namespace\":\"default\",\"resourceVersion\":\"375301\",\"uid\":\"cf211b63-a5e4-40c4-bed3-fe90aea76a38\"},\"note\":\"Back-off restarting failed container cartservice in pod my-otel-demo-cartservice-7b585f4fb7-79ccz_default(9580334a-7ef9-4ad5-baf6-0ad10ae49853)\",\"reason\":\"BackOff\",\"regarding\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.containers{cartservice}\",\"kind\":\"Pod\",\"name\":\"my-otel-demo-cartservice-7b585f4fb7-79ccz\",\"namespace\":\"default\",\"resourceVersion\":\"375163\",\"uid\":\"9580334a-7ef9-4ad5-baf6-0ad10ae49853\"},\"reportingController\":\"kubelet\",\"reportingInstance\":\"minikube\",\"type\":\"Warning\"},\"type\":\"MODIFIED\"}" + ] + }, + "firstOccurrence": "2024-11-02T10:55:33.051Z", + "lastOccurrence": "2024-11-02T10:56:52.563Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 16 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 4 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "spike", + "significance": "high", + "change_point": 38, + "p_value": 2.9750218550484796e-168, + "timestamp": "2024-11-02T10:55:30.000Z" + }, + "shortId": "lqan", + "relevance": "critical", + "interesting": true + } + ], + "searches": [ + { + "fragments": [ + "AddItemAsync called with userId", + "productId", + "quantity" + ], + "appearsAs": "userId, productId, and quantity are referenced in the request handling log entries in cartservice." + }, + { + "fragments": [ + "GetCartAsync called with userId" + ], + "appearsAs": "userId is referenced in the request handling log entries in cartservice." + }, + { + "fragments": [ + "Empty cart" + ], + "appearsAs": "Empty cart operation logs in cartservice." + }, + { + "fragments": [ + "cartServiceFailure" + ], + "appearsAs": "Feature flag 'cartServiceFailure' in cartservice." + }, + { + "fragments": [ + "10.244.0.61" + ], + "appearsAs": "IP address of the cartservice pod." + }, + { + "fragments": [ + "my-otel-demo-cartservice-67575c6f84-vngzw" + ], + "appearsAs": "Pod name of cartservice." + }, + { + "fragments": [ + "my-otel-demo-valkey:6379" + ], + "appearsAs": "Redis service used by cartservice." + }, + { + "fragments": [ + "/oteldemo.CartService/AddItem", + "/oteldemo.CartService/GetCart", + "/oteldemo.CartService/EmptyCart" + ], + "appearsAs": "Endpoints handled by cartservice." + }, + { + "fragments": [ + "flagd.evaluation.v1.Service" + ], + "appearsAs": "gRPC service involved in feature flag evaluation by cartservice." + }, + { + "fragments": [ + "HGET", + "EXPIRE", + "HMSET" + ], + "appearsAs": "Redis commands executed by cartservice." + } + ], + "relatedEntitiesSummaries": [ + "Based on the context provided, the following entities are potentially related to `service.name:cartservice` as either upstream or downstream dependencies. Below is a detailed analysis based on the indicators of relationships obtained from the observability data:\n\n### 1. Related Entity: `service.name:controller`\n- **Indicators**: \n - **Average Indicator**: The logs highlight high error rates (500 Internal Server Error) in the controller when POST requests to the `/api/cart` endpoint are made.\n - **Field values**: In controller logs, `message` contains references to the `/api/cart` endpoint, which is handled by `cartservice`.\n- **Reasoning**: \n - The `controller` service is responsible for managing /api/cart requests. Thus, it acts as a direct upstream service to `cartservice`.\n - It implies `controller` calls `cartservice` as part of handling requests, leading to the observed errors.\n- **Likeliness**: High\n - The `controller` service is likely a highly relevant entity since it directly interfaces with `cartservice`, with the errors surfacing in it when interacting with `cartservice`.\n\n### 2. Related Entity: `service.name:frontend`\n- **Indicators**:\n - **Strong Indicator**: The system architecture documentation shows that `frontend` interacts with various backend services, including those for user interactions such as adding items to the cart.\n - **Field values**: In the knowledge base, `frontend` receives HTTP traffic routed through `frontendproxy` and interacts with `cartservice`.\n- **Reasoning**:\n - `frontend` would act as a direct upstream service that communicates with `controller`, providing requests that eventually hit `cartservice`.\n- **Likeliness**: High\n - As `frontend` handles initial user interactions and routes requests to `cartservice`, it is essential in the request flow leading to `/api/cart` errors.\n\n### 3. Related Entity: `service.name:currencyservice`\n- **Indicators**:\n - **Strong Indicator**: The architecture description indicates `currencyservice` interacts with `cartservice` to handle currency conversions.\n - **Field values**: The entries show gRPC calls between `cartservice` and `currencyservice` for conversion operations.\n- **Reasoning**:\n - `currencyservice` may be an upstream dependency for `cartservice` for any currency-related manipulations on cart items.\n- **Likeliness**: Medium-High\n - While `currencyservice` interacts with `cartservice`, its exact influence on the direct issue might not be as strong as `controller` or `frontend`.\n\n### 4. Related Entity: `service.name:checkoutservice`\n- **Indicators**:\n - **Strong Indicator**: The architecture documentation lists `checkoutservice` as coordinating the checkout process involving interactions with `cartservice`.\n - **Field values**: Distributed tracing data could show `checkoutservice` making gRPC or HTTP calls to `cartservice`.\n- **Reasoning**:\n - `checkoutservice` is likely a downstream service that relies on the correct functioning of `cartservice` to gather cart data before proceeding to checkout operations.\n- **Likeliness**: Medium\n - Although primarily a downstream dependency, it processes important data from `cartservice`.\n\n### 5. Related Entity: `service.name:adservice`\n- **Indicators**:\n - **Weak Indicator**: `adservice` interfaces with `frontend` via gRPC to deliver ad content, it also might indirectly influence `cartservice` interactions if ads are part of the cart page.\n - **Field values**: Architectural details state `adservice` operates in the background to enhance user experience but no direct interaction with `cartservice`.\n- **Reasoning**:\n - While not directly connected, any latency in `adservice` may affect the overall user experience, causing indirect latency in calls that reach `cartservice`.\n- **Likeliness**: Low-Medium\n - Indirect connection and latent repercussions on user interactions with cart functionality.\n\n### 6. Related Entity: `service.name:loadgenerator`\n- **Indicators**:\n - **Average Indicator**: The `loadgenerator` service generates simulated traffic, handled by `frontendproxy` to stress-test services like `cartservice`.\n - **Field values**: Traffic from `loadgenerator` is routed through `frontendproxy` to reach core services, including `cartservice`.\n- **Reasoning**:\n - As an external input simulator, its traffic generation directly impacts `cartservice` when testing load resilience.\n- **Likeliness**: Medium\n - The errors can be a result of load tests conducted by `loadgenerator` surfacing bottlenecks in `cartservice`.\n\n### Summary\n\nTo conclude, the following entities are likely relevant to the issue in `service.name:cartservice`:\n\n1. **controller**: Direct upstream causing the 500 errors - High relevance.\n2. **frontend**: Upstream service initiating user interactions - High relevance.\n3. **currencyservice**: Upstream service for currency conversion - Medium-High relevance.\n4. **checkoutservice**: Downstream service relying on cart data - Medium relevance.\n5. **adservice**: Possible indirect impact due to latency - Low-Medium relevance.\n6. **loadgenerator**: Simulated traffic testing the system's resilience - Medium relevance.\n\nBy analyzing these entities, you can prioritize investigating `controller`, `frontend`, and `currencyservice` first, as they have the most direct and potentially impactful interactions with `cartservice`.", + "Based on the context provided, the architecture outlined in the knowledge base entry, the document analysis for the `cartservice`, and search keywords, several possible relationships with the `cartservice` can be identified. Below are the entities identified as highly relevant to the `cartservice`, along with the indicators, evidence, reasoning, and overall relevance.\n\n### 1. Entity: `service.name:frontend`\n\n#### Indicators and Evidence\n- **Average Indicator - URL Paths:**\n - `http://my-otel-demo-cartservice:8080/oteldemo.CartService/AddItem`\n - `http://my-otel-demo-cartservice:8080/oteldemo.CartService/GetCart`\n - `http://my-otel-demo-cartservice:8080/oteldemo.CartService/EmptyCart`\n- **Average Indicator - Logs:**\n - Observed in the search highlights for `service.name:frontend`: `@opentelemetry/api/build/src/api/context.js:60:46) at ServiceClientImpl.clientMethodTrace [as getCart]`\n- **Knowledge Base:**\n - The `frontend` is the core service for user interactions, receiving HTTP traffic and making requests to the `cartservice`.\n\n#### Relationship and Reasoning\nThe `frontend` service interacts directly with the `cartservice` by making requests to handle user shopping cart operations, such as adding items, retrieving the cart, and emptying the cart. Given the observed log entries and URL paths, it is reasonable to infer that the `frontend` service acts as a caller, while the `cartservice` acts as the callee. The high error rates observed in the context likely originate from the `frontend` making POST requests to the `/api/cart` endpoint handled by the `cartservice`.\n\n#### Likelihood of Relevance\n- **Very High:** The `frontend` service is highly likely to be relevant as it has a direct interaction with the `cartservice` and would be significantly impacted by any issues within the `cartservice`.\n\n### 2. Entity: `service.name:valkey`\n\n#### Indicators and Evidence\n- **Average Indicator - Redis Service:**\n - `my-otel-demo-valkey:6379`\n- **Average Indicator - Log Entries:**\n - Log patterns show Redis command execution by `cartservice`: `HGET`, `EXPIRE`, `HMSET`\n\n#### Relationship and Reasoning\nThe `valkey` service corresponds to the Redis instance that `cartservice` uses for data persistence. The `cartservice` makes frequent calls to Redis to perform operations such as fetching, expiring, and setting data, which is crucial for managing shopping cart state. As Redis is an upstream dependency, connection or data integrity issues here could directly contribute to the `500 Internal Server Errors` observed in the `cartservice`.\n\n#### Likelihood of Relevance\n- **High:** The `valkey` service is highly relevant because it is the data store for `cartservice`, directly affecting its behavior and performance.\n\n### 3. Entity: `service.name:currencyservice`\n\n#### Indicators and Evidence\n- **Average Indicator - gRPC Services:**\n - Mentioned in the architecture as handling currency conversions.\n- **Knowledge Base:**\n - Communicates with `cartservice` over gRPC to facilitate currency operations.\n\n#### Relationship and Reasoning\nThe `currencyservice` may interact with `cartservice` to handle price conversions for the items in the cart. Problems with currency conversion could cause unexpected data formats or communication failures, leading to `500 Internal Server Errors` in `cartservice`.\n\n#### Likelihood of Relevance\n- **Moderate:** While the interaction exists, whether it directly contributes to the 500 errors specifically observed at `/api/cart` endpoints would require further investigation.\n\n### 4. Entity: `service.name:checkoutservice`\n\n#### Indicators and Evidence\n- **Strong Indicator - gRPC Services:**\n - Interacts with `checkoutservice` during the checkout process.\n- **Knowledge Base:**\n - Handles interactions including calls to `cartservice` for finalizing orders.\n\n#### Relationship and Reasoning\nThe `checkoutservice` could potentially depend on `cartservice` to validate and finalize items in the user's cart as part of the checkout process. If the `cartservice` fails during these operations, it could propagate errors back up to the user level through `checkoutservice`.\n\n#### Likelihood of Relevance\n- **Moderate:** The relevance depends on whether the observed errors are occurring during checkout processes or general cart manipulations.\n\n### 5. Entity: `service.name:flagd`\n\n#### Indicators and Evidence\n- **Average Indicator - Feature Flag Evaluation:**\n - `flagd.evaluation.v1.Service`\n- **Log Metadata:**\n - `labels.feature_flag_key:keyword - cartServiceFailure`\n- **Trace Destination Service:**\n - `my-otel-demo-flagd:8013`\n\n#### Relationship and Reasoning\nThe `flagd` service is responsible for evaluating feature flags, such as the `cartServiceFailure`. If the feature flagging system is improperly toggled (e.g.: feature flag set to fail operations), it might contribute to the high error rates observed in `cartservice`.\n\n#### Likelihood of Relevance\n- **Moderate:** The feature flags might be causing or amplifying existing issues within the `cartservice`.\n\n### Summary\nFrom the observed data, the following entities are highly likely to be related to `cartservice` with respect to the given context:\n\n1. **`frontend`** - High relevance due to direct HTTP interaction with `cartservice`.\n2. **`valkey`** - High relevance as the Redis data store for `cartservice`.\n\nEntities with moderate likelihood:\n\n1. **`currencyservice`** - Related via gRPC for currency operations.\n2. **`checkoutservice`** - Potentially related during checkout processes.\n3. **`flagd`** - Related to feature flag evaluations involving `cartservice`.\n\nThese relationships cover both upstream dependencies affecting `cartservice` and downstream services impacted by `cartservice` issues, aiding in comprehensive issue diagnosis." + ], + "kbEntries": [ + { + "id": "System architecture", + "text": "The architecture described here outlines a microservices-based system, where each service is implemented in a distinct programming language and communicates via gRPC, HTTP, or TCP. This system is designed to handle simulated user traffic, supported by a variety of interconnected services and components.\n\n### System Architecture\n\n1. **`loadgenerator`** - Simulates external user traffic by sending HTTP requests, which are managed by an Nginx ingress controller. This ingress directs traffic to the `frontendproxy` service.\n\n2. **`frontendproxy` (Envoy)** - Acts as a reverse proxy, routing incoming traffic from `loadgenerator` to `frontend`.\n\n3. **`frontend` (Node.js)** - The core service for user interactions, receiving HTTP traffic from `frontendproxy` and interfacing with various backend services to fulfill requests.\n\n4. **`frontend-web` (RUM)** - A Real User Monitoring (RUM) layer that runs in the user's browser, enabling insights into end-user experiences and frontend performance.\n\n5. **`adservice`** - Delivers advertisements to the `frontend` using gRPC, enhancing the user experience with relevant ad content.\n\n6. **`cartservice`** - Manages shopping cart data, including adding and removing items. It communicates over gRPC and leverages a Redis cache for data persistence.\n\n7. **`currencyservice`** - Handles currency conversions and facilitates interactions between `cartservice` and `checkoutservice` over gRPC.\n\n8. **`checkoutservice`** - Coordinates the checkout process, calling various services for payments, shipping, and emails. It utilizes both gRPC and HTTP protocols to aggregate the necessary information for order completion.\n\n9. **`emailservice`** - Sends order confirmation emails to users via gRPC, triggered by interactions with `checkoutservice`.\n\n10. **`productcatalogservice`** - Maintains the product catalog, storing details about available items and providing this data to other services via gRPC.\n\n11. **`recommendationservice`** - Generates personalized product recommendations, accessed by `frontend` over gRPC.\n\n12. **`shippingservice`** - Manages shipping information, providing essential data to `checkoutservice` over gRPC.\n\n13. **`quoteservice`** - Supplies shipping quotes over HTTP, which are accessed by `shippingservice` to estimate shipping costs.\n\n14. **`paymentservice`** - Processes payment transactions through gRPC, enabling secure and efficient payments for `checkoutservice`.\n\n15. **`accountingservice`** - Responsible for recording transactions, it connects to a Kafka queue and interacts over TCP.\n\n16. **`frauddetectionservice`** - Monitors orders for potential fraud, also interfacing with the Kafka queue over TCP to receive relevant transaction data.\n\n17. **`imageprovider` (Nginx)** - Serves static images for the frontend interface, accessible over HTTP.\n\n18. **`queue` (Kafka)** - Acts as a central message broker, facilitating communication between `accountingservice` and `frauddetectionservice`.\n\n### Key Components\nThe system is structured to enable robust, distributed communication across services, allowing each component to focus on a specific aspect of the user experience or business logic. The ingress controller, in particular, plays a critical role in directing traffic, ensuring that incoming requests from `loadgenerator` are correctly routed through `frontendproxy` and into the system’s core services.\n\nThis architecture ensures that the system can handle high traffic loads and provides a modular, flexible framework to meet user demands while monitoring for performance and security.\n", + "tokens": 733, + "score": 5 + } + ] + }, + "entity": { + "service.name": "cartservice" + }, + "relatedEntities": [ + { + "entity": { + "service.name": "controller" + }, + "reason": "The controller service is responsible for managing /api/cart requests. Thus, it acts as a direct upstream service to cartservice. High errors were observed in the controller when interacting with cartservice.", + "confidence": "high" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The frontend service interacts directly with the controller, handling user interactions that lead to /api/cart requests which are eventually processed by cartservice.", + "confidence": "high" + }, + { + "entity": { + "service.name": "currencyservice" + }, + "reason": "The currencyservice interacts with cartservice to handle currency conversions, acting as an upstream dependency for cartservice when performing currency-related operations on cart items.", + "confidence": "medium-high" + }, + { + "entity": { + "service.name": "checkoutservice" + }, + "reason": "The checkoutservice relies on cart data from cartservice during the checkout process, making it a downstream service dependent on the correct functioning of cartservice.", + "confidence": "medium" + }, + { + "entity": { + "service.name": "loadgenerator" + }, + "reason": "The loadgenerator service generates simulated traffic which impacts cartservice directly when testing the system's resilience.", + "confidence": "medium" + }, + { + "entity": { + "service.name": "adservice" + }, + "reason": "The adservice might indirectly impact cartservice through the frontend service by affecting the overall user experience and potentially causing indirect latency.", + "confidence": "low-medium" + }, + { + "entity": { + "service.name": "frontend" + }, + "reason": "The `frontend` service is highly likely to be relevant as it has a direct interaction with the `cartservice` and would be significantly impacted by any issues within the `cartservice`.", + "confidence": "very high" + }, + { + "entity": { + "service.name": "valkey" + }, + "reason": "The `valkey` service is highly relevant because it is the data store for `cartservice`, directly affecting its behavior and performance.", + "confidence": "high" + }, + { + "entity": { + "service.name": "currencyservice" + }, + "reason": "The `currencyservice` may interact with `cartservice` to handle price conversions for the items in the cart. Problems with currency conversion could cause unexpected data formats or communication failures, leading to `500 Internal Server Error` in `cartservice`.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "checkoutservice" + }, + "reason": "The `checkoutservice` could potentially depend on `cartservice` to validate and finalize items in the user's cart as part of the checkout process. If the `cartservice` fails during these operations, it could propagate errors back up to the user level through `checkoutservice`.", + "confidence": "moderate" + } + ], + "summary": "Based on the context provided, including the system architecture and data samples, the entity `service.name:cartservice` can be described as follows:\n\n### Infrastructure & Environment\n`cartservice` operates within a microservices-based architecture. It is containerized and runs within a Kubernetes environment. Specifically, the data sample indicates that the service is deployed in the `default` Kubernetes namespace and is running on a pod named `my-otel-demo-cartservice-67575c6f84-vngzw` with an IP address of `10.244.0.61`. The service environment is tagged as `opentelemetry-demo`, indicating the use of OpenTelemetry for observability purposes. The infrastructure includes a Redis cache used by the cart service for data persistence.\n\n### Communication Characteristics (Protocols and Endpoints)\n`cartservice` primarily communicates using gRPC. It handles shopping cart data including adding and removing items. The service interacts with Redis (as indicated by the `labels.db_redis_flags` attribute). Additionally, the service integrates with external feature flag providers as seen from the `feature_flag_key` and `feature_flag_provider_name` attributes, which suggests it evaluates feature flags, possibly targeting the feature key `cartServiceFailure`. \n\nThe communication endpoints and protocols from the sample data are:\n- gRPC methods: `/oteldemo.CartService/EmptyCart`, `/oteldemo.CartService/AddItem`, `/oteldemo.CartService/GetCart`\n- HTTP endpoint: `http://my-otel-demo-flagd:8013/flagd.evaluation.v1.Service/ResolveBoolean`\n- Redis database interactions: `HGET`, `HMSET`, `EXPIRE` commands targeting various identifiers like `my-otel-demo-valkey:6379`.\n\n### Context of Entity in Investigation\nThe cart service (`cartservice`) is being investigated as it is the downstream service handling `/api/cart` requests. Issues in `cartservice` are directly contributing to the error patterns in the controller layer for the `/api/cart` endpoint. A high error rate, culminating in `500 Internal Server Error` responses, started around `2024-11-02T10:56:42.498Z`. The context indicates that the cart service plays a crucial role in managing shopping cart operations.\n\nGiven the observed high error rates and the 500 errors, `cartservice` may be experiencing issues in processing gRPC calls, feature flag evaluations, or Redis caching, which could be causing failures that propagate upstream to the controller.\n\n### Related Entities and Previous Investigations\nPreviously, errors in the controller for POST requests to `/api/cart` have been observed. This investigation is a continuation, focusing on the downstream `cartservice` which is responsible for handling these requests. This service's interaction with other entities such as Redis (for caching cart data) and external feature flag services (potentially toggling functionality) suggest that any issues in these integrations could impact the `cartservice` performance and result in the observed errors upstream in the controller.\n\nThis detailed analysis moves us to further inspect specific logs, traces, and any interdependent service metrics that may provide clues about the root cause of the high error rate in `cartservice`.\n\n### Observations for service.name:cartservice\n\n#### Startup Messages\n1. **Pattern: \"OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated.\"**\n - **Count:** 78\n - **Trend:** There was a spike at **2024-11-02T10:55:30.000Z** with 78 occurrences. Before this timestamp, the value was consistently 0.\n\n2. **Pattern: \"OTEL-SDK: [224] 'MeterProvider' Disposed.\"**\n - **Count:** 4\n - **Trend:** Occurrences were persistently recorded as 0 until a brief spike at **2024-11-02T10:55:30.000Z** with 4 instances.\n\n3. **Pattern: \"exiting...\"**\n - **Count:** 3\n - **Trend:** Consistently 0 until a minor rise at **2024-11-02T10:55:30.000Z**, with 3 instances recorded.\n\n4. **Pattern: \"Application is shutting down...\"**\n - **Count:** 2\n - **Trend:** Log entries were consistently at 0 with a brief spike at **2024-11-02T10:55:30.000Z** showing 2 instances.\n\n#### Fatal Errors\n5. **Pattern: \"FATAL: Could not start, bad entrypoint!\"**\n - **Count:** 3\n - **Trend:** This pattern shows a significant change at **2024-11-02T10:55:30.000Z** with 2 occurrences at the change point and one additional at **2024-11-02T10:56:30.000Z**. Before this period, the occurrence rate was consistently 0.\n\n### Conclusion\n\nThe patterns observed indicate that there were significant startup issues with the `cartservice` around the **2024-11-02T10:55:30.000Z** mark. Specifically, the `cartservice` encountered a fatal error (\"FATAL: Could not start, bad entrypoint!\") that aligns precisely with the rise in errors noted during this period. This error indicates that the service failed to start due to a misconfiguration or issues with the entry point. This corresponds with the sudden spike in errors and `500 Internal Server Error` responses observed in the downstream controller making POST requests to the `/api/cart` endpoint. Furthermore, logs related to the service's deactivation and shutdown support the perspective that the service was not running successfully or consistently after this time.\n\n### Timeline of significant events\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “OTEL-SDK: [224] Instrument 'process.runtime.dotnet.jit.compilation_time', Meter 'OpenTelemetry.Instrumentation.Runtime' has been deactivated.”\n - **Description**: Spike detected with 78 occurrences, suggesting a potential issue within the service's runtime environment.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “OTEL-SDK: [224] 'MeterProvider' Disposed.”\n - **Description**: Sudden spike of 4 occurrences suggesting a significant change in the service’s telemetry setup or a potential abnormal shutdown initiation.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “exiting...”\n - **Description**: Log entries rose to 3 incidences, signaling the cart service may be initiating an unexpected exit.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “Application is shutting down...”\n - **Description**: 2 instances of this log message indicating the application is attempting to shut down around this time.\n\n- **2024-11-02T10:55:30.000Z**: \n - **Log Message**: “FATAL: Could not start, bad entrypoint!”\n - **Description**: Abrupt fatal error occurs 2 times, implying a critical misconfiguration or startup failure.\n\n- **2024-11-02T10:56:30.000Z**: \n - **Log Message**: “FATAL: Could not start, bad entrypoint!”\n - **Description**: Another occurrence of the critical fatal error, indicating the issue persisted beyond the initial spike and may have contributed to continued disruptions.\n\n- **2024-11-02T10:56:42.498Z**: \n - **Alert**: High error rate observed in the controller (98.78% error rate for POST requests to /api/cart).\n - **Description**: Starts the period of significantly high error rates contributing to 500 Internal Server Error responses. \n\n### Context and reasoning\n\nGiven the high error rate (98.78%) starting from **2024-11-02T10:56:42.498Z** for POST requests to `/api/cart`, the `cartservice` is a critical component for investigation as it handles these requests directly. From logs, there is a clear indication that significant problems began around **2024-11-02T10:55:30.000Z**, approximately one minute before the heightened error rate was observed in the upstream controller.\n\n**1. Startup Issues**: Multiple startup-related log patterns such as instruments deactivation, disposal of the MeterProvider, and application exit/shutdown messages indicate that cartservice experienced troubles initializing. Notably, the log entries “FATAL: Could not start, bad entrypoint!” directly show critical failures in service entry points likely causing the downstream failures.\n\n**2. Fatal Errors**: The fatal errors precisely correlate with the timeframe where errors spiked in the upstream service (controller). The error messages “FATAL: Could not start, bad entrypoint!” occurring multiple times reflect a misconfiguration or critical code issue that prevented the service from running properly.\n\nThus, the evidence from log patterns strongly suggests that startup and initialization problems in `cartservice`, resulting in its inconsistent availability and operational failures, is the root cause of the observed high error rates and 500 Internal Server Errors in the controller's POST requests to `/api/cart`." + }, + { + "attachments": { + "alerts": [], + "slos": [], + "analysis": { + "total": 98017, + "sampled": 1000, + "fields": [ + "@timestamp:date - 327 distinct values", + "app.label.component:keyword - 1 distinct values (`frontend`)", + "attributes.log.file.path.text:text - 1 distinct values (`/var/log/pods/default_my-otel-demo-frontend-5bbf4d78bc-qtwdr_a9fcfff9-3524-411e-8ac9-4e4341c1a121/frontend/0.log`)", + "attributes.log.file.path:keyword - 1 distinct values (`/var/log/pods/default_my-otel-demo-frontend-5bbf4d78bc-qtwdr_a9fcfff9-3524-411e-8ac9-4e4341c1a121/frontend/0.log`)", + "attributes.log.iostream:keyword - 1 distinct values (`stderr`)", + "body.text:text - 36 distinct values (` code: 13,\n`, ` details: 'cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"',\n`, 34 more values)", + "data_stream.dataset:keyword - 1 distinct values (`generic.otel`)", + "data_stream.namespace:keyword - 1 distinct values (`default`)", + "data_stream.type:keyword - 1 distinct values (`logs`)", + "deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "dropped_attributes_count:long - 1 distinct values (`0`)", + "event.dataset:keyword - 1 distinct values (`generic.otel`)", + "host.arch:keyword - 1 distinct values (`arm64`)", + "host.architecture:keyword - 1 distinct values (`arm64`)", + "host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "host.cpu.family:keyword - 1 distinct values (``)", + "host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "host.cpu.model.name:keyword - 1 distinct values (``)", + "host.cpu.stepping:keyword - 1 distinct values (`0`)", + "host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "host.os.full:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "host.os.platform:keyword - 1 distinct values (`linux`)", + "k8s.container.name:keyword - 1 distinct values (`frontend`)", + "k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "k8s.deployment.name:keyword - 1 distinct values (`my-otel-demo-frontend`)", + "k8s.namespace.name:keyword - 1 distinct values (`default`)", + "k8s.node.name:keyword - 1 distinct values (`minikube`)", + "k8s.pod.name:keyword - 1 distinct values (`my-otel-demo-frontend-5bbf4d78bc-qtwdr`)", + "k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T09:00:25Z`)", + "k8s.pod.uid:keyword - 1 distinct values (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`)", + "kubernetes.deployment.name:keyword - 1 distinct values (`my-otel-demo-frontend`)", + "kubernetes.namespace:keyword - 1 distinct values (`default`)", + "kubernetes.node.name:keyword - 1 distinct values (`minikube`)", + "kubernetes.pod.name:keyword - 1 distinct values (`my-otel-demo-frontend-5bbf4d78bc-qtwdr`)", + "kubernetes.pod.uid:keyword - 1 distinct values (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`)", + "log.file.path:keyword - 1 distinct values (`/var/log/pods/default_my-otel-demo-frontend-5bbf4d78bc-qtwdr_a9fcfff9-3524-411e-8ac9-4e4341c1a121/frontend/0.log`)", + "log.iostream:keyword - 1 distinct values (`stderr`)", + "message:text - 36 distinct values (` code: 13,\n`, ` details: 'cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"',\n`, 34 more values)", + "observed_timestamp:date_nanos - 1000 distinct values (`2024-11-02T10:56:50.564274379Z`, `2024-11-02T10:55:46.563453752Z`, `2024-11-02T10:56:52.76272763Z`, `2024-11-02T10:56:14.764728626Z`, `2024-11-02T10:55:51.964080879Z`, `2024-11-02T10:55:51.764216463Z`, `2024-11-02T10:56:50.564063629Z`, `2024-11-02T10:55:38.563141804Z`, `2024-11-02T10:55:53.963540672Z`, `2024-11-02T10:56:32.762493176Z`, 990 more values)", + "os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.app.label.component:keyword - 1 distinct values (`frontend`)", + "resource.attributes.deployment.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "resource.attributes.host.arch:keyword - 1 distinct values (`arm64`)", + "resource.attributes.host.cpu.cache.l2.size:long - 1 distinct values (`0`)", + "resource.attributes.host.cpu.family:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.model.id:keyword - 1 distinct values (`0x000`)", + "resource.attributes.host.cpu.model.name.text:text - 1 distinct values (``)", + "resource.attributes.host.cpu.model.name:keyword - 1 distinct values (``)", + "resource.attributes.host.cpu.stepping:keyword - 1 distinct values (`0`)", + "resource.attributes.host.cpu.vendor.id:keyword - 1 distinct values (`Apple`)", + "resource.attributes.host.ip:ip - 2 distinct values (`10.244.0.19`, `fe80::28ce:acff:fe42:368e`)", + "resource.attributes.host.mac:keyword - 1 distinct values (`2A-CE-AC-42-36-8E`)", + "resource.attributes.host.name:keyword - 1 distinct values (`otel-daemonset-opentelemetry-collector-agent-7jlpk`)", + "resource.attributes.k8s.container.name.text:text - 1 distinct values (`frontend`)", + "resource.attributes.k8s.container.name:keyword - 1 distinct values (`frontend`)", + "resource.attributes.k8s.container.restart_count:keyword - 1 distinct values (`0`)", + "resource.attributes.k8s.deployment.name:keyword - 1 distinct values (`my-otel-demo-frontend`)", + "resource.attributes.k8s.namespace.name:keyword - 1 distinct values (`default`)", + "resource.attributes.k8s.node.name:keyword - 1 distinct values (`minikube`)", + "resource.attributes.k8s.pod.name:keyword - 1 distinct values (`my-otel-demo-frontend-5bbf4d78bc-qtwdr`)", + "resource.attributes.k8s.pod.start_time:keyword - 1 distinct values (`2024-10-26T09:00:25Z`)", + "resource.attributes.k8s.pod.uid:keyword - 1 distinct values (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`)", + "resource.attributes.os.description:keyword - 1 distinct values (`Ubuntu 24.04.1 LTS (Noble Numbat) (Linux otel-daemonset-opentelemetry-collector-agent-7jlpk 6.10.4-linuxkit #1 SMP Wed Oct 2 16:38:00 UTC 2024 aarch64)`)", + "resource.attributes.os.type:keyword - 1 distinct values (`linux`)", + "resource.attributes.service.name.text:text - 1 distinct values (`frontend`)", + "resource.attributes.service.name:keyword - 1 distinct values (`frontend`)", + "resource.dropped_attributes_count:long - 1 distinct values (`0`)", + "resource.schema_url:keyword - 1 distinct values (`https://opentelemetry.io/schemas/1.6.1`)", + "scope.dropped_attributes_count:long - 1 distinct values (`0`)", + "service.environment:keyword - 1 distinct values (`opentelemetry-demo`)", + "service.name:keyword - 1 distinct values (`frontend`)", + "severity_number:byte - 1 distinct values (`0`)" + ] + }, + "ownPatterns": [ + { + "field": "message", + "count": 3756, + "pattern": "at", + "regex": ".*?at.*?", + "sample": " at /app/.next/server/pages/api/cart.js:1:1025\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at /app/.next/server/pages/api/cart.js:1:1025\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 1103 + }, + { + "x": 1730544960000, + "y": 1411 + }, + { + "x": 1730544990000, + "y": 1242 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "qlqu", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 2366, + "pattern": "at app node_modules grpc grpc js build src", + "regex": ".*?at.+?app.+?node_modules.+?grpc.+?grpc.+?js.+?build.+?src.*?", + "sample": " at Object.onReceiveStatus (/app/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at Object.onReceiveStatus (/app/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 693 + }, + { + "x": 1730544960000, + "y": 896 + }, + { + "x": 1730544990000, + "y": 777 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "roms", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1014, + "pattern": "at app node_modules opentelemetry instrumentation grpc build src", + "regex": ".*?at.+?app.+?node_modules.+?opentelemetry.+?instrumentation.+?grpc.+?build.+?src.*?", + "sample": " at ServiceClientImpl.clientMethodTrace [as getCart] (/app/node_modules/@opentelemetry/instrumentation-grpc/build/src/instrumentation.js:211:42)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ServiceClientImpl.clientMethodTrace [as getCart] (/app/node_modules/@opentelemetry/instrumentation-grpc/build/src/instrumentation.js:211:42)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 297 + }, + { + "x": 1730544960000, + "y": 384 + }, + { + "x": 1730544990000, + "y": 333 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "eyqk", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 351, + "pattern": "at node:internal process task_queues", + "regex": ".*?at.+?node:internal.+?process.+?task_queues.*?", + "sample": " at process.processTicksAndRejections (node:internal/process/task_queues:77:11)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at process.processTicksAndRejections (node:internal/process/task_queues:77:11)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 104 + }, + { + "x": 1730544960000, + "y": 129 + }, + { + "x": 1730544990000, + "y": 118 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "mpyi", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at AsyncLocalStorage.run node:async_hooks 346 14", + "regex": ".*?at.+?AsyncLocalStorage\\.run.+?node:async_hooks.+?346.+?14.*?", + "sample": " at AsyncLocalStorage.run (node:async_hooks:346:14)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at AsyncLocalStorage.run (node:async_hooks:346:14)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "jsoq", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at AsyncLocalStorageContextManager.with app node_modules opentelemetry context async hooks build src AsyncLocalStorageContextManager.js 33 40", + "regex": ".*?at.+?AsyncLocalStorageContextManager\\.with.+?app.+?node_modules.+?opentelemetry.+?context.+?async.+?hooks.+?build.+?src.+?AsyncLocalStorageContextManager\\.js.+?33.+?40.*?", + "sample": " at AsyncLocalStorageContextManager.with (/app/node_modules/@opentelemetry/context-async-hooks/build/src/AsyncLocalStorageContextManager.js:33:40)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at AsyncLocalStorageContextManager.with (/app/node_modules/@opentelemetry/context-async-hooks/build/src/AsyncLocalStorageContextManager.js:33:40)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "viwd", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at ContextAPI.with app node_modules opentelemetry api build src api context.js 60 46", + "regex": ".*?at.+?ContextAPI\\.with.+?app.+?node_modules.+?opentelemetry.+?api.+?build.+?src.+?api.+?context\\.js.+?60.+?46.*?", + "sample": " at ContextAPI.with (/app/node_modules/@opentelemetry/api/build/src/api/context.js:60:46)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ContextAPI.with (/app/node_modules/@opentelemetry/api/build/src/api/context.js:60:46)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "agsa", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at new ZoneAwarePromise app node_modules zone.js bundles zone.umd.js 1340 33", + "regex": ".*?at.+?new.+?ZoneAwarePromise.+?app.+?node_modules.+?zone\\.js.+?bundles.+?zone\\.umd\\.js.+?1340.+?33.*?", + "sample": " at new ZoneAwarePromise (/app/node_modules/zone.js/bundles/zone.umd.js:1340:33) {\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at new ZoneAwarePromise (/app/node_modules/zone.js/bundles/zone.umd.js:1340:33) {\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "dhes", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "code", + "regex": ".*?code.*?", + "sample": " code: 14,\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " code: 14,\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "feod", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "for call at", + "regex": ".*?for.+?call.+?at.*?", + "sample": "for call at\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + "for call at\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "enzg", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at ServiceClientImpl anonymous /app/node_modules/@grpc/grpc-js/build/src/make-client.js", + "regex": ".*?at.+?ServiceClientImpl.+?anonymous.+?/app/node_modules/@grpc/grpc-js/build/src/make-client\\.js.*?", + "sample": " at ServiceClientImpl.<anonymous> (/app/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ServiceClientImpl.<anonymous> (/app/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "iook", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 338, + "pattern": "at ServiceClientImpl.makeUnaryRequest /app/node_modules/@grpc/grpc-js/build/src/client.js", + "regex": ".*?at.+?ServiceClientImpl\\.makeUnaryRequest.+?/app/node_modules/@grpc/grpc-js/build/src/client\\.js.*?", + "sample": " at ServiceClientImpl.makeUnaryRequest (/app/node_modules/@grpc/grpc-js/build/src/client.js:161:32)\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " at ServiceClientImpl.makeUnaryRequest (/app/node_modules/@grpc/grpc-js/build/src/client.js:161:32)\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 99 + }, + { + "x": 1730544960000, + "y": 128 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "jvlx", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 335, + "pattern": "metadata Metadata internalRepr Map 0 options", + "regex": ".*?metadata.+?Metadata.+?internalRepr.+?Map.+?0.+?options.*?", + "sample": " metadata: Metadata { internalRepr: Map(0) {}, options: {} }\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " metadata: Metadata { internalRepr: Map(0) {}, options: {} }\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.678Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 97 + }, + { + "x": 1730544960000, + "y": 127 + }, + { + "x": 1730544990000, + "y": 111 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "wczz", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 3, + "pattern": "internalRepr Map content-type Array", + "regex": ".*?internalRepr.+?Map.+?content-type.+?Array.*?", + "sample": " internalRepr: Map(1) { 'content-type' => [Array] },\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " internalRepr: Map(1) { 'content-type' => [Array] },\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.039Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "pcyb", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 3, + "pattern": "metadata Metadata", + "regex": ".*?metadata.+?Metadata.*?", + "sample": " metadata: Metadata {\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " metadata: Metadata {\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.039Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "tcak", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 3, + "pattern": "options", + "regex": ".*?options.*?", + "sample": " options: {}\n", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ], + "resource.attributes.service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + " options: {}\n" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.039Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "xbsw", + "relevance": "normal", + "interesting": false + }, + { + "field": "message", + "count": 1005, + "pattern": "No connection established Last error connect ECONNREFUSED 10.110.191.164 8080 2024 11 02T10", + "regex": ".*?No.+?connection.+?established.+?Last.+?error.+?connect.+?ECONNREFUSED.+?10\\.110\\.191\\.164.+?8080.+?2024.+?11.+?02T10.*?", + "sample": "14 UNAVAILABLE: No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080 (2024-11-02T10:56:12.143Z)", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "message": [ + "14 UNAVAILABLE: No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080 (2024-11-02T10:56:12.143Z)" + ] + }, + "firstOccurrence": "2024-11-02T10:55:36.676Z", + "lastOccurrence": "2024-11-02T10:56:59.370Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 291 + }, + { + "x": 1730544960000, + "y": 381 + }, + { + "x": 1730544990000, + "y": 333 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "pssf", + "relevance": "critical", + "interesting": true + }, + { + "field": "error.exception.message", + "count": 3, + "pattern": "INTERNAL cart failure failed to get user cart during checkout rpc error code Unavailable desc connection error desc transport Error while dialing dial tcp connect connection refused", + "regex": ".*?INTERNAL.+?cart.+?failure.+?failed.+?to.+?get.+?user.+?cart.+?during.+?checkout.+?rpc.+?error.+?code.+?Unavailable.+?desc.+?connection.+?error.+?desc.+?transport.+?Error.+?while.+?dialing.+?dial.+?tcp.+?connect.+?connection.+?refused.*?", + "sample": "13 INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"", + "highlight": { + "service.name": [ + "<em>frontend</em>" + ] + }, + "metadata": { + "error.exception.message": [ + "13 INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"" + ] + }, + "firstOccurrence": "2024-11-02T10:55:43.710Z", + "lastOccurrence": "2024-11-02T10:56:15.038Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 0 + }, + { + "x": 1730543820000, + "y": 0 + }, + { + "x": 1730543850000, + "y": 0 + }, + { + "x": 1730543880000, + "y": 0 + }, + { + "x": 1730543910000, + "y": 0 + }, + { + "x": 1730543940000, + "y": 0 + }, + { + "x": 1730543970000, + "y": 0 + }, + { + "x": 1730544000000, + "y": 0 + }, + { + "x": 1730544030000, + "y": 0 + }, + { + "x": 1730544060000, + "y": 0 + }, + { + "x": 1730544090000, + "y": 0 + }, + { + "x": 1730544120000, + "y": 0 + }, + { + "x": 1730544150000, + "y": 0 + }, + { + "x": 1730544180000, + "y": 0 + }, + { + "x": 1730544210000, + "y": 0 + }, + { + "x": 1730544240000, + "y": 0 + }, + { + "x": 1730544270000, + "y": 0 + }, + { + "x": 1730544300000, + "y": 0 + }, + { + "x": 1730544330000, + "y": 0 + }, + { + "x": 1730544360000, + "y": 0 + }, + { + "x": 1730544390000, + "y": 0 + }, + { + "x": 1730544420000, + "y": 0 + }, + { + "x": 1730544450000, + "y": 0 + }, + { + "x": 1730544480000, + "y": 0 + }, + { + "x": 1730544510000, + "y": 0 + }, + { + "x": 1730544540000, + "y": 0 + }, + { + "x": 1730544570000, + "y": 0 + }, + { + "x": 1730544600000, + "y": 0 + }, + { + "x": 1730544630000, + "y": 0 + }, + { + "x": 1730544660000, + "y": 0 + }, + { + "x": 1730544690000, + "y": 0 + }, + { + "x": 1730544720000, + "y": 0 + }, + { + "x": 1730544750000, + "y": 0 + }, + { + "x": 1730544780000, + "y": 0 + }, + { + "x": 1730544810000, + "y": 0 + }, + { + "x": 1730544840000, + "y": 0 + }, + { + "x": 1730544870000, + "y": 0 + }, + { + "x": 1730544900000, + "y": 0 + }, + { + "x": 1730544930000, + "y": 2 + }, + { + "x": 1730544960000, + "y": 1 + }, + { + "x": 1730544990000, + "y": 0 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "crai", + "relevance": "critical", + "interesting": true + } + ], + "patternsFromOtherEntities": [ + { + "field": "message", + "count": 246, + "pattern": "INFO 10.244.0.26 AAAA IN my otel demo frontend udp 39 false 512 NXDOMAIN qr rd ra 39", + "regex": ".*?INFO.+?10\\.244\\.0\\.26.+?AAAA.+?IN.+?my.+?otel.+?demo.+?frontend.+?udp.+?39.+?false.+?512.+?NXDOMAIN.+?qr.+?rd.+?ra.+?39.*?", + "sample": "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-frontend. udp 39 false 512\" NXDOMAIN qr,rd,ra 39 0.003716084s\n", + "highlight": { + "body.text": [ + "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-<em>frontend</em>. udp 39 false 512\" NXDOMAIN qr,rd,ra" + ], + "message": [ + "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-<em>frontend</em>. udp 39 false 512\" NXDOMAIN qr,rd,ra" + ] + }, + "metadata": { + "service.name": [ + "coredns" + ], + "message": [ + "[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-frontend. udp 39 false 512\" NXDOMAIN qr,rd,ra 39 0.003716084s\n" + ] + }, + "firstOccurrence": "2024-11-02T10:36:30.917Z", + "lastOccurrence": "2024-11-02T10:56:58.646Z", + "timeseries": [ + { + "x": 1730543790000, + "y": 6 + }, + { + "x": 1730543820000, + "y": 6 + }, + { + "x": 1730543850000, + "y": 6 + }, + { + "x": 1730543880000, + "y": 6 + }, + { + "x": 1730543910000, + "y": 6 + }, + { + "x": 1730543940000, + "y": 6 + }, + { + "x": 1730543970000, + "y": 6 + }, + { + "x": 1730544000000, + "y": 6 + }, + { + "x": 1730544030000, + "y": 6 + }, + { + "x": 1730544060000, + "y": 6 + }, + { + "x": 1730544090000, + "y": 6 + }, + { + "x": 1730544120000, + "y": 6 + }, + { + "x": 1730544150000, + "y": 6 + }, + { + "x": 1730544180000, + "y": 6 + }, + { + "x": 1730544210000, + "y": 6 + }, + { + "x": 1730544240000, + "y": 6 + }, + { + "x": 1730544270000, + "y": 6 + }, + { + "x": 1730544300000, + "y": 6 + }, + { + "x": 1730544330000, + "y": 6 + }, + { + "x": 1730544360000, + "y": 6 + }, + { + "x": 1730544390000, + "y": 6 + }, + { + "x": 1730544420000, + "y": 6 + }, + { + "x": 1730544450000, + "y": 6 + }, + { + "x": 1730544480000, + "y": 6 + }, + { + "x": 1730544510000, + "y": 6 + }, + { + "x": 1730544540000, + "y": 6 + }, + { + "x": 1730544570000, + "y": 6 + }, + { + "x": 1730544600000, + "y": 6 + }, + { + "x": 1730544630000, + "y": 6 + }, + { + "x": 1730544660000, + "y": 6 + }, + { + "x": 1730544690000, + "y": 6 + }, + { + "x": 1730544720000, + "y": 6 + }, + { + "x": 1730544750000, + "y": 6 + }, + { + "x": 1730544780000, + "y": 6 + }, + { + "x": 1730544810000, + "y": 6 + }, + { + "x": 1730544840000, + "y": 6 + }, + { + "x": 1730544870000, + "y": 6 + }, + { + "x": 1730544900000, + "y": 6 + }, + { + "x": 1730544930000, + "y": 6 + }, + { + "x": 1730544960000, + "y": 6 + }, + { + "x": 1730544990000, + "y": 6 + }, + { + "x": 1730545020000, + "y": 0 + } + ], + "change": { + "type": "stationary", + "significance": null + }, + "shortId": "rlzf", + "relevance": "normal", + "interesting": false + } + ], + "searches": [ + { + "fragments": [ + "10.110.191.164:8080", + "10.110.191.164", + "8080" + ], + "appearsAs": "This IP address and port are referenced in the investigated entity 'frontend'." + }, + { + "fragments": [ + "/api/cart", + "cartservice", + "/api" + ], + "appearsAs": "These URL fragments appear as attributes.request.url in the investigated entity 'frontend'. They could be related to 'cartservice'." + }, + { + "fragments": [ + "000aa", + "000bbb" + ], + "appearsAs": "These ids appear as span.id and parent.id in the investigated entity 'frontend'. They could be referring to spans found on upstream or downstream services" + } + ], + "relatedEntitiesSummaries": [ + "## Possible Relationships to `service.name:frontend`\n\n### 1. Entity: `service.name:controller`\n- **Indicators:**\n - #### Average Indicator:\n - **IP Address and Port:**\n - `frontend`: `10.110.191.164:8080`\n - `controller`: `10.244.0.26:8080`\n - **URL Fragment:**\n - `frontend`: `/api/cart`\n - `controller`: `/<em>api</em>/<em>cart</em>?session`\n- **Relationship Reasoning:**\n - The `controller` service is highly likely to be making requests to, or routing through, the `frontend` service as evidenced by the URL fragments referring to the `/api/cart` endpoint seen in both entities. Additionally, they share common IP address and port patterns indicating network interaction.\n- **Relevance Assessment:**\n - **Very High**: Given that the `controller` service handles endpoints like `/api/cart`, which directly correspond to transactions failing with a high error rate, this entity is a critical part of the interaction chain and should be closely examined.\n\n### 2. Entity: `service.name:cartservice`\n- **Indicators:**\n - #### Strong Indicator:\n - **Direct Call References:**\n - `frontend`: `details: 'cart failure: failed to get user cart during checkout: rpc error: ... desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"'\n - `cartservice`: `url.full.text:\"http://my-otel-demo-cartservice:8080/oteldemo.CartService/GetCart\"`\n- **Relationship Reasoning:**\n - The `frontend` service attempts to interact with the `cartservice` as observed by the endpoint `/oteldemo.CartService/GetCart`. Connection errors from `frontend` indicate it is calling `cartservice` and facing issues getting responses, potentially causing the 500 errors.\n- **Relevance Assessment:**\n - **Very High**: Since `cartservice` manages user cart data and the connection errors reported in `frontend` logs directly correspond to attempts to communicate with `cartservice`, this entity is a probable cause of the service failures being observed.\n\n### 3. Entity: `service.name:frontend-web`\n- **Indicators:**\n - #### Average Indicator:\n - **URL Fragment:**\n - `frontend`: `/api/cart`\n - `frontend-web`: `/api/cart`\n - #### Weak Indicator:\n - **RUM Layer Mentions:**\n - `frontend`: `frontend-web (RUM)`\n - `frontend-web`: Described in System Architecture.\n- **Relationship Reasoning:**\n - `frontend-web` captures real user interactions with the `/api/cart` endpoint providing insights into the `frontend` service which might help trace the errors and delays externally perceived by users.\n- **Relevance Assessment:**\n - **Moderate**: While `frontend-web` can show the surface errors users are experiencing, it is more of an observability layer rather than directly causing the 500 errors or impacting the service interactions upstream.\n\n### 4. Entity: `service.name:frontendproxy`\n- **Indicators:**\n - #### Average Indicator:\n - **Network Routing Indicator:**\n - `frontend`: Receives traffic from `frontendproxy`\n - `frontendproxy`: Directs traffic to `frontend`\n - #### IP Address Mention:\n - Both services reference `8080`, indicating shared routing or proxying.\n- **Relationship Reasoning:**\n - `frontendproxy` routes traffic from external sources, including simulated user requests, to `frontend`. Any issues in this proxy layer could impact the incoming traffic to `frontend`, causing errors.\n- **Relevance Assessment:**\n - **High**: Considering `frontendproxy` handles traffic routing, any misconfiguration or failures here could lead to the issues observed on the `frontend`.\n\n### 5. Entity: `service.name:coredns`\n- **Indicators:**\n - #### Weak Indicators:\n - **DNS Resolution Events:**\n - Logs showing DNS queries involving `frontend`.\n - **IP Address and Port:**\n - Shared network interactions over common ports like `8080`.\n- **Relationship Reasoning:**\n - While not directly related to application logic, `coredns` is responsible for DNS resolution within the cluster, and issues here could result in connectivity problems seen in `frontend` when trying to reach `cartservice`.\n- **Relevance Assessment:**\n - **Moderate**: While less likely to be the root cause, DNS misconfigurations or failures could indirectly contribute to connectivity issues within services like `frontend`.\n\n### Summary\n\n1. **service.name:controller** - Very High relevance due to direct endpoint interaction.\n2. **service.name:cartservice** - Very High relevance for being the direct interaction target with observed failures.\n3. **service.name:frontend-web** - Moderate relevance in monitoring layer but not direct interaction.\n4. **service.name:frontendproxy** - High relevance for routing traffic to `frontend`.\n5. **service.name:coredns** - Moderate relevance for possible DNS resolution issues." + ], + "kbEntries": [ + { + "id": "System architecture", + "text": "The architecture described here outlines a microservices-based system, where each service is implemented in a distinct programming language and communicates via gRPC, HTTP, or TCP. This system is designed to handle simulated user traffic, supported by a variety of interconnected services and components.\n\n### System Architecture\n\n1. **`loadgenerator`** - Simulates external user traffic by sending HTTP requests, which are managed by an Nginx ingress controller. This ingress directs traffic to the `frontendproxy` service.\n\n2. **`frontendproxy` (Envoy)** - Acts as a reverse proxy, routing incoming traffic from `loadgenerator` to `frontend`.\n\n3. **`frontend` (Node.js)** - The core service for user interactions, receiving HTTP traffic from `frontendproxy` and interfacing with various backend services to fulfill requests.\n\n4. **`frontend-web` (RUM)** - A Real User Monitoring (RUM) layer that runs in the user's browser, enabling insights into end-user experiences and frontend performance.\n\n5. **`adservice`** - Delivers advertisements to the `frontend` using gRPC, enhancing the user experience with relevant ad content.\n\n6. **`cartservice`** - Manages shopping cart data, including adding and removing items. It communicates over gRPC and leverages a Redis cache for data persistence.\n\n7. **`currencyservice`** - Handles currency conversions and facilitates interactions between `cartservice` and `checkoutservice` over gRPC.\n\n8. **`checkoutservice`** - Coordinates the checkout process, calling various services for payments, shipping, and emails. It utilizes both gRPC and HTTP protocols to aggregate the necessary information for order completion.\n\n9. **`emailservice`** - Sends order confirmation emails to users via gRPC, triggered by interactions with `checkoutservice`.\n\n10. **`productcatalogservice`** - Maintains the product catalog, storing details about available items and providing this data to other services via gRPC.\n\n11. **`recommendationservice`** - Generates personalized product recommendations, accessed by `frontend` over gRPC.\n\n12. **`shippingservice`** - Manages shipping information, providing essential data to `checkoutservice` over gRPC.\n\n13. **`quoteservice`** - Supplies shipping quotes over HTTP, which are accessed by `shippingservice` to estimate shipping costs.\n\n14. **`paymentservice`** - Processes payment transactions through gRPC, enabling secure and efficient payments for `checkoutservice`.\n\n15. **`accountingservice`** - Responsible for recording transactions, it connects to a Kafka queue and interacts over TCP.\n\n16. **`frauddetectionservice`** - Monitors orders for potential fraud, also interfacing with the Kafka queue over TCP to receive relevant transaction data.\n\n17. **`imageprovider` (Nginx)** - Serves static images for the frontend interface, accessible over HTTP.\n\n18. **`queue` (Kafka)** - Acts as a central message broker, facilitating communication between `accountingservice` and `frauddetectionservice`.\n\n### Key Components\nThe system is structured to enable robust, distributed communication across services, allowing each component to focus on a specific aspect of the user experience or business logic. The ingress controller, in particular, plays a critical role in directing traffic, ensuring that incoming requests from `loadgenerator` are correctly routed through `frontendproxy` and into the system’s core services.\n\nThis architecture ensures that the system can handle high traffic loads and provides a modular, flexible framework to meet user demands while monitoring for performance and security.\n", + "tokens": 733, + "score": 5 + } + ] + }, + "entity": { + "service.name": "frontend" + }, + "relatedEntities": [ + { + "entity": { + "service.name": "controller" + }, + "reason": "`controller` service handles endpoints like `/api/cart`, which corresponds to failed transactions. They share common IP address and port patterns, indicating network interaction.", + "confidence": "very high" + }, + { + "entity": { + "service.name": "cartservice" + }, + "reason": "`frontend` service attempts to interact with `cartservice`. Connection errors from `frontend` indicate it is calling `cartservice` and facing issues getting responses, potentially causing the 500 errors.", + "confidence": "very high" + }, + { + "entity": { + "service.name": "frontend-web" + }, + "reason": "`frontend-web` captures real user interactions with the `/api/cart` endpoint. Helps trace the errors and delays externally perceived by users.", + "confidence": "moderate" + }, + { + "entity": { + "service.name": "coredns" + }, + "reason": "`coredns` is responsible for DNS resolution within the cluster and issues here could result in connectivity problems seen in `frontend`.", + "confidence": "moderate" + } + ], + "summary": "### Investigation of Entity `service.name:frontend`\n\n#### Context of Investigation\n\nThe `frontend` service is critical in this investigation due to its role in the overall request handling and the observed high error rate (98.78%) in the `controller` service for POST requests to the `/api/cart` endpoint. This issue began at `2024-11-02T10:56:42.498Z`. The `frontend` service routes requests to `cartservice`, a key interaction in this error occurrence.\n\n#### Infrastructure & Environment\n\n- **Environment**: The `frontend` operates within the `opentelemetry-demo` deployment environment.\n- **Deployment**: It is deployed on Kubernetes (k8s), specifically within the `default` namespace. \n- **Pod Information**: The pod name is `my-otel-demo-frontend-5bbf4d78bc-qtwdr`, on the `minikube` node. Each pod has a unique UID (`a9fcfff9-3524-411e-8ac9-4e4341c1a121`), with logs stored at `/var/log/pods/`.\n- **Resource Attributes**: Hosts `Apple` Arm64 architecture processor (`host.cpu.vendor.id: Apple`), running `Ubuntu 24.04.1 LTS (Noble Numbat)`, indicating a Linux-based system.\n\n#### Communication Characteristics \n\n- **Protocols**: \n - The `frontend` service communicates primarily using HTTP for inbound requests and gRPC for backend service interactions. \n - gRPC is specifically used when the `frontend` communicates with `cartservice`, highlighted by recorded RPC errors in the logs.\n- **Endpoints**:\n - The `frontend` gets requests from `frontendproxy` (Envoy), acting as the reverse proxy.\n - The service then routes these requests to different backend services, including `cartservice`, via gRPC.\n - The critical IP noted in logs is `10.110.191.164:8080`, pointing to a potential endpoint for the `cartservice`.\n\n#### Context of Entity in Investigation\n\n- **Reason for Investigation**: The `frontend` service is under scrutiny due to its pivotal role in processing and routing incoming user requests. Any disruption in its communication or processing mechanism directly affects the functionality of connected services, notably `cartservice`, leading to high error rates observed in the `controller`.\n- **Relation to Other Entities**:\n - **Previous Entity**: `controller` - The `controller` service logs indicate a high number of 500 errors were triggered during POST requests to `/api/cart`.\n - **Dependencies**: `frontend` relies on successful communication with `cartservice` to fulfill these cart-related requests.\n- **Architectural Role**: The `frontend` is the nucleus for user interactions within this microservices architecture. Any network or communication issue in `frontend` can cascade, influencing its backend dependencies like `cartservice` and leading to broader service disruptions.\n\nThis comprehensive analysis of the `frontend` service’s infrastructure, communication protocols, and its investigative context emphasizes its critical position in the service chain responsible for the reported errors. Further scrutiny of the communication logs, particularly focusing on the gRPC interactions with `cartservice`, is essential to identify and mitigate the root cause of these failures.\n\nObservations for service `frontend`.\n\n### Connection Issues to Upstream Dependency\n\n1. **Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Sample**: \"14 UNAVAILABLE: No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080 (2024-11-02T10:56:12.143Z)\"\n - **Timeseries Observations**: \n - No occurrences before 2024-11-02T10:55:30.000Z.\n - Sharp increase at 2024-11-02T10:55:30.000Z (291 occurrences).\n - Further increase at 2024-11-02T10:56:00.000Z (381 occurrences).\n - Next timestamp at 2024-11-02T10:57:00.000Z showing a return to 0 occurrences.\n\n2. **Pattern**: \"INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"\n - **Sample**: \"13 INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 10.110.191.164:8080: connect: connection refused\"\n - **Timeseries Observations**:\n - No occurrences before 2024-11-02T10:55:30.000Z.\n - Slight increase at 2024-11-02T10:55:30.000Z (2 occurrences).\n - One more occurrence at 2024-11-02T10:56:00.000Z (1 occurrence).\n - No occurrences after 2024-11-02T10:56:30.000Z.\n\nThe significant spike in connection errors starting from 2024-11-02T10:55:30.000Z aligns with the high error rate in the `controller` service, suggesting a strong correlation between these established connection issues in the `frontend` service and the 500 errors seen in the `controller` service for POST requests to the `/api/cart` endpoint around the same time.\n\n### Possibly Relevant Log Patterns from coredns\n\n1. **Pattern**: \"INFO 10.244.0.26 AAAA IN my-otel-demo-frontend udp 39 false 512 NXDOMAIN qr,rd,ra 39\"\n - **Sample**: \"[INFO] 10.244.0.26:59273 - 48617 \"AAAA IN my-otel-demo-frontend. udp 39 false 512\" NXDOMAIN qr,rd,ra 39 0.003716084s\"\n - **Timeseries Observations**:\n - Frequent steady occurrences of 6 events every 30 seconds.\n - No notable changes or spikes coinciding with the connection issues observed in the `frontend` service.\n\nFrom these observations, it appears that the connection refusal errors in the `frontend` service are likely caused by issues in communication with the `cartservice`, potentially as a result of intermittent network disruptions or dependency service failures at the IP 10.110.191.164. Further investigation should focus on the health and connectivity status of the `cartservice` around the specified time period.\n\n### Timeline of Significant Events\n\n1. **2024-11-02T10:55:30.000Z**\n - **Event**: Sharp increase in connection error logs.\n - **Log Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Details**: 291 occurrences reported.\n\n2. **2024-11-02T10:55:30.000Z**\n - **Event**: Appearance of an internal error in accessing cart services.\n - **Log Pattern**: \"INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error\"\n - **Details**: 2 occurrences reported.\n\n3. **2024-11-02T10:56:00.000Z**\n - **Event**: Further increase in connection error logs.\n - **Log Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Details**: 381 occurrences reported.\n\n4. **2024-11-02T10:56:00.000Z**\n - **Event**: Additional occurrence of an internal error in accessing cart services.\n - **Log Pattern**: \"INTERNAL: cart failure: failed to get user cart during checkout: rpc error: code = Unavailable desc = connection error\"\n - **Details**: 1 occurrence reported.\n\n5. **2024-11-02T10:56:42.498Z**\n - **Event**: High error rate (98.78%) in the `controller` service for POST requests to the `/api/cart` endpoint begins.\n - **Details**: Corresponds to the timing of observed spikes in connection errors in the `frontend` service.\n\n6. **2024-11-02T10:57:00.000Z**\n - **Event**: Connection error logs return to zero occurrences.\n - **Log Pattern**: \"No connection established. Last error: connect ECONNREFUSED 10.110.191.164:8080\"\n - **Details**: 0 occurrences reported.\n\n### Context and Reasoning\n\nThe `frontend` service is critical in this investigation due to its role in routing requests to the `cartservice`. The high error rates observed in the `controller` service's POST requests to the `/api/cart` endpoint started precisely at 2024-11-02T10:56:42.498Z, which is within the timeframe when the `frontend` service experienced significant connection issues with the `cartservice`.\n\nUpon analyzing log patterns, it is evident that the communication disruptions between the `frontend` service and the `cartservice` began at 2024-11-02T10:55:30.000Z with a sharp increase in connection errors, and these errors persisted until approximately 2024-11-02T10:57:00.000Z. During this period, numerous `ECONNREFUSED` errors were logged, indicating the `frontend` service's inability to establish a connection to the `cartservice` (IP 10.110.191.164:8080). This aligns with the timeline of the high error rates in the `controller` service, suggesting a direct correlation.\n\nFurthermore, the internal errors logged by the `frontend` service related to RPC errors and failed attempts to get the user cart during checkout reaffirm these connection problems. These errors underscore an impaired communication pathway to the `cartservice`, affecting the `controller` service's ability to process POST requests to the `/api/cart` endpoint.\n\nTherefore, the evidence strongly indicates that network or connection failures between the `frontend` service and its upstream dependency, `cartservice`, are the principal cause of the cascading 500 errors seen in the `controller` service. This highlights the critical position of the `frontend` service in ensuring stable communication pathways within the microservice architecture." + } + ] + }, + "role": "tool", + "toolCallId": "call_KJwmI3xgY1gcstI4MVd4Olcf" + }, + { + "role": "assistant", + "content": "", + "toolCalls": [ + { + "toolCallId": "call_1Y45Vw3lRUFLsImFilvrXPos", + "function": { + "name": "endProcessAndWriteReport", + "arguments": { + "endProcess": true + } + } + } + ] + }, + { + "name": "endProcessAndWriteReport", + "role": "tool", + "toolCallId": "call_1Y45Vw3lRUFLsImFilvrXPos", + "response": { + "report": "# Root Cause Analysis (RCA) Report\n\n## 1. Introduction\n\n### Overview\nThis RCA report investigates the elevated error rates in the `controller` service and its downstream dependencies. The incident was first detected by an alert indicating an unusually high number of 500 Internal Server Errors on the `/api/cart` endpoint, with an error rate of 98.78%, significantly exceeding the 1% threshold over a 1-minute period. The primary entities investigated were the `controller`, `cartservice`, and `frontend` services.\n\n### Initial Hypothesis\nThe initial hypothesis proposed that either a deployment, a critical configuration change, or a dependency failure caused the high error rate in the `controller` service.\n\n## 2. Investigation Summary\n\n### Proposed Hypotheses\n1. **Resource exhaustion in `controller`**:\n - **Evidence**:\n - **Strong:** High error rate specifically for POST requests to the `/api/cart` endpoint.\n - **Weak:** No indications of resource limits being exceeded in the `controller` service.\n2. **Upstream latency or failure from `frontendproxy`**:\n - **Evidence**:\n - **Strong:** Error patterns suggested connectivity issues starting from the `frontendproxy`.\n - **Weak:** Eventually ruled out as communication problems upstream of the `controller`.\n3. **Backend service issue or configuration error in `cartservice`**:\n - **Evidence**:\n - **Strong:** Identified startup issues and fatal errors in `cartservice`.\n - **Weak:** None.\n\n### Discarded Hypotheses\n- **Resource exhaustion in `controller`**: Ruled out due to stable resource usage.\n- **Upstream latency or failure from `frontendproxy`**: Connectivity issues traced further downstream to `cartservice`.\n\n### Investigated Entities\n- `controller`\n- `frontend`\n- `cartservice`\n\n## 3. Cause and Effect\n\n### Cause\nThe root cause was identified as a startup failure in the `cartservice`, with fatal \"bad entrypoint\" errors preventing the service from starting correctly.\n\n### Effect\nThe startup issues in `cartservice` caused connection failures, leading to `frontend` being unable to establish connections. This resulted in `controller` reporting a high number of 500 errors for POST requests to the `/api/cart` endpoint, thus impacting user-facing services relying on this endpoint.\n\n## 4. Evidence for Root Cause\n\n### Log Patterns\n- **`cartservice` Logs**: Repeated \"FATAL: Could not start, bad entrypoint!\" errors indicating startup failures.\n- **`frontend` Logs**: \"ECONNREFUSED\" errors and spikes in \"No connection established\" errors to `cartservice`.\n- **`controller` Logs**: High frequency of 500 errors for HTTP POST requests to `/api/cart`.\n\n### Alerts and SLOs\n- An alert was triggered at `2024-11-02T10:56:42.498Z` due to a high error rate of 98.78% for the `/api/cart` endpoint.\n\n### Data Analysis\n- **Memory and CPU usage** of `controller` remained stable, ruling out resource exhaustion.\n- **Network traffic** analysis showed no abnormalities at the `controller` level but issues at the connectivity to `cartservice`.\n\n## 5. Proposed Impact\n\n### Affected Services\n- `controller`\n- `frontend`\n- `cartservice`\n\n### Performance Degradation\n- High error rate and degraded performance for the `/api/cart` endpoint.\n- Impact on downstream services and user-facing operations reliant on `cartservice`.\n\n### User Impact\n- Elevated latency and failed transactions affecting users trying to access and modify shopping cart data.\n\n## 6. Timeline of Significant Events\n\n- **2024-11-02T10:55:30.000Z**:\n - `cartservice` logs indicate a series of startup issues, marked by \"FATAL: Could not start, bad entrypoint!\" errors.\n - `frontend` logs show initial \"No connection established\" errors to `cartservice`.\n\n- **2024-11-02T10:56:00.000Z**:\n - `frontend` logs continue to show increased \"No connection established\" errors.\n\n- **2024-11-02T10:56:30.000Z**:\n - Additional \"bad entrypoint\" errors recorded in `cartservice` logs.\n\n- **2024-11-02T10:56:42.498Z**:\n - Alert triggered due to a high error rate of 98.78% for `/api/cart` in `controller`.\n\n- **2024-11-02T10:57:00.000Z**:\n - `frontend` logs show a return to zero connection errors as the startup issue in `cartservice` stabilizes.\n\n## 7. Conclusion and Next Steps\n\n### Conclusion\nThe investigation concludes that the root cause of the incident was the startup failure and persistent initialization issues in `cartservice`. This prevented `cartservice` from functioning correctly, causing connection refusal errors in `frontend`, which in turn resulted in the `controller` reporting high error rates for POST requests to the `/api/cart` endpoint.\n\n### Next Steps\n1. **Fixes or Mitigations**:\n - Address and rectify the misconfiguration or code issues in `cartservice` causing fatal startup errors.\n - Ensure proper configuration and reliable startup for `cartservice` moving forward.\n\n2. **Monitoring Improvements**:\n - Implement more granular alerts and monitoring for `cartservice` startup and initialization errors.\n - Enhance network error monitoring between `frontend` and `cartservice`.\n\n3. **Further Investigations**:\n - Monitor `cartservice` and observe for any recurrent patterns indicating startup issues.\n - Investigate the potential for automated failover or redundancy mechanisms to handle startup failures in critical services.\n\nThis concluded RCA encapsulates the findings from the investigations and provides clear guidance on addressing identified issues.\n\n---\n\n**Prepared by:**\nElastic Observability Support Team", + "timeline": { + "events": [ + { + "@timestamp": "2024-11-02T10:55:30.000Z", + "severity": "unusual", + "type": "event", + "description": "`cartservice` logs indicate a series of startup issues, marked by 'FATAL: Could not start, bad entrypoint!' errors." + }, + { + "@timestamp": "2024-11-02T10:55:30.000Z", + "severity": "unusual", + "type": "event", + "description": "`frontend` logs show initial 'No connection established' errors to `cartservice`." + }, + { + "@timestamp": "2024-11-02T10:56:00.000Z", + "severity": "unusual", + "type": "event", + "description": "`frontend` logs continue to show increased 'No connection established' errors." + }, + { + "@timestamp": "2024-11-02T10:56:30.000Z", + "severity": "unusual", + "type": "event", + "description": "Additional 'bad entrypoint' errors recorded in `cartservice` logs." + }, + { + "@timestamp": "2024-11-02T10:56:42.498Z", + "severity": "critical", + "type": "alert", + "description": "Alert triggered due to a high error rate of 98.78% for `/api/cart` in `controller`." + }, + { + "@timestamp": "2024-11-02T10:57:00.000Z", + "severity": "info", + "type": "event", + "description": "`frontend` logs show a return to zero connection errors as the startup issue in `cartservice` stabilizes." + } + ] + } + } + } +] diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/mock/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/mock/index.ts new file mode 100644 index 0000000000000..5068c8d5055fb --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/mock/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + InvestigateEntityToolMessage, + RootCauseAnalysisEvent, +} from '@kbn/observability-ai-server/root_cause_analysis'; +import { RCA_INVESTIGATE_ENTITY_TOOL_NAME } from '@kbn/observability-ai-common/root_cause_analysis'; +import { MessageRole } from '@kbn/inference-common'; +import { Required } from 'utility-types'; +// @ts-ignore +import completeRootCauseAnalysisJson from './complete_root_cause_analysis.json'; + +export const completeRootCauseAnalysis = completeRootCauseAnalysisJson as RootCauseAnalysisEvent[]; + +export const controllerEntityHealthAnalysis = completeRootCauseAnalysis.find( + (event) => + 'role' in event && + event.role === MessageRole.Tool && + event.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME && + event.response.entity['service.name'] === 'cartservice' +) as Required<InvestigateEntityToolMessage, 'data'>; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_callout/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_callout/index.stories.tsx new file mode 100644 index 0000000000000..6328835af1f63 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_callout/index.stories.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { RootCauseAnalysisCallout } from '.'; + +const stories: Meta<{}> = { + title: 'RCA/Callout', + component: RootCauseAnalysisCallout, +}; + +export default stories; + +export const Default: Story<{}> = () => { + return ( + <RootCauseAnalysisCallout + onClick={() => {}} + onCompleteInBackgroundClick={() => {}} + completeInBackground + /> + ); +}; + +export const CompleteInBackgroundDisabled: Story<{}> = () => { + return ( + <RootCauseAnalysisCallout + onClick={() => {}} + onCompleteInBackgroundClick={() => {}} + completeInBackground={false} + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_callout/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_callout/index.tsx new file mode 100644 index 0000000000000..0487172aca6a6 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_callout/index.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButton, + EuiCallOut, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiFormLabel, + EuiPanel, + EuiText, + EuiTitle, + useGeneratedHtmlId, +} from '@elastic/eui'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { AssistantAvatar } from '@kbn/observability-ai-assistant-plugin/public'; +import { css } from '@emotion/css'; + +export function RootCauseAnalysisCallout({ + onClick, + onCompleteInBackgroundClick, + completeInBackground, +}: { + onClick: () => void; + onCompleteInBackgroundClick: () => void; + completeInBackground: boolean; +}) { + const checkboxId = useGeneratedHtmlId(); + + return ( + <EuiCallOut color="primary"> + <EuiPanel color="transparent" hasShadow={false} hasBorder={false}> + <EuiFlexGroup alignItems="center" justifyContent="center"> + <EuiFlexGroup + direction="column" + alignItems="center" + justifyContent="center" + className={css` + max-width: 512px; + `} + > + <EuiFlexGroup direction="row" alignItems="center" justifyContent="center"> + <AssistantAvatar /> + <EuiFlexItem grow={false}> + <EuiTitle size="xs"> + <h2> + {i18n.translate('xpack.observabilityAiAssistant.rca.calloutTitle', { + defaultMessage: 'AI-assisted root cause analysis', + })} + </h2> + </EuiTitle> + </EuiFlexItem> + </EuiFlexGroup> + <EuiFlexItem grow={false}> + <EuiText size="m"> + {i18n.translate('xpack.observabilityAiAssistant.rca.calloutText', { + defaultMessage: `Start an automated investigation that will analyze + log patterns, SLOs and alerts for entities and provide an evidence- + based root cause analysis of issues in your system.`, + })} + </EuiText> + </EuiFlexItem> + <EuiFlexGroup direction="column" alignItems="center" gutterSize="m"> + <EuiFlexGroup + direction="row" + alignItems="center" + justifyContent="center" + gutterSize="s" + > + <EuiCheckbox + id={checkboxId} + onChange={() => { + onCompleteInBackgroundClick(); + }} + checked={completeInBackground} + /> + <EuiFormLabel htmlFor={checkboxId}> + {i18n.translate( + 'xpack.observabilityAiAssistant.rootCauseAnalysisCallout.keepAnalysisRunningInFormLabelLabel', + { defaultMessage: 'Keep analysis running in background' } + )} + </EuiFormLabel> + </EuiFlexGroup> + <EuiButton + data-test-subj="observabilityAiAssistantAppRootCauseAnalysisCalloutStartAnalysisButton" + iconType="sparkles" + fill + onClick={onClick} + > + {i18n.translate('xpack.observabilityAiAssistant.rca.calloutText', { + defaultMessage: 'Start analysis', + })} + </EuiButton> + </EuiFlexGroup> + </EuiFlexGroup> + </EuiFlexGroup> + </EuiPanel> + </EuiCallOut> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_collapsible_panel/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_collapsible_panel/index.tsx new file mode 100644 index 0000000000000..8cdf518f84abe --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_collapsible_panel/index.tsx @@ -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 { EuiAccordion, EuiPanel, EuiSpacer, useGeneratedHtmlId } from '@elastic/eui'; +import React from 'react'; +import { RootCauseAnalysisPanel } from '../rca_panel'; + +export function RootCauseAnalysisCollapsiblePanel({ + title, + content, + color, + isDisabled, +}: { + title: React.ReactNode; + content: React.ReactNode; + color?: React.ComponentProps<typeof EuiPanel>['color']; + isDisabled?: boolean; +}) { + const htmlId = useGeneratedHtmlId(); + return ( + <RootCauseAnalysisPanel color={color}> + <EuiAccordion id={`panel_${htmlId}`} buttonContent={title} isDisabled={isDisabled}> + <EuiSpacer size="l" /> + {content} + </EuiAccordion> + </RootCauseAnalysisPanel> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_container/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_container/index.stories.tsx new file mode 100644 index 0000000000000..492d6ecc59386 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_container/index.stories.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { noop } from 'lodash'; +import { RootCauseAnalysisContainer } from '.'; +// @ts-ignore +import fullAnalysis from '../mock/complete_root_cause_analysis.json'; + +const stories: Meta<{}> = { + title: 'RCA/Container', + component: RootCauseAnalysisContainer, +}; + +export default stories; + +const handlers = { + onStartAnalysisClick: noop, + onStopAnalysisClick: noop, + onResetAnalysisClick: noop, + onCompleteInBackgroundClick: noop, + onClearAnalysisClick: noop, +}; + +export const Empty: Story<{}> = () => { + return <RootCauseAnalysisContainer completeInBackground loading={false} {...handlers} />; +}; + +export const Loading: Story<{}> = () => { + return <RootCauseAnalysisContainer completeInBackground loading {...handlers} />; +}; + +export const LoadingWithoutCompleteInBackground: Story<{}> = () => { + return <RootCauseAnalysisContainer completeInBackground={false} loading {...handlers} />; +}; + +const error = new Error('Failed to load analysis'); + +export const WithError: Story<{}> = () => { + return ( + <RootCauseAnalysisContainer completeInBackground loading={false} {...handlers} error={error} /> + ); +}; + +export const Completed: Story<{}> = () => { + return ( + <RootCauseAnalysisContainer + completeInBackground + loading={false} + events={fullAnalysis as any[]} + {...handlers} + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_container/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_container/index.tsx new file mode 100644 index 0000000000000..1651f039bdbf5 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_container/index.tsx @@ -0,0 +1,338 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + RCA_END_PROCESS_TOOL_NAME, + RCA_INVESTIGATE_ENTITY_TOOL_NAME, + RCA_OBSERVE_TOOL_NAME, +} from '@kbn/observability-ai-common/root_cause_analysis'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiText, useEuiTheme } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { AssistantMessage, MessageRole, ToolMessage } from '@kbn/inference-common'; +import type { + RootCauseAnalysisEvent, + RootCauseAnalysisToolMessage, + RootCauseAnalysisToolRequest, + ToolErrorMessage, +} from '@kbn/observability-ai-server/root_cause_analysis'; +import { findLast } from 'lodash'; +import React from 'react'; +import { css } from '@emotion/css'; +import { EntityBadge } from '../entity_badge'; +import { RootCauseAnalysisCallout } from '../rca_callout'; +import { RootCauseAnalysisEntityInvestigation } from '../rca_entity_investigation'; +import { RootCauseAnalysisObservationPanel } from '../rca_observation_panel'; +import { RootCauseAnalysisReport } from '../rca_report'; +import { RootCauseAnalysisStepItem } from '../rca_step'; +import { RootCauseAnalysisStopButton } from '../rca_stop_button'; + +export function RootCauseAnalysisContainer({ + events, + completeInBackground, + onStartAnalysisClick, + onStopAnalysisClick, + onResetAnalysisClick, + onClearAnalysisClick, + onCompleteInBackgroundClick, + loading, + error, +}: { + events?: RootCauseAnalysisEvent[]; + completeInBackground: boolean; + onStartAnalysisClick: () => void; + onStopAnalysisClick: () => void; + onResetAnalysisClick: () => void; + onClearAnalysisClick: () => void; + onCompleteInBackgroundClick: () => void; + loading: boolean; + error?: Error; +}) { + const theme = useEuiTheme(); + + if (!events?.length && !loading && !error) { + return ( + <RootCauseAnalysisCallout + onClick={onStartAnalysisClick} + completeInBackground={completeInBackground} + onCompleteInBackgroundClick={onCompleteInBackgroundClick} + /> + ); + } + + const elements: React.ReactElement[] = []; + + const toolResponsesById = new Map( + events + ?.filter( + (event): event is Extract<RootCauseAnalysisEvent, ToolMessage> => + event.role === MessageRole.Tool + ) + .map((event) => [event.toolCallId, event]) + ); + + events?.forEach((event) => { + if (event.role === MessageRole.Assistant) { + event.toolCalls.forEach((toolCall) => { + switch (toolCall.function.name) { + case RCA_OBSERVE_TOOL_NAME: + elements.push( + getObservationItem( + toolCall.function.arguments.title, + toolResponsesById.get(toolCall.toolCallId) + ) + ); + break; + + case RCA_INVESTIGATE_ENTITY_TOOL_NAME: + case RCA_END_PROCESS_TOOL_NAME: + const response = toolResponsesById.get(toolCall.toolCallId); + const element = response ? getToolResponseItem(response) : undefined; + if (element) { + elements.push(element); + } + break; + } + }); + } + }); + + const clearButton = ( + <EuiButton + data-test-subj="observabilityAiAssistantAppRootCauseAnalysisClearButton" + color={error ? 'danger' : 'primary'} + onClick={() => { + onClearAnalysisClick(); + }} + iconType="crossInCircle" + > + {i18n.translate('xpack.observabilityAiAssistant.rca.clearButtonLabel', { + defaultMessage: 'Clear', + })} + </EuiButton> + ); + + const restartButton = ( + <EuiButton + data-test-subj="observabilityAiAssistantAppRootCauseAnalysisRestartButton" + color={error ? 'danger' : 'primary'} + fill={!!error} + onClick={() => { + onResetAnalysisClick(); + }} + iconType="refresh" + > + {i18n.translate('xpack.observabilityAiAssistant.rca.restartButtonLabel', { + defaultMessage: 'Restart', + })} + </EuiButton> + ); + + if (loading) { + const label = getLoadingLabel(events); + elements.push( + <RootCauseAnalysisStepItem + label={label} + button={ + completeInBackground ? undefined : ( + <RootCauseAnalysisStopButton + onClick={() => { + onStopAnalysisClick(); + }} + /> + ) + } + loading + /> + ); + } else if (error) { + elements.push( + <RootCauseAnalysisStepItem + label={i18n.translate('xpack.observabilityAiAssistant.rca.analysisError', { + defaultMessage: 'Failed to complete analysis: {errorMessage}', + values: { + errorMessage: error.message, + }, + })} + iconType="alert" + color="danger" + button={ + <EuiFlexGroup direction="row" gutterSize="s"> + {clearButton} + {restartButton} + </EuiFlexGroup> + } + /> + ); + } else { + // completed + elements.push( + <RootCauseAnalysisStepItem + label={ + <EuiText + size="m" + className={css` + font-weight: ${theme.euiTheme.font.weight.bold}; + `} + > + {i18n.translate('xpack.observabilityAiAssistant.rca.analysisCompleted', { + defaultMessage: 'Completed analysis', + })} + </EuiText> + } + iconType="checkInCircleFilled" + color="primary" + button={ + <EuiFlexGroup direction="row" gutterSize="s"> + {clearButton} + {restartButton} + </EuiFlexGroup> + } + /> + ); + } + + return ( + <EuiFlexGroup direction="column" gutterSize="m"> + {elements.map((element, index) => { + return React.cloneElement(element, { key: index }); + })} + </EuiFlexGroup> + ); +} + +function getLoadingLabel(events?: RootCauseAnalysisEvent[]) { + const lastAssistantMessage = findLast( + events, + (event): event is Extract<RootCauseAnalysisEvent, AssistantMessage> => + event.role === MessageRole.Assistant + ); + + if (lastAssistantMessage) { + const toolResponsesByToolCallId = new Map( + events + ?.filter( + (event): event is Extract<RootCauseAnalysisEvent, ToolMessage> => + event.role === MessageRole.Tool + ) + .map((event) => [event.toolCallId, event]) + ); + const pendingToolCalls = lastAssistantMessage.toolCalls.filter((event) => { + const response = toolResponsesByToolCallId.get(event.toolCallId); + + return !response; + }); + + const allInvestigateEntityToolCalls = pendingToolCalls.filter( + (event): event is RootCauseAnalysisToolRequest<typeof RCA_INVESTIGATE_ENTITY_TOOL_NAME> => + event.function.name === RCA_INVESTIGATE_ENTITY_TOOL_NAME + ); + + if (allInvestigateEntityToolCalls.length) { + return ( + <EuiFlexGroup direction="row" gutterSize="m" alignItems="center"> + <EuiText size="s"> + {i18n.translate('xpack.observabilityAiAssistant.rca.investigatingEntitiesTextLabel', { + defaultMessage: 'Investigating entities', + })} + </EuiText> + <EuiFlexItem grow={false}> + <EuiFlexGroup direction="row" gutterSize="s" alignItems="center"> + {allInvestigateEntityToolCalls.map((toolCall) => { + return ( + <EuiFlexItem key={toolCall.toolCallId}> + <EntityBadge + entity={{ + [toolCall.function.arguments.entity.field]: + toolCall.function.arguments.entity.value, + }} + /> + </EuiFlexItem> + ); + })} + </EuiFlexGroup> + </EuiFlexItem> + </EuiFlexGroup> + ); + } + + if (pendingToolCalls[0]?.function.name === RCA_END_PROCESS_TOOL_NAME) { + return i18n.translate('xpack.observabilityAiAssistant.rca.finalizingReport', { + defaultMessage: 'Finalizing report', + }); + } + } + + return i18n.translate('xpack.observabilityAiAssistant.rca.analysisLoadingLabel', { + defaultMessage: 'Thinking...', + }); +} + +function getToolResponseErrorItem(response: ToolErrorMessage['response']) { + return ( + <RootCauseAnalysisStepItem + label={i18n.translate('xpack.observabilityAiAssistant.rca.toolResponseError', { + defaultMessage: 'Failed to execute task: {errorMessage}', + values: { + errorMessage: response.error.message, + }, + })} + iconType="alert" + color="danger" + /> + ); +} + +function getToolResponseItem( + message: RootCauseAnalysisToolMessage | ToolErrorMessage +): React.ReactElement | null { + if (message.name === 'observe') { + return null; + } + + if (message.name === 'error') { + return getToolResponseErrorItem(message.response); + } + + if (message.name === 'investigateEntity') { + return ( + <RootCauseAnalysisEntityInvestigation + summary={message.response.summary} + entity={message.response.entity} + ownPatterns={message.data.attachments.ownPatterns} + patternsFromOtherEntities={message.data.attachments.patternsFromOtherEntities} + /> + ); + } + + return ( + <RootCauseAnalysisReport + report={message.response.report} + timeline={message.response.timeline} + /> + ); +} + +function getObservationItem( + title: React.ReactNode, + toolResponse?: RootCauseAnalysisToolMessage | ToolErrorMessage +) { + let content: string | undefined; + switch (toolResponse?.name) { + case 'observe': + content = toolResponse.response.content; + break; + + case 'error': + content = i18n.translate('xpack.observabilityAiAssistant.rca.failedObservation', { + defaultMessage: 'Failed to generate observations', + }); + break; + } + + return ( + <RootCauseAnalysisObservationPanel title={title} content={content} loading={!toolResponse} /> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_investigation/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_investigation/index.stories.tsx new file mode 100644 index 0000000000000..0601a0cdf1f6f --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_investigation/index.stories.tsx @@ -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 { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { RootCauseAnalysisEntityInvestigation } from '.'; +import { controllerEntityHealthAnalysis } from '../mock'; + +const stories: Meta<{}> = { + title: 'RCA/EntityInvestigation', + component: RootCauseAnalysisEntityInvestigation, +}; + +export default stories; + +export const Default: Story<{}> = () => { + return ( + <RootCauseAnalysisEntityInvestigation + entity={controllerEntityHealthAnalysis.response.entity} + summary={controllerEntityHealthAnalysis.response.summary} + ownPatterns={controllerEntityHealthAnalysis.data.attachments.ownPatterns} + patternsFromOtherEntities={ + controllerEntityHealthAnalysis.data.attachments.patternsFromOtherEntities + } + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_investigation/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_investigation/index.tsx new file mode 100644 index 0000000000000..b74f5969fa08f --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_investigation/index.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { EuiFlexGroup, EuiFlexItem, EuiMarkdownFormat, EuiPanel, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import type { EntityInvestigation } from '@kbn/observability-ai-server/root_cause_analysis/tasks/investigate_entity/types'; +import React from 'react'; +import { EntityBadge } from '../entity_badge'; +import { RootCauseAnalysisCollapsiblePanel } from '../rca_collapsible_panel'; +import { RootCauseAnalysisEntityLogPatternTable } from '../rca_entity_log_pattern_table'; + +export function RootCauseAnalysisEntityInvestigation({ + summary, + entity, + ownPatterns, + patternsFromOtherEntities, +}: { + summary: string; + entity: Record<string, string>; +} & Pick<EntityInvestigation['attachments'], 'ownPatterns' | 'patternsFromOtherEntities'>) { + return ( + <RootCauseAnalysisCollapsiblePanel + title={ + <EuiFlexGroup direction="row" gutterSize="s"> + <EuiTitle size="xs"> + <h2> + {i18n.translate( + 'xpack.observabilityAiAssistant.rootCauseAnalysisEntityInvestigation.title', + { + defaultMessage: 'Investigation', + } + )} + </h2> + </EuiTitle> + <EuiFlexItem grow={false}> + <EntityBadge entity={entity} /> + </EuiFlexItem> + </EuiFlexGroup> + } + content={ + <EuiFlexGroup direction="column" gutterSize="l"> + <EuiPanel color="subdued" paddingSize="l"> + <EuiMarkdownFormat textSize="s">{summary}</EuiMarkdownFormat> + </EuiPanel> + <RootCauseAnalysisEntityLogPatternTable + entity={entity} + ownPatterns={ownPatterns} + patternsFromOtherEntities={patternsFromOtherEntities} + /> + </EuiFlexGroup> + } + /> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_log_pattern_table/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_log_pattern_table/index.stories.tsx new file mode 100644 index 0000000000000..16596832eff89 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_log_pattern_table/index.stories.tsx @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { RootCauseAnalysisEntityLogPatternTable } from '.'; +import { controllerEntityHealthAnalysis } from '../mock'; + +const stories: Meta<{}> = { + title: 'RCA/EntityLogPatternTable', + component: RootCauseAnalysisEntityLogPatternTable, +}; + +export default stories; + +export const Default: Story<{}> = () => { + return ( + <RootCauseAnalysisEntityLogPatternTable + entity={controllerEntityHealthAnalysis.response.entity} + ownPatterns={controllerEntityHealthAnalysis.data.attachments.ownPatterns} + patternsFromOtherEntities={ + controllerEntityHealthAnalysis.data.attachments.patternsFromOtherEntities + } + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_log_pattern_table/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_log_pattern_table/index.tsx new file mode 100644 index 0000000000000..10d78eef6d475 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_entity_log_pattern_table/index.tsx @@ -0,0 +1,299 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + EuiBadge, + EuiBasicTable, + EuiBasicTableColumn, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiText, + EuiThemeComputed, +} from '@elastic/eui'; +import { css } from '@emotion/css'; +import { i18n } from '@kbn/i18n'; +import { formatInteger } from '@kbn/observability-utils-common/format/integer'; +import { highlightPatternFromRegex } from '@kbn/observability-utils-common/llm/log_analysis/highlight_patterns_from_regex'; +import type { EntityInvestigation } from '@kbn/observability-ai-server/root_cause_analysis/tasks/investigate_entity/types'; +import React, { useMemo, useState } from 'react'; +import { orderBy } from 'lodash'; +import type { AnalyzedLogPattern } from '@kbn/observability-ai-server/root_cause_analysis/tasks/analyze_log_patterns'; +import { useTheme } from '../../../hooks/use_theme'; +import { SparkPlot } from '../../charts/spark_plot'; + +const badgeClassName = css` + width: 100%; + .euiBadge__content { + justify-content: center; + } +`; + +const PER_PAGE = 5; + +export function RootCauseAnalysisEntityLogPatternTable({ + entity, + ownPatterns, + patternsFromOtherEntities, +}: Pick<EntityInvestigation['attachments'], 'ownPatterns' | 'patternsFromOtherEntities'> & { + entity: Record<string, string>; +}) { + const theme = useTheme(); + + const [showUsualPatterns, setShowUsualPatterns] = useState(false); + + const [pageIndex, setPageIndex] = useState(0); + + const columns = useMemo((): Array<EuiBasicTableColumn<AnalyzedLogPattern>> => { + return [ + { + field: 'relevance', + name: '', + width: '128px', + render: (_, { relevance, metadata }) => { + const color = getRelevanceColor(relevance); + + return ( + <EuiBadge className={badgeClassName} color={color}> + {relevance} + </EuiBadge> + ); + }, + }, + { + field: 'pattern', + name: i18n.translate( + 'xpack.observabilityAiAssistant.rca.logPatternTable.messageColumnTitle', + { defaultMessage: 'Message' } + ), + render: (_, { regex, sample }) => { + return ( + <EuiText + size="xs" + className={css` + font-family: ${theme.font.familyCode}; + color: ${theme.colors.subduedText}; + em { + font-style: normal; + font-weight: ${theme.font.weight.semiBold}; + color: ${theme.colors.primaryText}; + } + `} + dangerouslySetInnerHTML={{ __html: highlightPatternFromRegex(regex, sample) }} + /> + ); + }, + }, + { + field: 'count', + name: i18n.translate( + 'xpack.observabilityAiAssistant.rca.logPatternTable.countColumnTitle', + { defaultMessage: 'Count' } + ), + width: '96px', + render: (_, { count }) => { + return ( + <EuiText + size="xs" + className={css` + white-space: nowrap; + `} + > + {formatInteger(count)} + </EuiText> + ); + }, + }, + { + field: 'change', + name: i18n.translate( + 'xpack.observabilityAiAssistant.rca.logPatternTable.changeColumnTitle', + { defaultMessage: 'Change' } + ), + width: '128px', + render: (_, { change }) => { + return getChangeBadge(change); + }, + }, + { + field: 'timeseries', + width: '128px', + name: i18n.translate( + 'xpack.observabilityAiAssistant.rca.logPatternTable.trendColumnTitle', + { defaultMessage: 'Trend' } + ), + render: (_, { timeseries, change }) => { + return ( + <SparkPlot + timeseries={timeseries} + annotations={getAnnotationsFromChangePoint({ + timeseries, + change, + theme, + })} + type="bar" + /> + ); + }, + }, + ]; + }, [theme]); + + const allPatterns = useMemo(() => { + return [...ownPatterns, ...patternsFromOtherEntities]; + }, [ownPatterns, patternsFromOtherEntities]); + + const items = useMemo(() => { + return allPatterns.filter((pattern) => { + if (!showUsualPatterns) { + return pattern.relevance !== 'normal'; + } + return pattern; + }); + }, [allPatterns, showUsualPatterns]); + + const visibleItems = useMemo(() => { + const start = pageIndex * PER_PAGE; + return orderBy(items, (item) => relevanceToInt(item.relevance), 'desc').slice( + start, + start + PER_PAGE + ); + }, [pageIndex, items]); + + const paginationOptions = useMemo(() => { + return { + pageIndex, + totalItemCount: items.length, + pageSize: PER_PAGE, + }; + }, [pageIndex, items.length]); + + return ( + <EuiFlexGroup direction="column"> + <EuiFlexGroup direction="row" alignItems="center"> + <EuiFlexItem grow> + <EuiText size="s"> + {i18n.translate( + 'xpack.observabilityAiAssistant.rootCauseAnalysisEntityInvestigation.logPatternsTableTitle', + { + defaultMessage: 'Showing {count} of {total} log patterns', + values: { + total: items.length, + count: visibleItems.length, + }, + } + )} + </EuiText> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiCheckbox + id={`show_usual_patterns_${JSON.stringify(entity)}`} + checked={showUsualPatterns} + onChange={() => { + setShowUsualPatterns((prev) => !prev); + }} + /> + <EuiText size="xs"> + {i18n.translate( + 'xpack.observabilityAiAssistant.rca.logPatternTable.showUsualPatternsCheckbox', + { + defaultMessage: 'Show unremarkable patterns', + } + )} + </EuiText> + </EuiFlexGroup> + </EuiFlexItem> + </EuiFlexGroup> + <EuiBasicTable + tableLayout="auto" + columns={columns} + items={visibleItems} + pagination={paginationOptions} + onChange={(criteria) => { + setPageIndex(criteria.page.index); + }} + /> + </EuiFlexGroup> + ); +} + +function getRelevanceColor(relevance: 'normal' | 'unusual' | 'warning' | 'critical') { + switch (relevance) { + case 'normal': + return 'plain'; + + case 'critical': + return 'danger'; + + case 'warning': + return 'warning'; + + case 'unusual': + return 'primary'; + } +} + +function getSignificanceColor(significance: 'high' | 'medium' | 'low' | null) { + switch (significance) { + case 'high': + return 'danger'; + + case 'medium': + return 'warning'; + + case 'low': + case null: + return 'plain'; + } +} + +function relevanceToInt(relevance: 'normal' | 'unusual' | 'warning' | 'critical') { + switch (relevance) { + case 'normal': + return 0; + case 'unusual': + return 1; + case 'warning': + return 2; + case 'critical': + return 3; + } +} + +function getAnnotationsFromChangePoint({ + change, + theme, + timeseries, +}: { + change: AnalyzedLogPattern['change']; + theme: EuiThemeComputed<{}>; + timeseries: Array<{ x: number; y: number }>; +}): Required<React.ComponentProps<typeof SparkPlot>['annotations']> { + if (!change.change_point || !change.type) { + return []; + } + + const color = getSignificanceColor(change.significance); + + return [ + { + color: color === 'plain' ? theme.colors.subduedText : theme.colors[color], + id: '1', + icon: '*', + label: <EuiBadge color="hollow">{change.type}</EuiBadge>, + x: timeseries[change.change_point].x, + }, + ]; +} + +export function getChangeBadge(change: AnalyzedLogPattern['change']) { + return ( + <EuiBadge className={badgeClassName} color={getSignificanceColor(change.significance)}> + {change.significance ?? 'No change'} + </EuiBadge> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_observation_panel/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_observation_panel/index.stories.tsx new file mode 100644 index 0000000000000..5ec46729e7c74 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_observation_panel/index.stories.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { RootCauseAnalysisObservationPanel } from '.'; + +const stories: Meta<{}> = { + title: 'RCA/ObservationPanel', + component: RootCauseAnalysisObservationPanel, +}; + +const content = + 'The high rate of HTTP 500 errors in the controller service for the /api/cart endpoint is likely due to issues with the upstream service default-my-otel-demo-frontendproxy-8080, as indicated by logs showing upstream prematurely closed connections. The next step is to investigate the health and performance of the upstream service default-my-otel-demo-frontendproxy-8080.'; + +export default stories; + +export const Default: Story<{}> = () => { + return ( + <RootCauseAnalysisObservationPanel title={'High rate of HTTP 500 errors'} content={content} /> + ); +}; + +export const Loading: Story<{}> = () => { + return ( + <RootCauseAnalysisObservationPanel + title={'High rate of HTTP 500 errors'} + content={content} + loading + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_observation_panel/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_observation_panel/index.tsx new file mode 100644 index 0000000000000..ee00f568ca688 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_observation_panel/index.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiMarkdownFormat, + EuiText, + EuiTitle, + useEuiTheme, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { css } from '@emotion/css'; +import { RootCauseAnalysisCollapsiblePanel } from '../rca_collapsible_panel'; + +export function RootCauseAnalysisObservationPanel({ + content, + title, + loading, +}: { + content?: string; + title: React.ReactNode; + loading?: boolean; +}) { + const theme = useEuiTheme().euiTheme; + return ( + <RootCauseAnalysisCollapsiblePanel + isDisabled={loading} + title={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="m"> + <EuiTitle + size="xs" + className={css` + color: ${loading ? theme.colors.subduedText : theme.colors.text}; + white-space: nowrap; + `} + > + <h2> + {i18n.translate('xpack.observabilityAiAssistant.rca.observationPanelTitle', { + defaultMessage: 'Observations', + })} + </h2> + </EuiTitle> + <EuiFlexItem grow={false}> + <EuiFlexGroup direction="row" alignItems="center" gutterSize="m"> + <EuiText size="s" color={loading ? theme.colors.subduedText : theme.colors.text}> + {title} + </EuiText> + {loading ? <EuiLoadingSpinner size="s" /> : null} + </EuiFlexGroup> + </EuiFlexItem> + </EuiFlexGroup> + } + color="success" + content={content ? <EuiMarkdownFormat textSize="s">{content}</EuiMarkdownFormat> : null} + /> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_panel/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_panel/index.tsx new file mode 100644 index 0000000000000..2ad1225a10f71 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_panel/index.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiPanel } from '@elastic/eui'; +import { css } from '@emotion/css'; +import { rgba } from 'polished'; +import React from 'react'; +import { useTheme } from '../../../hooks/use_theme'; + +export function RootCauseAnalysisPanel({ + children, + color, +}: { + children: React.ReactElement; + color?: React.ComponentProps<typeof EuiPanel>['color']; +}) { + const theme = useTheme(); + + const panelClassName = + color && color !== 'transparent' && color !== 'plain' && color !== 'subdued' + ? css` + border: 1px solid; + border-color: ${rgba(theme.colors[color], 0.25)}; + ` + : undefined; + + return ( + <EuiPanel hasBorder paddingSize="l" color={color} className={panelClassName}> + {children} + </EuiPanel> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_report/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_report/index.stories.tsx new file mode 100644 index 0000000000000..cb32631fc7a73 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_report/index.stories.tsx @@ -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 { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { RootCauseAnalysisReport } from '.'; + +const report = + '## 1. Understanding the Context and Hypothesis\n\n### Context:\n- **Issue:** High rate of HTTP 500 errors for the `/api/cart` endpoint in the `controller` service.\n- **Objective:** Investigate internal issues or anomalies that could explain the alert.\n\n### Hypothesis:\n- The high rate of HTTP 500 errors could be due to internal issues within the `controller` service, such as resource exhaustion, misconfigurations, or upstream service failures.\n\n## 2. Entity Overview\n\n### Entity: `controller`\n- **Environment:** Kubernetes pod, running in `opentelemetry-demo`\n- **Language:** Not specified\n- **Communication:** HTTP\n- **Cloud Provider:** Not specified, but running on `minikube`\n\n## 3. Identifying Related Entities\n\n### Upstream Dependencies:\n- **Upstream Service:** `default-my-otel-demo-frontendproxy-8080`\n - **Evidence:** Log entries show frequent API calls to `default-my-otel-demo-frontendproxy-8080` for various endpoints, including `/api/cart`.\n\n### Downstream Dependencies:\n- **Downstream Service:** Not explicitly mentioned, but the `controller` service is likely serving multiple endpoints, including `/api/cart`.\n\n### Infrastructure:\n- **Pod:** `ingress-nginx-controller-bc57996ff-qrd25`\n - **Evidence:** Logs and metadata indicate the `controller` service is running in this pod.\n\n## 4. Health Status Assessment\n\n### Active Alerts:\n- **Alert:** Custom threshold alert for HTTP 500 errors on `/api/cart` endpoint.\n - **Reason:** Custom equation is 100, above the threshold of 5.\n - **Duration:** 1 min\n - **Data View:** logs-*\n - **Group:** `controller`, `/api/cart`\n - **Evaluation Values:** [100]\n - **Threshold:** [5]\n - **Status:** Active\n - **Start Time:** 2024-10-21T08:51:51.846Z\n\n### SLO Performance:\n- **No SLOs** specified for this entity.\n\n### Log Patterns and Anomalies:\n- **Normal Logs:**\n - Logs show normal GET and POST requests with HTTP 200 responses.\n- **Critical Logs:**\n - Logs indicate upstream prematurely closed connection while reading upstream, leading to HTTP 500 errors.\n - Example: `2024/10/21 08:37:11 [error] 36#36: *3518505 upstream prematurely closed connection while reading upstream, client: 10.244.0.117, server: otel-demo.internal, request: "POST /flagservice/flagd.evaluation.v1.Service/EventStream HTTP/1.1", upstream: "http://10.244.0.119:8080/flagservice/flagd.evaluation.v1.Service/EventStream", host: "ingress-nginx-controller.ingress-nginx.svc.cluster.local", referrer: "http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/cart"`\n\n## 5. Relevance of Entity to the Investigation\n\n### Relevance:\n- The `controller` service is directly related to the investigation due to the elevated HTTP 500 error rate on the `/api/cart` endpoint.\n- The critical log entries suggest that the issue might be related to upstream service failures, specifically the `default-my-otel-demo-frontendproxy-8080` service.\n\n### Signs Aligning with Hypothesis:\n- **Resource Exhaustion:** Not explicitly indicated in the logs, but the high rate of HTTP 500 errors could be a symptom.\n- **Upstream Service Failures:** Logs indicate upstream prematurely closed connections, which aligns with the hypothesis of upstream service issues.\n\n## 6. Timeline of Significant Events\n\n### Timeline:\n1. **2024-10-21T08:37:11.050Z:** Critical log entry indicating upstream prematurely closed connection while reading upstream.\n2. **2024-10-21T08:51:51.846Z:** Alert for high rate of HTTP 500 errors on `/api/cart` endpoint becomes active.\n3. **2024-10-21T09:34:52.720Z:** Alert status remains active with a custom equation value of 100, above the threshold of 5.\n\n## 7. Next Steps or Root Cause Identification\n\n### Next Steps:\n1. **Investigate Upstream Service (`default-my-otel-demo-frontendproxy-8080`):**\n - Check the health and performance of the upstream service.\n - Look for any signs of resource exhaustion, connection issues, or misconfigurations.\n2. **Review Recent Changes:**\n - Check for any recent deployments or configuration changes in the `controller` service and its upstream dependencies.\n3. **Analyze Resource Usage:**\n - Monitor CPU, memory, and network usage for the `controller` service to identify any resource-related issues.\n\n### Potential Root Cause:\n- **Upstream Service Failures:** The critical log entries indicating upstream prematurely closed connections suggest that the root cause might be related to issues in the upstream service (`default-my-otel-demo-frontendproxy-8080`), leading to HTTP 500 errors in the `controller` service.\n\nBy following these steps, we can further narrow down the root cause and take appropriate actions to resolve the issue.'; + +const stories: Meta<{}> = { + title: 'RCA/Report', + component: RootCauseAnalysisReport, +}; + +export default stories; + +export const Default: Story<{}> = () => { + return ( + <RootCauseAnalysisReport + report={report} + timeline={{ + events: [], + }} + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_report/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_report/index.tsx new file mode 100644 index 0000000000000..cd793786eb6cb --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_report/index.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiFlexGroup, + EuiHorizontalRule, + EuiMarkdownFormat, + EuiPanel, + EuiTitle, +} from '@elastic/eui'; +import type { SignificantEventsTimeline } from '@kbn/observability-ai-server/root_cause_analysis'; + +export function RootCauseAnalysisReport({ + report, + timeline, +}: { + report: string; + timeline: SignificantEventsTimeline; +}) { + return ( + <EuiPanel hasBorder paddingSize="l"> + <EuiFlexGroup direction="column"> + <EuiFlexGroup direction="row" gutterSize="s"> + <EuiTitle size="s"> + <h2> + {i18n.translate('xpack.observabilityAiAssistant.rootCauseAnalysisReport.title', { + defaultMessage: 'Report', + })} + </h2> + </EuiTitle> + </EuiFlexGroup> + </EuiFlexGroup> + <EuiHorizontalRule margin="xl" /> + <EuiMarkdownFormat textSize="s">{report}</EuiMarkdownFormat> + </EuiPanel> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_step/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_step/index.stories.tsx new file mode 100644 index 0000000000000..fa5b184800216 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_step/index.stories.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { EuiBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { RootCauseAnalysisStepItem } from '.'; + +const stories: Meta<{}> = { + title: 'RCA/StepItem', + component: RootCauseAnalysisStepItem, +}; + +export default stories; + +export const Default: Story<{}> = () => { + return ( + <RootCauseAnalysisStepItem + label={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>Investigating</EuiFlexItem> + <EuiBadge color="hollow">service.name:controller</EuiBadge> + </EuiFlexGroup> + } + /> + ); +}; + +export const Loading: Story<{}> = () => { + return ( + <RootCauseAnalysisStepItem + loading + label={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>Investigating</EuiFlexItem> + <EuiBadge color="hollow">service.name:controller</EuiBadge> + </EuiFlexGroup> + } + /> + ); +}; + +export const WithColor: Story<{}> = () => { + return ( + <RootCauseAnalysisStepItem + loading + color="primary" + label={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>Investigating</EuiFlexItem> + <EuiBadge color="hollow">service.name:controller</EuiBadge> + </EuiFlexGroup> + } + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_step/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_step/index.tsx new file mode 100644 index 0000000000000..d887c75c1b4a5 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_step/index.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLoadingSpinner, + EuiPanel, + EuiText, +} from '@elastic/eui'; +import { css } from '@emotion/css'; +import React from 'react'; +import { RootCauseAnalysisPanel } from '../rca_panel'; + +export interface RootCauseAnalysisStepItemProps { + label: React.ReactNode; + loading?: boolean; + color?: React.ComponentProps<typeof EuiPanel>['color']; + button?: React.ReactElement; + iconType?: React.ComponentProps<typeof EuiIcon>['type']; +} + +export function RootCauseAnalysisStepItem({ + label, + loading, + color, + iconType, + button, +}: RootCauseAnalysisStepItemProps) { + return ( + <RootCauseAnalysisPanel color={color}> + <EuiFlexGroup + direction="row" + alignItems="flexStart" + justifyContent="flexStart" + gutterSize="m" + > + <EuiFlexItem grow={false}> + <EuiFlexGroup + className={css` + min-height: 40px; + `} + justifyContent="center" + alignItems="center" + > + {loading ? ( + <EuiLoadingSpinner size="m" /> + ) : ( + <EuiIcon type={iconType || 'logoElastic'} /> + )} + </EuiFlexGroup> + </EuiFlexItem> + <EuiFlexItem> + <EuiFlexGroup + direction="row" + alignItems="center" + className={css` + min-height: 40px; + `} + > + <EuiText size="s">{label}</EuiText> + </EuiFlexGroup> + </EuiFlexItem> + {button ? <EuiFlexItem grow={false}>{button}</EuiFlexItem> : null} + </EuiFlexGroup> + </RootCauseAnalysisPanel> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_stop_button/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_stop_button/index.tsx new file mode 100644 index 0000000000000..7ef0b175b636d --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_stop_button/index.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 { i18n } from '@kbn/i18n'; +import { EuiButton } from '@elastic/eui'; + +export function RootCauseAnalysisStopButton({ onClick }: { onClick: () => void }) { + return ( + <EuiButton + data-test-subj="observabilityAiAssistantAppRootCauseAnalysisStopButton" + onClick={() => { + onClick(); + }} + iconType="stopFilled" + color="text" + > + {i18n.translate('xpack.observabilityAiAssistant.rca.stopAnalysisButtonLabel', { + defaultMessage: 'Stop', + })} + </EuiButton> + ); +} diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_task_step/index.stories.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_task_step/index.stories.tsx new file mode 100644 index 0000000000000..4bc31dcf7cc4f --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_task_step/index.stories.tsx @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { EuiBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { RootCauseAnalysisTaskStepItem } from '.'; +import { EntityBadge } from '../entity_badge'; + +const stories: Meta<{}> = { + title: 'RCA/TaskStepItem', + component: RootCauseAnalysisTaskStepItem, +}; + +export default stories; + +export const Pending: Story<{}> = () => { + return ( + <RootCauseAnalysisTaskStepItem + status="pending" + label={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>Investigating</EuiFlexItem> + <EuiFlexItem grow={false}> + <EntityBadge entity={{ 'service.name': 'controller' }} /> + </EuiFlexItem> + </EuiFlexGroup> + } + /> + ); +}; + +export const Completed: Story<{}> = () => { + return ( + <RootCauseAnalysisTaskStepItem + status="completed" + label={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>Completed investigation</EuiFlexItem> + <EuiFlexItem grow={false}> + <EntityBadge entity={{ 'service.name': 'controller' }} /> + </EuiFlexItem> + </EuiFlexGroup> + } + /> + ); +}; + +export const Failure: Story<{}> = () => { + return ( + <RootCauseAnalysisTaskStepItem + status="failure" + label={ + <EuiFlexGroup direction="row" alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}>Failed investigating</EuiFlexItem> + <EuiBadge color="hollow">service.name:controller</EuiBadge> + </EuiFlexGroup> + } + /> + ); +}; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_task_step/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_task_step/index.tsx new file mode 100644 index 0000000000000..b29d8a834745d --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/rca/rca_task_step/index.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { RootCauseAnalysisStepItem } from '../rca_step'; + +export function RootCauseAnalysisTaskStepItem({ + label, + status, +}: { + label: React.ReactNode; + status: 'pending' | 'completed' | 'failure'; +}) { + let color: React.ComponentProps<typeof RootCauseAnalysisStepItem>['color']; + let iconType: React.ComponentProps<typeof RootCauseAnalysisStepItem>['iconType']; + + let loading: boolean | undefined; + + if (status === 'failure') { + color = 'danger'; + iconType = 'alert'; + } else if (status === 'completed') { + color = 'success'; + iconType = 'checkInCircleFilled'; + } else { + color = 'primary'; + loading = true; + } + + return ( + <RootCauseAnalysisStepItem loading={loading} label={label} color={color} iconType={iconType} /> + ); +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/technical_preview_badge.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/technical_preview_badge.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/technical_preview_badge.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/components/technical_preview_badge.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/changes/index.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/changes/index.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/changes/index.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/changes/index.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/lens.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/lens.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/lens.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/lens.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/visualize_esql.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/functions/visualize_esql.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_kibana.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_kibana.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_kibana.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_kibana.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_license.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_license.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_license.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_license.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_app_service.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_app_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_app_service.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_app_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_chat_service.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_chat_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_chat_service.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_chat_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_router.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_router.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_router.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/__storybook_mocks__/use_observability_ai_assistant_router.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/is_nav_control_visible.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/is_nav_control_visible.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/is_nav_control_visible.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/is_nav_control_visible.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_chart_theme.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_chart_theme.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_chart_theme.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_chart_theme.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_force_update.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_force_update.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_force_update.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_force_update.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_kibana.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_kibana.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_kibana.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_kibana.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_license.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_license.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_license.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_license.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_local_storage.test.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_local_storage.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_local_storage.test.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_local_storage.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_local_storage.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_local_storage.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_local_storage.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_local_storage.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_nav_control_scope.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_nav_control_scope.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_nav_control_scope.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_nav_control_scope.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_nav_control_screen_context.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_nav_control_screen_context.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_nav_control_screen_context.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_nav_control_screen_context.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_chat_service.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_chat_service.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_chat_service.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_chat_service.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_params.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_params.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_params.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_params.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_router.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_router.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_router.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_observability_ai_assistant_router.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_theme.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_theme.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_theme.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/hooks/use_theme.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/index.ts similarity index 91% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/index.ts index 5de1c30de7c4c..9fd8b9158f4c8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/index.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/index.ts @@ -14,6 +14,8 @@ import type { ObservabilityAIAssistantAppPublicStart, } from './types'; +export type { ObservabilityAIAssistantAppPublicSetup, ObservabilityAIAssistantAppPublicStart }; + export const plugin: PluginInitializer< ObservabilityAIAssistantAppPublicSetup, ObservabilityAIAssistantAppPublicStart, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/plugin.tsx similarity index 83% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/plugin.tsx index cd1285b0017ce..218b663525dbd 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/plugin.tsx +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/plugin.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; +import React, { lazy } from 'react'; import ReactDOM from 'react-dom'; import { type AppMountParameters, @@ -18,6 +18,7 @@ import type { Logger } from '@kbn/logging'; import { i18n } from '@kbn/i18n'; import { AI_ASSISTANT_APP_ID } from '@kbn/deeplinks-observability'; import { createAppService, AIAssistantAppService } from '@kbn/ai-assistant'; +import { withSuspense } from '@kbn/shared-ux-utility'; import type { ObservabilityAIAssistantAppPluginSetupDependencies, ObservabilityAIAssistantAppPluginStartDependencies, @@ -26,6 +27,7 @@ import type { } from './types'; import { getObsAIAssistantConnectorType } from './rule_connector'; import { NavControlInitiator } from './components/nav_control/lazy_nav_control'; +import { SharedProviders } from './utils/shared_providers'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ConfigSchema {} @@ -135,9 +137,33 @@ export class ObservabilityAIAssistantAppPlugin await registerFunctions({ pluginsStart, registerRenderFunction }); }); + const withProviders = <P extends {}, R = {}>(Component: React.ComponentType<P>) => + React.forwardRef((props: P, ref: React.Ref<R>) => ( + <SharedProviders + coreStart={coreStart} + pluginsStart={pluginsStart} + service={service} + theme$={coreStart.theme.theme$} + > + <Component {...props} ref={ref} /> + </SharedProviders> + )); + + const LazilyLoadedRootCauseAnalysisContainer = withSuspense( + withProviders( + lazy(() => + import('./components/rca/rca_container').then((m) => ({ + default: m.RootCauseAnalysisContainer, + })) + ) + ) + ); + pluginsStart.triggersActionsUi.actionTypeRegistry.register( getObsAIAssistantConnectorType(service) ); - return {}; + return { + RootCauseAnalysisContainer: LazilyLoadedRootCauseAnalysisContainer, + }; } } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/routes/config.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/routes/config.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/routes/config.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/routes/config.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/routes/conversations/conversation_view_with_props.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/routes/conversations/conversation_view_with_props.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/routes/conversations/conversation_view_with_props.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/routes/conversations/conversation_view_with_props.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/ai_assistant.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/ai_assistant_params.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/translations.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/translations.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/translations.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/translations.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/types.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/rule_connector/types.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/rule_connector/types.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/types.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/types.ts similarity index 91% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/types.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/types.ts index 398ef5f3afe4c..22bdf2b12236e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/types.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/types.ts @@ -31,9 +31,13 @@ import type { AIAssistantManagementSelectionPluginPublicStart, AIAssistantManagementSelectionPluginPublicSetup, } from '@kbn/ai-assistant-management-plugin/public'; +import type { RootCauseAnalysisContainer } from './components/rca/rca_container'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ObservabilityAIAssistantAppPublicStart {} +export interface ObservabilityAIAssistantAppPublicStart { + RootCauseAnalysisContainer: React.ExoticComponent< + React.ComponentProps<typeof RootCauseAnalysisContainer> + >; +} // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ObservabilityAIAssistantAppPublicSetup {} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/non_nullable.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/utils/non_nullable.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/non_nullable.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/utils/non_nullable.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/safe_json_parse.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/utils/safe_json_parse.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/safe_json_parse.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/utils/safe_json_parse.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/shared_providers.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/utils/shared_providers.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/shared_providers.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/public/utils/shared_providers.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/.eslintrc.json b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/.eslintrc.json similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/.eslintrc.json rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/.eslintrc.json diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/README.md b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/README.md similarity index 93% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/README.md rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/README.md index 0e5bc22fe7c75..f8d10c679e622 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/README.md +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/README.md @@ -14,7 +14,7 @@ This tool is developed for our team working on the Elastic Observability platfor Run the tool using: -`$ node x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/index.js` +`$ node x-pack/solutions/observability/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/index.js` This will evaluate all existing scenarios, and write the evaluation results to the terminal. diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/cli.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/cli.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/cli.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/cli.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/evaluation.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/evaluation.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/get_service_urls.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/get_service_urls.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/get_service_urls.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/get_service_urls.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/index.js b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/index.js similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/index.js rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/index.js diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/read_kibana_config.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/read_kibana_config.ts similarity index 98% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/read_kibana_config.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/read_kibana_config.ts index fca94a8d57d05..e6a44cbb4a549 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/read_kibana_config.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/read_kibana_config.ts @@ -13,7 +13,7 @@ import { identity, pickBy } from 'lodash'; export type KibanaConfig = ReturnType<typeof readKibanaConfig>; export const readKibanaConfig = () => { - const kibanaConfigDir = path.join(__filename, '../../../../../../../config'); + const kibanaConfigDir = path.join(__filename, '../../../../../../../../config'); const kibanaDevConfig = path.join(kibanaConfigDir, 'kibana.dev.yml'); const kibanaConfig = path.join(kibanaConfigDir, 'kibana.yml'); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/elasticsearch/index.spec.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/elasticsearch/index.spec.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/elasticsearch/index.spec.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/elasticsearch/index.spec.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/kb/index.spec.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/kb/index.spec.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/kb/index.spec.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/scenarios/kb/index.spec.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/select_connector.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/select_connector.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/select_connector.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/select_connector.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/services/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/services/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/services/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/services/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/setup_synthtrace.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/setup_synthtrace.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/setup_synthtrace.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/setup_synthtrace.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/types.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/scripts/evaluation/types.ts diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/clients/create_observability_ai_assistant_app_es_client.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/clients/create_observability_ai_assistant_app_es_client.ts new file mode 100644 index 0000000000000..babb6c1273370 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/clients/create_observability_ai_assistant_app_es_client.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createObservabilityEsClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import { ElasticsearchClient, Logger } from '@kbn/core/server'; + +export async function createObservabilityAIAssistantAppEsClient({ + client, + logger, +}: { + client: ElasticsearchClient; + logger: Logger; +}) { + const esClient = createObservabilityEsClient({ + client, + logger, + plugin: 'observabilityAIAssistantApp', + }); + + return esClient; +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/clients/elasticsearch/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/clients/elasticsearch/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/clients/elasticsearch/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/clients/elasticsearch/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/config.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/config.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/config.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/config.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/alerts.ts similarity index 95% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/alerts.ts index 5408dbbf4ab4f..bf797bb170606 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/alerts.ts @@ -196,17 +196,17 @@ export function registerAlertsFunction({ lte: end, }, }, - ...kqlQuery, - ...(!includeRecovered - ? [ - { - term: { - [ALERT_STATUS]: ALERT_STATUS_ACTIVE, - }, - }, - ] - : []), }, + ...kqlQuery, + ...(!includeRecovered + ? [ + { + term: { + [ALERT_STATUS]: ALERT_STATUS_ACTIVE, + }, + }, + ] + : []), ], }, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/get_log_changes.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/changes/get_log_changes.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/get_log_changes.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/changes/get_log_changes.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/get_metric_changes.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/changes/get_metric_changes.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/get_metric_changes.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/changes/get_metric_changes.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/changes/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/changes/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/documentation.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/documentation.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/documentation.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/documentation.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/lens.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/lens.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/lens.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/lens.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.test.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.test.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/get_errors_with_commands.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/visualize_esql.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/visualize_esql.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/plugin.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/plugin.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/plugin.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/rule_connector/convert_schema_to_open_api.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/rule_connector/index.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/rule_connector/index.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/rule_connector/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/rule_connector/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/types.ts similarity index 92% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/types.ts index 0a3fc6d9dc12d..cd9f578d99093 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/types.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/types.ts @@ -35,6 +35,8 @@ import type { ObservabilityPluginSetup } from '@kbn/observability-plugin/server' import type { InferenceServerStart, InferenceServerSetup } from '@kbn/inference-plugin/server'; import type { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/server'; import type { LlmTasksPluginStart } from '@kbn/llm-tasks-plugin/server'; +import type { SLOServerStart, SLOServerSetup } from '@kbn/slo-plugin/server'; +import type { SpacesPluginStart, SpacesPluginSetup } from '@kbn/spaces-plugin/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ObservabilityAIAssistantAppServerStart {} @@ -55,6 +57,8 @@ export interface ObservabilityAIAssistantAppPluginStartDependencies { serverless?: ServerlessPluginStart; inference: InferenceServerStart; logsDataAccess: LogsDataAccessPluginStart; + slo: SLOServerStart; + spaces: SpacesPluginStart; llmTasks: LlmTasksPluginStart; } @@ -72,4 +76,6 @@ export interface ObservabilityAIAssistantAppPluginSetupDependencies { cloud?: CloudSetup; serverless?: ServerlessPluginSetup; inference: InferenceServerSetup; + slo: SLOServerSetup; + spaces: SpacesPluginSetup; } diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/util/get_log_sources.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/util/get_log_sources.ts new file mode 100644 index 0000000000000..6532e686a2eb2 --- /dev/null +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/util/get_log_sources.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IUiSettingsClient } from '@kbn/core/server'; +import { OBSERVABILITY_LOGS_DATA_ACCESS_LOG_SOURCES_ID } from '@kbn/management-settings-ids'; + +export function getLogSources({ uiSettings }: { uiSettings: IUiSettingsClient }) { + return uiSettings.get(OBSERVABILITY_LOGS_DATA_ACCESS_LOG_SOURCES_ID) as Promise<string[]>; +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/tsconfig.json similarity index 85% rename from x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json rename to x-pack/solutions/observability/plugins/observability_ai_assistant_app/tsconfig.json index e0a520fb574c7..7e3de7940f22b 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/tsconfig.json @@ -1,16 +1,17 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, "include": [ - "../../../typings/**/*", + "../../../../typings/**/*", "common/**/*", "public/**/*", "scripts/**/*", "typings/**/*", "public/**/*.json", - "server/**/*" + "server/**/*", + ".storybook/**/*.tsx" ], "kbn_references": [ "@kbn/es-types", @@ -69,7 +70,14 @@ "@kbn/cloud-plugin", "@kbn/logs-data-access-plugin", "@kbn/ai-assistant-common", + "@kbn/observability-utils-server", + "@kbn/observability-utils-common", + "@kbn/slo-plugin", + "@kbn/spaces-plugin", + "@kbn/data-service", "@kbn/inference-common", + "@kbn/observability-ai-server", + "@kbn/observability-ai-common", "@kbn/llm-tasks-plugin", "@kbn/product-doc-common", ], diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/README.md b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/README.md similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/README.md rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/README.md diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/common/ui_settings.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/common/ui_settings.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/common/ui_settings.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/common/ui_settings.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/jest.config.js b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/jest.config.js similarity index 58% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/jest.config.js rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/jest.config.js index bbe2bd0b6266e..99b1d23eb5bd4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/jest.config.js +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/jest.config.js @@ -7,10 +7,10 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_management'], + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_management'], coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '<rootDir>/x-pack/plugins/observability_solution/observability_ai_assistant_management/{common,public,server}/**/*.{js,ts,tsx}', + '<rootDir>/x-pack/solutions/observability/plugins/observability_ai_assistant_management/{common,public,server}/**/*.{js,ts,tsx}', ], }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/kibana.jsonc b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/kibana.jsonc similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/kibana.jsonc rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/kibana.jsonc diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/app.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/app.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/app.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/app.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/constants.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/constants.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/constants.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/constants.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/context/app_context.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/context/app_context.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/context/app_context.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/context/app_context.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/categorize_entries.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/helpers/categorize_entries.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/categorize_entries.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/helpers/categorize_entries.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/test_helper.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/helpers/test_helper.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/test_helper.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/helpers/test_helper.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_app_context.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_app_context.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_app_context.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_app_context.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_entry.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_entry.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_entry.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_entry.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_user_instruction.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_user_instruction.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_user_instruction.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_create_knowledge_base_user_instruction.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_delete_knowledge_base_entry.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_delete_knowledge_base_entry.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_delete_knowledge_base_entry.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_delete_knowledge_base_entry.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_get_knowledge_base_entries.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_get_knowledge_base_entries.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_get_knowledge_base_entries.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_get_knowledge_base_entries.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_get_user_instructions.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_get_user_instructions.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_get_user_instructions.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_get_user_instructions.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_import_knowledge_base_entries.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_import_knowledge_base_entries.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_import_knowledge_base_entries.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_import_knowledge_base_entries.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_install_product_doc.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_install_product_doc.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_install_product_doc.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_install_product_doc.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_kibana.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_kibana.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_kibana.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_kibana.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_observability_management_params.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_observability_management_params.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_observability_management_params.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_observability_management_params.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_observability_management_router.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_observability_management_router.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_observability_management_router.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_observability_management_router.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_uninstall_product_doc.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_uninstall_product_doc.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/hooks/use_uninstall_product_doc.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/hooks/use_uninstall_product_doc.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/plugin.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/plugin.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/plugin.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/plugin.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_bulk_import_flyout.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_bulk_import_flyout.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_bulk_import_flyout.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_bulk_import_flyout.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_category_flyout.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_category_flyout.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_category_flyout.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_category_flyout.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_manual_entry_flyout.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_user_instruction_flyout.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_user_instruction_flyout.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_user_instruction_flyout.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_edit_user_instruction_flyout.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.test.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/knowledge_base_tab.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/redirect_to_home_if_unauthorized.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/redirect_to_home_if_unauthorized.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/redirect_to_home_if_unauthorized.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/redirect_to_home_if_unauthorized.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_page.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_page.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/ui_settings.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/ui_settings.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/ui_settings.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/components/settings_tab/ui_settings.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/config.tsx b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/config.tsx similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/config.tsx rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/public/routes/config.tsx diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/config.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/server/config.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/server/config.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/server/config.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/server/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/server/index.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/server/index.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/plugin.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/server/plugin.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/server/plugin.ts rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/server/plugin.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/tsconfig.json similarity index 94% rename from x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json rename to x-pack/solutions/observability/plugins/observability_ai_assistant_management/tsconfig.json index 7b78d52c64806..982fda386cc1e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, diff --git a/x-pack/solutions/observability/plugins/streams/common/types.ts b/x-pack/solutions/observability/plugins/streams/common/types.ts index 59cdd1cf9c4b9..3d8e0fc0d390c 100644 --- a/x-pack/solutions/observability/plugins/streams/common/types.ts +++ b/x-pack/solutions/observability/plugins/streams/common/types.ts @@ -87,22 +87,21 @@ export type StreamChild = z.infer<typeof streamChildSchema>; export const streamWithoutIdDefinitonSchema = z.object({ processing: z.array(processingDefinitionSchema).default([]), fields: z.array(fieldDefinitionSchema).default([]), + managed: z.boolean().default(true), children: z.array(streamChildSchema).default([]), }); export type StreamWithoutIdDefinition = z.infer<typeof streamDefinitonSchema>; +export const unmanagedElasticsearchAsset = z.object({ + type: z.enum(['ingest_pipeline', 'component_template', 'index_template', 'data_stream']), + id: z.string(), +}); +export type UnmanagedElasticsearchAsset = z.infer<typeof unmanagedElasticsearchAsset>; + export const streamDefinitonSchema = streamWithoutIdDefinitonSchema.extend({ id: z.string(), - managed: z.boolean().default(true), - unmanaged_elasticsearch_assets: z.optional( - z.array( - z.object({ - type: z.enum(['ingest_pipeline', 'component_template', 'index_template', 'data_stream']), - id: z.string(), - }) - ) - ), + unmanaged_elasticsearch_assets: z.optional(z.array(unmanagedElasticsearchAsset)), }); export type StreamDefinition = z.infer<typeof streamDefinitonSchema>; diff --git a/x-pack/solutions/observability/plugins/streams/server/lib/streams/ingest_pipelines/generate_ingest_pipeline.ts b/x-pack/solutions/observability/plugins/streams/server/lib/streams/ingest_pipelines/generate_ingest_pipeline.ts index eb09df8831304..e7c9c784a8123 100644 --- a/x-pack/solutions/observability/plugins/streams/server/lib/streams/ingest_pipelines/generate_ingest_pipeline.ts +++ b/x-pack/solutions/observability/plugins/streams/server/lib/streams/ingest_pipelines/generate_ingest_pipeline.ts @@ -12,20 +12,24 @@ import { logsDefaultPipelineProcessors } from './logs_default_pipeline'; import { isRoot } from '../helpers/hierarchy'; import { getProcessingPipelineName } from './name'; +function generateProcessingSteps(definition: StreamDefinition) { + return definition.processing.map((processor) => { + const { type, ...config } = processor.config; + return { + [type]: { + ...config, + if: processor.condition ? conditionToPainless(processor.condition) : undefined, + }, + }; + }); +} + export function generateIngestPipeline(id: string, definition: StreamDefinition) { return { id: getProcessingPipelineName(id), processors: [ ...(isRoot(definition.id) ? logsDefaultPipelineProcessors : []), - ...definition.processing.map((processor) => { - const { type, ...config } = processor.config; - return { - [type]: { - ...config, - if: processor.condition ? conditionToPainless(processor.condition) : undefined, - }, - }; - }), + ...generateProcessingSteps(definition), { pipeline: { name: `${id}@stream.reroutes`, @@ -40,3 +44,14 @@ export function generateIngestPipeline(id: string, definition: StreamDefinition) version: ASSET_VERSION, }; } + +export function generateClassicIngestPipelineBody(definition: StreamDefinition) { + return { + processors: generateProcessingSteps(definition), + _meta: { + description: `Stream-managed pipeline for the ${definition.id} stream`, + managed: true, + }, + version: ASSET_VERSION, + }; +} diff --git a/x-pack/solutions/observability/plugins/streams/server/lib/streams/stream_crud.ts b/x-pack/solutions/observability/plugins/streams/server/lib/streams/stream_crud.ts index c158280bec161..5066ecd61a601 100644 --- a/x-pack/solutions/observability/plugins/streams/server/lib/streams/stream_crud.ts +++ b/x-pack/solutions/observability/plugins/streams/server/lib/streams/stream_crud.ts @@ -7,6 +7,8 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; import { Logger } from '@kbn/logging'; +import { IngestPipeline, IngestProcessorContainer } from '@elastic/elasticsearch/lib/api/types'; +import { set } from '@kbn/safer-lodash-set'; import { IndicesDataStream } from '@elastic/elasticsearch/lib/api/types'; import { STREAMS_INDEX } from '../../../common/constants'; import { FieldDefinition, StreamDefinition } from '../../../common/types'; @@ -24,7 +26,10 @@ import { getAncestors } from './helpers/hierarchy'; import { generateIndexTemplate } from './index_templates/generate_index_template'; import { deleteTemplate, upsertTemplate } from './index_templates/manage_index_templates'; import { getIndexTemplateName } from './index_templates/name'; -import { generateIngestPipeline } from './ingest_pipelines/generate_ingest_pipeline'; +import { + generateClassicIngestPipelineBody, + generateIngestPipeline, +} from './ingest_pipelines/generate_ingest_pipeline'; import { generateReroutePipeline } from './ingest_pipelines/generate_reroute_pipeline'; import { deleteIngestPipeline, @@ -45,6 +50,63 @@ interface DeleteStreamParams extends BaseParams { logger: Logger; } +export async function deleteUnmanagedStreamObjects({ + id, + scopedClusterClient, + logger, +}: DeleteStreamParams) { + const unmanagedAssets = await getUnmanagedElasticsearchAssets({ + name: id, + scopedClusterClient, + }); + const pipelineName = unmanagedAssets.find((asset) => asset.type === 'ingest_pipeline')?.id; + if (pipelineName) { + const { targetPipelineName, targetPipeline, referencesStreamManagedPipeline } = + await findStreamManagedPipelineReference(scopedClusterClient, pipelineName, id); + if (referencesStreamManagedPipeline) { + const streamManagedPipelineName = getProcessingPipelineName(id); + const updatedProcessors = targetPipeline.processors!.filter( + (processor) => + !(processor.pipeline && processor.pipeline.name === streamManagedPipelineName) + ); + await scopedClusterClient.asCurrentUser.ingest.putPipeline({ + id: targetPipelineName, + body: { + processors: updatedProcessors, + }, + }); + } + } + await deleteDataStream({ + esClient: scopedClusterClient.asCurrentUser, + name: id, + logger, + }); + try { + await deleteIngestPipeline({ + esClient: scopedClusterClient.asCurrentUser, + id: getProcessingPipelineName(id), + logger, + }); + } catch (e) { + // if the pipeline doesn't exist, we don't need to delete it + if (!(e.meta?.statusCode === 404)) { + throw e; + } + } + try { + await scopedClusterClient.asInternalUser.delete({ + id, + index: STREAMS_INDEX, + refresh: 'wait_for', + }); + } catch (e) { + if (e.meta?.statusCode !== 404) { + throw e; + } + } +} + export async function deleteStreamObjects({ id, scopedClusterClient, logger }: DeleteStreamParams) { await deleteDataStream({ esClient: scopedClusterClient.asCurrentUser, @@ -82,7 +144,7 @@ async function upsertInternalStream({ definition, scopedClusterClient }: BasePar return scopedClusterClient.asInternalUser.index({ id: definition.id, index: STREAMS_INDEX, - document: { ...definition, managed: true }, + document: { ...definition }, refresh: 'wait_for', }); } @@ -103,14 +165,20 @@ export async function listStreams({ }); const dataStreams = await listDataStreamsAsStreams({ scopedClusterClient }); - let definitions = response.hits.hits.map((hit) => ({ ...hit._source!, managed: true })); + let definitions = response.hits.hits.map((hit) => ({ ...hit._source! })); const hasAccess = await Promise.all( definitions.map((definition) => checkReadAccess({ id: definition.id, scopedClusterClient })) ); definitions = definitions.filter((_, index) => hasAccess[index]); + const definitionMap = new Map(definitions.map((definition) => [definition.id, definition])); + dataStreams.forEach((dataStream) => { + if (!definitionMap.has(dataStream.id)) { + definitionMap.set(dataStream.id, dataStream); + } + }); return { - definitions: [...definitions, ...dataStreams], + definitions: Array.from(definitionMap.values()), }; } @@ -158,7 +226,6 @@ export async function readStream({ return { definition: { ...definition, - managed: true, }, }; } catch (e) { @@ -169,35 +236,42 @@ export async function readStream({ } } -export async function readDataStreamAsStream({ - id, +export async function readDataStreamAsStream({ id, scopedClusterClient }: ReadStreamParams) { + const definition: StreamDefinition = { + id, + managed: false, + children: [], + fields: [], + processing: [], + }; + + definition.unmanaged_elasticsearch_assets = await getUnmanagedElasticsearchAssets({ + name: id, + scopedClusterClient, + }); + + return { definition }; +} + +interface ReadUnmanagedAssetsParams extends BaseParams { + name: string; +} + +async function getUnmanagedElasticsearchAssets({ + name, scopedClusterClient, - skipAccessCheck, -}: ReadStreamParams) { +}: ReadUnmanagedAssetsParams) { let dataStream: IndicesDataStream; try { - const response = await scopedClusterClient.asInternalUser.indices.getDataStream({ name: id }); + const response = await scopedClusterClient.asInternalUser.indices.getDataStream({ name }); dataStream = response.data_streams[0]; } catch (e) { if (e.meta?.statusCode === 404) { - throw new DefinitionNotFound(`Stream definition for ${id} not found.`); + throw new DefinitionNotFound(`Stream definition for ${name} not found.`); } throw e; } - const definition: StreamDefinition = { - id, - managed: false, - children: [], - fields: [], - processing: [], - }; - if (!skipAccessCheck) { - const hasAccess = await checkReadAccess({ id, scopedClusterClient }); - if (!hasAccess) { - throw new DefinitionNotFound(`Stream definition for ${id} not found.`); - } - } // retrieve linked index template, component template and ingest pipeline const templateName = dataStream.template; const componentTemplates: string[] = []; @@ -215,9 +289,9 @@ export async function readDataStreamAsStream({ }); const ingestPipelineId = currentIndex[writeIndexName].settings?.index?.default_pipeline!; - definition.unmanaged_elasticsearch_assets = [ + return [ { - type: 'ingest_pipeline', + type: 'ingest_pipeline' as const, id: ingestPipelineId, }, ...componentTemplates.map((componentTemplateName) => ({ @@ -225,16 +299,14 @@ export async function readDataStreamAsStream({ id: componentTemplateName, })), { - type: 'index_template', + type: 'index_template' as const, id: templateName, }, { - type: 'data_stream', - id, + type: 'data_stream' as const, + id: name, }, ]; - - return { definition }; } interface ReadAncestorsParams extends BaseParams { @@ -378,8 +450,12 @@ export async function syncStream({ logger, }: SyncStreamParams) { if (!definition.managed) { - // TODO For now, we just don't allow reads at all - later on we will relax this to allow certain operations, but they will use a completely different syncing logic - throw new Error('Cannot sync an unmanaged stream'); + await syncUnmanagedStream({ scopedClusterClient, definition, logger }); + await upsertInternalStream({ + scopedClusterClient, + definition, + }); + return; } const componentTemplate = generateLayer(definition.id, definition); await upsertComponent({ @@ -432,6 +508,163 @@ export async function syncStream({ }); } +interface ExecutionPlanStep { + method: string; + path: string; + body?: Record<string, unknown>; +} + +async function syncUnmanagedStream({ scopedClusterClient, definition, logger }: SyncStreamParams) { + if (definition.managed) { + throw new Error('Got an unmanaged stream that is marked as managed'); + } + if (definition.fields.length) { + throw new Error( + 'Unmanaged streams cannot have managed fields, please edit the component templates directly' + ); + } + if (definition.children.length) { + throw new Error('Unmanaged streams cannot have managed children, coming soon'); + } + const unmanagedAssets = await getUnmanagedElasticsearchAssets({ + name: definition.id, + scopedClusterClient, + }); + const executionPlan: ExecutionPlanStep[] = []; + const streamManagedPipelineName = getProcessingPipelineName(definition.id); + const pipelineName = unmanagedAssets.find((asset) => asset.type === 'ingest_pipeline')?.id; + if (!pipelineName) { + throw new Error('Unmanaged stream needs a default ingest pipeline'); + } + if (pipelineName === streamManagedPipelineName) { + throw new Error('Unmanaged stream cannot have the @stream pipeline as the default pipeline'); + } + await ensureStreamManagedPipelineReference( + scopedClusterClient, + pipelineName, + definition, + executionPlan + ); + + if (definition.processing.length) { + // if the stream has processing, we need to create or update the stream managed pipeline + executionPlan.push({ + method: 'PUT', + path: `/_ingest/pipeline/${streamManagedPipelineName}`, + body: generateClassicIngestPipelineBody(definition), + }); + } else { + const pipelineExists = Boolean( + await tryGettingPipeline({ scopedClusterClient, id: streamManagedPipelineName }) + ); + // no processing, just delete the pipeline if it exists. The reference to the pipeline won't break anything + if (pipelineExists) { + executionPlan.push({ + method: 'DELETE', + path: `/_ingest/pipeline/${streamManagedPipelineName}`, + }); + } + } + + await executePlan(executionPlan, scopedClusterClient); +} + +async function executePlan( + executionPlan: ExecutionPlanStep[], + scopedClusterClient: IScopedClusterClient +) { + for (const step of executionPlan) { + await scopedClusterClient.asCurrentUser.transport.request({ + method: step.method, + path: step.path, + body: step.body, + }); + } +} + +async function findStreamManagedPipelineReference( + scopedClusterClient: IScopedClusterClient, + pipelineName: string, + streamId: string +): Promise<{ + targetPipelineName: string; + targetPipeline: IngestPipeline; + referencesStreamManagedPipeline: boolean; +}> { + const streamManagedPipelineName = getProcessingPipelineName(streamId); + const pipeline = (await tryGettingPipeline({ scopedClusterClient, id: pipelineName })) || { + processors: [], + }; + const streamProcessor = pipeline.processors?.find( + (processor) => processor.pipeline && processor.pipeline.name === streamManagedPipelineName + ); + const customProcessor = pipeline.processors?.findLast( + (processor) => processor.pipeline && processor.pipeline.name.endsWith('@custom') + ); + if (streamProcessor) { + return { + targetPipelineName: pipelineName, + targetPipeline: pipeline, + referencesStreamManagedPipeline: true, + }; + } + if (customProcessor) { + // go one level deeper, find the latest @custom leaf pipeline + return await findStreamManagedPipelineReference( + scopedClusterClient, + customProcessor.pipeline!.name, + streamId + ); + } + return { + targetPipelineName: pipelineName, + targetPipeline: pipeline, + referencesStreamManagedPipeline: false, + }; +} + +async function ensureStreamManagedPipelineReference( + scopedClusterClient: IScopedClusterClient, + pipelineName: string, + definition: StreamDefinition, + executionPlan: ExecutionPlanStep[] +) { + const streamManagedPipelineName = getProcessingPipelineName(definition.id); + const { targetPipelineName, targetPipeline, referencesStreamManagedPipeline } = + await findStreamManagedPipelineReference(scopedClusterClient, pipelineName, definition.id); + if (!referencesStreamManagedPipeline) { + const callStreamManagedPipelineProcessor: IngestProcessorContainer = { + pipeline: { + name: streamManagedPipelineName, + if: `ctx._index == '${definition.id}'`, + ignore_missing_pipeline: true, + description: + "Call the stream's managed pipeline - do not change this manually but instead use the streams UI or API", + }, + }; + executionPlan.push({ + method: 'PUT', + path: `/_ingest/pipeline/${targetPipelineName}`, + body: set( + { ...targetPipeline }, + 'processors', + (targetPipeline.processors || []).concat(callStreamManagedPipelineProcessor) + ), + }); + } +} + +async function tryGettingPipeline({ scopedClusterClient, id }: ReadStreamParams) { + try { + return (await scopedClusterClient.asCurrentUser.ingest.getPipeline({ id }))[id]; + } catch (e) { + if (e.meta?.statusCode === 404) { + return; + } + throw e; + } +} + export async function streamsEnabled({ scopedClusterClient }: BaseParams) { return await scopedClusterClient.asInternalUser.indices.exists({ index: STREAMS_INDEX, diff --git a/x-pack/solutions/observability/plugins/streams/server/routes/streams/delete.ts b/x-pack/solutions/observability/plugins/streams/server/routes/streams/delete.ts index a2092838792cf..d6bf5fbb84d8f 100644 --- a/x-pack/solutions/observability/plugins/streams/server/routes/streams/delete.ts +++ b/x-pack/solutions/observability/plugins/streams/server/routes/streams/delete.ts @@ -16,7 +16,12 @@ import { SecurityException, } from '../../lib/streams/errors'; import { createServerRoute } from '../create_server_route'; -import { syncStream, readStream, deleteStreamObjects } from '../../lib/streams/stream_crud'; +import { + syncStream, + readStream, + deleteStreamObjects, + deleteUnmanagedStreamObjects, +} from '../../lib/streams/stream_crud'; import { MalformedStreamId } from '../../lib/streams/errors/malformed_stream_id'; import { getParentId } from '../../lib/streams/helpers/hierarchy'; @@ -47,14 +52,6 @@ export const deleteStreamRoute = createServerRoute({ try { const { scopedClusterClient } = await getScopedClients({ request }); - const parentId = getParentId(params.path.id); - if (!parentId) { - throw new MalformedStreamId('Cannot delete root stream'); - } - - // need to update parent first to cut off documents streaming down - await updateParentStream(scopedClusterClient, params.path.id, parentId, logger); - await deleteStream(scopedClusterClient, params.path.id, logger); return { acknowledged: true }; @@ -83,6 +80,18 @@ export async function deleteStream( ) { try { const { definition } = await readStream({ scopedClusterClient, id }); + if (!definition.managed) { + await deleteUnmanagedStreamObjects({ scopedClusterClient, id, logger }); + return; + } + + const parentId = getParentId(id); + if (!parentId) { + throw new MalformedStreamId('Cannot delete root stream'); + } + + // need to update parent first to cut off documents streaming down + await updateParentStream(scopedClusterClient, id, parentId, logger); for (const child of definition.children) { await deleteStream(scopedClusterClient, child.id, logger); } diff --git a/x-pack/solutions/observability/plugins/streams/server/routes/streams/edit.ts b/x-pack/solutions/observability/plugins/streams/server/routes/streams/edit.ts index e280796bc9780..19867018ce25f 100644 --- a/x-pack/solutions/observability/plugins/streams/server/routes/streams/edit.ts +++ b/x-pack/solutions/observability/plugins/streams/server/routes/streams/edit.ts @@ -50,6 +50,17 @@ export const editStreamRoute = createServerRoute({ handler: async ({ response, params, logger, request, getScopedClients }) => { try { const { scopedClusterClient } = await getScopedClients({ request }); + const streamDefinition = { ...params.body, id: params.path.id }; + + if (!streamDefinition.managed) { + await syncStream({ + scopedClusterClient, + definition: { ...streamDefinition, id: params.path.id }, + rootDefinition: undefined, + logger, + }); + return { acknowledged: true }; + } await validateStreamChildren(scopedClusterClient, params.path.id, params.body.children); await validateAncestorFields(scopedClusterClient, params.path.id, params.body.fields); @@ -58,8 +69,6 @@ export const editStreamRoute = createServerRoute({ const parentId = getParentId(params.path.id); let parentDefinition: StreamDefinition | undefined; - const streamDefinition = { ...params.body, id: params.path.id }; - // always need to go from the leaves to the parent when syncing ingest pipelines, otherwise data // will be routed before the data stream is ready diff --git a/x-pack/solutions/observability/plugins/streams/server/routes/streams/enable.ts b/x-pack/solutions/observability/plugins/streams/server/routes/streams/enable.ts index cfcb97f9b3581..ee49a93aaacbb 100644 --- a/x-pack/solutions/observability/plugins/streams/server/routes/streams/enable.ts +++ b/x-pack/solutions/observability/plugins/streams/server/routes/streams/enable.ts @@ -31,12 +31,12 @@ export const enableStreamsRoute = createServerRoute({ response, logger, getScopedClients, - }): Promise<{ acknowledged: true }> => { + }): Promise<{ acknowledged: true; message: string }> => { try { const { scopedClusterClient } = await getScopedClients({ request }); const alreadyEnabled = await streamsEnabled({ scopedClusterClient }); if (alreadyEnabled) { - return { acknowledged: true }; + return { acknowledged: true, message: 'Streams was already enabled' }; } await createStreamsIndex(scopedClusterClient); await syncStream({ @@ -44,7 +44,11 @@ export const enableStreamsRoute = createServerRoute({ definition: rootStreamDefinition, logger, }); - return { acknowledged: true }; + return { + acknowledged: true, + message: + 'Streams enabled - reload your browser window to show the streams UI in the navigation', + }; } catch (e) { if (e instanceof SecurityException) { throw badRequest(e); diff --git a/x-pack/solutions/observability/plugins/streams/server/routes/streams/fork.ts b/x-pack/solutions/observability/plugins/streams/server/routes/streams/fork.ts index 070dc66b9ab10..9ec61d27619e2 100644 --- a/x-pack/solutions/observability/plugins/streams/server/routes/streams/fork.ts +++ b/x-pack/solutions/observability/plugins/streams/server/routes/streams/fork.ts @@ -58,7 +58,11 @@ export const forkStreamsRoute = createServerRoute({ id: params.path.id, }); - const childDefinition = { ...params.body.stream, children: [], managed: true }; + if (rootDefinition.managed === false) { + throw new MalformedStreamId('Cannot fork a stream that is not managed'); + } + + const childDefinition = { ...params.body.stream, children: [] }; // check whether root stream has a child of the given name already if (rootDefinition.children.some((child) => child.id === childDefinition.id)) { diff --git a/x-pack/solutions/observability/plugins/streams/server/routes/streams/list.ts b/x-pack/solutions/observability/plugins/streams/server/routes/streams/list.ts index 774a256e5ba4a..f98c635830bda 100644 --- a/x-pack/solutions/observability/plugins/streams/server/routes/streams/list.ts +++ b/x-pack/solutions/observability/plugins/streams/server/routes/streams/list.ts @@ -29,14 +29,14 @@ export const listStreamsRoute = createServerRoute({ response, request, getScopedClients, - }): Promise<{ definitions: StreamDefinition[]; trees: StreamTree[] }> => { + }): Promise<{ definitions: StreamDefinition[] }> => { try { const { scopedClusterClient } = await getScopedClients({ request }); const { definitions } = await listStreams({ scopedClusterClient }); - const trees = asTrees(definitions); - - return { definitions, trees }; + return { + definitions, + }; } catch (e) { if (e instanceof DefinitionNotFound) { throw notFound(e); @@ -46,33 +46,3 @@ export const listStreamsRoute = createServerRoute({ } }, }); - -export interface StreamTree { - id: string; - children: StreamTree[]; -} - -function asTrees(definitions: Array<{ id: string; managed?: boolean }>) { - const trees: StreamTree[] = []; - const ids = definitions - .filter((definition) => definition.managed) - .map((definition) => definition.id); - - ids.sort((a, b) => a.split('.').length - b.split('.').length); - - ids.forEach((id) => { - let currentTree = trees; - let existingNode: StreamTree | undefined; - // traverse the tree following the prefix of the current id. - // once we reach the leaf, the current id is added as child - this works because the ids are sorted by depth - while ((existingNode = currentTree.find((node) => id.startsWith(node.id)))) { - currentTree = existingNode.children; - } - if (!existingNode) { - const newNode = { id, children: [] }; - currentTree.push(newNode); - } - }); - - return trees; -} diff --git a/x-pack/solutions/observability/plugins/streams/tsconfig.json b/x-pack/solutions/observability/plugins/streams/tsconfig.json index 4cec623f68286..08ed4e1648af7 100644 --- a/x-pack/solutions/observability/plugins/streams/tsconfig.json +++ b/x-pack/solutions/observability/plugins/streams/tsconfig.json @@ -29,6 +29,7 @@ "@kbn/licensing-plugin", "@kbn/server-route-repository-client", "@kbn/observability-utils-server", - "@kbn/observability-utils-common" + "@kbn/observability-utils-common", + "@kbn/safer-lodash-set" ] } diff --git a/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/classic.tsx b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/classic.tsx new file mode 100644 index 0000000000000..1664b322b5a8e --- /dev/null +++ b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/classic.tsx @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { ReadStreamDefinition, StreamDefinition } from '@kbn/streams-plugin/common'; +import { EuiFlexGroup, EuiListGroup, EuiText } from '@elastic/eui'; +import { useStreamsAppParams } from '../../hooks/use_streams_app_params'; +import { RedirectTo } from '../redirect_to'; +import { StreamDetailEnriching } from '../stream_detail_enriching'; +import { useKibana } from '../../hooks/use_kibana'; +import { Wrapper } from './wrapper'; + +type ManagementSubTabs = 'enrich' | 'overview'; + +function isValidManagementSubTab(value: string): value is ManagementSubTabs { + return ['enrich', 'overview'].includes(value); +} + +export function ClassicStreamDetailManagement({ + definition, + refreshDefinition, +}: { + definition: ReadStreamDefinition; + refreshDefinition: () => void; +}) { + const { + path: { key, subtab }, + } = useStreamsAppParams('/{key}/management/{subtab}'); + + const tabs = { + overview: { + content: <UnmanagedStreamOverview definition={definition} />, + label: i18n.translate('xpack.streams.streamDetailView.overviewTab', { + defaultMessage: 'Overview', + }), + }, + enrich: { + content: ( + <StreamDetailEnriching definition={definition} refreshDefinition={refreshDefinition} /> + ), + label: i18n.translate('xpack.streams.streamDetailView.enrichingTab', { + defaultMessage: 'Extract field', + }), + }, + }; + + if (!isValidManagementSubTab(subtab)) { + return ( + <RedirectTo + path="/{key}/management/{subtab}" + params={{ path: { key, subtab: 'overview' } }} + /> + ); + } + + return <Wrapper tabs={tabs} streamId={key} subtab={subtab} />; +} + +function UnmanagedStreamOverview({ definition }: { definition: StreamDefinition }) { + const { + core: { + http: { basePath }, + }, + } = useKibana(); + const groupedAssets = (definition.unmanaged_elasticsearch_assets ?? []).reduce((acc, asset) => { + const title = assetToTitle(asset); + if (title) { + acc[title] = acc[title] ?? []; + acc[title].push(asset); + } + return acc; + }, {} as Record<string, Array<{ type: string; id: string }>>); + return ( + <EuiFlexGroup direction="column" gutterSize="m"> + <EuiText> + <p> + {i18n.translate('xpack.streams.streamDetailView.unmanagedStreamOverview', { + defaultMessage: + 'This stream is not managed. Follow the links to stack management to change the related Elasticsearch objects.', + })} + </p> + </EuiText> + {Object.entries(groupedAssets).map(([title, assets]) => ( + <div key={title}> + <EuiText> + <h3>{title}</h3> + </EuiText> + <EuiListGroup + listItems={assets.map((asset) => ({ + label: asset.id, + href: basePath.prepend(assetToLink(asset)), + iconType: 'index', + target: '_blank', + }))} + /> + </div> + ))} + </EuiFlexGroup> + ); +} + +function assetToLink(asset: { type: string; id: string }) { + switch (asset.type) { + case 'index_template': + return `/app/management/data/index_management/templates/${asset.id}`; + case 'component_template': + return `/app/management/data/index_management/component_templates/${asset.id}`; + case 'data_stream': + return `/app/management/data/index_management/data_streams/${asset.id}`; + case 'ingest_pipeline': + return `/app/management/ingest/ingest_pipelines?pipeline=${asset.id}`; + default: + return ''; + } +} + +function assetToTitle(asset: { type: string; id: string }) { + switch (asset.type) { + case 'index_template': + return i18n.translate('xpack.streams.streamDetailView.indexTemplate', { + defaultMessage: 'Index template', + }); + case 'component_template': + return i18n.translate('xpack.streams.streamDetailView.componentTemplate', { + defaultMessage: 'Component template', + }); + case 'data_stream': + return i18n.translate('xpack.streams.streamDetailView.dataStream', { + defaultMessage: 'Data stream', + }); + case 'ingest_pipeline': + return i18n.translate('xpack.streams.streamDetailView.ingestPipeline', { + defaultMessage: 'Ingest pipeline', + }); + default: + return ''; + } +} diff --git a/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/index.tsx b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/index.tsx index 4f3d207c91789..c093f05c03210 100644 --- a/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/index.tsx +++ b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/index.tsx @@ -5,23 +5,9 @@ * 2.0. */ import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { ReadStreamDefinition, StreamDefinition } from '@kbn/streams-plugin/common'; -import { css } from '@emotion/css'; -import { EuiButtonGroup, EuiFlexGroup, EuiFlexItem, EuiListGroup, EuiText } from '@elastic/eui'; -import { useStreamsAppParams } from '../../hooks/use_streams_app_params'; -import { RedirectTo } from '../redirect_to'; -import { useStreamsAppRouter } from '../../hooks/use_streams_app_router'; -import { StreamDetailRouting } from '../stream_detail_routing'; -import { StreamDetailEnriching } from '../stream_detail_enriching'; -import { StreamDetailSchemaEditor } from '../stream_detail_schema_editor'; -import { useKibana } from '../../hooks/use_kibana'; - -type ManagementSubTabs = 'route' | 'enrich' | 'schemaEditor'; - -function isValidManagementSubTab(value: string): value is ManagementSubTabs { - return ['route', 'enrich', 'schemaEditor'].includes(value); -} +import { ReadStreamDefinition } from '@kbn/streams-plugin/common'; +import { WiredStreamDetailManagement } from './wired'; +import { ClassicStreamDetailManagement } from './classic'; export function StreamDetailManagement({ definition, @@ -30,180 +16,17 @@ export function StreamDetailManagement({ definition?: ReadStreamDefinition; refreshDefinition: () => void; }) { - const { - path: { key, subtab }, - } = useStreamsAppParams('/{key}/management/{subtab}'); - const router = useStreamsAppRouter(); - - if (subtab === 'overview') { - if (!definition) { - return null; - } - if (definition.managed) { - return ( - <RedirectTo path="/{key}/management/{subtab}" params={{ path: { key, subtab: 'route' } }} /> - ); - } - return <UnmanagedStreamOverview definition={definition} />; - } - - const tabs = { - route: { - content: ( - <StreamDetailRouting definition={definition} refreshDefinition={refreshDefinition} /> - ), - label: i18n.translate('xpack.streams.streamDetailView.routingTab', { - defaultMessage: 'Streams Partitioning', - }), - }, - enrich: { - content: ( - <StreamDetailEnriching definition={definition} refreshDefinition={refreshDefinition} /> - ), - label: i18n.translate('xpack.streams.streamDetailView.enrichingTab', { - defaultMessage: 'Extract field', - }), - }, - schemaEditor: { - content: ( - <StreamDetailSchemaEditor definition={definition} refreshDefinition={refreshDefinition} /> - ), - label: i18n.translate('xpack.streams.streamDetailView.schemaEditorTab', { - defaultMessage: 'Schema editor', - }), - }, - }; - - if (!isValidManagementSubTab(subtab)) { - return ( - <RedirectTo path="/{key}/management/{subtab}" params={{ path: { key, subtab: 'route' } }} /> - ); + if (!definition) { + return null; } - if (definition && !definition.managed) { + if (definition.managed) { return ( - <RedirectTo - path="/{key}/management/{subtab}" - params={{ path: { key, subtab: 'overview' } }} - /> + <WiredStreamDetailManagement definition={definition} refreshDefinition={refreshDefinition} /> ); } - const selectedTabObject = tabs[subtab]; - - return ( - <EuiFlexGroup - direction="column" - gutterSize="s" - className={css` - max-width: 100%; - `} - > - <EuiFlexItem grow={false}> - <EuiButtonGroup - legend="Management tabs" - idSelected={subtab} - onChange={(optionId) => { - router.push('/{key}/management/{subtab}', { - path: { key, subtab: optionId }, - query: {}, - }); - }} - options={Object.keys(tabs).map((id) => ({ - id, - label: tabs[id as ManagementSubTabs].label, - }))} - /> - </EuiFlexItem> - <EuiFlexItem - className={css` - overflow: auto; - `} - grow - > - {selectedTabObject.content} - </EuiFlexItem> - </EuiFlexGroup> - ); -} - -function assetToLink(asset: { type: string; id: string }) { - switch (asset.type) { - case 'index_template': - return `/app/management/data/index_management/templates/${asset.id}`; - case 'component_template': - return `/app/management/data/index_management/component_templates/${asset.id}`; - case 'data_stream': - return `/app/management/data/index_management/data_streams/${asset.id}`; - case 'ingest_pipeline': - return `/app/management/ingest/ingest_pipelines?pipeline=${asset.id}`; - default: - return ''; - } -} - -function assetToTitle(asset: { type: string; id: string }) { - switch (asset.type) { - case 'index_template': - return i18n.translate('xpack.streams.streamDetailView.indexTemplate', { - defaultMessage: 'Index template', - }); - case 'component_template': - return i18n.translate('xpack.streams.streamDetailView.componentTemplate', { - defaultMessage: 'Component template', - }); - case 'data_stream': - return i18n.translate('xpack.streams.streamDetailView.dataStream', { - defaultMessage: 'Data stream', - }); - case 'ingest_pipeline': - return i18n.translate('xpack.streams.streamDetailView.ingestPipeline', { - defaultMessage: 'Ingest pipeline', - }); - default: - return ''; - } -} - -function UnmanagedStreamOverview({ definition }: { definition: StreamDefinition }) { - const { - core: { - http: { basePath }, - }, - } = useKibana(); - const groupedAssets = (definition.unmanaged_elasticsearch_assets ?? []).reduce((acc, asset) => { - const title = assetToTitle(asset); - if (title) { - acc[title] = acc[title] ?? []; - acc[title].push(asset); - } - return acc; - }, {} as Record<string, Array<{ type: string; id: string }>>); return ( - <EuiFlexGroup direction="column" gutterSize="m"> - <EuiText> - <p> - {i18n.translate('xpack.streams.streamDetailView.unmanagedStreamOverview', { - defaultMessage: - 'This stream is not managed. Follow the links to stack management to change the related Elasticsearch objects.', - })} - </p> - </EuiText> - {Object.entries(groupedAssets).map(([title, assets]) => ( - <div key={title}> - <EuiText> - <h3>{title}</h3> - </EuiText> - <EuiListGroup - listItems={assets.map((asset) => ({ - label: asset.id, - href: basePath.prepend(assetToLink(asset)), - iconType: 'index', - target: '_blank', - }))} - /> - </div> - ))} - </EuiFlexGroup> + <ClassicStreamDetailManagement definition={definition} refreshDefinition={refreshDefinition} /> ); } diff --git a/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/wired.tsx b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/wired.tsx new file mode 100644 index 0000000000000..5f8c4e57bf7d1 --- /dev/null +++ b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/wired.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { ReadStreamDefinition } from '@kbn/streams-plugin/common'; +import { useStreamsAppParams } from '../../hooks/use_streams_app_params'; +import { RedirectTo } from '../redirect_to'; +import { StreamDetailRouting } from '../stream_detail_routing'; +import { StreamDetailEnriching } from '../stream_detail_enriching'; +import { StreamDetailSchemaEditor } from '../stream_detail_schema_editor'; +import { Wrapper } from './wrapper'; + +type ManagementSubTabs = 'route' | 'enrich' | 'schemaEditor'; + +function isValidManagementSubTab(value: string): value is ManagementSubTabs { + return ['route', 'enrich', 'schemaEditor'].includes(value); +} + +export function WiredStreamDetailManagement({ + definition, + refreshDefinition, +}: { + definition?: ReadStreamDefinition; + refreshDefinition: () => void; +}) { + const { + path: { key, subtab }, + } = useStreamsAppParams('/{key}/management/{subtab}'); + + const tabs = { + route: { + content: ( + <StreamDetailRouting definition={definition} refreshDefinition={refreshDefinition} /> + ), + label: i18n.translate('xpack.streams.streamDetailView.routingTab', { + defaultMessage: 'Streams Partitioning', + }), + }, + enrich: { + content: ( + <StreamDetailEnriching definition={definition} refreshDefinition={refreshDefinition} /> + ), + label: i18n.translate('xpack.streams.streamDetailView.enrichingTab', { + defaultMessage: 'Extract field', + }), + }, + schemaEditor: { + content: ( + <StreamDetailSchemaEditor definition={definition} refreshDefinition={refreshDefinition} /> + ), + label: i18n.translate('xpack.streams.streamDetailView.schemaEditorTab', { + defaultMessage: 'Schema editor', + }), + }, + }; + + if (!isValidManagementSubTab(subtab)) { + return ( + <RedirectTo path="/{key}/management/{subtab}" params={{ path: { key, subtab: 'route' } }} /> + ); + } + + return <Wrapper tabs={tabs} streamId={key} subtab={subtab} />; +} diff --git a/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/wrapper.tsx b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/wrapper.tsx new file mode 100644 index 0000000000000..92d80924298fc --- /dev/null +++ b/x-pack/solutions/observability/plugins/streams_app/public/components/stream_detail_management/wrapper.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButtonGroup, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import React from 'react'; +import { css } from '@emotion/css'; +import { useStreamsAppRouter } from '../../hooks/use_streams_app_router'; + +export function Wrapper({ + tabs, + streamId, + subtab, +}: { + tabs: Record<string, { content: JSX.Element; label: string }>; + streamId: string; + subtab: string; +}) { + const router = useStreamsAppRouter(); + return ( + <EuiFlexGroup + direction="column" + gutterSize="s" + className={css` + max-width: 100%; + `} + > + <EuiFlexItem grow={false}> + <EuiButtonGroup + legend="Management tabs" + idSelected={subtab} + onChange={(optionId) => { + router.push('/{key}/management/{subtab}', { + path: { key: streamId, subtab: optionId }, + query: {}, + }); + }} + options={Object.keys(tabs).map((id) => ({ + id, + label: tabs[id].label, + }))} + /> + </EuiFlexItem> + <EuiFlexItem + className={css` + overflow: auto; + `} + grow + > + {tabs[subtab].content} + </EuiFlexItem> + </EuiFlexGroup> + ); +} diff --git a/x-pack/packages/security-solution/data_table/README.md b/x-pack/solutions/security/packages/data_table/README.md similarity index 100% rename from x-pack/packages/security-solution/data_table/README.md rename to x-pack/solutions/security/packages/data_table/README.md diff --git a/x-pack/packages/security-solution/data_table/common/types/data_table/index.ts b/x-pack/solutions/security/packages/data_table/common/types/data_table/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/common/types/data_table/index.ts rename to x-pack/solutions/security/packages/data_table/common/types/data_table/index.ts diff --git a/x-pack/packages/security-solution/data_table/common/types/detail_panel.ts b/x-pack/solutions/security/packages/data_table/common/types/detail_panel.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/common/types/detail_panel.ts rename to x-pack/solutions/security/packages/data_table/common/types/detail_panel.ts diff --git a/x-pack/packages/security-solution/data_table/common/types/header_actions/index.ts b/x-pack/solutions/security/packages/data_table/common/types/header_actions/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/common/types/header_actions/index.ts rename to x-pack/solutions/security/packages/data_table/common/types/header_actions/index.ts diff --git a/x-pack/packages/security-solution/data_table/common/types/index.ts b/x-pack/solutions/security/packages/data_table/common/types/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/common/types/index.ts rename to x-pack/solutions/security/packages/data_table/common/types/index.ts diff --git a/x-pack/packages/security-solution/data_table/common/types/risk_scores.ts b/x-pack/solutions/security/packages/data_table/common/types/risk_scores.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/common/types/risk_scores.ts rename to x-pack/solutions/security/packages/data_table/common/types/risk_scores.ts diff --git a/x-pack/packages/security-solution/data_table/common/types/session_view/index.ts b/x-pack/solutions/security/packages/data_table/common/types/session_view/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/common/types/session_view/index.ts rename to x-pack/solutions/security/packages/data_table/common/types/session_view/index.ts diff --git a/x-pack/packages/security-solution/data_table/components/data_table/column_headers/default_headers.ts b/x-pack/solutions/security/packages/data_table/components/data_table/column_headers/default_headers.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/column_headers/default_headers.ts rename to x-pack/solutions/security/packages/data_table/components/data_table/column_headers/default_headers.ts diff --git a/x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.test.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/column_headers/helpers.test.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.test.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/column_headers/helpers.test.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/column_headers/helpers.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/column_headers/helpers.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/column_headers/translations.ts b/x-pack/solutions/security/packages/data_table/components/data_table/column_headers/translations.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/column_headers/translations.ts rename to x-pack/solutions/security/packages/data_table/components/data_table/column_headers/translations.ts diff --git a/x-pack/packages/security-solution/data_table/components/data_table/constants.ts b/x-pack/solutions/security/packages/data_table/components/data_table/constants.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/constants.ts rename to x-pack/solutions/security/packages/data_table/components/data_table/constants.ts diff --git a/x-pack/packages/security-solution/data_table/components/data_table/data_table.stories.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/data_table.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/data_table.stories.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/data_table.stories.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/helpers.test.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/helpers.test.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/helpers.test.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/helpers.test.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/helpers.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/helpers.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/helpers.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/helpers.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/index.test.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/index.tsx b/x-pack/solutions/security/packages/data_table/components/data_table/index.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/index.tsx rename to x-pack/solutions/security/packages/data_table/components/data_table/index.tsx diff --git a/x-pack/packages/security-solution/data_table/components/data_table/pagination.ts b/x-pack/solutions/security/packages/data_table/components/data_table/pagination.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/pagination.ts rename to x-pack/solutions/security/packages/data_table/components/data_table/pagination.ts diff --git a/x-pack/packages/security-solution/data_table/components/data_table/types.ts b/x-pack/solutions/security/packages/data_table/components/data_table/types.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/types.ts rename to x-pack/solutions/security/packages/data_table/components/data_table/types.ts diff --git a/x-pack/packages/security-solution/data_table/components/data_table/utils.ts b/x-pack/solutions/security/packages/data_table/components/data_table/utils.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/data_table/utils.ts rename to x-pack/solutions/security/packages/data_table/components/data_table/utils.ts diff --git a/x-pack/packages/security-solution/data_table/components/toolbar/bulk_actions/types.ts b/x-pack/solutions/security/packages/data_table/components/toolbar/bulk_actions/types.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/toolbar/bulk_actions/types.ts rename to x-pack/solutions/security/packages/data_table/components/toolbar/bulk_actions/types.ts diff --git a/x-pack/packages/security-solution/data_table/components/toolbar/unit/index.ts b/x-pack/solutions/security/packages/data_table/components/toolbar/unit/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/toolbar/unit/index.ts rename to x-pack/solutions/security/packages/data_table/components/toolbar/unit/index.ts diff --git a/x-pack/packages/security-solution/data_table/components/toolbar/unit/styles.tsx b/x-pack/solutions/security/packages/data_table/components/toolbar/unit/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/components/toolbar/unit/styles.tsx rename to x-pack/solutions/security/packages/data_table/components/toolbar/unit/styles.tsx diff --git a/x-pack/packages/security-solution/data_table/components/toolbar/unit/translations.ts b/x-pack/solutions/security/packages/data_table/components/toolbar/unit/translations.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/components/toolbar/unit/translations.ts rename to x-pack/solutions/security/packages/data_table/components/toolbar/unit/translations.ts diff --git a/x-pack/packages/security-solution/data_table/hooks/use_selector.tsx b/x-pack/solutions/security/packages/data_table/hooks/use_selector.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/hooks/use_selector.tsx rename to x-pack/solutions/security/packages/data_table/hooks/use_selector.tsx diff --git a/x-pack/packages/security-solution/data_table/index.ts b/x-pack/solutions/security/packages/data_table/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/index.ts rename to x-pack/solutions/security/packages/data_table/index.ts diff --git a/x-pack/packages/security-solution/features/jest.config.js b/x-pack/solutions/security/packages/data_table/jest.config.js similarity index 75% rename from x-pack/packages/security-solution/features/jest.config.js rename to x-pack/solutions/security/packages/data_table/jest.config.js index 47da21e7adff0..5b21976680c68 100644 --- a/x-pack/packages/security-solution/features/jest.config.js +++ b/x-pack/solutions/security/packages/data_table/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/x-pack/packages/security-solution/features'], + roots: ['<rootDir>/x-pack/solutions/security/packages/data_table'], + rootDir: '../../../../..', }; diff --git a/x-pack/packages/security-solution/data_table/kibana.jsonc b/x-pack/solutions/security/packages/data_table/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/data_table/kibana.jsonc rename to x-pack/solutions/security/packages/data_table/kibana.jsonc diff --git a/x-pack/packages/security-solution/data_table/mock/demo_data/endpoint/library_load_event.ts b/x-pack/solutions/security/packages/data_table/mock/demo_data/endpoint/library_load_event.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/demo_data/endpoint/library_load_event.ts rename to x-pack/solutions/security/packages/data_table/mock/demo_data/endpoint/library_load_event.ts diff --git a/x-pack/packages/security-solution/data_table/mock/demo_data/endpoint/process_execution_malware_prevention_alert.ts b/x-pack/solutions/security/packages/data_table/mock/demo_data/endpoint/process_execution_malware_prevention_alert.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/demo_data/endpoint/process_execution_malware_prevention_alert.ts rename to x-pack/solutions/security/packages/data_table/mock/demo_data/endpoint/process_execution_malware_prevention_alert.ts diff --git a/x-pack/packages/security-solution/data_table/mock/demo_data/endpoint/registry_modification_event.ts b/x-pack/solutions/security/packages/data_table/mock/demo_data/endpoint/registry_modification_event.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/demo_data/endpoint/registry_modification_event.ts rename to x-pack/solutions/security/packages/data_table/mock/demo_data/endpoint/registry_modification_event.ts diff --git a/x-pack/packages/security-solution/data_table/mock/demo_data/timeline.ts b/x-pack/solutions/security/packages/data_table/mock/demo_data/timeline.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/demo_data/timeline.ts rename to x-pack/solutions/security/packages/data_table/mock/demo_data/timeline.ts diff --git a/x-pack/packages/security-solution/data_table/mock/global_state.ts b/x-pack/solutions/security/packages/data_table/mock/global_state.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/global_state.ts rename to x-pack/solutions/security/packages/data_table/mock/global_state.ts diff --git a/x-pack/packages/security-solution/data_table/mock/header.ts b/x-pack/solutions/security/packages/data_table/mock/header.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/header.ts rename to x-pack/solutions/security/packages/data_table/mock/header.ts diff --git a/x-pack/packages/security-solution/data_table/mock/mock_local_storage.ts b/x-pack/solutions/security/packages/data_table/mock/mock_local_storage.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/mock_local_storage.ts rename to x-pack/solutions/security/packages/data_table/mock/mock_local_storage.ts diff --git a/x-pack/packages/security-solution/data_table/mock/mock_source.ts b/x-pack/solutions/security/packages/data_table/mock/mock_source.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/mock_source.ts rename to x-pack/solutions/security/packages/data_table/mock/mock_source.ts diff --git a/x-pack/packages/security-solution/data_table/mock/mock_timeline_data.ts b/x-pack/solutions/security/packages/data_table/mock/mock_timeline_data.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/mock_timeline_data.ts rename to x-pack/solutions/security/packages/data_table/mock/mock_timeline_data.ts diff --git a/x-pack/packages/security-solution/data_table/mock/test_providers.tsx b/x-pack/solutions/security/packages/data_table/mock/test_providers.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/mock/test_providers.tsx rename to x-pack/solutions/security/packages/data_table/mock/test_providers.tsx diff --git a/x-pack/packages/security-solution/data_table/package.json b/x-pack/solutions/security/packages/data_table/package.json similarity index 100% rename from x-pack/packages/security-solution/data_table/package.json rename to x-pack/solutions/security/packages/data_table/package.json diff --git a/x-pack/packages/security-solution/data_table/store/data_table/actions.ts b/x-pack/solutions/security/packages/data_table/store/data_table/actions.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/actions.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/actions.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/defaults.ts b/x-pack/solutions/security/packages/data_table/store/data_table/defaults.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/defaults.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/defaults.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/helpers.test.tsx b/x-pack/solutions/security/packages/data_table/store/data_table/helpers.test.tsx similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/helpers.test.tsx rename to x-pack/solutions/security/packages/data_table/store/data_table/helpers.test.tsx diff --git a/x-pack/packages/security-solution/data_table/store/data_table/helpers.ts b/x-pack/solutions/security/packages/data_table/store/data_table/helpers.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/helpers.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/helpers.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/index.ts b/x-pack/solutions/security/packages/data_table/store/data_table/index.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/index.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/index.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/inputs.ts b/x-pack/solutions/security/packages/data_table/store/data_table/inputs.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/inputs.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/inputs.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/model.ts b/x-pack/solutions/security/packages/data_table/store/data_table/model.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/model.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/model.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/reducer.ts b/x-pack/solutions/security/packages/data_table/store/data_table/reducer.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/reducer.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/reducer.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/selectors.ts b/x-pack/solutions/security/packages/data_table/store/data_table/selectors.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/selectors.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/selectors.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/translations.ts b/x-pack/solutions/security/packages/data_table/store/data_table/translations.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/translations.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/translations.ts diff --git a/x-pack/packages/security-solution/data_table/store/data_table/types.ts b/x-pack/solutions/security/packages/data_table/store/data_table/types.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/store/data_table/types.ts rename to x-pack/solutions/security/packages/data_table/store/data_table/types.ts diff --git a/x-pack/packages/security-solution/data_table/tsconfig.json b/x-pack/solutions/security/packages/data_table/tsconfig.json similarity index 92% rename from x-pack/packages/security-solution/data_table/tsconfig.json rename to x-pack/solutions/security/packages/data_table/tsconfig.json index 9fab7f29b9aab..d44a419c3ba4e 100644 --- a/x-pack/packages/security-solution/data_table/tsconfig.json +++ b/x-pack/solutions/security/packages/data_table/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": ["jest", "node", "react"] diff --git a/x-pack/packages/security-solution/data_table/utils/use_mount_appended.ts b/x-pack/solutions/security/packages/data_table/utils/use_mount_appended.ts similarity index 100% rename from x-pack/packages/security-solution/data_table/utils/use_mount_appended.ts rename to x-pack/solutions/security/packages/data_table/utils/use_mount_appended.ts diff --git a/x-pack/packages/security-solution/distribution_bar/README.md b/x-pack/solutions/security/packages/distribution_bar/README.md similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/README.md rename to x-pack/solutions/security/packages/distribution_bar/README.md diff --git a/x-pack/packages/security-solution/distribution_bar/index.ts b/x-pack/solutions/security/packages/distribution_bar/index.ts similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/index.ts rename to x-pack/solutions/security/packages/distribution_bar/index.ts diff --git a/x-pack/packages/security-solution/distribution_bar/jest.config.js b/x-pack/solutions/security/packages/distribution_bar/jest.config.js similarity index 74% rename from x-pack/packages/security-solution/distribution_bar/jest.config.js rename to x-pack/solutions/security/packages/distribution_bar/jest.config.js index efe091d25afdd..296ff5369079c 100644 --- a/x-pack/packages/security-solution/distribution_bar/jest.config.js +++ b/x-pack/solutions/security/packages/distribution_bar/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - roots: ['<rootDir>/x-pack/packages/security-solution/distribution_bar'], - rootDir: '../../../..', + roots: ['<rootDir>/x-pack/solutions/security/packages/distribution_bar'], + rootDir: '../../../../..', }; diff --git a/x-pack/packages/security-solution/distribution_bar/kibana.jsonc b/x-pack/solutions/security/packages/distribution_bar/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/kibana.jsonc rename to x-pack/solutions/security/packages/distribution_bar/kibana.jsonc diff --git a/x-pack/packages/security-solution/distribution_bar/package.json b/x-pack/solutions/security/packages/distribution_bar/package.json similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/package.json rename to x-pack/solutions/security/packages/distribution_bar/package.json diff --git a/x-pack/packages/security-solution/distribution_bar/src/distribution_bar.stories.tsx b/x-pack/solutions/security/packages/distribution_bar/src/distribution_bar.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/src/distribution_bar.stories.tsx rename to x-pack/solutions/security/packages/distribution_bar/src/distribution_bar.stories.tsx diff --git a/x-pack/packages/security-solution/distribution_bar/src/distribution_bar.test.tsx b/x-pack/solutions/security/packages/distribution_bar/src/distribution_bar.test.tsx similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/src/distribution_bar.test.tsx rename to x-pack/solutions/security/packages/distribution_bar/src/distribution_bar.test.tsx diff --git a/x-pack/packages/security-solution/distribution_bar/src/distribution_bar.tsx b/x-pack/solutions/security/packages/distribution_bar/src/distribution_bar.tsx similarity index 100% rename from x-pack/packages/security-solution/distribution_bar/src/distribution_bar.tsx rename to x-pack/solutions/security/packages/distribution_bar/src/distribution_bar.tsx diff --git a/x-pack/packages/security-solution/distribution_bar/tsconfig.json b/x-pack/solutions/security/packages/distribution_bar/tsconfig.json similarity index 87% rename from x-pack/packages/security-solution/distribution_bar/tsconfig.json rename to x-pack/solutions/security/packages/distribution_bar/tsconfig.json index b87424ce11016..277fe500caa48 100644 --- a/x-pack/packages/security-solution/distribution_bar/tsconfig.json +++ b/x-pack/solutions/security/packages/distribution_bar/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/README.md b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/README.md similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/README.md rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/README.md diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/hooks/use_add_to_new_case/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/add_to_new_case/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/chat/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/copy_to_clipboard/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/actions/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/actions/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/indices_check_context/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/indices_check_context/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/indices_check_context/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/indices_check_context/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/results_rollup_context/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/results_rollup_context/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/results_rollup_context/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/contexts/results_rollup_context/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_context/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/ilm_phases_empty_prompt/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/hooks/use_is_historical_results_tour_active/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/hooks/use_is_historical_results_tour_active/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/hooks/use_is_historical_results_tour_active/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/hooks/use_is_historical_results_tour_active/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/contexts/historical_results_context/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/error_empty_prompt/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/historical_results_tour/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/reducers/fetch_historical_results_reducer.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_historical_results/utils/fetch_historical_results.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_ilm_explain/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/hooks/use_stats/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_fields_tabs/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/check_success_empty_prompt/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/compare_fields_table/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/ecs_allowed_values/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_body/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/empty_prompt_title/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/historical_check_fields/utils/get_incompatible_and_same_family_fields_from_historical_result.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/legacy_historical_check_fields/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/historical_result/utils/is_non_legacy_historical_result.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/historical_results_list/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_date_picker/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_date_picker/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_date_picker/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_date_picker/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_outcome_filter/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_outcome_filter/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_outcome_filter/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_outcome_filter/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/hooks/use_historical_results_pagination/reducers/historical_results_pagination_reducer.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/reducers/fetch_historical_results_query_reducer.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/historical_results/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/hooks/use_current_window_width/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_callout/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/incompatible_tab/utils/get_incompatible_table_columns.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_invalid_values/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/index_stats_panel/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/all_tab/utils/get_all_table_columns.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/custom_callout/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/get_custom_table_columns.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/custom_tab/utils/markdown.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/ecs_compliant_tab/utils/get_ecs_compliant_table_columns.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/sticky_actions/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/sticky_actions/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/sticky_actions/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/sticky_actions/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/get_ecs_compliant_badge_color.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/latest_results/latest_check_fields/utils/is_timestamp_field_missing.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_callout/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/get_same_family_table_columns.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/same_family_tab/utils/markdown.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_check_flyout/utils/get_formatted_check_time.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/index_result_badge/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/loading_empty_prompt/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/loading_empty_prompt/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/loading_empty_prompt/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/loading_empty_prompt/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/ilm_phase_counts/utils/get_pattern_ilm_phase_description.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/get_pattern_result_tooltip.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/pattern_label/utils/show_result.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/pattern_summary/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/remote_clusters_callout/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/columns.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/summary_table/utils/get_show_pagination.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_check_text_color.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_index_result_tooltip.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/get_page_index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/ilm_explain.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_index_names.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/should_create_pattern_rollup.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/indices_details/pattern/utils/stats.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/chart_legend_item/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/chart_legend_item/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/chart_legend_item/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/chart_legend_item/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/no_data/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_fill_color.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_layers_multi_dimensional.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_legend_items.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/get_path_to_flattened_bucket_map.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/storage_treemap/utils/stats.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_details/storage_details/utils/get_flattened_buckets.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/ilm_phase_filter/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_all/utils/get_all_indices_to_check.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/helpers.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/errors_viewer/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/errors_popover/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/check_status/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/get_error_summaries.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/data_quality_summary/summary_actions/utils/markdown.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_abort_controller_ref/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/reducer.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/reducer.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/reducer.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/reducer.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_indices_check/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_is_mounted_ref/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/constants.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/constants.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/constants.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/constants.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/hooks/use_stored_pattern_results/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/get_pattern_rollups_with_latest_check_result.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/metadata.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/stats.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/hooks/use_results_rollup/utils/storage.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/allowed_values/mock_allowed_values.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/allowed_values/mock_allowed_values.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/allowed_values/mock_allowed_values.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/allowed_values/mock_allowed_values.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/data_quality_check_result/mock_index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/data_quality_check_result/mock_index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/data_quality_check_result/mock_index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/data_quality_check_result/mock_index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/enriched_field_metadata/mock_enriched_field_metadata.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/enriched_field_metadata/mock_enriched_field_metadata.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/enriched_field_metadata/mock_enriched_field_metadata.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/enriched_field_metadata/mock_enriched_field_metadata.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/historical_results/mock_historical_results_response.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/historical_results/mock_historical_results_response.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/historical_results/mock_historical_results_response.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/historical_results/mock_historical_results_response.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/ilm_explain/mock_ilm_explain.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/ilm_explain/mock_ilm_explain.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/ilm_explain/mock_ilm_explain.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/ilm_explain/mock_ilm_explain.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/indices_get_mapping_index_mapping_record/mock_indices_get_mapping_index_mapping_record.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/indices_get_mapping_index_mapping_record/mock_indices_get_mapping_index_mapping_record.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/indices_get_mapping_index_mapping_record/mock_indices_get_mapping_index_mapping_record.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/indices_get_mapping_index_mapping_record/mock_indices_get_mapping_index_mapping_record.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_properties/mock_mappings_properties.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_properties/mock_mappings_properties.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_properties/mock_mappings_properties.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_properties/mock_mappings_properties.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_response/mock_mappings_response.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_response/mock_mappings_response.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_response/mock_mappings_response.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/mappings_response/mock_mappings_response.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata_with_same_family.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata_with_same_family.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata_with_same_family.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/partitioned_field_metadata/mock_partitioned_field_metadata_with_same_family.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_alerts_pattern_rollup.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_alerts_pattern_rollup.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_alerts_pattern_rollup.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_alerts_pattern_rollup.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_auditbeat_pattern_rollup.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_auditbeat_pattern_rollup.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_auditbeat_pattern_rollup.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_auditbeat_pattern_rollup.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_packetbeat_pattern_rollup.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_packetbeat_pattern_rollup.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_packetbeat_pattern_rollup.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/pattern_rollup/mock_packetbeat_pattern_rollup.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_auditbeat_index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_auditbeat_index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_auditbeat_index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_auditbeat_index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_packetbeat_index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_packetbeat_index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_packetbeat_index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/stats/mock_stats_packetbeat_index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/test_providers.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/test_providers.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/test_providers.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/test_providers.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/format.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/format.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/format.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/format.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_data_quality_context_props.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_data_quality_context_props.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_data_quality_context_props.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_data_quality_context_props.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_indices_check_context_props.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_indices_check_context_props.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_indices_check_context_props.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_indices_check_context_props.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_results_rollup_context_props.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_results_rollup_context_props.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_results_rollup_context_props.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/test_providers/utils/get_merged_results_rollup_context_props.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/unallowed_values/mock_unallowed_values.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/unallowed_values/mock_unallowed_values.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/unallowed_values/mock_unallowed_values.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/unallowed_values/mock_unallowed_values.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/use_results_rollup/mock_use_results_rollup.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/use_results_rollup/mock_use_results_rollup.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/mock/use_results_rollup/mock_use_results_rollup.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/mock/use_results_rollup/mock_use_results_rollup.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stat/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stat_label/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stat_label/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stat_label/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stat_label/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stats_rollup/index.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/generate_historical_results_stub/index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/generate_historical_results_stub/index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/generate_historical_results_stub/index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/generate_historical_results_stub/index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_check_state_stub/index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_check_state_stub/index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_check_state_stub/index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_check_state_stub/index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_historical_result_stub/index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_historical_result_stub/index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_historical_result_stub/index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_historical_result_stub/index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_pattern_rollup_stub/index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_pattern_rollup_stub/index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_pattern_rollup_stub/index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/stub/get_pattern_rollup_stub/index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/styles.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/styles.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/styles.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/styles.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/translations.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/translations.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/translations.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/translations.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/types.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/types.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/types.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/types.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/check_index.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_mappings.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/fetch_unallowed_values.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_ilm_phase_description.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_incompatible_stat_badge_color.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_summary_table_items.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_value_request_items.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_value_request_items.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_value_request_items.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_value_request_items.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_values_request_items.test.tsx b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_values_request_items.test.tsx similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_values_request_items.test.tsx rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/get_unallowed_values_request_items.test.tsx diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/markdown.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/metadata.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.test.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.test.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.test.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.test.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/data_quality_panel/utils/stats.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/index.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/index.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/index.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/index.ts diff --git a/x-pack/solutions/security/packages/ecs_data_quality_dashboard/jest.config.js b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/jest.config.js new file mode 100644 index 0000000000000..773d813a166b9 --- /dev/null +++ b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/jest.config.js @@ -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. + */ + +module.exports = { + coverageDirectory: + '<rootDir>/target/kibana-coverage/jest/x-pack/solutions/security/packages/ecs_data_quality_dashboard_impl', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/**/*.{ts,tsx}', + '!<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/**/{__test__,__snapshots__,__examples__,*mock*,stub,tests,test_helpers,integration_tests,types}/**/*', + '!<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/**/*mock*.{ts,tsx}', + '!<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/**/*.test.{ts,tsx}', + '!<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/**/*.d.ts', + '!<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/impl/**/*.config.ts', + ], + preset: '@kbn/test', + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard'], + setupFilesAfterEnv: [ + '<rootDir>/x-pack/solutions/security/packages/ecs_data_quality_dashboard/setup_tests.ts', + ], +}; diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/kibana.jsonc b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/kibana.jsonc rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/kibana.jsonc diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/package.json b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/package.json similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/package.json rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/package.json diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/setup_tests.ts b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/setup_tests.ts similarity index 100% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/setup_tests.ts rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/setup_tests.ts diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/tsconfig.json b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/tsconfig.json similarity index 91% rename from x-pack/packages/security-solution/ecs_data_quality_dashboard/tsconfig.json rename to x-pack/solutions/security/packages/ecs_data_quality_dashboard/tsconfig.json index e42a916396971..2d76e9b8b0b4b 100644 --- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/tsconfig.json +++ b/x-pack/solutions/security/packages/ecs_data_quality_dashboard/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/security-solution/features/README.mdx b/x-pack/solutions/security/packages/features/README.mdx similarity index 100% rename from x-pack/packages/security-solution/features/README.mdx rename to x-pack/solutions/security/packages/features/README.mdx diff --git a/x-pack/packages/security-solution/features/config.ts b/x-pack/solutions/security/packages/features/config.ts similarity index 100% rename from x-pack/packages/security-solution/features/config.ts rename to x-pack/solutions/security/packages/features/config.ts diff --git a/x-pack/packages/security-solution/features/index.ts b/x-pack/solutions/security/packages/features/index.ts similarity index 100% rename from x-pack/packages/security-solution/features/index.ts rename to x-pack/solutions/security/packages/features/index.ts diff --git a/x-pack/packages/security-solution/upselling/jest.config.js b/x-pack/solutions/security/packages/features/jest.config.js similarity index 76% rename from x-pack/packages/security-solution/upselling/jest.config.js rename to x-pack/solutions/security/packages/features/jest.config.js index 014db69e5a69d..8179ac021e815 100644 --- a/x-pack/packages/security-solution/upselling/jest.config.js +++ b/x-pack/solutions/security/packages/features/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/x-pack/packages/security-solution/upselling'], + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/solutions/security/packages/features'], }; diff --git a/x-pack/packages/security-solution/features/keys.ts b/x-pack/solutions/security/packages/features/keys.ts similarity index 100% rename from x-pack/packages/security-solution/features/keys.ts rename to x-pack/solutions/security/packages/features/keys.ts diff --git a/x-pack/packages/security-solution/features/kibana.jsonc b/x-pack/solutions/security/packages/features/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/features/kibana.jsonc rename to x-pack/solutions/security/packages/features/kibana.jsonc diff --git a/x-pack/packages/security-solution/features/package.json b/x-pack/solutions/security/packages/features/package.json similarity index 100% rename from x-pack/packages/security-solution/features/package.json rename to x-pack/solutions/security/packages/features/package.json diff --git a/x-pack/packages/security-solution/features/privileges.ts b/x-pack/solutions/security/packages/features/privileges.ts similarity index 100% rename from x-pack/packages/security-solution/features/privileges.ts rename to x-pack/solutions/security/packages/features/privileges.ts diff --git a/x-pack/packages/security-solution/features/product_features.ts b/x-pack/solutions/security/packages/features/product_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/product_features.ts rename to x-pack/solutions/security/packages/features/product_features.ts diff --git a/x-pack/packages/security-solution/features/src/assistant/index.ts b/x-pack/solutions/security/packages/features/src/assistant/index.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/assistant/index.ts rename to x-pack/solutions/security/packages/features/src/assistant/index.ts diff --git a/x-pack/packages/security-solution/features/src/assistant/kibana_features.ts b/x-pack/solutions/security/packages/features/src/assistant/kibana_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/assistant/kibana_features.ts rename to x-pack/solutions/security/packages/features/src/assistant/kibana_features.ts diff --git a/x-pack/packages/security-solution/features/src/assistant/kibana_sub_features.ts b/x-pack/solutions/security/packages/features/src/assistant/kibana_sub_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/assistant/kibana_sub_features.ts rename to x-pack/solutions/security/packages/features/src/assistant/kibana_sub_features.ts diff --git a/x-pack/packages/security-solution/features/src/assistant/product_feature_config.ts b/x-pack/solutions/security/packages/features/src/assistant/product_feature_config.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/assistant/product_feature_config.ts rename to x-pack/solutions/security/packages/features/src/assistant/product_feature_config.ts diff --git a/x-pack/packages/security-solution/features/src/attack_discovery/index.ts b/x-pack/solutions/security/packages/features/src/attack_discovery/index.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/attack_discovery/index.ts rename to x-pack/solutions/security/packages/features/src/attack_discovery/index.ts diff --git a/x-pack/packages/security-solution/features/src/attack_discovery/kibana_features.ts b/x-pack/solutions/security/packages/features/src/attack_discovery/kibana_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/attack_discovery/kibana_features.ts rename to x-pack/solutions/security/packages/features/src/attack_discovery/kibana_features.ts diff --git a/x-pack/packages/security-solution/features/src/attack_discovery/product_feature_config.ts b/x-pack/solutions/security/packages/features/src/attack_discovery/product_feature_config.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/attack_discovery/product_feature_config.ts rename to x-pack/solutions/security/packages/features/src/attack_discovery/product_feature_config.ts diff --git a/x-pack/packages/security-solution/features/src/cases/index.ts b/x-pack/solutions/security/packages/features/src/cases/index.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/index.ts rename to x-pack/solutions/security/packages/features/src/cases/index.ts diff --git a/x-pack/packages/security-solution/features/src/cases/product_feature_config.ts b/x-pack/solutions/security/packages/features/src/cases/product_feature_config.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/product_feature_config.ts rename to x-pack/solutions/security/packages/features/src/cases/product_feature_config.ts diff --git a/x-pack/packages/security-solution/features/src/cases/types.ts b/x-pack/solutions/security/packages/features/src/cases/types.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/types.ts rename to x-pack/solutions/security/packages/features/src/cases/types.ts diff --git a/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_features.ts b/x-pack/solutions/security/packages/features/src/cases/v1_features/kibana_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/v1_features/kibana_features.ts rename to x-pack/solutions/security/packages/features/src/cases/v1_features/kibana_features.ts diff --git a/x-pack/packages/security-solution/features/src/cases/v1_features/kibana_sub_features.ts b/x-pack/solutions/security/packages/features/src/cases/v1_features/kibana_sub_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/v1_features/kibana_sub_features.ts rename to x-pack/solutions/security/packages/features/src/cases/v1_features/kibana_sub_features.ts diff --git a/x-pack/packages/security-solution/features/src/cases/v1_features/types.ts b/x-pack/solutions/security/packages/features/src/cases/v1_features/types.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/v1_features/types.ts rename to x-pack/solutions/security/packages/features/src/cases/v1_features/types.ts diff --git a/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_features.ts b/x-pack/solutions/security/packages/features/src/cases/v2_features/kibana_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/v2_features/kibana_features.ts rename to x-pack/solutions/security/packages/features/src/cases/v2_features/kibana_features.ts diff --git a/x-pack/packages/security-solution/features/src/cases/v2_features/kibana_sub_features.ts b/x-pack/solutions/security/packages/features/src/cases/v2_features/kibana_sub_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/cases/v2_features/kibana_sub_features.ts rename to x-pack/solutions/security/packages/features/src/cases/v2_features/kibana_sub_features.ts diff --git a/x-pack/packages/security-solution/features/src/constants.ts b/x-pack/solutions/security/packages/features/src/constants.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/constants.ts rename to x-pack/solutions/security/packages/features/src/constants.ts diff --git a/x-pack/packages/security-solution/features/src/helpers.ts b/x-pack/solutions/security/packages/features/src/helpers.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/helpers.ts rename to x-pack/solutions/security/packages/features/src/helpers.ts diff --git a/x-pack/packages/security-solution/features/src/product_features_keys.ts b/x-pack/solutions/security/packages/features/src/product_features_keys.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/product_features_keys.ts rename to x-pack/solutions/security/packages/features/src/product_features_keys.ts diff --git a/x-pack/packages/security-solution/features/src/product_features_privileges.ts b/x-pack/solutions/security/packages/features/src/product_features_privileges.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/product_features_privileges.ts rename to x-pack/solutions/security/packages/features/src/product_features_privileges.ts diff --git a/x-pack/packages/security-solution/features/src/security/index.ts b/x-pack/solutions/security/packages/features/src/security/index.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/security/index.ts rename to x-pack/solutions/security/packages/features/src/security/index.ts diff --git a/x-pack/packages/security-solution/features/src/security/kibana_features.ts b/x-pack/solutions/security/packages/features/src/security/kibana_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/security/kibana_features.ts rename to x-pack/solutions/security/packages/features/src/security/kibana_features.ts diff --git a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts b/x-pack/solutions/security/packages/features/src/security/kibana_sub_features.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts rename to x-pack/solutions/security/packages/features/src/security/kibana_sub_features.ts diff --git a/x-pack/packages/security-solution/features/src/security/product_feature_config.ts b/x-pack/solutions/security/packages/features/src/security/product_feature_config.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/security/product_feature_config.ts rename to x-pack/solutions/security/packages/features/src/security/product_feature_config.ts diff --git a/x-pack/packages/security-solution/features/src/security/types.ts b/x-pack/solutions/security/packages/features/src/security/types.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/security/types.ts rename to x-pack/solutions/security/packages/features/src/security/types.ts diff --git a/x-pack/packages/security-solution/features/src/types.ts b/x-pack/solutions/security/packages/features/src/types.ts similarity index 100% rename from x-pack/packages/security-solution/features/src/types.ts rename to x-pack/solutions/security/packages/features/src/types.ts diff --git a/x-pack/packages/security-solution/features/tsconfig.json b/x-pack/solutions/security/packages/features/tsconfig.json similarity index 89% rename from x-pack/packages/security-solution/features/tsconfig.json rename to x-pack/solutions/security/packages/features/tsconfig.json index 2c153f831721d..bc415fbae622b 100644 --- a/x-pack/packages/security-solution/features/tsconfig.json +++ b/x-pack/solutions/security/packages/features/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/security-solution/navigation/README.mdx b/x-pack/solutions/security/packages/navigation/README.mdx similarity index 100% rename from x-pack/packages/security-solution/navigation/README.mdx rename to x-pack/solutions/security/packages/navigation/README.mdx diff --git a/x-pack/packages/security-solution/navigation/index.ts b/x-pack/solutions/security/packages/navigation/index.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/index.ts rename to x-pack/solutions/security/packages/navigation/index.ts diff --git a/x-pack/packages/security-solution/data_table/jest.config.js b/x-pack/solutions/security/packages/navigation/jest.config.js similarity index 75% rename from x-pack/packages/security-solution/data_table/jest.config.js rename to x-pack/solutions/security/packages/navigation/jest.config.js index 38f769e20277c..e452a9a064f1c 100644 --- a/x-pack/packages/security-solution/data_table/jest.config.js +++ b/x-pack/solutions/security/packages/navigation/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - roots: ['<rootDir>/x-pack/packages/security-solution/data_table'], - rootDir: '../../../..', + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/solutions/security/packages/navigation'], }; diff --git a/x-pack/packages/security-solution/navigation/kibana.jsonc b/x-pack/solutions/security/packages/navigation/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/navigation/kibana.jsonc rename to x-pack/solutions/security/packages/navigation/kibana.jsonc diff --git a/x-pack/packages/security-solution/navigation/landing_links.ts b/x-pack/solutions/security/packages/navigation/landing_links.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/landing_links.ts rename to x-pack/solutions/security/packages/navigation/landing_links.ts diff --git a/x-pack/packages/security-solution/navigation/links.ts b/x-pack/solutions/security/packages/navigation/links.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/links.ts rename to x-pack/solutions/security/packages/navigation/links.ts diff --git a/x-pack/packages/security-solution/navigation/mocks/context.ts b/x-pack/solutions/security/packages/navigation/mocks/context.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/mocks/context.ts rename to x-pack/solutions/security/packages/navigation/mocks/context.ts diff --git a/x-pack/packages/security-solution/navigation/mocks/navigation.ts b/x-pack/solutions/security/packages/navigation/mocks/navigation.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/mocks/navigation.ts rename to x-pack/solutions/security/packages/navigation/mocks/navigation.ts diff --git a/x-pack/packages/security-solution/navigation/package.json b/x-pack/solutions/security/packages/navigation/package.json similarity index 100% rename from x-pack/packages/security-solution/navigation/package.json rename to x-pack/solutions/security/packages/navigation/package.json diff --git a/x-pack/packages/security-solution/navigation/src/__mocks__/context.tsx b/x-pack/solutions/security/packages/navigation/src/__mocks__/context.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/__mocks__/context.tsx rename to x-pack/solutions/security/packages/navigation/src/__mocks__/context.tsx diff --git a/x-pack/packages/security-solution/navigation/src/__mocks__/navigation.ts b/x-pack/solutions/security/packages/navigation/src/__mocks__/navigation.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/__mocks__/navigation.ts rename to x-pack/solutions/security/packages/navigation/src/__mocks__/navigation.ts diff --git a/x-pack/packages/security-solution/navigation/src/constants.ts b/x-pack/solutions/security/packages/navigation/src/constants.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/constants.ts rename to x-pack/solutions/security/packages/navigation/src/constants.ts diff --git a/x-pack/packages/security-solution/navigation/src/context.tsx b/x-pack/solutions/security/packages/navigation/src/context.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/context.tsx rename to x-pack/solutions/security/packages/navigation/src/context.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/beta_badge.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/beta_badge.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/beta_badge.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/beta_badge.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/index.ts b/x-pack/solutions/security/packages/navigation/src/landing_links/index.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/index.ts rename to x-pack/solutions/security/packages/navigation/src/landing_links/index.ts diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories_goups.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories_goups.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories_goups.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories_goups.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories_groups.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories_groups.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories_groups.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories_groups.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories_groups.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories_groups.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_categories_groups.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_categories_groups.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_groups.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_groups.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_groups.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_groups.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_groups.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_groups.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_groups.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_groups.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_groups.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_groups.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_icons_groups.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_icons_groups.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_image_card.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_image_card.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_image_card.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_image_card.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_image_card.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_image_card.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_image_card.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_image_card.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_image_card.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_image_card.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_image_card.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_image_card.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images_cards.stories.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images_cards.stories.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images_cards.stories.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images_cards.stories.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images_cards.test.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images_cards.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images_cards.test.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images_cards.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images_cards.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images_cards.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/landing_links_images_cards.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/landing_links_images_cards.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/lazy.tsx b/x-pack/solutions/security/packages/navigation/src/landing_links/lazy.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/lazy.tsx rename to x-pack/solutions/security/packages/navigation/src/landing_links/lazy.tsx diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/translations.ts b/x-pack/solutions/security/packages/navigation/src/landing_links/translations.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/translations.ts rename to x-pack/solutions/security/packages/navigation/src/landing_links/translations.ts diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/utils.test.ts b/x-pack/solutions/security/packages/navigation/src/landing_links/utils.test.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/utils.test.ts rename to x-pack/solutions/security/packages/navigation/src/landing_links/utils.test.ts diff --git a/x-pack/packages/security-solution/navigation/src/landing_links/utils.ts b/x-pack/solutions/security/packages/navigation/src/landing_links/utils.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/landing_links/utils.ts rename to x-pack/solutions/security/packages/navigation/src/landing_links/utils.ts diff --git a/x-pack/packages/security-solution/navigation/src/links.test.tsx b/x-pack/solutions/security/packages/navigation/src/links.test.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/links.test.tsx rename to x-pack/solutions/security/packages/navigation/src/links.test.tsx diff --git a/x-pack/packages/security-solution/navigation/src/links.tsx b/x-pack/solutions/security/packages/navigation/src/links.tsx similarity index 100% rename from x-pack/packages/security-solution/navigation/src/links.tsx rename to x-pack/solutions/security/packages/navigation/src/links.tsx diff --git a/x-pack/packages/security-solution/navigation/src/navigation.test.ts b/x-pack/solutions/security/packages/navigation/src/navigation.test.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/navigation.test.ts rename to x-pack/solutions/security/packages/navigation/src/navigation.test.ts diff --git a/x-pack/packages/security-solution/navigation/src/navigation.ts b/x-pack/solutions/security/packages/navigation/src/navigation.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/navigation.ts rename to x-pack/solutions/security/packages/navigation/src/navigation.ts diff --git a/x-pack/packages/security-solution/navigation/src/types.ts b/x-pack/solutions/security/packages/navigation/src/types.ts similarity index 100% rename from x-pack/packages/security-solution/navigation/src/types.ts rename to x-pack/solutions/security/packages/navigation/src/types.ts diff --git a/x-pack/packages/security-solution/navigation/tsconfig.json b/x-pack/solutions/security/packages/navigation/tsconfig.json similarity index 88% rename from x-pack/packages/security-solution/navigation/tsconfig.json rename to x-pack/solutions/security/packages/navigation/tsconfig.json index a0ba8fb180bfb..41296e15768c5 100644 --- a/x-pack/packages/security-solution/navigation/tsconfig.json +++ b/x-pack/solutions/security/packages/navigation/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/security-solution/side_nav/README.mdx b/x-pack/solutions/security/packages/side_nav/README.mdx similarity index 100% rename from x-pack/packages/security-solution/side_nav/README.mdx rename to x-pack/solutions/security/packages/side_nav/README.mdx diff --git a/x-pack/packages/security-solution/side_nav/index.ts b/x-pack/solutions/security/packages/side_nav/index.ts similarity index 100% rename from x-pack/packages/security-solution/side_nav/index.ts rename to x-pack/solutions/security/packages/side_nav/index.ts diff --git a/x-pack/packages/security-solution/navigation/jest.config.js b/x-pack/solutions/security/packages/side_nav/jest.config.js similarity index 75% rename from x-pack/packages/security-solution/navigation/jest.config.js rename to x-pack/solutions/security/packages/side_nav/jest.config.js index a150e2a7b4c9c..11d774a650450 100644 --- a/x-pack/packages/security-solution/navigation/jest.config.js +++ b/x-pack/solutions/security/packages/side_nav/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/x-pack/packages/security-solution/navigation'], + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/solutions/security/packages/side_nav'], }; diff --git a/x-pack/packages/security-solution/side_nav/kibana.jsonc b/x-pack/solutions/security/packages/side_nav/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/side_nav/kibana.jsonc rename to x-pack/solutions/security/packages/side_nav/kibana.jsonc diff --git a/x-pack/packages/security-solution/side_nav/package.json b/x-pack/solutions/security/packages/side_nav/package.json similarity index 100% rename from x-pack/packages/security-solution/side_nav/package.json rename to x-pack/solutions/security/packages/side_nav/package.json diff --git a/x-pack/packages/security-solution/side_nav/panel.ts b/x-pack/solutions/security/packages/side_nav/panel.ts similarity index 100% rename from x-pack/packages/security-solution/side_nav/panel.ts rename to x-pack/solutions/security/packages/side_nav/panel.ts diff --git a/x-pack/packages/security-solution/side_nav/src/beta_badge.tsx b/x-pack/solutions/security/packages/side_nav/src/beta_badge.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/beta_badge.tsx rename to x-pack/solutions/security/packages/side_nav/src/beta_badge.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/index.tsx b/x-pack/solutions/security/packages/side_nav/src/index.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/index.tsx rename to x-pack/solutions/security/packages/side_nav/src/index.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav.stories.tsx b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav.stories.tsx similarity index 99% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav.stories.tsx rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav.stories.tsx index 4ac035f717c83..d67e36949ae98 100644 --- a/x-pack/packages/security-solution/side_nav/src/solution_side_nav.stories.tsx +++ b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { SolutionNav } from '@kbn/shared-ux-page-solution-nav'; import { LinkCategoryType } from '@kbn/security-solution-navigation'; -import readme from '../../README.mdx'; +import readme from '../README.mdx'; import { SolutionSideNav as SolutionSideNavComponent, type SolutionSideNavProps, diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav.styles.ts b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav.styles.ts similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav.styles.ts rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav.styles.ts diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav.test.tsx b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav.test.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav.test.tsx rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav.test.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav.tsx b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav.tsx rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav_panel.styles.ts b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav_panel.styles.ts similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav_panel.styles.ts rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav_panel.styles.ts diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav_panel.test.tsx b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav_panel.test.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav_panel.test.tsx rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav_panel.test.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/solution_side_nav_panel.tsx b/x-pack/solutions/security/packages/side_nav/src/solution_side_nav_panel.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/solution_side_nav_panel.tsx rename to x-pack/solutions/security/packages/side_nav/src/solution_side_nav_panel.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/telemetry/const.ts b/x-pack/solutions/security/packages/side_nav/src/telemetry/const.ts similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/telemetry/const.ts rename to x-pack/solutions/security/packages/side_nav/src/telemetry/const.ts diff --git a/x-pack/packages/security-solution/side_nav/src/telemetry/telemetry_context.tsx b/x-pack/solutions/security/packages/side_nav/src/telemetry/telemetry_context.tsx similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/telemetry/telemetry_context.tsx rename to x-pack/solutions/security/packages/side_nav/src/telemetry/telemetry_context.tsx diff --git a/x-pack/packages/security-solution/side_nav/src/types.ts b/x-pack/solutions/security/packages/side_nav/src/types.ts similarity index 100% rename from x-pack/packages/security-solution/side_nav/src/types.ts rename to x-pack/solutions/security/packages/side_nav/src/types.ts diff --git a/x-pack/packages/security-solution/side_nav/tsconfig.json b/x-pack/solutions/security/packages/side_nav/tsconfig.json similarity index 90% rename from x-pack/packages/security-solution/side_nav/tsconfig.json rename to x-pack/solutions/security/packages/side_nav/tsconfig.json index 4468c671f4351..12c35d948e0d0 100644 --- a/x-pack/packages/security-solution/side_nav/tsconfig.json +++ b/x-pack/solutions/security/packages/side_nav/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/security-solution/storybook/config/README.mdx b/x-pack/solutions/security/packages/storybook/config/README.mdx similarity index 100% rename from x-pack/packages/security-solution/storybook/config/README.mdx rename to x-pack/solutions/security/packages/storybook/config/README.mdx diff --git a/x-pack/packages/security-solution/storybook/config/constants.ts b/x-pack/solutions/security/packages/storybook/config/constants.ts similarity index 100% rename from x-pack/packages/security-solution/storybook/config/constants.ts rename to x-pack/solutions/security/packages/storybook/config/constants.ts diff --git a/x-pack/packages/security-solution/storybook/config/index.ts b/x-pack/solutions/security/packages/storybook/config/index.ts similarity index 100% rename from x-pack/packages/security-solution/storybook/config/index.ts rename to x-pack/solutions/security/packages/storybook/config/index.ts diff --git a/x-pack/solutions/security/packages/storybook/config/kibana.jsonc b/x-pack/solutions/security/packages/storybook/config/kibana.jsonc new file mode 100644 index 0000000000000..141b69563ed37 --- /dev/null +++ b/x-pack/solutions/security/packages/storybook/config/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/security-solution-storybook-config", + "owner": "@elastic/security-threat-hunting-explore", + "group": "security", + "visibility": "private" +} diff --git a/x-pack/packages/security-solution/storybook/config/main.ts b/x-pack/solutions/security/packages/storybook/config/main.ts similarity index 88% rename from x-pack/packages/security-solution/storybook/config/main.ts rename to x-pack/solutions/security/packages/storybook/config/main.ts index 4e7fca030c2f6..8fd00f77083a8 100644 --- a/x-pack/packages/security-solution/storybook/config/main.ts +++ b/x-pack/solutions/security/packages/storybook/config/main.ts @@ -9,7 +9,7 @@ import { defaultConfig } from '@kbn/storybook'; module.exports = { ...defaultConfig, - stories: ['../../**/*.stories.+(tsx|mdx)'], + stories: ['../../../**/*.stories.+(tsx|mdx)'], reactOptions: { strictMode: true, }, diff --git a/x-pack/packages/security-solution/storybook/config/manager.ts b/x-pack/solutions/security/packages/storybook/config/manager.ts similarity index 100% rename from x-pack/packages/security-solution/storybook/config/manager.ts rename to x-pack/solutions/security/packages/storybook/config/manager.ts diff --git a/x-pack/packages/security-solution/storybook/config/package.json b/x-pack/solutions/security/packages/storybook/config/package.json similarity index 100% rename from x-pack/packages/security-solution/storybook/config/package.json rename to x-pack/solutions/security/packages/storybook/config/package.json diff --git a/x-pack/packages/security-solution/storybook/config/preview.ts b/x-pack/solutions/security/packages/storybook/config/preview.ts similarity index 100% rename from x-pack/packages/security-solution/storybook/config/preview.ts rename to x-pack/solutions/security/packages/storybook/config/preview.ts diff --git a/x-pack/packages/security-solution/storybook/config/tsconfig.json b/x-pack/solutions/security/packages/storybook/config/tsconfig.json similarity index 83% rename from x-pack/packages/security-solution/storybook/config/tsconfig.json rename to x-pack/solutions/security/packages/storybook/config/tsconfig.json index 1f8b2275f5191..8ef38ac430bcc 100644 --- a/x-pack/packages/security-solution/storybook/config/tsconfig.json +++ b/x-pack/solutions/security/packages/storybook/config/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../../tsconfig.base.json", + "extends": "../../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/security-solution/upselling/README.mdx b/x-pack/solutions/security/packages/upselling/README.mdx similarity index 100% rename from x-pack/packages/security-solution/upselling/README.mdx rename to x-pack/solutions/security/packages/upselling/README.mdx diff --git a/x-pack/packages/security-solution/upselling/helpers/index.tsx b/x-pack/solutions/security/packages/upselling/helpers/index.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/helpers/index.tsx rename to x-pack/solutions/security/packages/upselling/helpers/index.tsx diff --git a/x-pack/packages/security-solution/upselling/images/entity_paywall.png b/x-pack/solutions/security/packages/upselling/images/entity_paywall.png similarity index 100% rename from x-pack/packages/security-solution/upselling/images/entity_paywall.png rename to x-pack/solutions/security/packages/upselling/images/entity_paywall.png diff --git a/x-pack/packages/security-solution/side_nav/jest.config.js b/x-pack/solutions/security/packages/upselling/jest.config.js similarity index 75% rename from x-pack/packages/security-solution/side_nav/jest.config.js rename to x-pack/solutions/security/packages/upselling/jest.config.js index 89a16e7fff05e..d64e79c15976c 100644 --- a/x-pack/packages/security-solution/side_nav/jest.config.js +++ b/x-pack/solutions/security/packages/upselling/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['<rootDir>/x-pack/packages/security-solution/side_nav'], + rootDir: '../../../../..', + roots: ['<rootDir>/x-pack/solutions/security/packages/upselling'], }; diff --git a/x-pack/packages/security-solution/upselling/kibana.jsonc b/x-pack/solutions/security/packages/upselling/kibana.jsonc similarity index 100% rename from x-pack/packages/security-solution/upselling/kibana.jsonc rename to x-pack/solutions/security/packages/upselling/kibana.jsonc diff --git a/x-pack/packages/security-solution/upselling/messages/index.tsx b/x-pack/solutions/security/packages/upselling/messages/index.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/messages/index.tsx rename to x-pack/solutions/security/packages/upselling/messages/index.tsx diff --git a/x-pack/packages/security-solution/upselling/package.json b/x-pack/solutions/security/packages/upselling/package.json similarity index 100% rename from x-pack/packages/security-solution/upselling/package.json rename to x-pack/solutions/security/packages/upselling/package.json diff --git a/x-pack/packages/security-solution/upselling/pages/attack_discovery/index.test.tsx b/x-pack/solutions/security/packages/upselling/pages/attack_discovery/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/attack_discovery/index.test.tsx rename to x-pack/solutions/security/packages/upselling/pages/attack_discovery/index.test.tsx diff --git a/x-pack/packages/security-solution/upselling/pages/attack_discovery/index.tsx b/x-pack/solutions/security/packages/upselling/pages/attack_discovery/index.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/attack_discovery/index.tsx rename to x-pack/solutions/security/packages/upselling/pages/attack_discovery/index.tsx diff --git a/x-pack/packages/security-solution/upselling/pages/attack_discovery/page_title/index.test.tsx b/x-pack/solutions/security/packages/upselling/pages/attack_discovery/page_title/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/attack_discovery/page_title/index.test.tsx rename to x-pack/solutions/security/packages/upselling/pages/attack_discovery/page_title/index.test.tsx diff --git a/x-pack/packages/security-solution/upselling/pages/attack_discovery/page_title/index.tsx b/x-pack/solutions/security/packages/upselling/pages/attack_discovery/page_title/index.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/attack_discovery/page_title/index.tsx rename to x-pack/solutions/security/packages/upselling/pages/attack_discovery/page_title/index.tsx diff --git a/x-pack/packages/security-solution/upselling/pages/attack_discovery/page_title/translations.ts b/x-pack/solutions/security/packages/upselling/pages/attack_discovery/page_title/translations.ts similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/attack_discovery/page_title/translations.ts rename to x-pack/solutions/security/packages/upselling/pages/attack_discovery/page_title/translations.ts diff --git a/x-pack/packages/security-solution/upselling/pages/entity_analytics.test.tsx b/x-pack/solutions/security/packages/upselling/pages/entity_analytics.test.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/entity_analytics.test.tsx rename to x-pack/solutions/security/packages/upselling/pages/entity_analytics.test.tsx diff --git a/x-pack/packages/security-solution/upselling/pages/entity_analytics.tsx b/x-pack/solutions/security/packages/upselling/pages/entity_analytics.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/entity_analytics.tsx rename to x-pack/solutions/security/packages/upselling/pages/entity_analytics.tsx diff --git a/x-pack/packages/security-solution/upselling/pages/translations.ts b/x-pack/solutions/security/packages/upselling/pages/translations.ts similarity index 100% rename from x-pack/packages/security-solution/upselling/pages/translations.ts rename to x-pack/solutions/security/packages/upselling/pages/translations.ts diff --git a/x-pack/packages/security-solution/upselling/sections/attack_discovery/assistant_avatar/assistant_avatar.tsx b/x-pack/solutions/security/packages/upselling/sections/attack_discovery/assistant_avatar/assistant_avatar.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/sections/attack_discovery/assistant_avatar/assistant_avatar.tsx rename to x-pack/solutions/security/packages/upselling/sections/attack_discovery/assistant_avatar/assistant_avatar.tsx diff --git a/x-pack/packages/security-solution/upselling/sections/attack_discovery/index.test.tsx b/x-pack/solutions/security/packages/upselling/sections/attack_discovery/index.test.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/sections/attack_discovery/index.test.tsx rename to x-pack/solutions/security/packages/upselling/sections/attack_discovery/index.test.tsx diff --git a/x-pack/packages/security-solution/upselling/sections/attack_discovery/index.tsx b/x-pack/solutions/security/packages/upselling/sections/attack_discovery/index.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/sections/attack_discovery/index.tsx rename to x-pack/solutions/security/packages/upselling/sections/attack_discovery/index.tsx diff --git a/x-pack/packages/security-solution/upselling/sections/attack_discovery/translations.ts b/x-pack/solutions/security/packages/upselling/sections/attack_discovery/translations.ts similarity index 100% rename from x-pack/packages/security-solution/upselling/sections/attack_discovery/translations.ts rename to x-pack/solutions/security/packages/upselling/sections/attack_discovery/translations.ts diff --git a/x-pack/packages/security-solution/upselling/sections/entity_analytics.tsx b/x-pack/solutions/security/packages/upselling/sections/entity_analytics.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/sections/entity_analytics.tsx rename to x-pack/solutions/security/packages/upselling/sections/entity_analytics.tsx diff --git a/x-pack/packages/security-solution/upselling/service/index.ts b/x-pack/solutions/security/packages/upselling/service/index.ts similarity index 100% rename from x-pack/packages/security-solution/upselling/service/index.ts rename to x-pack/solutions/security/packages/upselling/service/index.ts diff --git a/x-pack/packages/security-solution/upselling/service/types.ts b/x-pack/solutions/security/packages/upselling/service/types.ts similarity index 100% rename from x-pack/packages/security-solution/upselling/service/types.ts rename to x-pack/solutions/security/packages/upselling/service/types.ts diff --git a/x-pack/packages/security-solution/upselling/service/upselling_service.test.tsx b/x-pack/solutions/security/packages/upselling/service/upselling_service.test.tsx similarity index 100% rename from x-pack/packages/security-solution/upselling/service/upselling_service.test.tsx rename to x-pack/solutions/security/packages/upselling/service/upselling_service.test.tsx diff --git a/x-pack/packages/security-solution/upselling/service/upselling_service.ts b/x-pack/solutions/security/packages/upselling/service/upselling_service.ts similarity index 100% rename from x-pack/packages/security-solution/upselling/service/upselling_service.ts rename to x-pack/solutions/security/packages/upselling/service/upselling_service.ts diff --git a/x-pack/packages/security-solution/upselling/tsconfig.json b/x-pack/solutions/security/packages/upselling/tsconfig.json similarity index 90% rename from x-pack/packages/security-solution/upselling/tsconfig.json rename to x-pack/solutions/security/packages/upselling/tsconfig.json index 70b145ed91b7d..653738495ed81 100644 --- a/x-pack/packages/security-solution/upselling/tsconfig.json +++ b/x-pack/solutions/security/packages/upselling/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/test/accessibility/apps/group1/spaces.ts b/x-pack/test/accessibility/apps/group1/spaces.ts index 324e3bcbcdccd..87cedf0f7d47c 100644 --- a/x-pack/test/accessibility/apps/group1/spaces.ts +++ b/x-pack/test/accessibility/apps/group1/spaces.ts @@ -54,6 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.spaceSelector.clickCreateSpace(); await PageObjects.spaceSelector.clickEnterSpaceName(); await PageObjects.spaceSelector.addSpaceName('space_a'); + await PageObjects.spaceSelector.changeSolutionView('classic'); await a11y.testAppSnapshot(); }); @@ -90,6 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.spaceSelector.clickCreateSpace(); await PageObjects.spaceSelector.clickEnterSpaceName(); await PageObjects.spaceSelector.addSpaceName('space_b'); + await PageObjects.spaceSelector.changeSolutionView('classic'); await PageObjects.spaceSelector.clickSaveSpaceCreation(); await PageObjects.common.navigateToApp('home'); await PageObjects.spaceSelector.openSpacesNav(); diff --git a/x-pack/test/api_integration/apis/entity_manager/helpers/clear_entity_definitions.ts b/x-pack/test/api_integration/apis/entity_manager/helpers/clear_entity_definitions.ts new file mode 100644 index 0000000000000..796761011e7ac --- /dev/null +++ b/x-pack/test/api_integration/apis/entity_manager/helpers/clear_entity_definitions.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { DEFINITIONS_ALIAS } from '@kbn/entityManager-plugin/server/lib/v2/constants'; + +export async function clearEntityDefinitions(esClient: ElasticsearchClient) { + await esClient.deleteByQuery({ + index: DEFINITIONS_ALIAS, + query: { + match_all: {}, + }, + }); +} diff --git a/x-pack/test/api_integration/apis/entity_manager/helpers/data_generation.ts b/x-pack/test/api_integration/apis/entity_manager/helpers/data_generation.ts new file mode 100644 index 0000000000000..3af84e894b7ff --- /dev/null +++ b/x-pack/test/api_integration/apis/entity_manager/helpers/data_generation.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Client } from '@elastic/elasticsearch'; +import { MappingProperty, PropertyName } from '@elastic/elasticsearch/lib/api/types'; + +export async function createIndexWithDocuments( + client: Client, + options: { + index: string; + properties: Record<PropertyName, MappingProperty>; + documents: Array<Record<string, any>>; + } +) { + await client.indices.create({ + index: options.index, + mappings: { + dynamic: false, + properties: options.properties, + }, + }); + + const bulkActions = options.documents.flatMap((doc) => { + return [{ create: { _index: options.index } }, doc]; + }); + + await client.bulk({ + body: bulkActions, + refresh: 'wait_for', + }); + + return () => client.indices.delete({ index: options.index }); +} diff --git a/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts b/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts index c21f33cc8793a..4c09ecb664ab3 100644 --- a/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts +++ b/x-pack/test/api_integration/apis/entity_manager/helpers/request.ts @@ -8,6 +8,7 @@ import { Agent } from 'supertest'; import { EntityDefinition, EntityDefinitionUpdate } from '@kbn/entities-schema'; import { EntityDefinitionWithState } from '@kbn/entityManager-plugin/server/lib/entities/types'; +import { EntitySourceDefinition } from '@kbn/entityManager-plugin/server/lib/v2/types'; export interface Auth { username: string; @@ -89,3 +90,51 @@ export const upgradeBuiltinDefinitions = async ( .expect(200); return response.body; }; + +export const createEntityTypeDefinition = ( + supertest: Agent, + params: { + type: { + id: string; + display_name: string; + }; + } +) => { + return supertest + .post('/internal/entities/v2/definitions/types') + .set('kbn-xsrf', 'xxx') + .send({ type: params.type }) + .expect(201); +}; + +export const createEntitySourceDefinition = ( + supertest: Agent, + params: { + source: EntitySourceDefinition; + } +) => { + return supertest + .post('/internal/entities/v2/definitions/sources') + .set('kbn-xsrf', 'xxx') + .send({ source: params.source }) + .expect(201); +}; + +export const searchEntities = async ( + supertest: Agent, + params: { + type: string; + start?: string; + end?: string; + metadata_fields?: string[]; + filters?: string[]; + }, + expectedCode?: number +) => { + const response = await supertest + .post('/internal/entities/v2/_search') + .set('kbn-xsrf', 'xxx') + .send(params) + .expect(expectedCode ?? 200); + return response.body; +}; diff --git a/x-pack/test/api_integration/apis/entity_manager/index.ts b/x-pack/test/api_integration/apis/entity_manager/index.ts index 8f7af35e5c8ad..9b3ecfa550c0d 100644 --- a/x-pack/test/api_integration/apis/entity_manager/index.ts +++ b/x-pack/test/api_integration/apis/entity_manager/index.ts @@ -13,5 +13,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./builtin_definitions')); loadTestFile(require.resolve('./definitions')); + loadTestFile(require.resolve('./search')); }); } diff --git a/x-pack/test/api_integration/apis/entity_manager/search.ts b/x-pack/test/api_integration/apis/entity_manager/search.ts new file mode 100644 index 0000000000000..778682ff9008d --- /dev/null +++ b/x-pack/test/api_integration/apis/entity_manager/search.ts @@ -0,0 +1,814 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import moment from 'moment'; +import expect from 'expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { + createEntitySourceDefinition, + createEntityTypeDefinition, + searchEntities, +} from './helpers/request'; +import { createIndexWithDocuments } from './helpers/data_generation'; +import { clearEntityDefinitions } from './helpers/clear_entity_definitions'; + +export default function ({ getService }: FtrProviderContext) { + const esClient = getService('es'); + const supertest = getService('supertest'); + + describe('_search API', () => { + let cleanup: Function[] = []; + + afterEach(async () => { + await Promise.all([clearEntityDefinitions(esClient), ...cleanup.map((fn) => fn())]); + cleanup = []; + }); + + it('returns 404 when no matching sources', async () => { + await searchEntities(supertest, { type: 'undefined-type' }, 404); + }); + + it('resolves entities from sources with timestamp', async () => { + const now = moment(); + + cleanup.push( + await createIndexWithDocuments(esClient, { + index: 'index-1-with-services', + properties: { + custom_timestamp: { type: 'date' }, + 'service.name': { type: 'keyword' }, + }, + documents: [ + { + custom_timestamp: moment(now).subtract(1, 'minute').toISOString(), + 'service.name': 'service-one', + }, + { + custom_timestamp: moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-two', + }, + { + custom_timestamp: moment(now).subtract(1, 'hour').toISOString(), + 'service.name': 'service-three', + }, + ], + }) + ); + + await createEntityTypeDefinition(supertest, { + type: { id: 'services-with-timestamp', display_name: 'services-with-timestamp' }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'source-1-with-services', + type_id: 'services-with-timestamp', + index_patterns: ['index-1-with-services'], + identity_fields: ['service.name'], + metadata_fields: [], + filters: [], + timestamp_field: 'custom_timestamp', + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'services-with-timestamp', + start: moment(now).subtract(10, 'minute').toISOString(), + end: now.toISOString(), + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.last_seen_timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'entity.id': 'service-one', + 'entity.display_name': 'service-one', + 'entity.type': 'services-with-timestamp', + 'service.name': 'service-one', + }, + { + 'entity.last_seen_timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'entity.id': 'service-two', + 'entity.display_name': 'service-two', + 'entity.type': 'services-with-timestamp', + 'service.name': 'service-two', + }, + ]); + }); + + it('resolves entities from sources without timestamp', async () => { + cleanup.push( + await createIndexWithDocuments(esClient, { + index: 'index-1-with-home-appliances', + properties: { 'appliance.name': { type: 'keyword' } }, + documents: [ + { 'appliance.name': 'rice cooker' }, + { 'appliance.name': 'kettle' }, + { 'appliance.name': 'dishwasher' }, + ], + }) + ); + + await createEntityTypeDefinition(supertest, { + type: { id: 'home-appliances', display_name: 'home-appliances' }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'appliances-no-timestamp', + type_id: 'home-appliances', + index_patterns: ['index-1-with-home-appliances'], + identity_fields: ['appliance.name'], + metadata_fields: [], + filters: [], + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'home-appliances', + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.id': 'dishwasher', + 'entity.display_name': 'dishwasher', + 'entity.type': 'home-appliances', + 'appliance.name': 'dishwasher', + }, + { + 'entity.id': 'kettle', + 'entity.display_name': 'kettle', + 'entity.type': 'home-appliances', + 'appliance.name': 'kettle', + }, + { + 'entity.id': 'rice cooker', + 'entity.display_name': 'rice cooker', + 'entity.type': 'home-appliances', + 'appliance.name': 'rice cooker', + }, + ]); + }); + + it('merges entities from different sources', async () => { + const now = moment(); + + cleanup = await Promise.all([ + createIndexWithDocuments(esClient, { + index: 'index-1-with-hosts', + properties: { + '@timestamp': { type: 'date' }, + 'host.name': { type: 'keyword' }, + 'agent.name': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'host.name': 'host-uno', + 'agent.name': 'agent-a', + }, + { + '@timestamp': moment(now).subtract(3, 'minute').toISOString(), + 'host.name': 'host-uno', + 'agent.name': 'agent-b', + }, + { + '@timestamp': moment(now).subtract(3, 'minute').toISOString(), + 'host.name': 'host-dos', + 'agent.name': 'agent-3', + }, + { + '@timestamp': moment(now).subtract(4, 'minute').toISOString(), + 'host.name': 'host-tres', + }, + ], + }), + + createIndexWithDocuments(esClient, { + index: 'index-2-with-hosts', + properties: { + timestamp: { type: 'date' }, + hostname_field: { type: 'keyword' }, + 'agent.name': { type: 'keyword' }, + }, + documents: [ + { + timestamp: moment(now).subtract(2, 'minute').toISOString(), + hostname_field: 'host-uno', + 'agent.name': 'agent-1', + }, + { + timestamp: moment(now).subtract(2, 'minute').toISOString(), + hostname_field: 'host-dos', + 'agent.name': 'agent-k', + }, + { + timestamp: moment(now).subtract(5, 'minute').toISOString(), + hostname_field: 'host-four', + }, + ], + }), + ]); + + await createEntityTypeDefinition(supertest, { + type: { id: 'hosts-with-agents', display_name: 'hosts-with-agents' }, + }); + await Promise.all([ + createEntitySourceDefinition(supertest, { + source: { + id: 'hosts-with-agents-1', + type_id: 'hosts-with-agents', + index_patterns: ['index-1-with-hosts'], + identity_fields: ['host.name'], + metadata_fields: [], + filters: [], + timestamp_field: '@timestamp', + }, + }), + createEntitySourceDefinition(supertest, { + source: { + id: 'hosts-with-agents-2', + type_id: 'hosts-with-agents', + index_patterns: ['index-2-with-hosts'], + identity_fields: ['hostname_field'], + metadata_fields: [], + filters: [], + timestamp_field: 'timestamp', + }, + }), + ]); + + const { entities, errors } = await searchEntities(supertest, { + type: 'hosts-with-agents', + start: moment(now).subtract(10, 'minute').toISOString(), + end: moment(now).toISOString(), + metadata_fields: ['agent.name'], + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.id': 'host-uno', + 'entity.display_name': 'host-uno', + 'entity.type': 'hosts-with-agents', + 'entity.last_seen_timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'host.name': 'host-uno', + hostname_field: 'host-uno', + 'agent.name': expect.arrayContaining(['agent-a', 'agent-b', 'agent-1']), + }, + { + 'entity.id': 'host-dos', + 'entity.display_name': 'host-dos', + 'entity.type': 'hosts-with-agents', + 'entity.last_seen_timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'host.name': 'host-dos', + hostname_field: 'host-dos', + 'agent.name': expect.arrayContaining(['agent-3', 'agent-k']), + }, + { + 'entity.id': 'host-tres', + 'entity.display_name': 'host-tres', + 'entity.type': 'hosts-with-agents', + 'entity.last_seen_timestamp': moment(now).subtract(4, 'minute').toISOString(), + 'host.name': 'host-tres', + 'agent.name': null, + }, + { + 'entity.id': 'host-four', + 'entity.display_name': 'host-four', + 'entity.type': 'hosts-with-agents', + 'entity.last_seen_timestamp': moment(now).subtract(5, 'minute').toISOString(), + hostname_field: 'host-four', + 'agent.name': null, + }, + ]); + }); + + it('includes source and additional metadata fields', async () => { + const now = moment(); + + cleanup = await Promise.all([ + createIndexWithDocuments(esClient, { + index: 'index-1-with-services', + properties: { + '@timestamp': { type: 'date' }, + 'service.name': { type: 'keyword' }, + 'agent.name': { type: 'keyword' }, + 'host.name': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'service.name': 'service-one', + 'agent.name': 'agent-one', + 'host.name': 'host-one', + }, + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-one', + 'agent.name': 'agent-one', + 'host.name': 'host-one', + }, + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-one', + 'host.name': 'host-two', + }, + { + '@timestamp': moment(now).subtract(3, 'minute').toISOString(), + 'service.name': 'service-two', + 'host.name': 'host-three', + }, + ], + }), + + createIndexWithDocuments(esClient, { + index: 'index-2-with-services', + properties: { + '@timestamp': { type: 'date' }, + 'service.name': { type: 'keyword' }, + 'agent.name': { type: 'keyword' }, + 'host.name': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'service.name': 'service-one', + 'agent.name': 'agent-one', + 'host.name': 'host-one', + }, + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-one', + 'agent.name': 'agent-ten', + 'host.name': 'host-ten', + }, + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-two', + 'agent.name': 'agent-nine', + 'host.name': 'host-nine', + }, + ], + }), + ]); + + await createEntityTypeDefinition(supertest, { + type: { id: 'services-with-hosts', display_name: 'services-with-hosts' }, + }); + await Promise.all([ + createEntitySourceDefinition(supertest, { + source: { + id: 'source-1-with-services', + type_id: 'services-with-hosts', + index_patterns: ['index-1-with-services'], + identity_fields: ['service.name'], + metadata_fields: ['host.name'], + filters: [], + timestamp_field: '@timestamp', + }, + }), + createEntitySourceDefinition(supertest, { + source: { + id: 'source-2-with-services', + type_id: 'services-with-hosts', + index_patterns: ['index-2-with-services'], + identity_fields: ['service.name'], + metadata_fields: ['host.name'], + filters: [], + timestamp_field: '@timestamp', + }, + }), + ]); + + const { entities, errors } = await searchEntities(supertest, { + type: 'services-with-hosts', + metadata_fields: ['agent.name', 'non.existing.metadata.field'], + start: moment(now).subtract(5, 'minute').toISOString(), + end: moment(now).toISOString(), + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.last_seen_timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'entity.id': 'service-one', + 'entity.display_name': 'service-one', + 'entity.type': 'services-with-hosts', + 'service.name': 'service-one', + 'agent.name': expect.arrayContaining(['agent-one', 'agent-ten']), + 'host.name': expect.arrayContaining(['host-one', 'host-two', 'host-ten']), + }, + { + 'entity.last_seen_timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'entity.id': 'service-two', + 'entity.display_name': 'service-two', + 'entity.type': 'services-with-hosts', + 'service.name': 'service-two', + 'agent.name': 'agent-nine', + 'host.name': expect.arrayContaining(['host-three', 'host-nine']), + }, + ]); + }); + + it('respects filters', async () => { + const now = moment(); + + cleanup.push( + await createIndexWithDocuments(esClient, { + index: 'index-1-with-services', + properties: { + '@timestamp': { type: 'date' }, + 'service.name': { type: 'keyword' }, + 'service.environment': { type: 'keyword' }, + 'service.url': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'service.name': 'service-one', + 'service.environment': 'prod', + 'service.url': 'http://prod.service-one.com', + }, + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-one', + 'service.environment': 'staging', + 'service.url': 'http://staging.service-one.com', + }, + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'service.name': 'service-two', + 'service.environment': 'prod', + 'service.url': 'http://prod.service-two.com', + }, + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'service.name': 'service-two', + 'service.environment': 'staging', + 'service.url': 'http://staging.service-two.com', + }, + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'service.name': 'service-three', + 'service.environment': 'prod', + 'service.url': 'http://prod.service-three.com', + }, + ], + }) + ); + + await createEntityTypeDefinition(supertest, { + type: { id: 'service-one-type', display_name: 'service-one-type' }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'source-1-with-services', + type_id: 'service-one-type', + index_patterns: ['index-1-with-services'], + identity_fields: ['service.name'], + metadata_fields: [], + filters: ['service.name: service-one'], + timestamp_field: '@timestamp', + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'service-one-type', + start: moment(now).subtract(5, 'minute').toISOString(), + end: moment(now).toISOString(), + filters: ['service.environment: prod'], + metadata_fields: ['service.environment', 'service.url'], + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.last_seen_timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'entity.id': 'service-one', + 'entity.display_name': 'service-one', + 'entity.type': 'service-one-type', + 'service.name': 'service-one', + 'service.environment': 'prod', + 'service.url': 'http://prod.service-one.com', + }, + ]); + }); + + it('resolves entities with multiple identity fields', async () => { + const now = moment(); + + cleanup.push( + await createIndexWithDocuments(esClient, { + index: 'index-1-with-cars', + properties: { + '@timestamp': { type: 'date' }, + 'car.brand': { type: 'keyword' }, + 'car.model': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'car.brand': 'Fiat', + 'car.model': 'Multipla', + }, + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'car.brand': 'Citroen', + 'car.model': 'ZX break', + }, + ], + }) + ); + + await createEntityTypeDefinition(supertest, { + type: { id: 'most-refined-cars', display_name: 'most-refined-cars' }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'source-1-with-cars', + type_id: 'most-refined-cars', + index_patterns: ['index-1-with-cars'], + identity_fields: ['car.brand', 'car.model'], + metadata_fields: [], + filters: [], + timestamp_field: '@timestamp', + display_name: 'car.model', + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'most-refined-cars', + start: moment(now).subtract(5, 'minute').toISOString(), + end: moment(now).toISOString(), + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.last_seen_timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'entity.id': 'Citroen:ZX break', + 'entity.display_name': 'ZX break', + 'entity.type': 'most-refined-cars', + 'car.brand': 'Citroen', + 'car.model': 'ZX break', + }, + { + 'entity.last_seen_timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'entity.id': 'Fiat:Multipla', + 'entity.display_name': 'Multipla', + 'entity.type': 'most-refined-cars', + 'car.brand': 'Fiat', + 'car.model': 'Multipla', + }, + ]); + }); + + it('resolves entities with multiple identity fields across sources', async () => { + const now = moment(); + + cleanup = await Promise.all([ + createIndexWithDocuments(esClient, { + index: 'index-1-with-cars', + properties: { + '@timestamp': { type: 'date' }, + 'car.brand': { type: 'keyword' }, + 'car.model': { type: 'keyword' }, + 'car.color': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'car.brand': 'Fiat', + 'car.model': 'Multipla', + 'car.color': 'cyan', + }, + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'car.brand': 'Citroen', + 'car.model': 'ZX break', + 'car.color': 'white', + }, + ], + }), + + createIndexWithDocuments(esClient, { + index: 'index-2-with-cars', + properties: { + '@timestamp': { type: 'date' }, + car_brand: { type: 'keyword' }, + car_model: { type: 'keyword' }, + 'car.color': { type: 'keyword' }, + }, + documents: [ + { + '@timestamp': moment(now).subtract(2, 'minute').toISOString(), + car_brand: 'Fiat', + car_model: 'Multipla', + 'car.color': 'purple', + }, + { + '@timestamp': moment(now).subtract(1, 'minute').toISOString(), + car_brand: 'Citroen', + car_model: 'ZX break', + 'car.color': 'orange', + }, + ], + }), + ]); + + await createEntityTypeDefinition(supertest, { + type: { id: 'most-refined-cars', display_name: 'most-refined-cars' }, + }); + await Promise.all([ + createEntitySourceDefinition(supertest, { + source: { + id: 'source-1-with-cars', + type_id: 'most-refined-cars', + index_patterns: ['index-1-with-cars'], + identity_fields: ['car.brand', 'car.model'], + metadata_fields: [], + filters: [], + timestamp_field: '@timestamp', + }, + }), + createEntitySourceDefinition(supertest, { + source: { + id: 'source-2-with-cars', + type_id: 'most-refined-cars', + index_patterns: ['index-2-with-cars'], + identity_fields: ['car_brand', 'car_model'], + metadata_fields: [], + filters: [], + timestamp_field: '@timestamp', + }, + }), + ]); + + const { entities, errors } = await searchEntities(supertest, { + type: 'most-refined-cars', + start: moment(now).subtract(5, 'minute').toISOString(), + end: moment(now).toISOString(), + metadata_fields: ['car.color'], + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.last_seen_timestamp': moment(now).subtract(1, 'minute').toISOString(), + 'entity.id': 'Citroen:ZX break', + 'entity.display_name': 'Citroen:ZX break', + 'entity.type': 'most-refined-cars', + 'car.brand': 'Citroen', + 'car.model': 'ZX break', + car_brand: 'Citroen', + car_model: 'ZX break', + 'car.color': expect.arrayContaining(['white', 'orange']), + }, + { + 'entity.last_seen_timestamp': moment(now).subtract(2, 'minute').toISOString(), + 'entity.id': 'Fiat:Multipla', + 'entity.display_name': 'Fiat:Multipla', + 'entity.type': 'most-refined-cars', + 'car.brand': 'Fiat', + 'car.model': 'Multipla', + car_brand: 'Fiat', + car_model: 'Multipla', + 'car.color': expect.arrayContaining(['cyan', 'purple']), + }, + ]); + }); + + it('casts conflicting mappings to keywords', async () => { + cleanup = await Promise.all([ + await createIndexWithDocuments(esClient, { + index: 'index-service-name-as-keyword', + properties: { 'service.name': { type: 'keyword' } }, + documents: [{ 'service.name': 'service-name-as-keyword' }], + }), + + await createIndexWithDocuments(esClient, { + index: 'index-service-name-as-text', + properties: { 'service.name': { type: 'text' } }, + documents: [{ 'service.name': 'service-name-as-text' }], + }), + + await createIndexWithDocuments(esClient, { + index: 'index-service-name-as-long', + properties: { 'service.name': { type: 'long' } }, + documents: [{ 'service.name': 123 }], + }), + ]); + + await createEntityTypeDefinition(supertest, { + type: { + id: 'type-with-conflicting-mappings', + display_name: 'type-with-conflicting-mappings', + }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'conflicting-mappings', + type_id: 'type-with-conflicting-mappings', + index_patterns: ['index-service-name-as-*'], + identity_fields: ['service.name'], + metadata_fields: [], + filters: [], + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'type-with-conflicting-mappings', + }); + + expect(errors).toEqual([]); + expect(entities).toEqual([ + { + 'entity.id': '123', + 'entity.display_name': '123', + 'entity.type': 'type-with-conflicting-mappings', + 'service.name': '123', + }, + { + 'entity.id': 'service-name-as-keyword', + 'entity.display_name': 'service-name-as-keyword', + 'entity.type': 'type-with-conflicting-mappings', + 'service.name': 'service-name-as-keyword', + }, + { + 'entity.id': 'service-name-as-text', + 'entity.display_name': 'service-name-as-text', + 'entity.type': 'type-with-conflicting-mappings', + 'service.name': 'service-name-as-text', + }, + ]); + }); + + it('returns error if index does not exist', async () => { + await createEntityTypeDefinition(supertest, { + type: { id: 'type-with-non-existing-index', display_name: 'type-with-non-existing-index' }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'non-existing-index', + type_id: 'type-with-non-existing-index', + index_patterns: ['non-existing-index-pattern*', 'non-existing-index'], + identity_fields: ['service.name'], + metadata_fields: [], + filters: [], + timestamp_field: '@timestamp', + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'type-with-non-existing-index', + }); + expect(errors).toEqual([ + 'No index found for source [non-existing-index] with index patterns [non-existing-index-pattern*, non-existing-index]', + ]); + expect(entities).toEqual([]); + }); + + it('returns error if mandatory fields are not mapped', async () => { + cleanup.push( + await createIndexWithDocuments(esClient, { + index: 'unmapped-id-fields', + properties: { 'service.environment': { type: 'keyword' } }, + documents: [ + { + '@timestamp': moment().toISOString(), + 'service.name': 'service-one', + 'service.environment': 'prod', + }, + ], + }) + ); + + await createEntityTypeDefinition(supertest, { + type: { id: 'type-with-unmapped-id-fields', display_name: 'type-with-unmapped-id-fields' }, + }); + await createEntitySourceDefinition(supertest, { + source: { + id: 'unmapped-fields', + type_id: 'type-with-unmapped-id-fields', + index_patterns: ['unmapped-id-fields'], + identity_fields: ['service.name', 'service.environment'], + metadata_fields: [], + filters: [], + timestamp_field: '@timestamp', + }, + }); + + const { entities, errors } = await searchEntities(supertest, { + type: 'type-with-unmapped-id-fields', + }); + expect(errors).toEqual([ + 'Mandatory fields [service.name, @timestamp] are not mapped for source [unmapped-fields] with index patterns [unmapped-id-fields]', + ]); + expect(entities).toEqual([]); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/templates.helpers.ts b/x-pack/test/api_integration/apis/management/index_management/lib/templates.helpers.ts index a342df2d6287e..ea1e9a2d83bb1 100644 --- a/x-pack/test/api_integration/apis/management/index_management/lib/templates.helpers.ts +++ b/x-pack/test/api_integration/apis/management/index_management/lib/templates.helpers.ts @@ -59,7 +59,6 @@ export function templatesHelpers(getService: FtrProviderContext['getService']) { name, indexPatterns, version: 1, - indexMode: 'standard', template: { ...getTemplateMock(isMappingsSourceFieldEnabled) }, _kbnMeta: { isLegacy, diff --git a/x-pack/test/api_integration/apis/streams/classic.ts b/x-pack/test/api_integration/apis/streams/classic.ts new file mode 100644 index 0000000000000..25a7238a757ca --- /dev/null +++ b/x-pack/test/api_integration/apis/streams/classic.ts @@ -0,0 +1,163 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { JsonObject } from '@kbn/utility-types'; +import { + deleteStream, + enableStreams, + fetchDocument, + getStream, + indexDocument, + listStreams, + putStream, +} from './helpers/requests'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { waitForDocumentInIndex } from '../../../alerting_api_integration/observability/helpers/alerting_wait_for_helpers'; +import { cleanUpRootStream } from './helpers/cleanup'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esClient = getService('es'); + const retryService = getService('retry'); + const logger = getService('log'); + + describe('Classic streams', () => { + after(async () => { + await cleanUpRootStream(esClient); + }); + + before(async () => { + await enableStreams(supertest); + }); + + it('Shows non-wired data streams', async () => { + const doc = { + message: '2023-01-01T00:00:10.000Z error test', + }; + const response = await indexDocument(esClient, 'logs-test-default', doc); + expect(response.result).to.eql('created'); + const streams = await listStreams(supertest); + const classicStream = streams.definitions.find( + (stream: JsonObject) => stream.id === 'logs-test-default' + ); + expect(classicStream).to.eql({ + id: 'logs-test-default', + managed: false, + children: [], + fields: [], + processing: [], + }); + }); + + it('Allows setting processing on classic streams', async () => { + const response = await putStream(supertest, 'logs-test-default', { + managed: false, + children: [], + fields: [], + processing: [ + { + config: { + type: 'grok', + field: 'message', + patterns: [ + '%{TIMESTAMP_ISO8601:inner_timestamp} %{LOGLEVEL:log.level} %{GREEDYDATA:message2}', + ], + }, + }, + ], + }); + expect(response).to.have.property('acknowledged', true); + const streamBody = await getStream(supertest, 'logs-test-default'); + expect(streamBody).to.eql({ + id: 'logs-test-default', + managed: false, + children: [], + inheritedFields: [], + fields: [], + processing: [ + { + config: { + type: 'grok', + field: 'message', + patterns: [ + '%{TIMESTAMP_ISO8601:inner_timestamp} %{LOGLEVEL:log.level} %{GREEDYDATA:message2}', + ], + }, + }, + ], + }); + }); + + it('Executes processing on classic streams', async () => { + const doc = { + '@timestamp': '2024-01-01T00:00:10.000Z', + message: '2023-01-01T00:00:10.000Z error test', + }; + const response = await indexDocument(esClient, 'logs-test-default', doc); + expect(response.result).to.eql('created'); + await waitForDocumentInIndex({ + esClient, + indexName: 'logs-test-default', + retryService, + logger, + docCountTarget: 2, + }); + const result = await fetchDocument(esClient, 'logs-test-default', response._id); + expect(result._source).to.eql({ + '@timestamp': '2024-01-01T00:00:10.000Z', + message: '2023-01-01T00:00:10.000Z error test', + inner_timestamp: '2023-01-01T00:00:10.000Z', + message2: 'test', + log: { + level: 'error', + }, + }); + }); + + it('Allows removing processing on classic streams', async () => { + const response = await putStream(supertest, 'logs-test-default', { + managed: false, + children: [], + fields: [], + processing: [], + }); + expect(response).to.have.property('acknowledged', true); + }); + + it('Executes processing on classic streams after removing processing', async () => { + const doc = { + // default logs pipeline fills in timestamp with current date if not set + message: '2023-01-01T00:00:10.000Z info mylogger this is the message', + }; + const response = await indexDocument(esClient, 'logs-test-default', doc); + expect(response.result).to.eql('created'); + await waitForDocumentInIndex({ + esClient, + indexName: 'logs-test-default', + retryService, + logger, + docCountTarget: 3, + }); + const result = await fetchDocument(esClient, 'logs-test-default', response._id); + expect(result._source).to.eql({ + // accept any date + '@timestamp': (result._source as { [key: string]: unknown })['@timestamp'], + message: '2023-01-01T00:00:10.000Z info mylogger this is the message', + }); + }); + + it('Allows deleting classic streams', async () => { + await deleteStream(supertest, 'logs-test-default'); + const streams = await listStreams(supertest); + const classicStream = streams.definitions.find( + (stream: JsonObject) => stream.id === 'logs-test-default' + ); + expect(classicStream).to.eql(undefined); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/streams/helpers/requests.ts b/x-pack/test/api_integration/apis/streams/helpers/requests.ts index 7d656e4aacf5e..43e7f02b7a750 100644 --- a/x-pack/test/api_integration/apis/streams/helpers/requests.ts +++ b/x-pack/test/api_integration/apis/streams/helpers/requests.ts @@ -42,6 +42,18 @@ export async function putStream(supertest: Agent, name: string, body: JsonObject return response.body; } +export async function getStream(supertest: Agent, name: string) { + const req = supertest.get(`/api/streams/${name}`).set('kbn-xsrf', 'xxx'); + const response = await req.send().expect(200); + return response.body; +} + +export async function listStreams(supertest: Agent) { + const req = supertest.get(`/api/streams`).set('kbn-xsrf', 'xxx'); + const response = await req.send().expect(200); + return response.body; +} + export async function deleteStream(supertest: Agent, id: string) { const req = supertest.delete(`/api/streams/${id}`).set('kbn-xsrf', 'xxx'); const response = await req.send().expect(200); diff --git a/x-pack/test/api_integration/apis/streams/index.ts b/x-pack/test/api_integration/apis/streams/index.ts index 4ef3fce385248..14decb2400196 100644 --- a/x-pack/test/api_integration/apis/streams/index.ts +++ b/x-pack/test/api_integration/apis/streams/index.ts @@ -11,6 +11,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('Streams Endpoints', () => { loadTestFile(require.resolve('./full_flow')); loadTestFile(require.resolve('./enrichment')); + loadTestFile(require.resolve('./classic')); loadTestFile(require.resolve('./flush_config')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_pct_fired.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_pct_fired.ts index 8ed42269e569b..f8f4a8a7df66b 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_pct_fired.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_pct_fired.ts @@ -28,6 +28,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { const dataViewApi = getService('dataViewApi'); const logger = getService('log'); const config = getService('config'); + const spacesService = getService('spaces'); const isServerless = config.get('serverless'); const expectedConsumer = isServerless ? 'observability' : 'logs'; let roleAuthc: RoleCredentials; @@ -39,6 +40,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { const DATA_VIEW_TITLE = 'kbn-data-forge-fake_hosts.fake_hosts-*'; const DATA_VIEW_NAME = 'data-view-name'; const DATA_VIEW_ID = 'data-view-id'; + const SPACE_ID = 'test-space'; let dataForgeConfig: PartialConfig; let dataForgeIndices: string[]; let actionId: string; @@ -73,8 +75,15 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { name: DATA_VIEW_NAME, id: DATA_VIEW_ID, title: DATA_VIEW_TITLE, + spaceId: SPACE_ID, roleAuthc, }); + await spacesService.create({ + id: SPACE_ID, + name: 'Test Space', + disabledFeatures: [], + color: '#AABBCC', + }); }); after(async () => { @@ -98,11 +107,13 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { }); await dataViewApi.delete({ id: DATA_VIEW_ID, + spaceId: SPACE_ID, roleAuthc, }); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); await samlAuth.invalidateM2mApiKeyWithRoleScope(roleAuthc); + await spacesService.delete(SPACE_ID); }); describe('Rule creation', () => { @@ -111,10 +122,12 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, + spaceId: SPACE_ID, }); const createdRule = await alertingApi.createRule({ roleAuthc, + spaceId: SPACE_ID, tags: ['observability'], consumer: expectedConsumer, name: 'Threshold rule', @@ -174,12 +187,13 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { roleAuthc, ruleId, expectedStatus: 'active', + spaceId: SPACE_ID, }); expect(executionStatus).to.be('active'); }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findInRules(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId, SPACE_ID); expect(match).not.to.be(undefined); expect(match.consumer).to.be(expectedConsumer); }); @@ -204,7 +218,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { 'observability.rules.custom_threshold' ); expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId); - expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default'); + expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain(SPACE_ID); expect(resp.hits.hits[0]._source) .property('kibana.alert.rule.tags') .contain('observability'); @@ -245,7 +259,9 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { const { protocol, hostname, port } = kbnTestConfig.getUrlPartsWithStrippedDefaultPort(); expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${ + port ? `:${port}` : '' + }/s/${SPACE_ID}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( `Average system.cpu.user.pct is 250%, above the threshold of 50%. (duration: 5 mins, data view: ${DATA_VIEW_NAME})` @@ -255,6 +271,10 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { const parsedViewInAppUrl = parseSearchParams<LogsExplorerLocatorParsedParams>( new URL(resp.hits.hits[0]._source?.viewInAppUrl || '').search ); + const viewInAppUrlPathName = new URL(resp.hits.hits[0]._source?.viewInAppUrl || '') + .pathname; + + expect(viewInAppUrlPathName).contain(`/s/${SPACE_ID}/app/r`); expect(resp.hits.hits[0]._source?.viewInAppUrl).contain('LOGS_EXPLORER_LOCATOR'); expect(omit(parsedViewInAppUrl.params, 'timeRange.from')).eql({ diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_us_fired.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_ticks_fired.ts similarity index 71% rename from x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_us_fired.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_ticks_fired.ts index 05b6ded5191d1..852363b0d8593 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_us_fired.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/avg_ticks_fired.ts @@ -5,45 +5,44 @@ * 2.0. */ -import moment from 'moment'; -import { format } from 'url'; +import { omit } from 'lodash'; import expect from '@kbn/expect'; +import { cleanup, generate, Dataset, PartialConfig } from '@kbn/data-forge'; import { COMPARATORS } from '@kbn/alerting-comparators'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { Aggregators } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/constants'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; +import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { kbnTestConfig } from '@kbn/test'; import type { InternalRequestHeader, RoleCredentials } from '@kbn/ftr-common-functional-services'; import { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; -import { getSyntraceClient, generateData } from './helpers/syntrace'; -import { ActionDocument } from './types'; +import { ISO_DATE_REGEX } from './constants'; +import { ActionDocument, LogsExplorerLocatorParsedParams } from './types'; export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { - const start = moment(Date.now()).subtract(10, 'minutes').valueOf(); - const end = moment(Date.now()).add(15, 'minutes').valueOf(); const esClient = getService('es'); const samlAuth = getService('samlAuth'); const supertestWithoutAuth = getService('supertestWithoutAuth'); const esDeleteAllIndices = getService('esDeleteAllIndices'); const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); + const logger = getService('log'); const config = getService('config'); - const kibanaServerConfig = config.get('servers.kibana'); const isServerless = config.get('serverless'); const expectedConsumer = isServerless ? 'observability' : 'logs'; - const kibanaUrl = format(kibanaServerConfig); + const spacesService = getService('spaces'); let roleAuthc: RoleCredentials; let internalReqHeader: InternalRequestHeader; - describe('AVG - US - FIRED', () => { + describe('AVG - TICKS - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; const ALERT_ACTION_INDEX = 'alert-action-threshold'; - const DATA_VIEW = 'traces-apm*,metrics-apm*,logs-apm*'; + const DATA_VIEW = 'kbn-data-forge-fake_hosts.fake_hosts-*'; const DATA_VIEW_ID = 'data-view-id'; const DATA_VIEW_NAME = 'test-data-view-name'; - - let synthtraceEsClient: ApmSynthtraceEsClient; + const SPACE_ID = 'test-space'; + let dataForgeConfig: PartialConfig; + let dataForgeIndices: string[]; let actionId: string; let ruleId: string; let alertId: string; @@ -51,14 +50,47 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { before(async () => { roleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('admin'); internalReqHeader = samlAuth.getInternalRequestHeader(); - synthtraceEsClient = await getSyntraceClient({ esClient, kibanaUrl }); - await generateData({ synthtraceEsClient, start, end }); + dataForgeConfig = { + schedule: [ + { + template: 'good', + start: 'now-10m', + end: 'now+5m', + metrics: [ + { + name: 'system.core.system.ticks', + method: 'linear', + start: 10_000_000, + end: 10_000_000, + }, + ], + }, + ], + indexing: { + dataset: 'fake_hosts' as Dataset, + eventsPerCycle: 1, + interval: 10000, + alignEventsToInterval: true, + }, + }; + dataForgeIndices = await generate({ client: esClient, config: dataForgeConfig, logger }); + await alertingApi.waitForDocumentInIndex({ + indexName: dataForgeIndices.join(','), + docCountTarget: 270, + }); await dataViewApi.create({ name: DATA_VIEW_NAME, id: DATA_VIEW_ID, title: DATA_VIEW, + spaceId: SPACE_ID, roleAuthc, }); + await spacesService.create({ + id: SPACE_ID, + name: 'Test Space', + disabledFeatures: [], + color: '#AABBCC', + }); }); after(async () => { @@ -70,7 +102,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { .delete(`/api/actions/connector/${actionId}`) .set(roleAuthc.apiKeyHeader) .set(internalReqHeader); - await esDeleteAllIndices([ALERT_ACTION_INDEX]); + await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -79,11 +111,13 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { index: '.kibana-event-log-*', query: { term: { 'kibana.alert.rule.consumer': expectedConsumer } }, }); - await synthtraceEsClient.clean(); await dataViewApi.delete({ id: DATA_VIEW_ID, + spaceId: SPACE_ID, roleAuthc, }); + await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await spacesService.delete(SPACE_ID); await samlAuth.invalidateM2mApiKeyWithRoleScope(roleAuthc); }); @@ -93,10 +127,12 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, + spaceId: SPACE_ID, }); const createdRule = await alertingApi.createRule({ roleAuthc, + spaceId: SPACE_ID, tags: ['observability'], consumer: expectedConsumer, name: 'Threshold rule', @@ -109,7 +145,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { timeSize: 5, timeUnit: 'm', metrics: [ - { name: 'A', field: 'span.self_time.sum.us', aggType: Aggregators.AVERAGE }, + { name: 'A', field: 'system.core.system.ticks', aggType: Aggregators.AVERAGE }, ], }, ], @@ -134,6 +170,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { alertDetailsUrl: '{{context.alertDetailsUrl}}', reason: '{{context.reason}}', value: '{{context.value}}', + viewInAppUrl: '{{context.viewInAppUrl}}', }, ], }, @@ -154,6 +191,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { roleAuthc, ruleId, expectedStatus: 'active', + spaceId: SPACE_ID, }); expect(executionStatus).to.be('active'); }); @@ -178,7 +216,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { 'observability.rules.custom_threshold' ); expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId); - expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default'); + expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain(SPACE_ID); expect(resp.hits.hits[0]._source) .property('kibana.alert.rule.tags') .contain('observability'); @@ -203,7 +241,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { threshold: [7500000], timeSize: 5, timeUnit: 'm', - metrics: [{ name: 'A', field: 'span.self_time.sum.us', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.core.system.ticks', aggType: 'avg' }], }, ], alertOnNoData: true, @@ -220,12 +258,30 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { const { protocol, hostname, port } = kbnTestConfig.getUrlPartsWithStrippedDefaultPort(); expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${ + port ? `:${port}` : '' + }/s/${SPACE_ID}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( - `Average span.self_time.sum.us is 10,000,000, above the threshold of 7,500,000. (duration: 5 mins, data view: ${DATA_VIEW_NAME})` + `Average system.core.system.ticks is 10,000,000, above the threshold of 7,500,000. (duration: 5 mins, data view: ${DATA_VIEW_NAME})` ); expect(resp.hits.hits[0]._source?.value).eql('10,000,000'); + + const parsedViewInAppUrl = parseSearchParams<LogsExplorerLocatorParsedParams>( + new URL(resp.hits.hits[0]._source?.viewInAppUrl || '').search + ); + const viewInAppUrlPathName = new URL(resp.hits.hits[0]._source?.viewInAppUrl || '') + .pathname; + + expect(viewInAppUrlPathName).contain(`/s/${SPACE_ID}/app/r`); + expect(resp.hits.hits[0]._source?.viewInAppUrl).contain('LOGS_EXPLORER_LOCATOR'); + expect(omit(parsedViewInAppUrl.params, 'timeRange.from')).eql({ + dataset: DATA_VIEW_ID, + timeRange: { to: 'now' }, + query: { query: '', language: 'kuery' }, + filters: [], + }); + expect(parsedViewInAppUrl.params.timeRange.from).match(ISO_DATE_REGEX); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/index.ts index 96a3351043ae6..45a8f2d8b1b40 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/custom_threshold/index.ts @@ -11,7 +11,7 @@ export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) describe('Custom Threshold rule', () => { loadTestFile(require.resolve('./avg_pct_fired')); loadTestFile(require.resolve('./avg_pct_no_data')); - loadTestFile(require.resolve('./avg_us_fired')); + loadTestFile(require.resolve('./avg_ticks_fired')); loadTestFile(require.resolve('./custom_eq_avg_bytes_fired')); loadTestFile(require.resolve('./documents_count_fired')); loadTestFile(require.resolve('./group_by_fired')); diff --git a/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts b/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts index d6660581938fa..855d5bd3cdff8 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts @@ -942,14 +942,16 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide ruleId, expectedStatus, roleAuthc, + spaceId, }: { ruleId: string; expectedStatus: string; roleAuthc: RoleCredentials; + spaceId?: string; }) { return await retry.tryForTime(retryTimeout, async () => { const response = await supertestWithoutAuth - .get(`/api/alerting/rule/${ruleId}`) + .get(`${spaceId ? '/s/' + spaceId : ''}/api/alerting/rule/${ruleId}`) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()) .timeout(requestTimeout); @@ -1034,13 +1036,15 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide name, indexName, roleAuthc, + spaceId, }: { name: string; indexName: string; roleAuthc: RoleCredentials; + spaceId?: string; }) { const { body } = await supertestWithoutAuth - .post(`/api/actions/connector`) + .post(`${spaceId ? '/s/' + spaceId : ''}/api/actions/connector`) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()) .send({ @@ -1063,6 +1067,7 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide schedule, consumer, roleAuthc, + spaceId, }: { ruleTypeId: string; name: string; @@ -1080,9 +1085,10 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide schedule?: { interval: string }; consumer: string; roleAuthc: RoleCredentials; + spaceId?: string; }) { const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule`) + .post(`${spaceId ? '/s/' + spaceId : ''}/api/alerting/rule`) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()) .send({ @@ -1118,17 +1124,17 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide }); }, - async findInRules(roleAuthc: RoleCredentials, ruleId: string) { + async findInRules(roleAuthc: RoleCredentials, ruleId: string, spaceId?: string) { const response = await supertestWithoutAuth - .get('/api/alerting/rules/_find') + .get(`${spaceId ? '/s/' + spaceId : ''}/api/alerting/rules/_find`) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()); return response.body.data.find((obj: any) => obj.id === ruleId); }, - async searchRules(roleAuthc: RoleCredentials, filter: string) { + async searchRules(roleAuthc: RoleCredentials, filter: string, spaceId?: string) { return supertestWithoutAuth - .get('/api/alerting/rules/_find') + .get(`${spaceId ? '/s/' + spaceId : ''}/api/alerting/rules/_find`) .query({ filter }) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()); diff --git a/x-pack/test/api_integration/deployment_agnostic/services/data_view_api.ts b/x-pack/test/api_integration/deployment_agnostic/services/data_view_api.ts index 33e829d8c9e39..6b03bdf46b273 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/data_view_api.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/data_view_api.ts @@ -18,14 +18,16 @@ export function DataViewApiProvider({ getService }: DeploymentAgnosticFtrProvide id, name, title, + spaceId, }: { roleAuthc: RoleCredentials; id: string; name: string; title: string; + spaceId?: string; }) { const { body } = await supertestWithoutAuth - .post(`/api/content_management/rpc/create`) + .post(`${spaceId ? '/s/' + spaceId : ''}/api/content_management/rpc/create`) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()) .set(samlAuth.getCommonRequestHeader()) @@ -48,9 +50,17 @@ export function DataViewApiProvider({ getService }: DeploymentAgnosticFtrProvide return body; }, - async delete({ roleAuthc, id }: { roleAuthc: RoleCredentials; id: string }) { + async delete({ + roleAuthc, + id, + spaceId, + }: { + roleAuthc: RoleCredentials; + id: string; + spaceId?: string; + }) { const { body } = await supertestWithoutAuth - .post(`/api/content_management/rpc/delete`) + .post(`${spaceId ? '/s/' + spaceId : ''}/api/content_management/rpc/delete`) .set(roleAuthc.apiKeyHeader) .set(samlAuth.getInternalRequestHeader()) .set(samlAuth.getCommonRequestHeader()) diff --git a/x-pack/test/api_integration/deployment_agnostic/services/deployment_agnostic_services.ts b/x-pack/test/api_integration/deployment_agnostic/services/deployment_agnostic_services.ts index 9623df1bebbd0..08a085e2fcd9b 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/deployment_agnostic_services.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/deployment_agnostic_services.ts @@ -26,4 +26,5 @@ export const deploymentAgnosticServices = _.pick(apiIntegrationServices, [ 'retry', 'security', 'usageAPI', + 'spaces', ]); diff --git a/x-pack/test/automatic_import_api_integration/security/config_basic.ts b/x-pack/test/automatic_import_api_integration/apis/config_basic.ts similarity index 80% rename from x-pack/test/automatic_import_api_integration/security/config_basic.ts rename to x-pack/test/automatic_import_api_integration/apis/config_basic.ts index ebda3390790e3..85abda4f2a7ba 100644 --- a/x-pack/test/automatic_import_api_integration/security/config_basic.ts +++ b/x-pack/test/automatic_import_api_integration/apis/config_basic.ts @@ -7,8 +7,7 @@ import { createTestConfig } from '../common/config'; -// eslint-disable-next-line import/no-default-export -export default createTestConfig('security', { +export default createTestConfig('apis', { license: 'basic', ssl: true, testFiles: [require.resolve('./tests/basic')], diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/translations.ts b/x-pack/test/automatic_import_api_integration/apis/config_graphs.ts similarity index 55% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/translations.ts rename to x-pack/test/automatic_import_api_integration/apis/config_graphs.ts index 8f6a10b5681be..c572c62bfb21f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_side/translations.ts +++ b/x-pack/test/automatic_import_api_integration/apis/config_graphs.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; +import { createTestConfig } from '../common/config'; -export const FINAL_UPDATE = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.finalUpdate', - { - defaultMessage: 'Final update', - } -); +export default createTestConfig('apis', { + license: 'trial', + ssl: true, + testFiles: [require.resolve('./tests/graphs')], + publicBaseUrl: true, +}); diff --git a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/analyze_logs.ts b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/analyze_logs.ts similarity index 95% rename from x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/analyze_logs.ts rename to x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/analyze_logs.ts index 6fb3abf127747..9f842247161cc 100644 --- a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/analyze_logs.ts +++ b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/analyze_logs.ts @@ -9,7 +9,6 @@ import { postAnalyzeLogs } from '../../../../common/lib/api/analyze_logs'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { User } from '../../../../common/lib/authentication/types'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); diff --git a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/categorization.ts b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/categorization.ts similarity index 95% rename from x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/categorization.ts rename to x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/categorization.ts index 4d9a3a0853109..0420822a8dfae 100644 --- a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/categorization.ts +++ b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/categorization.ts @@ -9,7 +9,6 @@ import { postCategorization } from '../../../../common/lib/api/categorization'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { User } from '../../../../common/lib/authentication/types'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); diff --git a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/ecs.ts b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/ecs.ts similarity index 95% rename from x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/ecs.ts rename to x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/ecs.ts index f55efceb3d04c..b6381a6ac7af8 100644 --- a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/ecs.ts +++ b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/ecs.ts @@ -9,7 +9,6 @@ import { postEcsMapping } from '../../../../common/lib/api/ecs'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { User } from '../../../../common/lib/authentication/types'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); @@ -27,6 +26,7 @@ export default ({ getService }: FtrProviderContext): void => { }, connectorId: 'bedrock-connector', }, + expectedHttpCode: 404, auth: { user: { username: 'elastic', password: 'elastic' } as User, }, diff --git a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/related.ts b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/related.ts similarity index 95% rename from x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/related.ts rename to x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/related.ts index 6091b64f7c224..45c1b5935cb49 100644 --- a/x-pack/test/automatic_import_api_integration/security/tests/basic/graphs/related.ts +++ b/x-pack/test/automatic_import_api_integration/apis/tests/basic/graphs/related.ts @@ -9,7 +9,6 @@ import { postRelated } from '../../../../common/lib/api/related'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { User } from '../../../../common/lib/authentication/types'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); diff --git a/x-pack/test/automatic_import_api_integration/security/tests/basic/index.ts b/x-pack/test/automatic_import_api_integration/apis/tests/basic/index.ts similarity index 95% rename from x-pack/test/automatic_import_api_integration/security/tests/basic/index.ts rename to x-pack/test/automatic_import_api_integration/apis/tests/basic/index.ts index 7391c1e3ae9ed..f0e61f713a6ac 100644 --- a/x-pack/test/automatic_import_api_integration/security/tests/basic/index.ts +++ b/x-pack/test/automatic_import_api_integration/apis/tests/basic/index.ts @@ -12,7 +12,6 @@ import { activateUserProfiles, } from '../../../common/lib/authentication'; -// eslint-disable-next-line import/no-default-export export default ({ loadTestFile, getService }: FtrProviderContext): void => { describe('Automatic Import enabled: basic', function () { before(async () => { diff --git a/x-pack/test/automatic_import_api_integration/apis/tests/graphs/categorization.ts b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/categorization.ts new file mode 100644 index 0000000000000..5fed052da894a --- /dev/null +++ b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/categorization.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import { postCategorization } from '../../../common/lib/api/categorization'; +import { User } from '../../../common/lib/authentication/types'; +import { BadRequestError } from '../../../common/lib/error/error'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + describe('Run categorization', () => { + it('should get 400 when trying to run categorization with invalid json', async () => { + const response = await postCategorization({ + supertest, + req: { + packageName: 'some-package', + dataStreamName: 'some-data-stream', + rawSamples: ['{test:json}'], + samplesFormat: { + name: 'json', + }, + connectorId: 'preconfigured-bedrock', + currentPipeline: { processors: [] }, + }, + expectedHttpCode: 400, + auth: { + user: { username: 'elastic', password: 'elastic' } as User, + }, + }); + if (response instanceof BadRequestError) { + expect(response.message).to.be("Expected property name or '}' in JSON at position 1"); + } else { + expect().fail('Expected BadRequestError'); + } + }); + it('should get 400 when trying to run categorization without connector action', async () => { + const response = await postCategorization({ + supertest, + req: { + packageName: 'some-package', + dataStreamName: 'some-data-stream', + rawSamples: ['{test:json}'], + samplesFormat: { + name: 'json', + }, + connectorId: 'preconfigured-dummy', + currentPipeline: { processors: [] }, + }, + expectedHttpCode: 400, + auth: { + user: { username: 'elastic', password: 'elastic' } as User, + }, + }); + if (response instanceof BadRequestError) { + expect(response.message).to.be('Saved object [action/preconfigured-dummy] not found'); + } else { + expect().fail('Expected BadRequestError'); + } + }); + }); +} diff --git a/x-pack/test/automatic_import_api_integration/apis/tests/graphs/ecs_mapping.ts b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/ecs_mapping.ts new file mode 100644 index 0000000000000..33281794109e2 --- /dev/null +++ b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/ecs_mapping.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import { postEcsMapping } from '../../../common/lib/api/ecs'; +import { User } from '../../../common/lib/authentication/types'; +import { BadRequestError } from '../../../common/lib/error/error'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + describe('Run ecs_mapping', () => { + it('should get 400 when trying to run ecs_mapping with invalid json', async () => { + const response = await postEcsMapping({ + supertest, + req: { + packageName: 'some-package', + dataStreamName: 'some-data-stream', + rawSamples: ['{test:json}'], + samplesFormat: { + name: 'json', + }, + connectorId: 'preconfigured-bedrock', + }, + expectedHttpCode: 400, + auth: { + user: { username: 'elastic', password: 'elastic' } as User, + }, + }); + if (response instanceof BadRequestError) { + expect(response.message).to.be("Expected property name or '}' in JSON at position 1"); + } else { + expect().fail('Expected BadRequestError'); + } + }); + it('should get 400 when trying to run ecs_mapping without connector action', async () => { + const response = await postEcsMapping({ + supertest, + req: { + packageName: 'some-package', + dataStreamName: 'some-data-stream', + rawSamples: ['{test:json}'], + samplesFormat: { + name: 'json', + }, + connectorId: 'preconfigured-dummy', + }, + expectedHttpCode: 400, + auth: { + user: { username: 'elastic', password: 'elastic' } as User, + }, + }); + if (response instanceof BadRequestError) { + expect(response.message).to.be('Saved object [action/preconfigured-dummy] not found'); + } else { + expect().fail('Expected BadRequestError'); + } + }); + }); +} diff --git a/x-pack/test/automatic_import_api_integration/apis/tests/graphs/index.ts b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/index.ts new file mode 100644 index 0000000000000..c48b1da1d86e3 --- /dev/null +++ b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/index.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { + createUsersAndRoles, + deleteUsersAndRoles, + activateUserProfiles, +} from '../../../common/lib/authentication'; + +export default ({ loadTestFile, getService }: FtrProviderContext): void => { + describe('Automatic Import enabled: basic', function () { + before(async () => { + await createUsersAndRoles(getService); + // once a user profile is created the only way to remove it is to delete the user and roles, so best to activate + // before all the tests + await activateUserProfiles(getService); + }); + + after(async () => { + await deleteUsersAndRoles(getService); + }); + + // Basic + loadTestFile(require.resolve('./ecs_mapping')); + loadTestFile(require.resolve('./categorization')); + loadTestFile(require.resolve('./related')); + }); +}; diff --git a/x-pack/test/automatic_import_api_integration/apis/tests/graphs/related.ts b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/related.ts new file mode 100644 index 0000000000000..9698017a2a3fb --- /dev/null +++ b/x-pack/test/automatic_import_api_integration/apis/tests/graphs/related.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import { postRelated } from '../../../common/lib/api/related'; +import { User } from '../../../common/lib/authentication/types'; +import { BadRequestError } from '../../../common/lib/error/error'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + describe('Run related', () => { + it('should get 400 when trying to run related with invalid json', async () => { + const response = await postRelated({ + supertest, + req: { + packageName: 'some-package', + dataStreamName: 'some-data-stream', + rawSamples: ['{test:json}'], + samplesFormat: { + name: 'json', + }, + connectorId: 'preconfigured-bedrock', + currentPipeline: { processors: [] }, + }, + expectedHttpCode: 400, + auth: { + user: { username: 'elastic', password: 'elastic' } as User, + }, + }); + if (response instanceof BadRequestError) { + expect(response.message).to.be("Expected property name or '}' in JSON at position 1"); + } else { + expect().fail('Expected BadRequestError'); + } + }); + it('should get 400 when trying to run related without connector action', async () => { + const response = await postRelated({ + supertest, + req: { + packageName: 'some-package', + dataStreamName: 'some-data-stream', + rawSamples: ['{test:json}'], + samplesFormat: { + name: 'json', + }, + connectorId: 'preconfigured-dummy', + currentPipeline: { processors: [] }, + }, + expectedHttpCode: 400, + auth: { + user: { username: 'elastic', password: 'elastic' } as User, + }, + }); + if (response instanceof BadRequestError) { + expect(response.message).to.be('Saved object [action/preconfigured-dummy] not found'); + } else { + expect().fail('Expected BadRequestError'); + } + }); + }); +} diff --git a/x-pack/test/automatic_import_api_integration/common/lib/api/categorization.ts b/x-pack/test/automatic_import_api_integration/common/lib/api/categorization.ts index f14efc63ee8a0..38bc7ddafe320 100644 --- a/x-pack/test/automatic_import_api_integration/common/lib/api/categorization.ts +++ b/x-pack/test/automatic_import_api_integration/common/lib/api/categorization.ts @@ -12,6 +12,7 @@ import { } from '@kbn/integration-assistant-plugin/common'; import { superUser } from '../authentication/users'; import { User } from '../authentication/types'; +import { BadRequestError } from '../error/error'; export const postCategorization = async ({ supertest, @@ -23,7 +24,7 @@ export const postCategorization = async ({ req: CategorizationRequestBody; expectedHttpCode?: number; auth: { user: User }; -}): Promise<CategorizationResponse> => { +}): Promise<CategorizationResponse | BadRequestError> => { const { body: response } = await supertest .post(`${CATEGORIZATION_GRAPH_PATH}`) .send(req) @@ -32,5 +33,9 @@ export const postCategorization = async ({ .auth(auth.user.username, auth.user.password) .expect(expectedHttpCode); + if (response.statusCode === 400) { + return new BadRequestError(response.message); + } + return response; }; diff --git a/x-pack/test/automatic_import_api_integration/common/lib/api/ecs.ts b/x-pack/test/automatic_import_api_integration/common/lib/api/ecs.ts index 3169659d7e2f3..82888d0861659 100644 --- a/x-pack/test/automatic_import_api_integration/common/lib/api/ecs.ts +++ b/x-pack/test/automatic_import_api_integration/common/lib/api/ecs.ts @@ -12,6 +12,7 @@ import { } from '@kbn/integration-assistant-plugin/common'; import { superUser } from '../authentication/users'; import { User } from '../authentication/types'; +import { BadRequestError } from '../error/error'; export const postEcsMapping = async ({ supertest, @@ -23,7 +24,7 @@ export const postEcsMapping = async ({ req: EcsMappingRequestBody; expectedHttpCode?: number; auth: { user: User }; -}): Promise<EcsMappingResponse> => { +}): Promise<EcsMappingResponse | BadRequestError> => { const { body: response } = await supertest .post(`${ECS_GRAPH_PATH}`) .send(req) @@ -32,5 +33,9 @@ export const postEcsMapping = async ({ .auth(auth.user.username, auth.user.password) .expect(expectedHttpCode); + if (response.statusCode === 400) { + return new BadRequestError(response.message); + } + return response; }; diff --git a/x-pack/test/automatic_import_api_integration/common/lib/api/related.ts b/x-pack/test/automatic_import_api_integration/common/lib/api/related.ts index 7ebe3d3bf89c2..0620d98fcb269 100644 --- a/x-pack/test/automatic_import_api_integration/common/lib/api/related.ts +++ b/x-pack/test/automatic_import_api_integration/common/lib/api/related.ts @@ -12,6 +12,7 @@ import { } from '@kbn/integration-assistant-plugin/common'; import { superUser } from '../authentication/users'; import { User } from '../authentication/types'; +import { BadRequestError } from '../error/error'; export const postRelated = async ({ supertest, @@ -23,7 +24,7 @@ export const postRelated = async ({ req: RelatedRequestBody; expectedHttpCode?: number; auth: { user: User }; -}): Promise<RelatedResponse> => { +}): Promise<RelatedResponse | BadRequestError> => { const { body: response } = await supertest .post(`${RELATED_GRAPH_PATH}`) .send(req) @@ -32,5 +33,9 @@ export const postRelated = async ({ .auth(auth.user.username, auth.user.password) .expect(expectedHttpCode); + if (response.statusCode === 400) { + return new BadRequestError(response.message); + } + return response; }; diff --git a/x-pack/test/automatic_import_api_integration/common/lib/error/error.ts b/x-pack/test/automatic_import_api_integration/common/lib/error/error.ts new file mode 100644 index 0000000000000..d0a19d0d8dfdb --- /dev/null +++ b/x-pack/test/automatic_import_api_integration/common/lib/error/error.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export class BadRequestError { + statusCode: number = 400; + error: string | undefined; + message: string | undefined; + + constructor(message: string) { + this.message = message; + } +} diff --git a/x-pack/test/functional/apps/lens/group4/color_mapping.ts b/x-pack/test/functional/apps/lens/group4/color_mapping.ts index 008ffa1cb53e1..d14505fb0b147 100644 --- a/x-pack/test/functional/apps/lens/group4/color_mapping.ts +++ b/x-pack/test/functional/apps/lens/group4/color_mapping.ts @@ -6,17 +6,15 @@ */ import expect from '@kbn/expect'; -import { - EUI_AMSTERDAM_PALETTE_COLORS, - ELASTIC_BRAND_PALETTE_COLORS, - EUIAmsterdamColorBlindPalette, - ElasticBrandPalette, -} from '@kbn/coloring/src/shared_components/color_mapping/palettes'; +import { getKbnPalettes, KbnPalette } from '@kbn/palettes'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const { visualize, lens } = getPageObjects(['visualize', 'lens']); const elasticChart = getService('elasticChart'); + const palettes = getKbnPalettes({ name: 'amsterdam', darkMode: false }); + const defaultPalette = palettes.get(KbnPalette.Default); + const classicPalette = palettes.get(KbnPalette.ElasticClassic); describe('lens color mapping', () => { before(async () => { @@ -34,7 +32,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', operation: 'terms', field: 'extension.raw', - palette: { mode: 'colorMapping', id: ElasticBrandPalette.id }, + palette: { mode: 'colorMapping', id: classicPalette.id }, keepOpen: true, }); }); @@ -43,18 +41,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const chart = await lens.getCurrentChartDebugState('xyVisChart'); const legendColors = chart?.legend?.items?.map((item) => item.color.toLowerCase()) ?? []; expect(legendColors).to.eql( - ELASTIC_BRAND_PALETTE_COLORS.slice(0, 5).map((c) => c.toLowerCase()) + classicPalette + .colors() + .slice(0, 5) + .map((c) => c.toLowerCase()) ); }); + it('should allow switching color mapping palette', async () => { await lens.changeColorMappingPalette( 'lnsXY_splitDimensionPanel > lnsLayerPanel-dimensionLink', - EUIAmsterdamColorBlindPalette.id + defaultPalette.id ); const chart = await lens.getCurrentChartDebugState('xyVisChart'); const legendColors = chart?.legend?.items?.map((item) => item.color.toLowerCase()) ?? []; expect(legendColors).to.eql( - EUI_AMSTERDAM_PALETTE_COLORS.slice(0, 5).map((c) => c.toLowerCase()) + defaultPalette + .colors() + .slice(0, 5) + .map((c) => c.toLowerCase()) ); }); @@ -66,7 +71,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); const chart = await lens.getCurrentChartDebugState('xyVisChart'); const firstLegendItemColor = chart?.legend?.items?.[0]?.color?.toLowerCase() ?? 'NONE'; - expect(firstLegendItemColor).to.eql(EUI_AMSTERDAM_PALETTE_COLORS[3].toLowerCase()); + expect(firstLegendItemColor).to.eql(defaultPalette.colors()[3].toLowerCase()); }); }); } diff --git a/x-pack/test/functional/apps/lens/group4/colors.ts b/x-pack/test/functional/apps/lens/group4/colors.ts index 5c5bbea4ba2c5..68e0ce9f88560 100644 --- a/x-pack/test/functional/apps/lens/group4/colors.ts +++ b/x-pack/test/functional/apps/lens/group4/colors.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { ElasticBrandPalette } from '@kbn/coloring'; +import { KbnPalette } from '@kbn/palettes'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObjects }: FtrProviderContext) { @@ -57,25 +57,25 @@ export default function ({ getPageObjects }: FtrProviderContext) { dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', operation: 'terms', field: '@message.raw', - palette: { mode: 'colorMapping', id: ElasticBrandPalette.id }, + palette: { mode: 'colorMapping', id: KbnPalette.ElasticClassic }, keepOpen: true, }); - await lens.assertPalette(ElasticBrandPalette.id, false); + await lens.assertPalette(KbnPalette.ElasticClassic, false); await lens.closeDimensionEditor(); }); it('should carry over palette to the pie chart', async () => { await lens.switchToVisualization('pie'); await lens.openDimensionEditor('lnsPie_sliceByDimensionPanel > lns-dimensionTrigger'); - await lens.assertPalette(ElasticBrandPalette.id, false); + await lens.assertPalette(KbnPalette.ElasticClassic, false); await lens.closeDimensionEditor(); }); it('should carry palette back to the bar chart', async () => { await lens.switchToVisualization('bar'); await lens.openDimensionEditor('lnsXY_splitDimensionPanel > lns-dimensionTrigger'); - await lens.assertPalette(ElasticBrandPalette.id, false); + await lens.assertPalette(KbnPalette.ElasticClassic, false); }); }); } diff --git a/x-pack/test/functional/apps/management/config.ts b/x-pack/test/functional/apps/management/config.ts index e4a06d30f260d..7ca5d972aa064 100644 --- a/x-pack/test/functional/apps/management/config.ts +++ b/x-pack/test/functional/apps/management/config.ts @@ -15,10 +15,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { testFiles: [require.resolve('.')], kbnTestServer: { ...functionalConfig.get('kbnTestServer'), - serverArgs: [ - ...functionalConfig.get('kbnTestServer.serverArgs'), - '--xpack.spaces.experimental.forceSolutionVisibility=true', - ], + serverArgs: [...functionalConfig.get('kbnTestServer.serverArgs')], }, }; } diff --git a/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts b/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts index 4b100595a38c6..a2c00647adf92 100644 --- a/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts +++ b/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts @@ -15,6 +15,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const spacesServices = getService('spaces'); const log = getService('log'); + const find = getService('find'); describe('Spaces Management: Create and Edit', () => { before(async () => { @@ -43,6 +44,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('create a space with a given name', async () => { await PageObjects.spaceSelector.addSpaceName(spaceName); + await PageObjects.spaceSelector.changeSolutionView('classic'); await PageObjects.spaceSelector.clickSaveSpaceCreation(); await testSubjects.existOrFail(`spacesListTableRow-${spaceId}`); }); @@ -60,6 +62,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { name: spaceName, disabledFeatures: [], color: '#AABBCC', + solution: 'classic', }); await PageObjects.common.navigateToApp('spacesManagement'); @@ -103,14 +106,100 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('solution view', () => { - it('does not show solution view panel', async () => { + it('does show the solution view panel', async () => { await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { shouldUseHashForSubUrl: false, }); await testSubjects.existOrFail('spaces-view-page'); await testSubjects.existOrFail('spaces-view-page > generalPanel'); - await testSubjects.missingOrFail('spaces-view-page > navigationPanel'); // xpack.spaces.allowSolutionVisibility is not enabled, so the solution view picker should not appear + await testSubjects.existOrFail('spaces-view-page > navigationPanel'); + }); + + it('changes the space solution and updates the side navigation', async () => { + await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { + shouldUseHashForSubUrl: false, + }); + + // Make sure we are on the classic side nav + await testSubjects.existOrFail('mgtSideBarNav'); + await testSubjects.missingOrFail('searchSideNav'); + + // change to Enterprise Search + await PageObjects.spaceSelector.changeSolutionView('es'); + await PageObjects.spaceSelector.clickSaveSpaceCreation(); + await PageObjects.spaceSelector.confirmModal(); + + await find.waitForDeletedByCssSelector('.kibanaWelcomeLogo'); + + // Search side nav is loaded + await testSubjects.existOrFail('searchSideNav'); + await testSubjects.missingOrFail('mgtSideBarNav'); + + // change back to classic + await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { + shouldUseHashForSubUrl: false, + }); + + await testSubjects.missingOrFail('space-edit-page-user-impact-warning'); + await PageObjects.spaceSelector.changeSolutionView('classic'); + await testSubjects.existOrFail('space-edit-page-user-impact-warning'); // Warn that the change will impact other users + + await PageObjects.spaceSelector.clickSaveSpaceCreation(); + await PageObjects.spaceSelector.confirmModal(); + + await testSubjects.existOrFail('mgtSideBarNav'); + await testSubjects.missingOrFail('searchSideNav'); + }); + }); + + describe('API-created Space', () => { + before(async () => { + await spacesServices.create({ + id: 'foo-space', + name: 'Foo Space', + disabledFeatures: [], + color: '#AABBCC', + }); + }); + + after(async () => { + await spacesServices.delete('foo-space'); + }); + + it('enabled features can be changed while the solution view remains unselected', async () => { + const securityFeatureCheckboxId = 'featureCategoryCheckbox_securitySolution'; + + await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/foo-space', { + shouldUseHashForSubUrl: false, + }); + + await testSubjects.existOrFail('spaces-view-page'); + + // ensure security feature is selected by default + expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(true); + + // Do not set a solution view first! + + await PageObjects.spaceSelector.toggleFeatureCategoryCheckbox('securitySolution'); + // + // ensure security feature now unselected + expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(false); + + await testSubjects.existOrFail('space-edit-page-user-impact-warning'); + + await PageObjects.spaceSelector.clickSaveSpaceCreation(); + + await testSubjects.click('confirmModalConfirmButton'); + + await testSubjects.existOrFail('spaces-view-page'); + + await testSubjects.click('foo-space-hyperlink'); + + await testSubjects.existOrFail('spaces-view-page'); + + // ensure security feature is still unselected + expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(false); }); }); }); diff --git a/x-pack/test/functional/apps/spaces/index.ts b/x-pack/test/functional/apps/spaces/index.ts index 3fe77a1a4528b..4a9334ab30486 100644 --- a/x-pack/test/functional/apps/spaces/index.ts +++ b/x-pack/test/functional/apps/spaces/index.ts @@ -15,5 +15,6 @@ export default function spacesApp({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./enter_space')); loadTestFile(require.resolve('./create_edit_space')); loadTestFile(require.resolve('./spaces_grid')); + loadTestFile(require.resolve('./solution_tour')); }); } diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts b/x-pack/test/functional/apps/spaces/solution_tour.ts similarity index 98% rename from x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts rename to x-pack/test/functional/apps/spaces/solution_tour.ts index ac8281f45a56e..862fe9146ee69 100644 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts +++ b/x-pack/test/functional/apps/spaces/solution_tour.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import type { SolutionView, Space } from '@kbn/spaces-plugin/common'; -import { FtrProviderContext } from '../../../ftr_provider_context'; +import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/config.ts b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/config.ts deleted file mode 100644 index f99c2daf38960..0000000000000 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/config.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FtrConfigProviderContext } from '@kbn/test'; - -/** - * NOTE: The solution view is currently only available in the cloud environment. - * This test suite fakes a cloud environement by setting the cloud.id and cloud.base_url - */ - -export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); - - return { - ...functionalConfig.getAll(), - testFiles: [require.resolve('.')], - kbnTestServer: { - ...functionalConfig.get('kbnTestServer'), - serverArgs: [ - ...functionalConfig.get('kbnTestServer.serverArgs'), - // Note: the base64 string in the cloud.id config contains the ES endpoint required in the functional tests - '--xpack.cloud.id=ftr_fake_cloud_id:aGVsbG8uY29tOjQ0MyRFUzEyM2FiYyRrYm4xMjNhYmM=', - '--xpack.cloud.base_url=https://cloud.elastic.co', - '--xpack.cloud.deployment_url=/deployments/deploymentId', - ], - }, - }; -} diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts deleted file mode 100644 index 8695077eae74e..0000000000000 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getPageObjects, getService }: FtrProviderContext) { - const kibanaServer = getService('kibanaServer'); - const PageObjects = getPageObjects(['common', 'settings', 'security', 'spaceSelector']); - const testSubjects = getService('testSubjects'); - const spacesService = getService('spaces'); - const find = getService('find'); - - describe('edit space', () => { - before(async () => { - await kibanaServer.savedObjects.cleanStandardList(); - }); - - after(async () => { - await kibanaServer.savedObjects.cleanStandardList(); - }); - - describe('solution view', () => { - it('does show the solution view panel', async () => { - await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { - shouldUseHashForSubUrl: false, - }); - - await testSubjects.existOrFail('spaces-view-page'); - await testSubjects.existOrFail('spaces-view-page > generalPanel'); - await testSubjects.existOrFail('spaces-view-page > navigationPanel'); - }); - - it('changes the space solution and updates the side navigation', async () => { - await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { - shouldUseHashForSubUrl: false, - }); - - // Make sure we are on the classic side nav - await testSubjects.existOrFail('mgtSideBarNav'); - await testSubjects.missingOrFail('searchSideNav'); - - // change to Enterprise Search - await PageObjects.spaceSelector.changeSolutionView('es'); - await PageObjects.spaceSelector.clickSaveSpaceCreation(); - await PageObjects.spaceSelector.confirmModal(); - - await find.waitForDeletedByCssSelector('.kibanaWelcomeLogo'); - - // Search side nav is loaded - await testSubjects.existOrFail('searchSideNav'); - await testSubjects.missingOrFail('mgtSideBarNav'); - - // change back to classic - await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { - shouldUseHashForSubUrl: false, - }); - - await testSubjects.missingOrFail('space-edit-page-user-impact-warning'); - await PageObjects.spaceSelector.changeSolutionView('classic'); - await testSubjects.existOrFail('space-edit-page-user-impact-warning'); // Warn that the change will impact other users - - await PageObjects.spaceSelector.clickSaveSpaceCreation(); - await PageObjects.spaceSelector.confirmModal(); - - await testSubjects.existOrFail('mgtSideBarNav'); - await testSubjects.missingOrFail('searchSideNav'); - }); - }); - - describe('API-created Space', () => { - before(async () => { - await spacesService.create({ - id: 'foo-space', - name: 'Foo Space', - disabledFeatures: [], - color: '#AABBCC', - }); - }); - - after(async () => { - await spacesService.delete('foo-space'); - }); - - it('enabled features can be changed while the solution view remains unselected', async () => { - const securityFeatureCheckboxId = 'featureCategoryCheckbox_securitySolution'; - - await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/foo-space', { - shouldUseHashForSubUrl: false, - }); - - await testSubjects.existOrFail('spaces-view-page'); - - // ensure security feature is selected by default - expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(true); - - // Do not set a solution view first! - - await PageObjects.spaceSelector.toggleFeatureCategoryCheckbox('securitySolution'); - // - // ensure security feature now unselected - expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(false); - - await testSubjects.existOrFail('space-edit-page-user-impact-warning'); - - await PageObjects.spaceSelector.clickSaveSpaceCreation(); - - await testSubjects.click('confirmModalConfirmButton'); - - await testSubjects.existOrFail('spaces-view-page'); - - await testSubjects.click('foo-space-hyperlink'); - - await testSubjects.existOrFail('spaces-view-page'); - - // ensure security feature is still unselected - expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(false); - }); - }); - }); -} diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/index.ts b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/index.ts deleted file mode 100644 index 45a8f78387154..0000000000000 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function spacesApp({ loadTestFile }: FtrProviderContext) { - describe('Spaces app (with solution view)', function spacesAppTestSuite() { - loadTestFile(require.resolve('./create_edit_space')); - loadTestFile(require.resolve('./solution_tour')); - }); -} diff --git a/x-pack/test/functional_search/config.ts b/x-pack/test/functional_search/config.ts index c7708363766b0..808edc73d97a6 100644 --- a/x-pack/test/functional_search/config.ts +++ b/x-pack/test/functional_search/config.ts @@ -30,12 +30,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { }, kbnTestServer: { ...functionalConfig.get('kbnTestServer'), - serverArgs: [ - ...functionalConfig.get('kbnTestServer.serverArgs'), - // Note: the base64 string in the cloud.id config contains the ES endpoint required in the functional tests - '--xpack.cloud.id=ftr_fake_cloud_id:aGVsbG8uY29tOjQ0MyRFUzEyM2FiYyRrYm4xMjNhYmM=', - '--xpack.cloud.base_url=https://cloud.elastic.co', - ], + serverArgs: [...functionalConfig.get('kbnTestServer.serverArgs')], }, }; } diff --git a/x-pack/test/functional_solution_sidenav/config.ts b/x-pack/test/functional_solution_sidenav/config.ts index f997aaea7c5e2..031fb55d192b7 100644 --- a/x-pack/test/functional_solution_sidenav/config.ts +++ b/x-pack/test/functional_solution_sidenav/config.ts @@ -20,12 +20,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { testFiles: [require.resolve('.')], kbnTestServer: { ...functionalConfig.get('kbnTestServer'), - serverArgs: [ - ...functionalConfig.get('kbnTestServer.serverArgs'), - // Note: the base64 string in the cloud.id config contains the ES endpoint required in the functional tests - '--xpack.cloud.id=ftr_fake_cloud_id:aGVsbG8uY29tOjQ0MyRFUzEyM2FiYyRrYm4xMjNhYmM=', - '--xpack.cloud.base_url=https://cloud.elastic.co', - ], + serverArgs: [...functionalConfig.get('kbnTestServer.serverArgs')], }, }; } diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/chat/chat.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/chat/chat.spec.ts index b1865f944f6a1..04139a574a216 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/chat/chat.spec.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/chat/chat.spec.ts @@ -137,57 +137,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]); }); - it.skip('returns a useful error if the request fails', async () => { - const interceptor = proxy.intercept('conversation', () => true); - - const passThrough = new PassThrough(); - - supertest - .post(CHAT_API_URL) - .set('kbn-xsrf', 'foo') - .send({ - name: 'my_api_call', - messages, - connectorId, - functions: [], - scopes: ['all'], - }) - .expect(200) - .pipe(passThrough); - - let data: string = ''; - - passThrough.on('data', (chunk) => { - data += chunk.toString('utf-8'); - }); - - const simulator = await interceptor.waitForIntercept(); - - await simulator.status(400); - - await simulator.rawWrite( - JSON.stringify({ - error: { - code: 'context_length_exceeded', - message: - "This model's maximum context length is 8192 tokens. However, your messages resulted in 11036 tokens. Please reduce the length of the messages.", - param: 'messages', - type: 'invalid_request_error', - }, - }) - ); - - await simulator.rawEnd(); - - await new Promise<void>((resolve) => passThrough.on('end', () => resolve())); - - const response = JSON.parse(data.trim()); - - expect(response.error.message).to.be( - `Token limit reached. Token limit is 8192, but the current conversation has 11036 tokens.` - ); - }); - describe('security roles and access privileges', () => { it('should deny access for users without the ai_assistant privilege', async () => { try { diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/functions/alerts.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/functions/alerts.spec.ts new file mode 100644 index 0000000000000..60c28aab6781b --- /dev/null +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/functions/alerts.spec.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MessageRole, MessageAddEvent } from '@kbn/observability-ai-assistant-plugin/common'; +import expect from '@kbn/expect'; +import { LlmProxy, createLlmProxy } from '../../../common/create_llm_proxy'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { getMessageAddedEvents, invokeChatCompleteWithFunctionRequest } from './helpers'; +import { + createProxyActionConnector, + deleteActionConnector, +} from '../../../common/action_connectors'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const log = getService('log'); + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + + describe('when calling the alerts function', () => { + let proxy: LlmProxy; + let connectorId: string; + let alertsEvents: MessageAddEvent[]; + + const start = 'now-100h'; + const end = 'now'; + + before(async () => { + proxy = await createLlmProxy(log); + connectorId = await createProxyActionConnector({ supertest, log, port: proxy.getPort() }); + + void proxy + .intercept('conversation', () => true, 'Hello from LLM Proxy') + .completeAfterIntercept(); + + const alertsResponseBody = await invokeChatCompleteWithFunctionRequest({ + connectorId, + observabilityAIAssistantAPIClient, + functionCall: { + name: 'alerts', + trigger: MessageRole.Assistant, + arguments: JSON.stringify({ start, end }), + }, + }); + + await proxy.waitForAllInterceptorsSettled(); + + alertsEvents = getMessageAddedEvents(alertsResponseBody); + }); + + after(async () => { + proxy.close(); + await deleteActionConnector({ supertest, connectorId, log }); + }); + + // This test ensures that invoking the alerts function does not result in an error. + it('should execute the function without any errors', async () => { + const alertsFunctionResponse = alertsEvents[0]; + expect(alertsFunctionResponse.message.message.name).to.be('alerts'); + + const parsedAlertsResponse = JSON.parse(alertsFunctionResponse.message.message.content!); + + expect(parsedAlertsResponse).not.to.have.property('error'); + expect(parsedAlertsResponse).to.have.property('total'); + expect(parsedAlertsResponse).to.have.property('alerts'); + expect(parsedAlertsResponse.alerts).to.be.an('array'); + expect(parsedAlertsResponse.total).to.be(0); + expect(parsedAlertsResponse.alerts.length).to.be(0); + }); + }); +} diff --git a/x-pack/test/observability_functional/apps/observability/index.ts b/x-pack/test/observability_functional/apps/observability/index.ts index f061fe68649d5..dce84cee32dfa 100644 --- a/x-pack/test/observability_functional/apps/observability/index.ts +++ b/x-pack/test/observability_functional/apps/observability/index.ts @@ -17,6 +17,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./pages/alerts/rule_stats')); loadTestFile(require.resolve('./pages/alerts/state_synchronization')); loadTestFile(require.resolve('./pages/alerts/table_storage')); + loadTestFile(require.resolve('./pages/alerts/custom_threshold_preview_chart')); loadTestFile(require.resolve('./pages/alerts/custom_threshold')); loadTestFile(require.resolve('./pages/cases/case_details')); loadTestFile(require.resolve('./pages/overview/alert_table')); diff --git a/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold_preview_chart.ts b/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold_preview_chart.ts new file mode 100644 index 0000000000000..6bc0564c711c1 --- /dev/null +++ b/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold_preview_chart.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from 'expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default ({ getService, getPageObject }: FtrProviderContext) => { + const common = getPageObject('common'); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const kibanaServer = getService('kibanaServer'); + const supertest = getService('supertest'); + const find = getService('find'); + const logger = getService('log'); + const retry = getService('retry'); + + describe('Custom threshold preview chart', () => { + const observability = getService('observability'); + const DATA_VIEW_1 = 'metricbeat-*'; + const DATA_VIEW_1_ID = 'data-view-id_1'; + const DATA_VIEW_1_NAME = 'test-data-view-name_1'; + + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); + await observability.alerts.common.createDataView({ + supertest, + name: DATA_VIEW_1_NAME, + id: DATA_VIEW_1_ID, + title: DATA_VIEW_1, + logger, + }); + await observability.alerts.common.navigateToRulesPage(); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); + // This also deletes the created data views + await kibanaServer.savedObjects.cleanStandardList(); + }); + + it('does render the empty chart only once at bootstrap', async () => { + await observability.alerts.rulesPage.clickCreateRuleButton(); + await observability.alerts.rulesPage.clickOnObservabilityCategory(); + await observability.alerts.rulesPage.clickOnCustomThresholdRule(); + await common.sleep(1000); + expect(await find.existsByCssSelector('[data-rendering-count="2"]')).toBe(true); + }); + + it('does render the correct error message', async () => { + await testSubjects.setValue('ruleNameInput', 'test custom threshold rule'); + + await testSubjects.click('customEquation'); + const customEquationField = await find.byCssSelector( + '[data-test-subj="thresholdRuleCustomEquationEditorFieldText"]' + ); + await customEquationField.click(); + // set an invalid equation + await customEquationField.type('A + '); + + await testSubjects.click('o11yClosablePopoverTitleButton'); + + await testSubjects.existOrFail('embeddable-lens-failure'); + const el = await find.byCssSelector('[data-test-subj="embeddable-lens-failure"] p'); + const textContent = await el.getVisibleText(); + expect(textContent).toBe('An error occurred while rendering the chart'); + }); + + it('does render the chart after fixing the error', async () => { + await testSubjects.click('customEquation'); + const customEquationField = await find.byCssSelector( + '[data-test-subj="thresholdRuleCustomEquationEditorFieldText"]' + ); + await customEquationField.click(); + // fix the equation + await customEquationField.type('A'); + await testSubjects.click('o11yClosablePopoverTitleButton'); + + // check no error is visible + await testSubjects.missingOrFail('embeddable-lens-failure'); + await retry.waitFor('Chart rendered correctly', () => { + return find.existsByCssSelector('[data-render-complete="true"]'); + }); + }); + }); +}; diff --git a/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/_find.ts b/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/_find.ts index 2ce44324f9bfe..7209af7343d1e 100644 --- a/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/_find.ts +++ b/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/_find.ts @@ -80,8 +80,9 @@ export default function (ftrContext: FtrProviderContext) { USERS.DEFAULT_SPACE_DASHBOARD_READ_USER, USERS.DEFAULT_SPACE_VISUALIZE_READ_USER, USERS.DEFAULT_SPACE_MAPS_READ_USER, + USERS.DEFAULT_SPACE_ADVANCED_SETTINGS_READ_USER, ], - noResults: [USERS.DEFAULT_SPACE_ADVANCED_SETTINGS_READ_USER], + noResults: [], unauthorized: [USERS.NOT_A_KIBANA_USER], }; diff --git a/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get.ts b/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get.ts index 25debcb2cc538..9348e458652e7 100644 --- a/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get.ts +++ b/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get.ts @@ -69,7 +69,7 @@ export default function (ftrContext: FtrProviderContext) { USERS.DEFAULT_SPACE_VISUALIZE_READ_USER, USERS.DEFAULT_SPACE_MAPS_READ_USER, ], - unauthorized: [USERS.NOT_A_KIBANA_USER, USERS.DEFAULT_SPACE_ADVANCED_SETTINGS_READ_USER], + unauthorized: [USERS.NOT_A_KIBANA_USER], }; const createUserTest = ( diff --git a/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get_all.ts b/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get_all.ts index 124fcea644c79..2d344a7179d9c 100644 --- a/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get_all.ts +++ b/x-pack/test/saved_object_tagging/api_integration/security_and_spaces/apis/get_all.ts @@ -86,7 +86,7 @@ export default function (ftrContext: FtrProviderContext) { USERS.DEFAULT_SPACE_VISUALIZE_READ_USER, USERS.DEFAULT_SPACE_MAPS_READ_USER, ], - unauthorized: [USERS.NOT_A_KIBANA_USER, USERS.DEFAULT_SPACE_ADVANCED_SETTINGS_READ_USER], + unauthorized: [USERS.NOT_A_KIBANA_USER], }; const createUserTest = ( diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/migrations/delete_alerts_migrations.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/migrations/delete_alerts_migrations.ts index 85911fc8ef7de..13c8ffc3c8ad0 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/migrations/delete_alerts_migrations.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/migrations/delete_alerts_migrations.ts @@ -13,7 +13,7 @@ import { DETECTION_ENGINE_SIGNALS_MIGRATION_URL, } from '@kbn/security-solution-plugin/common/constants'; import { ROLES } from '@kbn/security-solution-plugin/common/test'; -import { deleteMigrations, getIndexNameFromLoad } from '../../../../../utils'; +import { deleteMigrationsIfExistent, getIndexNameFromLoad } from '../../../../../utils'; import { createAlertsIndex, deleteAllAlerts, @@ -84,10 +84,12 @@ export default ({ getService }: FtrProviderContext): void => { afterEach(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/signals/outdated_signals_index'); - await deleteMigrations({ + await deleteMigrationsIfExistent({ kbnClient, ids: [createdMigration.migration_id], }); + // we need to delete migrated index, otherwise create migration call(in beforeEach hook) will fail + await es.indices.delete({ index: createdMigration.migration_index }); await deleteAllAlerts(supertest, log, es); }); @@ -99,6 +101,7 @@ export default ({ getService }: FtrProviderContext): void => { .expect(200); const deletedMigration = body.migrations[0]; + expect(deletedMigration.error).to.eql(undefined); expect(deletedMigration.id).to.eql(createdMigration.migration_id); expect(deletedMigration.sourceIndex).to.eql(outdatedAlertsIndexName); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/bootstrap_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/bootstrap_prebuilt_rules.ts index 97287ef0cdb93..a437561ef0a04 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/bootstrap_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/bootstrap_prebuilt_rules.ts @@ -18,7 +18,8 @@ export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); const securitySolutionApi = getService('securitySolutionApi'); - describe('@ess @serverless @skipInServerlessMKI Bootstrap Prebuilt Rules', () => { + // FLAKY: https://github.com/elastic/kibana/issues/203632 + describe.skip('@ess @serverless @skipInServerlessMKI Bootstrap Prebuilt Rules', () => { beforeEach(async () => { await deletePrebuiltRulesFleetPackage(supertest); await deleteEndpointFleetPackage(supertest); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/migrations/delete_migrations.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/migrations/delete_migrations.ts index 9da2e76aba4f9..da230c862889c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/migrations/delete_migrations.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/migrations/delete_migrations.ts @@ -25,3 +25,28 @@ export const deleteMigrations = async ({ ) ); }; + +export const deleteMigrationsIfExistent = async ({ + ids, + kbnClient, +}: { + ids: string[]; + kbnClient: KbnClient; +}): Promise<void> => { + await Promise.all( + ids.map(async (id) => { + try { + const res = await kbnClient.savedObjects.delete({ + id, + type: signalsMigrationType, + }); + return res; + } catch (e) { + // do not throw error when migration already deleted/not found + if (e?.response?.status !== 404) { + throw e; + } + } + }) + ); +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/endpoint_authz.ts b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/endpoint_authz.ts index df2f55ccb8d04..56b3328112e7c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/endpoint_authz.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/endpoint_authz.ts @@ -40,7 +40,9 @@ export default function ({ getService }: FtrProviderContext) { } // @skipInServerlessMKI - this test uses internal index manipulation in before/after hooks // @skipInServerlessMKI - if you are removing this annotation, make sure to add the test suite to the MKI pipeline in .buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_defend_workflows.yml - describe('@ess @serverless @skipInServerlessMKI When attempting to call an endpoint api', function () { + // FLAKY: https://github.com/elastic/kibana/issues/203909 + // FLAKY: https://github.com/elastic/kibana/issues/203910 + describe.skip('@ess @serverless @skipInServerlessMKI When attempting to call an endpoint api', function () { let indexedData: IndexedHostsAndAlertsResponse; let actionId = ''; let agentId = ''; diff --git a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/policy_response/trial_license_complete_tier/policy_response.ts b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/policy_response/trial_license_complete_tier/policy_response.ts index f3f49ffbc7c1f..a737b337faffe 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/policy_response/trial_license_complete_tier/policy_response.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/policy_response/trial_license_complete_tier/policy_response.ts @@ -13,7 +13,9 @@ export default function ({ getService }: FtrProviderContext) { const utils = getService('securitySolutionUtils'); const endpointTestresources = getService('endpointTestResources'); - describe('@ess @serverless @skipInServerlessMKI Endpoint policy response api', function () { + // FLAKY: https://github.com/elastic/kibana/issues/203908 + // Failing: See https://github.com/elastic/kibana/issues/203903 + describe.skip('@ess @serverless @skipInServerlessMKI Endpoint policy response api', function () { let adminSupertest: TestAgent; before(async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/execute.ts b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/execute.ts index 13afbf6e4551c..a82487c31eff9 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/execute.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/execute.ts @@ -23,7 +23,9 @@ export default function ({ getService }: FtrProviderContext) { const utils = getService('securitySolutionUtils'); // @skipInServerlessMKI - this test uses internal index manipulation in before/after hooks - describe('@ess @serverless @skipInServerlessMKI Endpoint `execute` response action', function () { + // FLAKY: https://github.com/elastic/kibana/issues/203906 + // Failing: See https://github.com/elastic/kibana/issues/203897 + describe.skip('@ess @serverless @skipInServerlessMKI Endpoint `execute` response action', function () { let indexedData: IndexedHostsAndAlertsResponse; let agentId = ''; let t1AnalystSupertest: TestAgent; diff --git a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/spaces/trial_license_complete_tier/space_awareness.ts b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/spaces/trial_license_complete_tier/space_awareness.ts index 9c83451111f95..38710b65465c7 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/spaces/trial_license_complete_tier/space_awareness.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/spaces/trial_license_complete_tier/space_awareness.ts @@ -24,7 +24,9 @@ export default function ({ getService }: FtrProviderContext) { const kbnServer = getService('kibanaServer'); const log = getService('log'); - describe('@ess @serverless @skipInServerlessMKI Endpoint management space awareness support', function () { + // FLAKY: https://github.com/elastic/kibana/issues/203893 + // Failing: See https://github.com/elastic/kibana/issues/203898 + describe.skip('@ess @serverless @skipInServerlessMKI Endpoint management space awareness support', function () { let adminSupertest: TestAgent; let dataSpaceA: Awaited<ReturnType<typeof endpointTestresources.loadEndpointData>>; let dataSpaceB: Awaited<ReturnType<typeof endpointTestresources.loadEndpointData>>; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts index 9d5b77919d548..efd8635d78cd6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts @@ -40,7 +40,8 @@ import { closeTimeline, openTimelineById } from '../../../tasks/timeline'; const siemDataViewTitle = 'Security Default Data View'; const dataViews = ['logs-*', 'metrics-*', '.kibana-event-log-*']; -describe('Timeline scope', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/198944 +describe.skip('Timeline scope', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { before(() => { waitForRulesBootstrap(); }); 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 f11b032d6351b..f25d362f0d798 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts @@ -12,7 +12,9 @@ import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default function (providerContext: FtrProviderContext) { const { loadTestFile, getService, getPageObjects } = providerContext; - describe('endpoint', function () { + // FLAKY: https://github.com/elastic/kibana/issues/180401 + // FLAKY: https://github.com/elastic/kibana/issues/203894 + 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/index.ts b/x-pack/test/security_solution_endpoint/apps/integrations/index.ts index 037ee3d60ec3e..5024b6d16739b 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/index.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/index.ts @@ -12,7 +12,9 @@ import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default function (providerContext: FtrProviderContext) { const { loadTestFile, getService, getPageObjects } = providerContext; - describe('integrations', function () { + // FLAKY: https://github.com/elastic/kibana/issues/203916 + // FLAKY: https://github.com/elastic/kibana/issues/180401 + describe.skip('integrations', function () { const ingestManager = getService('ingestManager'); const log = getService('log'); const endpointTestResources = getService('endpointTestResources'); diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 95178eca83172..ce202abc9738a 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -137,10 +137,8 @@ "@kbn/stack-connectors-plugin", "@kbn/stack-alerts-plugin", "@kbn/apm-data-access-plugin", - "@kbn/coloring", "@kbn/profiling-utils", "@kbn/profiling-data-access-plugin", - "@kbn/coloring", "@kbn/es", "@kbn/metrics-data-access-plugin", "@kbn/dataset-quality-plugin", @@ -188,8 +186,10 @@ "@kbn/ai-assistant-common", "@kbn/core-deprecations-common", "@kbn/usage-collection-plugin", + "@kbn/palettes", "@kbn/sse-utils-server", "@kbn/gen-ai-functional-testing", - "@kbn/integration-assistant-plugin" + "@kbn/integration-assistant-plugin", + "@kbn/core-elasticsearch-server" ] } diff --git a/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts b/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts index 74c3064f9341d..6a0f8aad4686e 100644 --- a/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts +++ b/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts @@ -17,9 +17,15 @@ import type { import { FtrProviderContext } from '../../common/ftr_provider_context'; const getApiDeprecations = (allDeprecations: DomainDeprecationDetails[]) => { - return allDeprecations.filter( - (deprecation) => deprecation.deprecationType === 'api' - ) as unknown as Array<DomainDeprecationDetails<ApiDeprecationDetails>>; + return ( + allDeprecations + .filter( + (deprecation): deprecation is DomainDeprecationDetails<ApiDeprecationDetails> => + deprecation.deprecationType === 'api' + ) + // Ensure consistent sorting + .sort((a, b) => a.title.localeCompare(b.title)) + ); }; export default function ({ getService }: FtrProviderContext) { @@ -28,8 +34,7 @@ export default function ({ getService }: FtrProviderContext) { const retry = getService('retry'); const es = getService('es'); - // FLAKY: https://github.com/elastic/kibana/issues/199782 - describe.skip('Kibana API Deprecations', function () { + describe('Kibana API Deprecations', function () { // bail on first error in this suite since cases sequentially depend on each other this.bail(true); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts index 7bd4b7f3e7a22..e0f6c5d43e788 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts @@ -15,6 +15,14 @@ export const mockAutoOpsResponse = { [1726862130000, 14657904], ], }, + { + name: 'metrics-system.core.total.pct-default', + error: null, + data: [ + [1726858530000, 13756849], + [1726862130000, 14657904], + ], + }, { name: 'logs-nginx.access-default', error: null, @@ -33,6 +41,14 @@ export const mockAutoOpsResponse = { [1726862130000, 13956423], ], }, + { + name: 'metrics-system.core.total.pct-default', + error: null, + data: [ + [1726858530000, 13756849], + [1726862130000, 14657904], + ], + }, { name: 'logs-nginx.access-default', error: null, diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts index 5460b750a5b21..6a0774ea2e8f4 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts @@ -29,7 +29,7 @@ export default function ({ getService }: FtrProviderContext) { const mockAutoopsApiService = setupMockServer(); describe('Metrics', function () { let mockApiServer: http.Server; - // due to the plugin depending on yml config (xpack.dataUsage.enabled), we cannot test in MKI until it is on by default + // MKI has a different config in the QA environment and will ignore the mock service this.tags(['skipMKI']); before(async () => { diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts index 04f0110527c79..f3a3acb9f805c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts @@ -94,6 +94,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:apm/show", "ui:apm/save", "ui:apm/alerting:show", @@ -1572,6 +1577,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:apm/show", "ui:apm/save", "ui:apm/alerting:show", @@ -3041,6 +3051,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:apm/show", "ui:apm/alerting:show", "alerting:apm.error_rate/apm/rule/get", @@ -3651,6 +3666,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:apm/show", "ui:apm/alerting:show", "alerting:apm.error_rate/apm/rule/get", @@ -4896,6 +4916,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:config-global/find", "saved_object:config-global/open_point_in_time", "saved_object:config-global/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "ui:discover/save", "ui:discover/saveQuery", @@ -6103,6 +6128,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "ui:discover/save", "ui:discover/saveQuery", @@ -7278,6 +7308,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "api:rac", "app:observability", @@ -7777,6 +7812,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:telemetry/find", "saved_object:telemetry/open_point_in_time", "saved_object:telemetry/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "ui:discover/createShortUrl", "api:rac", @@ -8879,6 +8919,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:fleetv2/read", "ui:fleetv2/all", "ui:fleetv2/agents_read", @@ -9370,6 +9415,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:fleetv2/read", "ui:fleetv2/all", "api:infra", @@ -9763,6 +9813,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:fleetv2/read", "api:infra", "api:rac", @@ -9982,6 +10037,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:fleetv2/read", "ui:fleetv2/agents_read", "ui:fleetv2/agent_policies_read", @@ -10402,6 +10462,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:infrastructure/show", "ui:infrastructure/configureSource", "ui:infrastructure/save", @@ -11920,6 +11985,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:infrastructure/show", "ui:infrastructure/configureSource", "ui:infrastructure/save", @@ -13417,6 +13487,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:infrastructure/show", "alerting:metrics.alert.threshold/infrastructure/rule/get", "alerting:metrics.alert.threshold/infrastructure/rule/getRuleState", @@ -14042,6 +14117,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:infrastructure/show", "alerting:metrics.alert.threshold/infrastructure/rule/get", "alerting:metrics.alert.threshold/infrastructure/rule/getRuleState", @@ -14650,6 +14730,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "api:downloadCsv", "ui:management/insightsAndAlerting/reporting", "ui:dashboard/downloadCsv", @@ -14685,6 +14770,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "api:downloadCsv", "ui:management/insightsAndAlerting/reporting", "ui:dashboard/downloadCsv", @@ -14713,6 +14803,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", ], "read": Array [ "login:", @@ -14736,6 +14831,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", ], }, "slo": Object { @@ -14801,6 +14901,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:slo/read", "ui:slo/write", "alerting:slo.rules.burnRate/slo/rule/get", @@ -16025,6 +16130,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:slo/read", "ui:slo/write", "alerting:slo.rules.burnRate/slo/rule/get", @@ -17227,6 +17337,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:slo/read", "alerting:slo.rules.burnRate/slo/rule/get", "alerting:slo.rules.burnRate/slo/rule/getRuleState", @@ -17727,6 +17842,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:slo/read", "alerting:slo.rules.burnRate/slo/rule/get", "alerting:slo.rules.burnRate/slo/rule/getRuleState", @@ -18315,6 +18435,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:uptime/save", "ui:uptime/configureSettings", "ui:uptime/show", @@ -19791,6 +19916,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:uptime/save", "ui:uptime/configureSettings", "ui:uptime/show", @@ -21189,6 +21319,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:uptime/show", "ui:uptime/alerting:save", "alerting:xpack.uptime.alerts.tls/uptime/rule/get", @@ -21784,6 +21919,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:uptime/show", "ui:uptime/alerting:save", "alerting:xpack.uptime.alerts.tls/uptime/rule/get", diff --git a/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts index ed9fdd30cbdae..c3fad6aa67ca8 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts @@ -703,6 +703,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:config-global/find", "saved_object:config-global/open_point_in_time", "saved_object:config-global/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "ui:discover/save", "ui:discover/saveQuery", @@ -782,6 +787,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "ui:discover/save", "ui:discover/saveQuery", @@ -829,6 +839,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", ], "read": Array [ @@ -881,6 +896,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:telemetry/find", "saved_object:telemetry/open_point_in_time", "saved_object:telemetry/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:discover/show", "ui:discover/createShortUrl", ], @@ -949,6 +969,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "api:downloadCsv", "ui:management/insightsAndAlerting/reporting", "ui:dashboard/downloadCsv", @@ -984,6 +1009,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "api:downloadCsv", "ui:management/insightsAndAlerting/reporting", "ui:dashboard/downloadCsv", @@ -1012,6 +1042,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", ], "read": Array [ "login:", @@ -1035,6 +1070,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", ], }, } diff --git a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts index 1f9a7f74fd572..dac4ff0604a1e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts @@ -67,6 +67,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "api:downloadCsv", "ui:management/insightsAndAlerting/reporting", "ui:dashboard/downloadCsv", @@ -102,6 +107,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "api:downloadCsv", "ui:management/insightsAndAlerting/reporting", "ui:dashboard/downloadCsv", @@ -130,6 +140,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", ], "read": Array [ "login:", @@ -153,6 +168,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", ], }, "siem": Object { @@ -436,6 +456,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:siem/show", "ui:siem/crud", "ui:siem/entity-analytics", @@ -843,11 +868,6 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:map/find", "saved_object:map/open_point_in_time", "saved_object:map/close_point_in_time", - "saved_object:tag/bulk_get", - "saved_object:tag/get", - "saved_object:tag/find", - "saved_object:tag/open_point_in_time", - "saved_object:tag/close_point_in_time", "ui:dashboard/createNew", "ui:dashboard/show", "ui:dashboard/showWriteControls", @@ -1295,6 +1315,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:siem/show", "ui:siem/crud", "ui:siem/entity-analytics", @@ -1700,11 +1725,6 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:map/find", "saved_object:map/open_point_in_time", "saved_object:map/close_point_in_time", - "saved_object:tag/bulk_get", - "saved_object:tag/get", - "saved_object:tag/find", - "saved_object:tag/open_point_in_time", - "saved_object:tag/close_point_in_time", "ui:dashboard/createNew", "ui:dashboard/show", "ui:dashboard/showWriteControls", @@ -1876,6 +1896,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:siem/show", "ui:siem/entity-analytics", "ui:siem/investigation-guide", @@ -2065,11 +2090,6 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:dashboard/find", "saved_object:dashboard/open_point_in_time", "saved_object:dashboard/close_point_in_time", - "saved_object:tag/bulk_get", - "saved_object:tag/get", - "saved_object:tag/find", - "saved_object:tag/open_point_in_time", - "saved_object:tag/close_point_in_time", "ui:dashboard/show", "ui:dashboard/createShortUrl", "app:visualize", @@ -2243,6 +2263,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:url/find", "saved_object:url/open_point_in_time", "saved_object:url/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", "ui:siem/show", "ui:siem/entity-analytics", "ui:siem/investigation-guide", @@ -2433,11 +2458,6 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:dashboard/find", "saved_object:dashboard/open_point_in_time", "saved_object:dashboard/close_point_in_time", - "saved_object:tag/bulk_get", - "saved_object:tag/get", - "saved_object:tag/find", - "saved_object:tag/open_point_in_time", - "saved_object:tag/close_point_in_time", "ui:dashboard/show", "ui:dashboard/createShortUrl", "app:visualize", diff --git a/x-pack/test_serverless/functional/page_objects/index.ts b/x-pack/test_serverless/functional/page_objects/index.ts index e10e98529b8bf..5c00c95b73a1d 100644 --- a/x-pack/test_serverless/functional/page_objects/index.ts +++ b/x-pack/test_serverless/functional/page_objects/index.ts @@ -26,6 +26,7 @@ import { SvlSearchElasticsearchStartPageProvider } from './svl_search_elasticsea import { SvlApiKeysProvider } from './svl_api_keys'; import { SvlSearchCreateIndexPageProvider } from './svl_search_create_index_page'; import { SvlSearchInferenceManagementPageProvider } from './svl_search_inference_management_page'; +import { SvlDataUsagePageProvider } from './svl_data_usage'; export const pageObjects = { ...xpackFunctionalPageObjects, @@ -49,4 +50,5 @@ export const pageObjects = { svlApiKeys: SvlApiKeysProvider, svlSearchCreateIndexPage: SvlSearchCreateIndexPageProvider, svlSearchInferenceManagementPage: SvlSearchInferenceManagementPageProvider, + svlDataUsagePage: SvlDataUsagePageProvider, }; diff --git a/x-pack/test_serverless/functional/page_objects/svl_data_usage.ts b/x-pack/test_serverless/functional/page_objects/svl_data_usage.ts new file mode 100644 index 0000000000000..0f684c24fcae0 --- /dev/null +++ b/x-pack/test_serverless/functional/page_objects/svl_data_usage.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export function SvlDataUsagePageProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + + return { + async assertDataUsagePageExists(): Promise<boolean> { + return await testSubjects.exists('DataUsagePage'); + }, + async clickDatastreamsDropdown() { + await testSubjects.click('data-usage-metrics-filter-dataStreams-popoverButton'); + }, + async findDatastreamsDropdownOptions() { + return await testSubjects.findAll('dataStreams-filter-option'); + }, + async findDatastreamsDropdownFilterButton() { + return await testSubjects.find('data-usage-metrics-filter-dataStreams-popoverButton'); + }, + async findIngestRateChart() { + return await testSubjects.find('ingest_rate-chart'); + }, + async storageRetainedChart() { + return await testSubjects.find('storage_retained-chart'); + }, + async findLegendItemsInChart(chartElement: WebElementWrapper) { + return await chartElement.findAllByCssSelector('li.echLegendItem'); + }, + async findLegendActionButton(legendItemElement: WebElementWrapper) { + return legendItemElement.findByTestSubject('legendActionButton'); + }, + async clickLegendActionButtonAtIndex(chartElement: WebElementWrapper, index: number) { + const legendItems = await this.findLegendItemsInChart(chartElement); + if (index < 0 || index >= legendItems.length) { + throw new Error( + `Invalid legend item index: ${index}. There are only ${legendItems.length} legend items.` + ); + } + const legendItem = legendItems[index]; + const actionButton = await this.findLegendActionButton(legendItem); + await actionButton.click(); + }, + + async assertLegendActionPopoverExists() { + await testSubjects.existOrFail('legendActionPopover'); + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts b/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts index 0b59557229cd4..438bf5ab7ee84 100644 --- a/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts +++ b/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts @@ -4,30 +4,200 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import expect from '@kbn/expect'; +import http from 'http'; +import { InterceptResponseFactory } from '@kbn/ftr-common-functional-ui-services'; import { FtrProviderContext } from '../../../ftr_provider_context'; +import { setupMockServer } from '../../../../api_integration/test_suites/common/data_usage/mock_api'; export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['svlCommonPage', 'svlManagementPage', 'common']); + const pageObjects = getPageObjects([ + 'svlDataUsagePage', + 'svlCommonPage', + 'svlManagementPage', + 'common', + ]); const testSubjects = getService('testSubjects'); const retry = getService('retry'); + const mockAutoopsApiService = setupMockServer(); + const es = getService('es'); + const browser = getService('browser'); + let mockApiServer: http.Server; + const dataStreamsMockResponse = [ + { + name: 'metrics-system.cpu-default', + storageSizeBytes: 6197, + }, + { + name: 'metrics-system.core.total.pct-default', + storageSizeBytes: 5197, + }, + { + name: 'logs-nginx.access-default', + storageSizeBytes: 1938, + }, + ]; describe('Main page', function () { this.tags(['skipMKI']); before(async () => { + // create test data streams from the mock data streams response + // so the metrics api can verify they exist + for (const { name } of dataStreamsMockResponse) { + await es.indices.putIndexTemplate({ + name, + body: { + index_patterns: [name], + data_stream: {}, + priority: 200, + }, + }); + await es.indices.createDataStream({ name }); + } await pageObjects.svlCommonPage.loginAsAdmin(); await pageObjects.common.navigateToApp('management'); await retry.waitFor('page to be visible', async () => { return await testSubjects.exists('cards-navigation-page'); }); await pageObjects.svlManagementPage.assertDataUsageManagementCardExists(); - await pageObjects.svlManagementPage.clickDataUsageManagementCard(); + + // mock external API request to autoops + mockApiServer = mockAutoopsApiService.listen(9000); + + // intercept the data_streams request to bypass waiting for the metering api to aggregate a response + // otherwise storage sizes get filtered out if they are 0 + await browser.interceptRequest( + '*data_streams*', + (responseFactory: InterceptResponseFactory) => { + return responseFactory.fulfill({ + responseCode: 200, + responseHeaders: [{ name: 'Content-Type', value: 'application/json' }], + body: Buffer.from(JSON.stringify(dataStreamsMockResponse)).toString('base64'), + }); + }, + async () => { + await pageObjects.svlManagementPage.clickDataUsageManagementCard(); + } + ); + }); + after(async () => { + mockApiServer.close(); + for (const { name } of dataStreamsMockResponse) { + await es.indices.deleteDataStream({ name }); + } }); it('renders data usage page', async () => { await retry.waitFor('page to be visible', async () => { - return await testSubjects.exists('DataUsagePage'); + return await pageObjects.svlDataUsagePage.assertDataUsagePageExists(); + }); + }); + it('shows 3 data streams in the filter dropdown', async () => { + // Click the dropdown button to show the options + await pageObjects.svlDataUsagePage.clickDatastreamsDropdown(); + + const options = await pageObjects.svlDataUsagePage.findDatastreamsDropdownOptions(); + + // Assert that exactly 3 elements are present + expect(options.length).to.eql(3); + + // Assert that each option is checked + for (const option of options) { + const ariaChecked = await option.getAttribute('aria-checked'); + expect(ariaChecked).to.be('true'); + } + + // Locate the filter button using its data-test-subj + const datastreamsDropdownFilterButton = + await pageObjects.svlDataUsagePage.findDatastreamsDropdownFilterButton(); + + // Find the badge element within the button (using its CSS class) + const notificationBadge = await datastreamsDropdownFilterButton.findByCssSelector( + '.euiNotificationBadge' + ); + + // Retrieve the text content of the badge + const activeFiltersCount = await notificationBadge.getVisibleText(); + + // Assert the badge displays the expected count + expect(activeFiltersCount).to.be('3'); + }); + it('renders charts', async () => { + // Data is coming from the mocked autoops API + const chartContainer = await testSubjects.find('data-usage-metrics'); + await testSubjects.existOrFail('data-usage-metrics'); + + // Check 2 charts rendered + await retry.waitFor('chart to render', async () => { + const chartStatus = await chartContainer.findAllByCssSelector( + '.echChartStatus[data-ech-render-complete="true"]' + ); + return chartStatus.length === 2; + }); + }); + it('renders legend', async () => { + const ingestRateChart = await pageObjects.svlDataUsagePage.findIngestRateChart(); + const storageRetainedChart = await pageObjects.svlDataUsagePage.storageRetainedChart(); + + const ingestLegendItems = await pageObjects.svlDataUsagePage.findLegendItemsInChart( + ingestRateChart + ); + + expect(ingestLegendItems.length).to.eql(4); // 3 data streams + 1 Total line series + + const storageLegendItems = await pageObjects.svlDataUsagePage.findLegendItemsInChart( + storageRetainedChart + ); + expect(storageLegendItems.length).to.eql(4); // same number of data streams + total line series + }); + it('renders actions popover with correct links', async () => { + // Open the first legend item actions popover + const ingestRateChart = await pageObjects.svlDataUsagePage.findIngestRateChart(); + await pageObjects.svlDataUsagePage.clickLegendActionButtonAtIndex(ingestRateChart, 0); + await pageObjects.svlDataUsagePage.assertLegendActionPopoverExists(); + // Check for links + await testSubjects.existOrFail('copyDataStreamNameAction'); + await testSubjects.existOrFail('manageDataStreamAction'); + await testSubjects.existOrFail('DatasetQualityAction'); + + const manageLink = await testSubjects.find('manageDataStreamAction'); + await manageLink.click(); + + // Wait for navigation to the data stream details page + await retry.waitFor('URL to update (index management)', async () => { + const currentUrl = await browser.getCurrentUrl(); + return currentUrl.includes( + `/app/management/data/index_management/data_streams/${dataStreamsMockResponse[0].name}` + ); + }); + await browser.goBack(); + // test second link to ensure state changed + await pageObjects.svlDataUsagePage.clickLegendActionButtonAtIndex(ingestRateChart, 1); + await pageObjects.svlDataUsagePage.assertLegendActionPopoverExists(); + + await manageLink.click(); + + // Wait for navigation to the data stream details page + await retry.waitFor('URL to update (index management)', async () => { + const currentUrl = await browser.getCurrentUrl(); + return currentUrl.includes( + `/app/management/data/index_management/data_streams/${dataStreamsMockResponse[1].name}` + ); + }); + await browser.goBack(); + + // Test navigation for the data quality link + await pageObjects.svlDataUsagePage.clickLegendActionButtonAtIndex(ingestRateChart, 0); + await pageObjects.svlDataUsagePage.assertLegendActionPopoverExists(); + const dataQualityLink = await testSubjects.find('DatasetQualityAction'); + await dataQualityLink.click(); + + // Wait for navigation to the data quality details page + await retry.waitFor('URL to update (data quality)', async () => { + const currentUrl = await browser.getCurrentUrl(); + return currentUrl.includes('/app/management/data/data_quality/details'); }); + await browser.goBack(); }); }); }; diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts index 3692a17709a2e..cd1668484337e 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts @@ -217,3 +217,7 @@ export const MORE_THAN_1024_CHARS = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; export const ANOTHER_1024_CHARS = 'grape fig tangerine tangerine kiwi lemon papaya cherry nectarine papaya mango cherry nectarine fig cherry fig grape mango mango quince fig strawberry mango quince date kiwi quince raspberry apple kiwi banana quince fig papaya grape mango cherry banana mango cherry lemon cherry tangerine fig quince quince papaya tangerine grape strawberry banana kiwi grape mango papaya nectarine banana nectarine kiwi papaya lemon apple lemon orange fig cherry grape apple nectarine papaya orange fig papaya date mango papaya mango cherry tangerine papaya apple banana papaya cherry strawberry grape raspberry lemon date papaya mango kiwi cherry fig banana banana apple date strawberry mango tangerine date lemon kiwi quince date orange orange papaya date apple fig tangerine quince tangerine date papaya banana banana orange raspberry papaya apple nectarine lemon raspberry raspberry mango cherry kiwi cherry cherry nectarine cherry date strawberry banana orange mango mango tangerine quince papaya papaya kiwi papaya strawberry date mango'; + +export const CONSISTENT_TAGS = [ + 'this_is_here_to_remove_variance_introduced_by_the_geoip_processor', +]; diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts index 7d12db16850cc..4152a745d8541 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts @@ -9,11 +9,12 @@ import expect from '@kbn/expect'; import moment from 'moment'; import { generateShortId, log, timerange } from '@kbn/apm-synthtrace-client'; import { + ANOTHER_1024_CHARS, + CONSISTENT_TAGS, + MORE_THAN_1024_CHARS, createDegradedFieldsRecord, defaultNamespace, getInitialTestLogs, - ANOTHER_1024_CHARS, - MORE_THAN_1024_CHARS, } from './data'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { logsSynthMappings } from './custom_mappings/custom_synth_mappings'; @@ -55,8 +56,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const apmAppDataStreamName = `${type}-${apmAppDatasetName}-${defaultNamespace}`; describe('Degraded fields flyout', function () { - // see details: https://github.com/elastic/kibana/issues/202641 - this.tags(['failsOnMKI']); describe('degraded field flyout open-close', () => { before(async () => { await synthtrace.index([ @@ -207,6 +206,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'service.name': serviceName, 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + // this works around a geoip limitation in CI + tags: CONSISTENT_TAGS, }) .timestamp(timestamp) ); @@ -300,6 +301,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], 'cloud.project.id': generateShortId(), + // this works around a geoip limitation in CI + tags: CONSISTENT_TAGS, }) .timestamp(timestamp) ); @@ -410,6 +413,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], 'cloud.project.id': generateShortId(), + // this works around a geoip limitation in CI + tags: CONSISTENT_TAGS, }) .timestamp(timestamp) ); diff --git a/yarn.lock b/yarn.lock index 47aad7866ae0c..c8054baf36e9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3848,7 +3848,7 @@ version "0.0.0" uid "" -"@kbn/ai-assistant-management-plugin@link:src/plugins/ai_assistant_management/selection": +"@kbn/ai-assistant-management-plugin@link:src/platform/plugins/shared/ai_assistant_management/selection": version "0.0.0" uid "" @@ -5240,7 +5240,7 @@ version "0.0.0" uid "" -"@kbn/data-usage-plugin@link:x-pack/plugins/data_usage": +"@kbn/data-usage-plugin@link:x-pack/platform/plugins/private/data_usage": version "0.0.0" uid "" @@ -5408,7 +5408,7 @@ version "0.0.0" uid "" -"@kbn/ecs-data-quality-dashboard@link:x-pack/packages/security-solution/ecs_data_quality_dashboard": +"@kbn/ecs-data-quality-dashboard@link:x-pack/solutions/security/packages/ecs_data_quality_dashboard": version "0.0.0" uid "" @@ -6448,15 +6448,23 @@ version "0.0.0" uid "" -"@kbn/observability-ai-assistant-app-plugin@link:x-pack/plugins/observability_solution/observability_ai_assistant_app": +"@kbn/observability-ai-assistant-app-plugin@link:x-pack/solutions/observability/plugins/observability_ai_assistant_app": version "0.0.0" uid "" -"@kbn/observability-ai-assistant-management-plugin@link:x-pack/plugins/observability_solution/observability_ai_assistant_management": +"@kbn/observability-ai-assistant-management-plugin@link:x-pack/solutions/observability/plugins/observability_ai_assistant_management": version "0.0.0" uid "" -"@kbn/observability-ai-assistant-plugin@link:x-pack/plugins/observability_solution/observability_ai_assistant": +"@kbn/observability-ai-assistant-plugin@link:x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant": + version "0.0.0" + uid "" + +"@kbn/observability-ai-common@link:x-pack/solutions/observability/packages/observability_ai/observability_ai_common": + version "0.0.0" + uid "" + +"@kbn/observability-ai-server@link:x-pack/solutions/observability/packages/observability_ai/observability_ai_server": version "0.0.0" uid "" @@ -6564,6 +6572,10 @@ version "0.0.0" uid "" +"@kbn/palettes@link:packages/kbn-palettes": + version "0.0.0" + uid "" + "@kbn/panel-loader@link:packages/kbn-panel-loader": version "0.0.0" uid "" @@ -6688,6 +6700,10 @@ version "0.0.0" uid "" +"@kbn/relocate@link:packages/kbn-relocate": + version "0.0.0" + uid "" + "@kbn/remote-clusters-plugin@link:x-pack/plugins/remote_clusters": version "0.0.0" uid "" @@ -7060,7 +7076,7 @@ version "0.0.0" uid "" -"@kbn/security-solution-distribution-bar@link:x-pack/packages/security-solution/distribution_bar": +"@kbn/security-solution-distribution-bar@link:x-pack/solutions/security/packages/distribution_bar": version "0.0.0" uid "" @@ -7068,7 +7084,7 @@ version "0.0.0" uid "" -"@kbn/security-solution-features@link:x-pack/packages/security-solution/features": +"@kbn/security-solution-features@link:x-pack/solutions/security/packages/features": version "0.0.0" uid "" @@ -7076,7 +7092,7 @@ version "0.0.0" uid "" -"@kbn/security-solution-navigation@link:x-pack/packages/security-solution/navigation": +"@kbn/security-solution-navigation@link:x-pack/solutions/security/packages/navigation": version "0.0.0" uid "" @@ -7088,15 +7104,15 @@ version "0.0.0" uid "" -"@kbn/security-solution-side-nav@link:x-pack/packages/security-solution/side_nav": +"@kbn/security-solution-side-nav@link:x-pack/solutions/security/packages/side_nav": version "0.0.0" uid "" -"@kbn/security-solution-storybook-config@link:x-pack/packages/security-solution/storybook/config": +"@kbn/security-solution-storybook-config@link:x-pack/solutions/security/packages/storybook/config": version "0.0.0" uid "" -"@kbn/security-solution-upselling@link:x-pack/packages/security-solution/upselling": +"@kbn/security-solution-upselling@link:x-pack/solutions/security/packages/upselling": version "0.0.0" uid "" @@ -7112,7 +7128,7 @@ version "0.0.0" uid "" -"@kbn/securitysolution-data-table@link:x-pack/packages/security-solution/data_table": +"@kbn/securitysolution-data-table@link:x-pack/solutions/security/packages/data_table": version "0.0.0" uid "" @@ -8128,6 +8144,21 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@ljharb/resumer@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@ljharb/resumer/-/resumer-0.1.3.tgz#5ef4a4958da1b4e71ffea8ef33499cc622672d89" + integrity sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw== + dependencies: + "@ljharb/through" "^2.3.13" + call-bind "^1.0.7" + +"@ljharb/through@^2.3.13": + version "2.3.13" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.13.tgz#b7e4766e0b65aa82e529be945ab078de79874edc" + integrity sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ== + dependencies: + call-bind "^1.0.7" + "@lmdb/lmdb-darwin-arm64@2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.9.2.tgz#da42cda48018eabfd678b9698e68a0102221b4ba" @@ -11887,10 +11918,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a" integrity sha1-UALhT3Xi1x5WQoHfBDHIwbSio2o= -"@types/minimist@^1.2.0", "@types/minimist@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/minimist@^1.2.0", "@types/minimist@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/mock-fs@^4.13.1": version "4.13.1" @@ -13354,11 +13385,6 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" -ansi-colors@4.1.1, ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-colors@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" @@ -13371,6 +13397,11 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -13682,6 +13713,17 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.every@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/array.prototype.every/-/array.prototype.every-1.1.6.tgz#1717b407d019913250317300d814a1b6660f10d7" + integrity sha512-gNEqZD97w6bfQRNmHkFv7rNnGM+VWyHZT+h/rf9C+22owcXuENr66Lfo0phItpU5KoXW6Owb34q2+8MnSIZ57w== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + is-string "^1.0.7" + array.prototype.findlastindex@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" @@ -14571,7 +14613,7 @@ brotli@^1.2.0: dependencies: base64-js "^1.1.2" -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== @@ -15115,7 +15157,7 @@ cheerio@^1.0.0-rc.12, cheerio@^1.0.0-rc.3: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@3.5.3, chokidar@^2.1.2, chokidar@^2.1.8, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.3: +chokidar@^2.1.2, chokidar@^2.1.8, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -15997,9 +16039,9 @@ cronstrue@^1.51.0: integrity sha512-fSRAz/MV0TRjeNZKAsovmH/MSsly7+8np4XsfsrjOOz7sjxLrE9SmedRYAs3nPAtLLC5UsMpvenjXYRz463bMA== cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -16008,9 +16050,9 @@ cross-spawn@^6.0.0: which "^1.2.9" cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82" - integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -16836,7 +16878,7 @@ deep-equal@^1.0.0, deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-equal@^2.0.3, deep-equal@^2.2.3: +deep-equal@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== @@ -16965,10 +17007,10 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +defined@^1.0.0, defined@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== degenerator@^5.0.0: version "5.0.1" @@ -17268,11 +17310,6 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -17283,10 +17320,10 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.0.0, diff@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +diff@^5.0.0, diff@^5.1.0, diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== diffie-hellman@^5.0.0: version "5.0.2" @@ -17617,10 +17654,10 @@ elastic-apm-node@3.46.0: traverse "^0.6.6" unicode-byte-truncate "^1.0.0" -elastic-apm-node@^4.8.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.8.1.tgz#b0ff8e04d7109c64b98608de73936c8740849f60" - integrity sha512-gryl5pJWd9Cp7qK+McHIFm9VlsqKipoXWIsKOGyPGzrddIVKKA8ONnLBwymQ1A2x4uXuk1HnIVwBvyk56vukaw== +elastic-apm-node@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.9.0.tgz#8ca807fdf64404b615b60c4090bd9c9aad5b78ed" + integrity sha512-VUbrahqHmqpfwGHtUysWJ7aeCIUm61hAw8tSu0gE9AYdriVSPod4Ki11X4K8sBri0bIc/FTHxOrg7kudhGoqHQ== dependencies: "@elastic/ecs-pino-format" "^1.5.0" "@opentelemetry/api" "^1.4.1" @@ -17640,7 +17677,7 @@ elastic-apm-node@^4.8.1: fast-safe-stringify "^2.0.7" fast-stream-to-buffer "^1.0.0" http-headers "^3.0.2" - import-in-the-middle "1.11.2" + import-in-the-middle "1.11.3" json-bigint "^1.0.0" lru-cache "10.2.0" measured-reporting "^1.51.1" @@ -18119,11 +18156,6 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -18134,6 +18166,11 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^2.0.0, escodegen@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" @@ -19198,14 +19235,6 @@ find-test-names@1.28.18, find-test-names@^1.19.0: globby "^11.0.4" simple-bin-help "^1.8.0" -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -19229,6 +19258,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -19586,6 +19623,11 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +fuse.js@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" + integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== + gauge@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" @@ -19898,19 +19940,7 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@8.1.0: +glob@8.1.0, glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -20269,6 +20299,14 @@ has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-dynamic-import@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-dynamic-import/-/has-dynamic-import-2.1.0.tgz#06359ad7672b9e764aea93a54bb9d6e17542d34c" + integrity sha512-su0anMkNEnJKZ/rB99jn3y6lV/J8Ro96hBJ28YAeVzj5rWxH+YL/AdCyiYYA1HDLV9YhmvqpWSJJj2KLo1MX6g== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -20529,7 +20567,7 @@ hdr-histogram-percentiles-obj@^3.0.0: resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== -he@1.2.0, he@^1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -20988,10 +21026,10 @@ import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-in-the-middle@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f" - integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA== +import-in-the-middle@1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.3.tgz#08559f2c05fd65ba7062e747af056ed18a80120c" + integrity sha512-tNpKEb4AjZrCyrxi+Eyu43h5ig0O8ZRFSXPHh/00/o+4P4pKzVEW/m5lsVtsAT7fCIgmQOAPjdqecGDsBXRxsw== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -22599,10 +22637,10 @@ js-search@^1.4.3: resolved "https://registry.yarnpkg.com/js-search/-/js-search-1.4.3.tgz#23a86d7e064ca53a473930edc48615b6b1c1954a" integrity sha512-Sny5pf00kX1sM1KzvUC9nGYWXOvBfy30rmvZWeRktpg+esQKedIXrXNee/I2CAnsouCyaTjitZpRflDACx4toA== -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== +js-sha256@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.11.0.tgz#256a921d9292f7fe98905face82e367abaca9576" + integrity sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q== js-string-escape@^1.0.1: version "1.0.1" @@ -22621,13 +22659,6 @@ js-tiktoken@^1.0.12, js-tiktoken@^1.0.14: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -22636,6 +22667,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" @@ -23447,14 +23485,6 @@ lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -23462,6 +23492,14 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" +log-symbols@^4.0.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -24261,13 +24299,6 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -24275,7 +24306,7 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatc dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.0: +minimatch@^5.0.1, minimatch@^5.1.0, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -24446,32 +24477,31 @@ mocha-multi-reporters@^1.5.1: debug "^4.1.1" lodash "^4.17.15" -mocha@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" - integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== +mocha@^10.3.0: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" mochawesome-merge@^4.3.0: version "4.3.0" @@ -24521,6 +24551,19 @@ mock-fs@^5.1.2: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-5.1.2.tgz#6fa486e06d00f8793a8d2228de980eff93ce6db7" integrity sha512-YkjQkdLulFrz0vD4BfNQdQRVmgycXTV7ykuHMlyv+C8WCHazpkiQRDthwa02kSyo8wKnY9wRptHfQLgmf0eR+A== +mock-property@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.1.0.tgz#b38b9961476d2e54cde2033b62847b9546b3670d" + integrity sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ== + dependencies: + define-data-property "^1.1.4" + functions-have-names "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + hasown "^2.0.2" + isarray "^2.0.5" + object-inspect "^1.13.2" + module-definition@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-5.0.1.tgz#62d1194e5d5ea6176b7dc7730f818f466aefa32f" @@ -24810,11 +24853,6 @@ nano-css@^5.2.1: stacktrace-js "^2.0.0" stylis "3.5.0" -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - nanoid@3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -25360,18 +25398,18 @@ object-identity-map@^1.0.2: dependencies: object.entries "^1.1.0" -object-inspect@^1.13.1, object-inspect@^1.7.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.1, object-inspect@^1.13.2, object-inspect@^1.7.0: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== -object-is@^1.0.1, object-is@^1.0.2, object-is@^1.1.2, object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== +object-is@^1.0.1, object-is@^1.0.2, object-is@^1.1.2, object-is@^1.1.5, object-is@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -28691,7 +28729,7 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12. path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: +resolve@^2.0.0-next.4, resolve@^2.0.0-next.5: version "2.0.0-next.5" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== @@ -28723,13 +28761,6 @@ restore-cursor@^5.0.0: onetime "^7.0.0" signal-exit "^4.1.0" -resumer@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -29284,13 +29315,6 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -29305,7 +29329,7 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.1: +serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== @@ -30499,7 +30523,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -30704,13 +30728,6 @@ supertest@^7.0.0: methods "^1.1.2" superagent "^9.0.1" -supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -30730,6 +30747,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -30906,28 +30930,33 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tape@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-5.0.1.tgz#0d70ce90a586387c4efda4393e72872672a416a3" - integrity sha512-wVsOl2shKPcjdJdc8a+PwacvrOdJZJ57cLUXlxW4TQ2R6aihXwG0m0bKm4mA4wjtQNTaLMCrYNEb4f9fjHKUYQ== +tape@^5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-5.9.0.tgz#8d1a7472c6a154b82ce23b20dd9dc70ec0729b46" + integrity sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA== dependencies: - deep-equal "^2.0.3" - defined "^1.0.0" + "@ljharb/resumer" "^0.1.3" + "@ljharb/through" "^2.3.13" + array.prototype.every "^1.1.6" + call-bind "^1.0.7" + deep-equal "^2.2.3" + defined "^1.0.1" dotignore "^0.1.2" for-each "^0.3.3" - function-bind "^1.1.1" - glob "^7.1.6" - has "^1.0.3" + get-package-type "^0.1.0" + glob "^7.2.3" + has-dynamic-import "^2.1.0" + hasown "^2.0.2" inherits "^2.0.4" - is-regex "^1.0.5" - minimist "^1.2.5" - object-inspect "^1.7.0" - object-is "^1.1.2" - object.assign "^4.1.0" - resolve "^1.17.0" - resumer "^0.0.0" - string.prototype.trim "^1.2.1" - through "^2.3.8" + is-regex "^1.1.4" + minimist "^1.2.8" + mock-property "^1.1.0" + object-inspect "^1.13.2" + object-is "^1.1.6" + object-keys "^1.1.1" + object.assign "^4.1.5" + resolve "^2.0.0-next.5" + string.prototype.trim "^1.2.9" tar-fs@^2.0.0: version "2.1.1" @@ -31197,7 +31226,7 @@ through2@~0.4.1: readable-stream "~1.0.17" xtend "~2.1.1" -through@^2.3.6, through@^2.3.8, through@~2.3.4: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -33395,10 +33424,10 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" @@ -33625,11 +33654,6 @@ yaml@^2.5.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== -yargs-parser@20.2.4, yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -33638,12 +33662,17 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.0.0, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -33653,19 +33682,6 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@17.0.1: version "17.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.0.1.tgz#6a1ced4ed5ee0b388010ba9fd67af83b9362e0bb" @@ -33696,6 +33712,19 @@ yargs@^15.0.2, yargs@^15.3.1, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^17.0.1, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.7.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"