From adb4bdf8d89dc924b7c0d6fc5ebaac95e307254a Mon Sep 17 00:00:00 2001 From: Gerard Soldevila Date: Thu, 20 Mar 2025 10:20:07 +0100 Subject: [PATCH] SKA: Extract list of Kibana solutions into a dedicated package (#213353) ## Summary The intent is to have a centralised place to store the list of Kibana solutions and serverless project types. To that end, this PR creates a `@kbn/projects-solutions-groups` package. It also adds the new solution type `'chat'`. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../scripts/steps/cloud/purge_projects.ts | 9 +- .buildkite/scripts/steps/serverless/deploy.sh | 1 + .github/CODEOWNERS | 3 + .gitignore | 1 + config/README.md | 3 +- config/serverless.chat.yml | 41 ++++++++ dev_docs/contributing/code_walkthrough.mdx | 5 +- package.json | 3 + .../src/dependency_graph/common/constants.ts | 16 +-- .../providers/cruiser.test.ts | 9 +- packages/kbn-dependency-usage/tsconfig.json | 1 + .../src/helpers/groups.ts | 2 +- .../rules/no_group_crossing_imports.test.ts | 2 +- .../rules/no_group_crossing_manifests.test.ts | 2 +- .../src/rules/no_group_crossing_manifests.ts | 2 +- .../kbn-eslint-plugin-imports/tsconfig.json | 1 + .../src/commands/package_command.ts | 21 ++-- packages/kbn-generate/src/paths.ts | 16 ++- packages/kbn-generate/tsconfig.json | 1 + .../src/kibana_json_v2_schema.ts | 3 +- .../kbn-kibana-manifest-schema/tsconfig.json | 3 + packages/kbn-mock-idp-plugin/server/plugin.ts | 4 + packages/kbn-optimizer/limits.yml | 1 + .../kbn-plugin-generator/src/ask_questions.ts | 17 +--- packages/kbn-plugin-generator/tsconfig.json | 1 + packages/kbn-relocate/tsconfig.json | 1 + packages/kbn-relocate/utils/relocate.ts | 3 +- .../kbn-repo-source-classifier/src/group.ts | 25 +++-- .../src/module_id.ts | 2 +- .../src/repo_source_classifier.ts | 2 +- .../kbn-repo-source-classifier/tsconfig.json | 1 + src/cli/serve/compile_config_stack.js | 8 +- src/cli/tsconfig.json | 1 + .../common/src/default_app_categories.ts | 1 + .../src/root/serverless_config.ts | 12 +-- .../root/server-internal/tsconfig.json | 1 + src/dev/precommit_hook/casing_check_config.js | 6 +- src/dev/tsconfig.json | 1 + .../kbn-code-owners/src/code_owner_areas.ts | 13 ++- .../kbn-projects-solutions-groups/README.md | 3 + .../kbn-projects-solutions-groups/index.ts | 97 +++++++++++++++++++ .../kibana.jsonc | 7 ++ .../package.json | 6 ++ .../tsconfig.json | 13 +++ .../kbn-repo-packages/modern/package.js | 19 ++-- .../modern/parse_package_manifest.js | 5 +- .../private/kbn-repo-packages/modern/types.ts | 4 +- .../private/kbn-repo-packages/tsconfig.json | 2 +- .../src/plugin_list/run_plugin_list_cli.ts | 22 ++--- .../shared/kbn-dev-utils/tsconfig.json | 1 + .../shared/kbn-repo-info/tsconfig.json | 3 + .../packages/shared/kbn-repo-info/types.ts | 5 +- .../src/config/discovery/search_configs.ts | 10 +- .../packages/shared/kbn-scout/tsconfig.json | 1 + .../settings/chat_project/README.mdx | 34 +++++++ .../serverless/settings/chat_project/index.ts | 10 ++ .../settings/chat_project/kibana.jsonc | 7 ++ .../settings/chat_project/package.json | 6 ++ .../settings/chat_project/tsconfig.json | 17 ++++ .../shared/serverless/types/index.d.ts | 3 +- tsconfig.base.json | 6 ++ x-pack/.telemetryrc.json | 5 + .../schema/README.md | 2 + .../schema/xpack_chat.json | 3 + .../chat/plugins/serverless_chat/.gitignore | 2 + .../chat/plugins/serverless_chat/README.mdx | 3 + .../serverless_chat/jest.config.dev.js | 16 +++ .../chat/plugins/serverless_chat/kibana.jsonc | 23 +++++ .../chat/plugins/serverless_chat/package.json | 11 +++ .../plugins/serverless_chat/public/index.ts | 16 +++ .../serverless_chat/public/jest.config.js | 30 ++++++ .../plugins/serverless_chat/public/plugin.ts | 43 ++++++++ .../plugins/serverless_chat/public/types.ts | 22 +++++ .../plugins/serverless_chat/server/config.ts | 23 +++++ .../plugins/serverless_chat/server/index.ts | 19 ++++ .../serverless_chat/server/jest.config.js | 13 +++ .../plugins/serverless_chat/server/plugin.ts | 54 +++++++++++ .../plugins/serverless_chat/server/types.ts | 20 ++++ .../plugins/serverless_chat/tsconfig.json | 23 +++++ .../apis/telemetry/telemetry.ts | 3 + .../apis/telemetry/telemetry_local.ts | 3 + .../common/telemetry/snapshot_telemetry.ts | 3 + yarn.lock | 12 +++ 83 files changed, 767 insertions(+), 108 deletions(-) create mode 100644 config/serverless.chat.yml create mode 100644 src/platform/packages/private/kbn-projects-solutions-groups/README.md create mode 100644 src/platform/packages/private/kbn-projects-solutions-groups/index.ts create mode 100644 src/platform/packages/private/kbn-projects-solutions-groups/kibana.jsonc create mode 100644 src/platform/packages/private/kbn-projects-solutions-groups/package.json create mode 100644 src/platform/packages/private/kbn-projects-solutions-groups/tsconfig.json create mode 100644 src/platform/packages/shared/serverless/settings/chat_project/README.mdx create mode 100644 src/platform/packages/shared/serverless/settings/chat_project/index.ts create mode 100644 src/platform/packages/shared/serverless/settings/chat_project/kibana.jsonc create mode 100644 src/platform/packages/shared/serverless/settings/chat_project/package.json create mode 100644 src/platform/packages/shared/serverless/settings/chat_project/tsconfig.json create mode 100644 x-pack/platform/plugins/private/telemetry_collection_xpack/schema/xpack_chat.json create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/.gitignore create mode 100755 x-pack/solutions/chat/plugins/serverless_chat/README.mdx create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/jest.config.dev.js create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/kibana.jsonc create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/package.json create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/public/index.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/public/jest.config.js create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/public/plugin.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/public/types.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/server/config.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/server/index.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/server/jest.config.js create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/server/plugin.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/server/types.ts create mode 100644 x-pack/solutions/chat/plugins/serverless_chat/tsconfig.json diff --git a/.buildkite/scripts/steps/cloud/purge_projects.ts b/.buildkite/scripts/steps/cloud/purge_projects.ts index 14ea457d9a30..95e33f3f6b20 100644 --- a/.buildkite/scripts/steps/cloud/purge_projects.ts +++ b/.buildkite/scripts/steps/cloud/purge_projects.ts @@ -12,13 +12,16 @@ import axios from 'axios'; import { getKibanaDir } from '#pipeline-utils'; async function getPrProjects() { - const match = /^(keep.?)?kibana-pr-([0-9]+)-(elasticsearch|security|observability)$/; + // BOOKMARK - List of Kibana project types + const match = /^(keep.?)?kibana-pr-([0-9]+)-(elasticsearch|security|observability|chat)$/; try { + // BOOKMARK - List of Kibana project types return ( await Promise.all([ projectRequest.get('/api/v1/serverless/projects/elasticsearch'), projectRequest.get('/api/v1/serverless/projects/security'), projectRequest.get('/api/v1/serverless/projects/observability'), + // TODO handle the new 'chat' project type - https://elastic.slack.com/archives/C5UDAFZQU/p1741692053429579 ]) ) .map((response) => response.data.items) @@ -47,11 +50,13 @@ async function deleteProject({ id, name, }: { - type: 'elasticsearch' | 'observability' | 'security'; + // BOOKMARK - List of Kibana project types + type: 'elasticsearch' | 'security' | 'observability' | 'chat'; id: number; name: string; }) { try { + // TODO handle the new 'chat' project type, and ideally rename 'elasticsearch' to 'search' await projectRequest.delete(`/api/v1/serverless/projects/${type}/${id}`); execSync(`.buildkite/scripts/common/deployment_credentials.sh unset ${name}`, { diff --git a/.buildkite/scripts/steps/serverless/deploy.sh b/.buildkite/scripts/steps/serverless/deploy.sh index 2c7fd1fdf2e6..cf59e5fcf6fb 100644 --- a/.buildkite/scripts/steps/serverless/deploy.sh +++ b/.buildkite/scripts/steps/serverless/deploy.sh @@ -9,6 +9,7 @@ KIBANA_IMAGE="docker.elastic.co/kibana-ci/kibana-serverless:pr-$BUILDKITE_PULL_R deploy() { PROJECT_TYPE=$1 + # BOOKMARK - List of Kibana solutions case $PROJECT_TYPE in elasticsearch) PROJECT_TYPE_LABEL='Elasticsearch Serverless' diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1d2f8c72036f..5956c69f1eda 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -339,6 +339,7 @@ src/platform/packages/private/kbn-node-libs-browser-webpack-plugin @elastic/kiba src/platform/packages/private/kbn-optimizer-webpack-helpers @elastic/kibana-operations src/platform/packages/private/kbn-panel-loader @elastic/kibana-presentation src/platform/packages/private/kbn-peggy @elastic/kibana-operations +src/platform/packages/private/kbn-projects-solutions-groups @elastic/kibana-core src/platform/packages/private/kbn-react-mute-legacy-root-warning @elastic/appex-sharedux src/platform/packages/private/kbn-repo-packages @elastic/kibana-operations src/platform/packages/private/kbn-repo-path @elastic/kibana-operations @@ -568,6 +569,7 @@ src/platform/packages/shared/response-ops/alerts-fields-browser @elastic/respons src/platform/packages/shared/response-ops/alerts-table @elastic/response-ops src/platform/packages/shared/response-ops/rule_form @elastic/response-ops src/platform/packages/shared/response-ops/rule_params @elastic/response-ops +src/platform/packages/shared/serverless/settings/chat_project @elastic/search-kibana src/platform/packages/shared/serverless/settings/common @elastic/appex-sharedux @elastic/kibana-management 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 @@ -931,6 +933,7 @@ x-pack/platform/plugins/shared/streams_app @elastic/streams-program-team x-pack/platform/plugins/shared/task_manager @elastic/response-ops x-pack/platform/plugins/shared/timelines @elastic/security-threat-hunting-investigations x-pack/platform/plugins/shared/triggers_actions_ui @elastic/response-ops +x-pack/solutions/chat/plugins/serverless_chat @elastic/search-kibana 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 diff --git a/.gitignore b/.gitignore index 5f4ad8c10438..2797d9ccabca 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,7 @@ webpackstats.json !/config/README.md !/config/serverless.yml !/config/serverless.es.yml +!/config/serverless.chat.yml !/config/serverless.oblt.yml !/config/serverless.security.yml !/config/serverless.security.essentials.yml diff --git a/config/README.md b/config/README.md index 83ef1b1c6612..838665b0caea 100644 --- a/config/README.md +++ b/config/README.md @@ -2,7 +2,8 @@ as work on serverless picks up we will add config values to these files that define how Kibana will run in "serverless" modes. To start Kibana locally with this configuration, pass `--serverless={mode}` or run `yarn serverless-{mode}` -valid modes are currently: `es`, `oblt`, and `security` +[//]: # (BOOKMARK - List of Kibana project types) +valid modes are currently: `es`, `oblt`, `security` and `chat` configuration is applied in the following order, later values override 1. serverless.yml (serverless configs go first) diff --git a/config/serverless.chat.yml b/config/serverless.chat.yml new file mode 100644 index 000000000000..7bf1e1084717 --- /dev/null +++ b/config/serverless.chat.yml @@ -0,0 +1,41 @@ +# Chat Project Config + +## Enable the Serverless Chat plugin +xpack.serverless.chat.enabled: true + +## Cloud settings +xpack.cloud.serverless.project_type: search + +## Set the home route +uiSettings.overrides.defaultRoute: /app/home + +## Disable plugins that belong to other solutions +xpack.apm.enabled: false +xpack.entities_data_access.enabled: false +xpack.infra.enabled: false +xpack.inventory.enabled: false +xpack.investigate.enabled: false +xpack.investigateApp.enabled: false +xpack.observability.enabled: false +xpack.observabilityAIAssistantApp.enabled: false +xpack.observabilityLogsExplorer.enabled: false +xpack.profiling.enabled: false +xpack.serverless.observability.enabled: false +xpack.slo.enabled: false +xpack.uptime.enabled: false +xpack.legacy_uptime.enabled: false +xpack.ux.enabled: false +xpack.search.enabled: false +xpack.searchAssistant.enabled: false +xpack.search.connectors.enabled: false +xpack.search.homepage.enabled: false +xpack.searchIndices.enabled: false +xpack.searchInferenceEndpoints.enabled: false +xpack.searchNotebooks.enabled: false +xpack.searchPlayground.enabled: false +xpack.searchSynonyms.enabled: false +xpack.serverless.search.enabled: false +xpack.cloudSecurityPosture.enabled: false +xpack.securitySolution.enabled: false +xpack.securitySolutionEss.enabled: false +xpack.securitySolutionServerless.enabled: false diff --git a/dev_docs/contributing/code_walkthrough.mdx b/dev_docs/contributing/code_walkthrough.mdx index 388446f79e67..c5095cdee097 100644 --- a/dev_docs/contributing/code_walkthrough.mdx +++ b/dev_docs/contributing/code_walkthrough.mdx @@ -107,7 +107,10 @@ Contains all of the gold+ (non-basic) modules that are common to all Kibana solu ## [x-pack/solutions](https://github.com/elastic/kibana/tree/main/x-pack/solutions) -Contains all of the code that is specific to each Kibana solution. At the moment, we have a folder for [observability](https://github.com/elastic/kibana/tree/main/x-pack/solutions/observability), another for [security](https://github.com/elastic/kibana/tree/main/x-pack/solutions/security), and another for [search](https://github.com/elastic/kibana/tree/main/x-pack/solutions/search). These folders contain the modules that belong to each solution, and these modules are also categorised as plugins or packages. +[//]: # (BOOKMARK - List of Kibana solutions) +Contains all of the code that is specific to each Kibana solution. At the moment, we have a folder for [observability](https://github.com/elastic/kibana/tree/main/x-pack/solutions/observability), another for [security](https://github.com/elastic/kibana/tree/main/x-pack/solutions/security), another for [search](https://github.com/elastic/kibana/tree/main/x-pack/solutions/search) and another for [chat](https://github.com/elastic/kibana/tree/main/x-pack/solutions/chat) (serverless only). + +These folders contain the modules that belong to each solution, and these modules are also categorised as plugins or packages. Unlike the `src/platform` and the `x-pack/platform` code, the solution-specific modules are `private` by definition, aka they cannot be accessed from platform nor from other solutions. ### [x-pack/build_chromium](https://github.com/elastic/kibana/tree/main/x-pack/build_chromium) diff --git a/package.json b/package.json index c60552a380e1..267cc7fab2d8 100644 --- a/package.json +++ b/package.json @@ -743,6 +743,7 @@ "@kbn/profiling-data-access-plugin": "link:x-pack/solutions/observability/plugins/profiling_data_access", "@kbn/profiling-plugin": "link:x-pack/solutions/observability/plugins/profiling", "@kbn/profiling-utils": "link:src/platform/packages/shared/kbn-profiling-utils", + "@kbn/projects-solutions-groups": "link:src/platform/packages/private/kbn-projects-solutions-groups", "@kbn/random-sampling": "link:x-pack/platform/packages/private/kbn-random-sampling", "@kbn/react-field": "link:src/platform/packages/shared/kbn-react-field", "@kbn/react-hooks": "link:src/platform/packages/shared/kbn-react-hooks", @@ -879,6 +880,8 @@ "@kbn/server-route-repository-client": "link:src/platform/packages/shared/kbn-server-route-repository-client", "@kbn/server-route-repository-utils": "link:src/platform/packages/shared/kbn-server-route-repository-utils", "@kbn/serverless": "link:x-pack/platform/plugins/shared/serverless", + "@kbn/serverless-chat": "link:x-pack/solutions/chat/plugins/serverless_chat", + "@kbn/serverless-chat-settings": "link:src/platform/packages/shared/serverless/settings/chat_project", "@kbn/serverless-common-settings": "link:src/platform/packages/shared/serverless/settings/common", "@kbn/serverless-observability": "link:x-pack/solutions/observability/plugins/serverless_observability", "@kbn/serverless-observability-settings": "link:src/platform/packages/shared/serverless/settings/observability_project", diff --git a/packages/kbn-dependency-usage/src/dependency_graph/common/constants.ts b/packages/kbn-dependency-usage/src/dependency_graph/common/constants.ts index d04da0f62da8..0d7f48d92697 100644 --- a/packages/kbn-dependency-usage/src/dependency_graph/common/constants.ts +++ b/packages/kbn-dependency-usage/src/dependency_graph/common/constants.ts @@ -7,13 +7,13 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export const aggregationGroups = [ - 'x-pack/solutions/observability/plugins', - 'x-pack/solutions/observability/packages', - 'x-pack/solutions/security/plugins', - 'x-pack/solutions/security/packages', - 'x-pack/solutions/search/plugins', - 'x-pack/solutions/search/packages', +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; + +export const aggregationGroups: string[] = [ + ...KIBANA_SOLUTIONS.flatMap((solution) => [ + `x-pack/solutions/${solution}/plugins`, + `x-pack/solutions/${solution}/packages`, + ]), 'x-pack/platform/plugins', 'x-pack/platform/packages', 'x-pack/packages', @@ -27,7 +27,7 @@ export const aggregationGroups = [ 'test', ]; -export const excludePaths = [ +export const excludePaths: string[] = [ '(^|/)target($|/)', '^kbn', '^@kbn', diff --git a/packages/kbn-dependency-usage/src/dependency_graph/providers/cruiser.test.ts b/packages/kbn-dependency-usage/src/dependency_graph/providers/cruiser.test.ts index f3a67c595513..c53bc0c03e95 100644 --- a/packages/kbn-dependency-usage/src/dependency_graph/providers/cruiser.test.ts +++ b/packages/kbn-dependency-usage/src/dependency_graph/providers/cruiser.test.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; import { identifyDependencyUsageWithCruiser as identifyDependencyUsage } from './cruiser.ts'; import { cruise } from 'dependency-cruiser'; @@ -113,12 +114,16 @@ describe('identifyDependencyUsage', () => { const [, configWithDepth2] = (cruise as jest.Mock).mock.calls[0]; const [, configWithDepth1] = (cruise as jest.Mock).mock.calls[1]; + const solutionsFolders = KIBANA_SOLUTIONS.flatMap((solution) => [ + `x-pack/solutions/${solution}/plugins`, + `x-pack/solutions/${solution}/packages`, + ]).join('|'); expect(configWithDepth2.collapse).toMatchInlineSnapshot( - `"^(x-pack/solutions/observability/plugins|x-pack/solutions/observability/packages|x-pack/solutions/security/plugins|x-pack/solutions/security/packages|x-pack/solutions/search/plugins|x-pack/solutions/search/packages|x-pack/platform/plugins|x-pack/platform/packages|x-pack/packages|src/platform/plugins|src/platform/packages|src/core/packages|packages|src|x-pack/test|x-pack/test_serverless|test)/([^/]+)/([^/]+)"` + `"^(${solutionsFolders}|x-pack/platform/plugins|x-pack/platform/packages|x-pack/packages|src/platform/plugins|src/platform/packages|src/core/packages|packages|src|x-pack/test|x-pack/test_serverless|test)/([^/]+)/([^/]+)"` ); expect(configWithDepth1.collapse).toMatchInlineSnapshot( - `"^(x-pack/solutions/observability/plugins|x-pack/solutions/observability/packages|x-pack/solutions/security/plugins|x-pack/solutions/security/packages|x-pack/solutions/search/plugins|x-pack/solutions/search/packages|x-pack/platform/plugins|x-pack/platform/packages|x-pack/packages|src/platform/plugins|src/platform/packages|src/core/packages|packages|src|x-pack/test|x-pack/test_serverless|test)/([^/]+)|^node_modules/(@[^/]+/[^/]+|[^/]+)"` + `"^(${solutionsFolders}|x-pack/platform/plugins|x-pack/platform/packages|x-pack/packages|src/platform/plugins|src/platform/packages|src/core/packages|packages|src|x-pack/test|x-pack/test_serverless|test)/([^/]+)|^node_modules/(@[^/]+/[^/]+|[^/]+)"` ); }); diff --git a/packages/kbn-dependency-usage/tsconfig.json b/packages/kbn-dependency-usage/tsconfig.json index 96b87da389c3..c5791f42dfca 100644 --- a/packages/kbn-dependency-usage/tsconfig.json +++ b/packages/kbn-dependency-usage/tsconfig.json @@ -16,5 +16,6 @@ ], "kbn_references": [ "@kbn/repo-info", + "@kbn/projects-solutions-groups", ], } diff --git a/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts b/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts index 2769f51bb855..ad6519aed006 100644 --- a/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts +++ b/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; import type { ModuleId } from '@kbn/repo-source-classifier'; /** diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts index 73decfb9d865..b2f0d58b192c 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts @@ -11,7 +11,7 @@ import { RuleTester } from 'eslint'; import dedent from 'dedent'; import { NoGroupCrossingImportsRule } from './no_group_crossing_imports'; import { formatSuggestions } from '../helpers/report'; -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; import type { KibanaPackageManifest } from '@kbn/repo-packages'; interface ModuleInfo { diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.test.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.test.ts index bf75a01b222b..88aa7ef53a18 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.test.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.test.ts @@ -12,7 +12,7 @@ import dedent from 'dedent'; import { NoGroupCrossingManifestsRule } from './no_group_crossing_manifests'; import { formatSuggestions } from '../helpers/report'; import { ModuleId } from '@kbn/repo-source-classifier/src/module_id'; -import { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; const makePlugin = (filename: string) => ({ filename, diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts index 918412725cd2..be1989534be9 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts @@ -13,7 +13,7 @@ import type { Rule } from 'eslint'; import type { Node } from 'estree'; import { getPackages, getPluginPackagesFilter } from '@kbn/repo-packages'; import { REPO_ROOT } from '@kbn/repo-info'; -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; import { getSourcePath } from '../helpers/source'; import { getImportResolver } from '../get_import_resolver'; import { getRepoSourceClassifier } from '../helpers/repo_source_classifier'; diff --git a/packages/kbn-eslint-plugin-imports/tsconfig.json b/packages/kbn-eslint-plugin-imports/tsconfig.json index b0ab9182171c..3dcbaea76a67 100644 --- a/packages/kbn-eslint-plugin-imports/tsconfig.json +++ b/packages/kbn-eslint-plugin-imports/tsconfig.json @@ -15,6 +15,7 @@ "@kbn/repo-source-classifier", "@kbn/repo-info", "@kbn/repo-packages", + "@kbn/projects-solutions-groups", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-generate/src/commands/package_command.ts b/packages/kbn-generate/src/commands/package_command.ts index 4b5fcd8c5f9c..06749d6665f7 100644 --- a/packages/kbn-generate/src/commands/package_command.ts +++ b/packages/kbn-generate/src/commands/package_command.ts @@ -19,6 +19,11 @@ import { REPO_ROOT } from '@kbn/repo-info'; import { createFailError, createFlagError, isFailError } from '@kbn/dev-cli-errors'; import { sortPackageJson } from '@kbn/sort-package-json'; +import { + KIBANA_GROUPS, + type KibanaGroup, + type ModuleVisibility, +} from '@kbn/projects-solutions-groups'; import { validateElasticTeam } from '../lib/validate_elastic_team'; import { PKG_TEMPLATE_DIR, determineDevPackageDir, determinePackageDir } from '../paths'; import type { GenerateCommand } from '../generate_command'; @@ -67,8 +72,8 @@ export const PackageCommand: GenerateCommand = { const web = !!flags.web; const dev = !!flags.dev; - let group: 'platform' | 'observability' | 'security' | 'search' = 'platform'; - let visibility: 'private' | 'shared' = 'private'; + let group: KibanaGroup = 'platform'; + let visibility: ModuleVisibility = 'private'; let calculatedPackageDir: string; const owner = @@ -109,14 +114,14 @@ export const PackageCommand: GenerateCommand = { } else { group = ( await inquirer.prompt<{ - group: 'platform' | 'observability' | 'security' | 'search'; + group: KibanaGroup; }>({ type: 'list', choices: [ - { name: 'Platform', value: 'platform' }, - { name: 'Observability', value: 'observability' }, - { name: 'Security', value: 'security' }, - { name: 'Search', value: 'search' }, + ...KIBANA_GROUPS.map((groupName) => ({ + name: groupName, + value: groupName, + })), ], name: 'group', message: `What group is this package part of?`, @@ -143,7 +148,7 @@ export const PackageCommand: GenerateCommand = { visibility = ( await inquirer.prompt<{ - visibility: 'private' | 'shared'; + visibility: ModuleVisibility; }>({ type: 'list', choices: [ diff --git a/packages/kbn-generate/src/paths.ts b/packages/kbn-generate/src/paths.ts index 618299649485..e4bbab50794f 100644 --- a/packages/kbn-generate/src/paths.ts +++ b/packages/kbn-generate/src/paths.ts @@ -10,6 +10,11 @@ import { resolve } from 'path'; import { REPO_ROOT } from '@kbn/repo-info'; +import { + type KibanaGroup, + KIBANA_SOLUTIONS, + ModuleVisibility, +} from '@kbn/projects-solutions-groups'; export const TEMPLATE_DIR = resolve(__dirname, '../templates'); export const PKG_TEMPLATE_DIR = resolve(TEMPLATE_DIR, 'package'); @@ -19,9 +24,10 @@ export const PKG_DIRS: Record = { 'oss|platform|shared': resolve(REPO_ROOT, 'src/platform/packages/shared'), 'xpack|platform|private': resolve(REPO_ROOT, 'x-pack/platform/packages/private'), 'xpack|platform|shared': resolve(REPO_ROOT, 'x-pack/platform/packages/shared'), - 'xpack|observability|private': resolve(REPO_ROOT, 'x-pack/solutions/observability/packages'), - 'xpack|security|private': resolve(REPO_ROOT, 'x-pack/solutions/security/packages'), - 'xpack|search|private': resolve(REPO_ROOT, 'x-pack/solutions/search/packages'), + ...KIBANA_SOLUTIONS.reduce>((agg, solution) => { + agg[`xpack|${solution}|private`] = resolve(REPO_ROOT, `x-pack/solutions/${solution}/packages`); + return agg; + }, {}), }; function folderName(pkgId: string) { @@ -39,8 +45,8 @@ export function determinePackageDir({ xpack, }: { pkgId: string; - group: 'observability' | 'platform' | 'security' | 'search'; - visibility: 'private' | 'shared'; + group: KibanaGroup; + visibility: ModuleVisibility; xpack: boolean; }) { const dir = PKG_DIRS[`${xpack ? 'xpack' : 'oss'}|${group}|${visibility}`]; diff --git a/packages/kbn-generate/tsconfig.json b/packages/kbn-generate/tsconfig.json index 8ff4ee5f6bea..bf1d4be28b76 100644 --- a/packages/kbn-generate/tsconfig.json +++ b/packages/kbn-generate/tsconfig.json @@ -17,6 +17,7 @@ "@kbn/dev-cli-errors", "@kbn/tooling-log", "@kbn/repo-packages", + "@kbn/projects-solutions-groups", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts b/packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts index a243dbb7598c..23458c707684 100644 --- a/packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts +++ b/packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts @@ -8,6 +8,7 @@ */ import type { JSONSchema } from 'json-schema-typed'; +import { KIBANA_GROUPS } from '@kbn/projects-solutions-groups'; import { desc } from './desc'; export const PLUGIN_ID_PATTERN = /^[a-z][a-zA-Z_]*$/; @@ -49,7 +50,7 @@ export const MANIFEST_V2: JSONSchema = { `, }, group: { - enum: ['platform', 'observability', 'security', 'search'], + enum: KIBANA_GROUPS, description: desc` Specifies the group to which this module pertains. `, diff --git a/packages/kbn-kibana-manifest-schema/tsconfig.json b/packages/kbn-kibana-manifest-schema/tsconfig.json index 9bd4f35cf62a..58e79b405343 100644 --- a/packages/kbn-kibana-manifest-schema/tsconfig.json +++ b/packages/kbn-kibana-manifest-schema/tsconfig.json @@ -12,5 +12,8 @@ ], "exclude": [ "target/**/*", + ], + "kbn_references": [ + "@kbn/projects-solutions-groups", ] } diff --git a/packages/kbn-mock-idp-plugin/server/plugin.ts b/packages/kbn-mock-idp-plugin/server/plugin.ts index fc9043099b19..569a02e8d324 100644 --- a/packages/kbn-mock-idp-plugin/server/plugin.ts +++ b/packages/kbn-mock-idp-plugin/server/plugin.ts @@ -31,10 +31,14 @@ const createSAMLResponseSchema = schema.object({ roles: schema.arrayOf(schema.string()), }); +// BOOKMARK - List of Kibana project types const projectToAlias = new Map([ ['observability', 'oblt'], ['security', 'security'], ['search', 'es'], + // TODO add new 'chat' solution + // https://elastic.slack.com/archives/C04HT4P1YS3/p1741690997400059 + // https://github.com/elastic/kibana/issues/213469 ]); const readServerlessRoles = (projectType: string) => { diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index e4b9c96c73f4..5f5013186aec 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -151,6 +151,7 @@ pageLoadAssetSize: securitySolutionEss: 31781 securitySolutionServerless: 62488 serverless: 16573 + serverlessChat: 22715 serverlessObservability: 68747 serverlessSearch: 72995 sessionView: 77750 diff --git a/packages/kbn-plugin-generator/src/ask_questions.ts b/packages/kbn-plugin-generator/src/ask_questions.ts index fe2c63a6f655..28fc27867816 100644 --- a/packages/kbn-plugin-generator/src/ask_questions.ts +++ b/packages/kbn-plugin-generator/src/ask_questions.ts @@ -11,6 +11,7 @@ import Path from 'path'; import { REPO_ROOT } from '@kbn/repo-info'; import inquirer from 'inquirer'; +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; export interface Answers { name: string; @@ -56,18 +57,10 @@ export const INTERNAL_PLUGIN_LOCATIONS: Array<{ name: string; value: string }> = name: 'X-Pack Platform (shared)', value: Path.resolve(REPO_ROOT, 'x-pack/platform/plugins/shared'), }, - { - name: 'X-Pack Observability', - value: Path.resolve(REPO_ROOT, 'x-pack/solutions/observability/plugins'), - }, - { - name: 'X-Pack Security', - value: Path.resolve(REPO_ROOT, 'x-pack/solutions/security/plugins'), - }, - { - name: 'X-Pack Search', - value: Path.resolve(REPO_ROOT, 'x-pack/solutions/search/plugins'), - }, + ...KIBANA_SOLUTIONS.map((solution) => ({ + name: `X-Pack ${solution}`, + value: Path.resolve(REPO_ROOT, `x-pack/solutions/${solution}/plugins`), + })), { name: 'X-Pack Functional Testing', value: Path.resolve(REPO_ROOT, 'x-pack/test/plugin_functional/plugins'), diff --git a/packages/kbn-plugin-generator/tsconfig.json b/packages/kbn-plugin-generator/tsconfig.json index 7c818fe8c558..fe2cad53999c 100644 --- a/packages/kbn-plugin-generator/tsconfig.json +++ b/packages/kbn-plugin-generator/tsconfig.json @@ -20,5 +20,6 @@ "@kbn/dev-cli-runner", "@kbn/dev-cli-errors", "@kbn/jest-serializers", + "@kbn/projects-solutions-groups", ], } diff --git a/packages/kbn-relocate/tsconfig.json b/packages/kbn-relocate/tsconfig.json index cd1126848613..23f155e21f07 100644 --- a/packages/kbn-relocate/tsconfig.json +++ b/packages/kbn-relocate/tsconfig.json @@ -18,5 +18,6 @@ "@kbn/repo-info", "@kbn/repo-packages", "@kbn/tooling-log", + "@kbn/projects-solutions-groups", ] } diff --git a/packages/kbn-relocate/utils/relocate.ts b/packages/kbn-relocate/utils/relocate.ts index e9dcc2c18eac..ecd6f5166e77 100644 --- a/packages/kbn-relocate/utils/relocate.ts +++ b/packages/kbn-relocate/utils/relocate.ts @@ -10,6 +10,7 @@ import { basename, join } from 'path'; import type { ToolingLog } from '@kbn/tooling-log'; import { orderBy } from 'lodash'; +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; import type { Package } from '../types'; import { HARDCODED_MODULE_PATHS, applyTransforms } from './transforms'; import { @@ -99,7 +100,7 @@ export const calculateModuleTargetFolder = (module: Package): string => { moduleFolder ); } - } else if (group === 'observability' || group === 'security' || group === 'search') { + } else if (KIBANA_SOLUTIONS.some((solution) => solution === group)) { path = join( BASE_FOLDER, 'x-pack', // all solution modules are 'x-pack' diff --git a/packages/kbn-repo-source-classifier/src/group.ts b/packages/kbn-repo-source-classifier/src/group.ts index 64327040b613..944eba9e9ef4 100644 --- a/packages/kbn-repo-source-classifier/src/group.ts +++ b/packages/kbn-repo-source-classifier/src/group.ts @@ -7,7 +7,11 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import { + KIBANA_SOLUTIONS, + type ModuleGroup, + type ModuleVisibility, +} from '@kbn/projects-solutions-groups'; interface ModuleAttrs { group: ModuleGroup; @@ -37,18 +41,13 @@ const MODULE_GROUPING_BY_PATH: Record = ['packages', 'plugi group: 'platform', visibility: 'private', }, - [`x-pack/solutions/observability/${type}`]: { - group: 'observability', - visibility: 'private', - }, - [`x-pack/solutions/security/${type}`]: { - group: 'security', - visibility: 'private', - }, - [`x-pack/solutions/search/${type}`]: { - group: 'search', - visibility: 'private', - }, + ...KIBANA_SOLUTIONS.reduce>((acc, solution) => { + acc[`x-pack/solutions/${solution}/${type}`] = { + group: solution, + visibility: 'private', + }; + return acc; + }, {}), })) .reduce((acc, current) => ({ ...acc, ...current }), { 'src/platform/test': { diff --git a/packages/kbn-repo-source-classifier/src/module_id.ts b/packages/kbn-repo-source-classifier/src/module_id.ts index 284ffe26de0d..443a6151fca2 100644 --- a/packages/kbn-repo-source-classifier/src/module_id.ts +++ b/packages/kbn-repo-source-classifier/src/module_id.ts @@ -8,7 +8,7 @@ */ import type { KibanaPackageManifest } from '@kbn/repo-packages'; -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; import type { ModuleType } from './module_type'; import type { PkgInfo } from './pkg_info'; diff --git a/packages/kbn-repo-source-classifier/src/repo_source_classifier.ts b/packages/kbn-repo-source-classifier/src/repo_source_classifier.ts index bfa837591988..53e2a3f5a05b 100644 --- a/packages/kbn-repo-source-classifier/src/repo_source_classifier.ts +++ b/packages/kbn-repo-source-classifier/src/repo_source_classifier.ts @@ -8,7 +8,7 @@ */ import type { ImportResolver } from '@kbn/import-resolver'; -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; import type { KibanaPackageManifest } from '@kbn/repo-packages/modern/types'; import type { ModuleId } from './module_id'; import type { ModuleType } from './module_type'; diff --git a/packages/kbn-repo-source-classifier/tsconfig.json b/packages/kbn-repo-source-classifier/tsconfig.json index 418b114eebaf..20aab3e31873 100644 --- a/packages/kbn-repo-source-classifier/tsconfig.json +++ b/packages/kbn-repo-source-classifier/tsconfig.json @@ -14,6 +14,7 @@ "@kbn/import-resolver", "@kbn/repo-info", "@kbn/repo-packages", + "@kbn/projects-solutions-groups", ], "exclude": [ "target/**/*", diff --git a/src/cli/serve/compile_config_stack.js b/src/cli/serve/compile_config_stack.js index ac9f5dc5f26c..c9722e823dc5 100644 --- a/src/cli/serve/compile_config_stack.js +++ b/src/cli/serve/compile_config_stack.js @@ -17,9 +17,11 @@ import { getConfigFromFiles } from '@kbn/config'; const isNotEmpty = _.negate(_.isEmpty); const isNotNull = _.negate(_.isNull); -/** @typedef {'es' | 'oblt' | 'security'} ServerlessProjectMode */ -/** @type {ServerlessProjectMode[]} */ -const VALID_SERVERLESS_PROJECT_MODE = ['es', 'oblt', 'security']; +/** + * BOOKMARK - List of Kibana project types + * @type {import('@kbn/projects-solutions-groups').KibanaProject[]} + * */ +const VALID_SERVERLESS_PROJECT_MODE = ['es', 'oblt', 'security', 'chat']; /** * Collects paths to configurations to be included in the final configuration stack. diff --git a/src/cli/tsconfig.json b/src/cli/tsconfig.json index 29903572a685..863aa1e06899 100644 --- a/src/cli/tsconfig.json +++ b/src/cli/tsconfig.json @@ -18,6 +18,7 @@ "@kbn/config", "@kbn/dev-utils", "@kbn/apm-config-loader", + "@kbn/projects-solutions-groups", ], "exclude": [ "target/**/*", diff --git a/src/core/packages/application/common/src/default_app_categories.ts b/src/core/packages/application/common/src/default_app_categories.ts index fc509900bb2e..509191938870 100644 --- a/src/core/packages/application/common/src/default_app_categories.ts +++ b/src/core/packages/application/common/src/default_app_categories.ts @@ -20,6 +20,7 @@ export const DEFAULT_APP_CATEGORIES: Record = Object.freeze euiIconType: 'logoKibana', order: 1000, }, + // BOOKMARK - List of Kibana solutions - TODO handle the new 'chat' project type - https://elastic.slack.com/archives/C061KHPJS2C/p1741691346619339 enterpriseSearch: { id: 'enterpriseSearch', label: i18n.translate('core.ui.searchNavList.label', { diff --git a/src/core/packages/root/server-internal/src/root/serverless_config.ts b/src/core/packages/root/server-internal/src/root/serverless_config.ts index ea40124119a0..1e883f227184 100644 --- a/src/core/packages/root/server-internal/src/root/serverless_config.ts +++ b/src/core/packages/root/server-internal/src/root/serverless_config.ts @@ -7,8 +7,9 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { schema, TypeOf, Type } from '@kbn/config-schema'; -import { ServiceConfigDescriptor } from '@kbn/core-base-server-internal'; +import { schema, TypeOf, type Type } from '@kbn/config-schema'; +import type { ServiceConfigDescriptor } from '@kbn/core-base-server-internal'; +import { KIBANA_PROJECTS, type KibanaProject } from '@kbn/projects-solutions-groups'; // Config validation for how to run Kibana in Serverless mode. // Clients need to specify the project type to run in. @@ -17,12 +18,11 @@ import { ServiceConfigDescriptor } from '@kbn/core-base-server-internal'; // If we even decide to extend this further, and converting it into an object, // BWC can be ensured by adding the object definition as another alternative to `schema.oneOf`. -export const VALID_SERVERLESS_PROJECT_TYPES = ['es', 'oblt', 'security']; - +// BOOKMARK - List of Kibana project types const serverlessConfigSchema = schema.maybe( schema.oneOf( - VALID_SERVERLESS_PROJECT_TYPES.map((projectName) => schema.literal(projectName)) as [ - Type<(typeof VALID_SERVERLESS_PROJECT_TYPES)[number]> // This cast is needed because it's different to Type[] :sight: + KIBANA_PROJECTS.map((projectName) => schema.literal(projectName)) as [ + Type // This cast is needed because it's different to Type[] :sight: ] ) ); diff --git a/src/core/packages/root/server-internal/tsconfig.json b/src/core/packages/root/server-internal/tsconfig.json index 31e0e876eb08..48a2b26e572c 100644 --- a/src/core/packages/root/server-internal/tsconfig.json +++ b/src/core/packages/root/server-internal/tsconfig.json @@ -78,6 +78,7 @@ "@kbn/core-user-profile-server-internal", "@kbn/core-feature-flags-server-internal", "@kbn/core-http-rate-limiter-internal", + "@kbn/projects-solutions-groups", ], "exclude": [ "target/**/*", diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 7bd8c1344c73..7d5b9f10612c 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -7,6 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; + /** * These patterns are used to identify files that are not supposed * to be snake_case because their names are determined by other @@ -108,9 +110,7 @@ export const KEBAB_CASE_DIRECTORY_GLOBS = [ 'src/platform/packages/shared/*', 'x-pack/platform/packages/private/*', 'x-pack/platform/packages/shared/*', - 'x-pack/solutions/observability/packages/*', - 'x-pack/solutions/search/packages/*', - 'x-pack/solutions/security/packages/*', + ...KIBANA_SOLUTIONS.map((solution) => `x-pack/solutions/${solution}/packages/*`), ]; /** diff --git a/src/dev/tsconfig.json b/src/dev/tsconfig.json index 0a9e71000a81..f9b2fe186d90 100644 --- a/src/dev/tsconfig.json +++ b/src/dev/tsconfig.json @@ -46,5 +46,6 @@ "@kbn/dev-proc-runner", "@kbn/core-i18n-server-internal", "@kbn/code-owners", + "@kbn/projects-solutions-groups", ] } diff --git a/src/platform/packages/private/kbn-code-owners/src/code_owner_areas.ts b/src/platform/packages/private/kbn-code-owners/src/code_owner_areas.ts index d999457d0b03..512a2d53ae18 100644 --- a/src/platform/packages/private/kbn-code-owners/src/code_owner_areas.ts +++ b/src/platform/packages/private/kbn-code-owners/src/code_owner_areas.ts @@ -10,13 +10,20 @@ /** * Code owner area names */ -export const CODE_OWNER_AREAS = ['platform', 'search', 'observability', 'security'] as const; +export const CODE_OWNER_AREAS = [ + 'platform', + 'search', + 'observability', + 'security', + 'chat', +] as const; export type CodeOwnerArea = (typeof CODE_OWNER_AREAS)[number]; /** * Area mappings for code owners */ export const CODE_OWNER_AREA_MAPPINGS: { [area in CodeOwnerArea]: string[] } = { + // BOOKMARK - List of Kibana solutions platform: [ 'elastic/appex-ai-infra', 'elastic/appex-qa', @@ -78,6 +85,10 @@ export const CODE_OWNER_AREA_MAPPINGS: { [area in CodeOwnerArea]: string[] } = { 'elastic/security-threat-hunting-explore', 'elastic/security-threat-hunting-investigations', ], + chat: [ + // TODO add owner teams here (once they exist) + // https://github.com/elastic/kibana/issues/213469 + ], }; /** diff --git a/src/platform/packages/private/kbn-projects-solutions-groups/README.md b/src/platform/packages/private/kbn-projects-solutions-groups/README.md new file mode 100644 index 000000000000..936f588f08cc --- /dev/null +++ b/src/platform/packages/private/kbn-projects-solutions-groups/README.md @@ -0,0 +1,3 @@ +# @kbn/projects-solutions-groups + +Contains some Kibana constants and types that are used across the codebase. diff --git a/src/platform/packages/private/kbn-projects-solutions-groups/index.ts b/src/platform/packages/private/kbn-projects-solutions-groups/index.ts new file mode 100644 index 000000000000..ba29e0a83478 --- /dev/null +++ b/src/platform/packages/private/kbn-projects-solutions-groups/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", 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". + */ + +/** + * The base group, for all modules that are commonly used across solutions. + */ +export const KIBANA_PLATFORM = 'platform' as const; +/** + * Constant for the Kibana Observability solution. + */ +export const KIBANA_OBSERVABILITY_SOLUTION = 'observability' as const; +/** + * Constant for the Kibana Security solution. + */ +export const KIBANA_SECURITY_SOLUTION = 'security' as const; +/** + * Constant for the Kibana Search solution. + */ +export const KIBANA_SEARCH_SOLUTION = 'search' as const; +/** + * Constant for the Kibana Chat (workchat) solution. + */ +export const KIBANA_CHAT_SOLUTION = 'chat' as const; + +/** + * A list of all Kibana solutions. + */ +export const KIBANA_SOLUTIONS = [ + KIBANA_OBSERVABILITY_SOLUTION, + KIBANA_SECURITY_SOLUTION, + KIBANA_SEARCH_SOLUTION, + KIBANA_CHAT_SOLUTION, +] as const; // BOOKMARK - List of Kibana solutions + +/** + * A type that defines the existing solutions. + */ +export type KibanaSolution = (typeof KIBANA_SOLUTIONS)[number]; + +/** + * A list of all Kibana groups (platform + solutions). + */ +export const KIBANA_GROUPS = [KIBANA_PLATFORM, ...KIBANA_SOLUTIONS] as const; + +/** + * A type that defines the existing groups (platform + solutions). + */ +export type KibanaGroup = (typeof KIBANA_GROUPS)[number]; + +/** + * The groups to which a module can belong. + * 'common' is the default for uncategorised modules. + */ +export type ModuleGroup = KibanaGroup | 'common'; + +/** + * ModuleVisibility tells whether a module is accessible from any module (shared) or only from modules of the same group (private) + */ +export type ModuleVisibility = 'private' | 'shared'; + +/** + * Constant for the Kibana Observability (workchat) serverless project type. + */ +export const KIBANA_OBSERVABILITY_PROJECT = 'oblt' as const; +/** + * Constant for the Kibana Security (workchat) serverless project type. + */ +export const KIBANA_SECURITY_PROJECT = 'security' as const; +/** + * Constant for the Kibana Search (workchat) serverless project type. + */ +export const KIBANA_SEARCH_PROJECT = 'es' as const; +/** + * Constant for the Kibana Chat (workchat) serverless project type. + */ +export const KIBANA_CHAT_PROJECT = 'chat' as const; + +/** + * A list of all Kibana serverless project types. + */ +export const KIBANA_PROJECTS = [ + KIBANA_OBSERVABILITY_PROJECT, + KIBANA_SECURITY_PROJECT, + KIBANA_SEARCH_PROJECT, + KIBANA_CHAT_PROJECT, +] as const; // BOOKMARK - List of Kibana project types + +/** + * A type that defines the existing serverless project types. + */ +export type KibanaProject = (typeof KIBANA_PROJECTS)[number]; diff --git a/src/platform/packages/private/kbn-projects-solutions-groups/kibana.jsonc b/src/platform/packages/private/kbn-projects-solutions-groups/kibana.jsonc new file mode 100644 index 000000000000..32d68cb8251d --- /dev/null +++ b/src/platform/packages/private/kbn-projects-solutions-groups/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/projects-solutions-groups", + "owner": "@elastic/kibana-core", + "group": "platform", + "visibility": "private", +} diff --git a/src/platform/packages/private/kbn-projects-solutions-groups/package.json b/src/platform/packages/private/kbn-projects-solutions-groups/package.json new file mode 100644 index 000000000000..c1f7210de0f9 --- /dev/null +++ b/src/platform/packages/private/kbn-projects-solutions-groups/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/projects-solutions-groups", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} diff --git a/src/platform/packages/private/kbn-projects-solutions-groups/tsconfig.json b/src/platform/packages/private/kbn-projects-solutions-groups/tsconfig.json new file mode 100644 index 000000000000..1fc0f73a1068 --- /dev/null +++ b/src/platform/packages/private/kbn-projects-solutions-groups/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/src/platform/packages/private/kbn-repo-packages/modern/package.js b/src/platform/packages/private/kbn-repo-packages/modern/package.js index 54a1fc004d8c..cc754a749d31 100644 --- a/src/platform/packages/private/kbn-repo-packages/modern/package.js +++ b/src/platform/packages/private/kbn-repo-packages/modern/package.js @@ -121,14 +121,14 @@ class Package { /** * the group to which this package belongs - * @type {import('@kbn/repo-info/types').ModuleGroup} + * @type {import('@kbn/projects-solutions-groups').ModuleGroup} * @readonly */ this.group = group; /** * the visibility of this package, i.e. whether it can be accessed by everybody or only modules in the same group - * @type {import('@kbn/repo-info/types').ModuleVisibility} + * @type {import('@kbn/projects-solutions-groups').ModuleVisibility} * @readonly */ this.visibility = visibility; @@ -159,7 +159,7 @@ class Package { /** * Returns the group to which this package belongs * @readonly - * @returns {import('@kbn/repo-info/types').ModuleGroup} + * @returns {import('@kbn/projects-solutions-groups').ModuleGroup} */ getGroup() { return this.group; @@ -168,7 +168,7 @@ class Package { /** * Returns the package visibility, i.e. whether it can be accessed by everybody or only packages in the same group * @readonly - * @returns {import('@kbn/repo-info/types').ModuleVisibility} + * @returns {import('@kbn/projects-solutions-groups').ModuleVisibility} */ getVisibility() { return this.visibility; @@ -203,9 +203,9 @@ class Package { determineGroupAndVisibility() { const dir = this.normalizedRepoRelativeDir; - /** @type {import('@kbn/repo-info/types').ModuleGroup} */ + /** @type {import('@kbn/projects-solutions-groups').ModuleGroup} */ let group = 'common'; - /** @type {import('@kbn/repo-info/types').ModuleVisibility} */ + /** @type {import('@kbn/projects-solutions-groups').ModuleVisibility} */ let visibility = 'shared'; if (dir.startsWith('src/platform/') || dir.startsWith('x-pack/platform/')) { @@ -214,6 +214,7 @@ class Package { /src\/platform\/[^\/]+\/shared/.test(dir) || /x-pack\/platform\/[^\/]+\/shared/.test(dir) ? 'shared' : 'private'; + // BOOKMARK - List of Kibana solutions } else if (dir.startsWith('x-pack/solutions/search/')) { group = 'search'; visibility = 'private'; @@ -223,10 +224,14 @@ class Package { } else if (dir.startsWith('x-pack/solutions/observability/')) { group = 'observability'; visibility = 'private'; + } else if (dir.startsWith('x-pack/solutions/chat/')) { + group = 'chat'; + visibility = 'private'; } else { group = this.manifest.group ?? 'common'; // if the group is 'private-only', enforce it - visibility = ['search', 'security', 'observability'].includes(group) + // BOOKMARK - List of Kibana solutions - FIXME we could use KIBANA_SOLUTIONS array here once we modernize this / get rid of Bazel + visibility = ['search', 'security', 'observability', 'chat'].includes(group) ? 'private' : this.manifest.visibility ?? 'shared'; } diff --git a/src/platform/packages/private/kbn-repo-packages/modern/parse_package_manifest.js b/src/platform/packages/private/kbn-repo-packages/modern/parse_package_manifest.js index 46004983848b..4cf9b6edd904 100644 --- a/src/platform/packages/private/kbn-repo-packages/modern/parse_package_manifest.js +++ b/src/platform/packages/private/kbn-repo-packages/modern/parse_package_manifest.js @@ -262,15 +262,16 @@ function validatePackageManifest(parsed, repoRoot, path) { ); } + // BOOKMARK - List of Kibana Solutions if ( group !== undefined && (!isSomeString(group) || - !['platform', 'search', 'security', 'observability', 'common'].includes(group)) + !['platform', 'search', 'security', 'observability', 'chat'].includes(group)) ) { throw err( `plugin.group`, group, - `must have a valid value ("platform" | "search" | "security" | "observability" | "common")` + `must have a valid value ("platform" | "search" | "security" | "observability" | "chat")` ); } diff --git a/src/platform/packages/private/kbn-repo-packages/modern/types.ts b/src/platform/packages/private/kbn-repo-packages/modern/types.ts index c883e33d8249..629e1aeab05e 100644 --- a/src/platform/packages/private/kbn-repo-packages/modern/types.ts +++ b/src/platform/packages/private/kbn-repo-packages/modern/types.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { KibanaGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; import type { Package } from './package'; import type { PLUGIN_CATEGORY } from './plugin_category_info'; @@ -95,7 +95,7 @@ export interface PackageManifestBaseFields { /** * Specifies the group to which this package belongs */ - group?: ModuleGroup; + group?: KibanaGroup; /** * Specifies the package visibility, i.e. whether it can be accessed by everybody or only packages in the same group */ diff --git a/src/platform/packages/private/kbn-repo-packages/tsconfig.json b/src/platform/packages/private/kbn-repo-packages/tsconfig.json index d116c3bfb8e6..847e1ed634e0 100644 --- a/src/platform/packages/private/kbn-repo-packages/tsconfig.json +++ b/src/platform/packages/private/kbn-repo-packages/tsconfig.json @@ -16,6 +16,6 @@ "target/**/*", ], "kbn_references": [ - "@kbn/repo-info", + "@kbn/projects-solutions-groups", ] } diff --git a/src/platform/packages/shared/kbn-dev-utils/src/plugin_list/run_plugin_list_cli.ts b/src/platform/packages/shared/kbn-dev-utils/src/plugin_list/run_plugin_list_cli.ts index 65f6735e22ca..0238928b49e5 100644 --- a/src/platform/packages/shared/kbn-dev-utils/src/plugin_list/run_plugin_list_cli.ts +++ b/src/platform/packages/shared/kbn-dev-utils/src/plugin_list/run_plugin_list_cli.ts @@ -12,6 +12,7 @@ import Fs from 'fs'; import { REPO_ROOT } from '@kbn/repo-info'; import { run } from '@kbn/dev-cli-runner'; +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; import { discoverPlugins } from './discover_plugins'; import { generatePluginList } from './generate_plugin_list'; @@ -27,16 +28,13 @@ export function runPluginListCli() { log.info('looking for x-pack plugins'); const xpackLegacyPlugins = discoverPlugins('x-pack/plugins'); const xpackPlatformPlugins = discoverPlugins('x-pack/platform/plugins'); - const xpackSearchPlugins = discoverPlugins('x-pack/solutions/search/plugins'); - const xpackSecurityPlugins = discoverPlugins('x-pack/solutions/security/plugins'); - const xpackObservabilityPlugins = discoverPlugins('x-pack/solutions/observability/plugins'); + const solutionsPlugins = KIBANA_SOLUTIONS.flatMap((solution) => + discoverPlugins(`x-pack/solutions/${solution}/plugins`) + ); + log.success( `found ${ - xpackLegacyPlugins.length + - xpackPlatformPlugins.length + - xpackSearchPlugins.length + - xpackSecurityPlugins.length + - xpackObservabilityPlugins.length + xpackLegacyPlugins.length + xpackPlatformPlugins.length + solutionsPlugins.length } plugins` ); @@ -45,13 +43,7 @@ export function runPluginListCli() { OUTPUT_PATH, generatePluginList( [...ossLegacyPlugins, ...ossPlatformPlugins], - [ - ...xpackLegacyPlugins, - ...xpackPlatformPlugins, - ...xpackSearchPlugins, - ...xpackSecurityPlugins, - ...xpackObservabilityPlugins, - ] + [...xpackLegacyPlugins, ...xpackPlatformPlugins, ...solutionsPlugins] ) ); }); diff --git a/src/platform/packages/shared/kbn-dev-utils/tsconfig.json b/src/platform/packages/shared/kbn-dev-utils/tsconfig.json index 08dd310d3ada..2f3377a4f772 100644 --- a/src/platform/packages/shared/kbn-dev-utils/tsconfig.json +++ b/src/platform/packages/shared/kbn-dev-utils/tsconfig.json @@ -17,6 +17,7 @@ "@kbn/repo-packages", "@kbn/some-dev-log", "@kbn/stdio-dev-helpers", + "@kbn/projects-solutions-groups", ], "exclude": [ "target/**/*", diff --git a/src/platform/packages/shared/kbn-repo-info/tsconfig.json b/src/platform/packages/shared/kbn-repo-info/tsconfig.json index b862dde8d9d4..502efff06ae1 100644 --- a/src/platform/packages/shared/kbn-repo-info/tsconfig.json +++ b/src/platform/packages/shared/kbn-repo-info/tsconfig.json @@ -14,5 +14,8 @@ ], "exclude": [ "target/**/*", + ], + "kbn_references": [ + "@kbn/projects-solutions-groups", ] } diff --git a/src/platform/packages/shared/kbn-repo-info/types.ts b/src/platform/packages/shared/kbn-repo-info/types.ts index 338881e878fd..96a7e99c6e63 100644 --- a/src/platform/packages/shared/kbn-repo-info/types.ts +++ b/src/platform/packages/shared/kbn-repo-info/types.ts @@ -7,8 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export type ModuleGroup = 'platform' | 'observability' | 'search' | 'security' | 'common'; -export type ModuleVisibility = 'private' | 'shared'; +import type { KibanaGroup, ModuleVisibility } from '@kbn/projects-solutions-groups'; export interface KibanaPackageJson { name: string; @@ -30,6 +29,6 @@ export interface KibanaPackageJson { [name: string]: string | undefined; }; [key: string]: unknown; - group?: ModuleGroup; + group?: KibanaGroup; visibility?: ModuleVisibility; } diff --git a/src/platform/packages/shared/kbn-scout/src/config/discovery/search_configs.ts b/src/platform/packages/shared/kbn-scout/src/config/discovery/search_configs.ts index 58c0402e55cc..15f45b73fc42 100644 --- a/src/platform/packages/shared/kbn-scout/src/config/discovery/search_configs.ts +++ b/src/platform/packages/shared/kbn-scout/src/config/discovery/search_configs.ts @@ -14,6 +14,7 @@ import { REPO_ROOT } from '@kbn/repo-info'; import fs from 'fs'; import yaml from 'js-yaml'; import { createFailError } from '@kbn/dev-cli-errors'; +import { KIBANA_SOLUTIONS } from '@kbn/projects-solutions-groups'; export const DEFAULT_TEST_PATH_PATTERNS = ['src/platform/plugins', 'x-pack/**/plugins']; @@ -36,9 +37,10 @@ export const getScoutPlaywrightConfigs = (searchPaths: string[], log: ToolingLog const files = patterns.flatMap((pattern) => fastGlob.sync(pattern, { onlyFiles: true })); const typeMappings: Record = { - 'x-pack/solutions/security': 'security', - 'x-pack/solutions/search': 'search', - 'x-pack/solutions/observability': 'observability', + ...KIBANA_SOLUTIONS.reduce>((agg, solution) => { + agg[`x-pack/solutions/${solution}`] = solution; + return agg; + }, {}), 'x-pack/platform/plugins': 'platform', 'src/platform/plugins': 'platform', }; @@ -46,7 +48,7 @@ export const getScoutPlaywrightConfigs = (searchPaths: string[], log: ToolingLog const matchPluginPath = (filePath: string): { pluginPath: string; pluginName: string } | null => { const regexes = [ /(x-pack\/platform\/plugins\/(?:private|shared|[^\/]+)\/([^\/]+))\/ui_tests\//, - /(x-pack\/solutions\/[^\/]+\/plugins\/([^\/]+))\/ui_tests\//, + /(x-pack\/solutions\/[^\/]+\/plugins\/([^\/]+))\/ui_tests\//, // covers all Kibana solutions /(src\/platform\/plugins\/(?:private|shared)?\/?([^\/]+))\/ui_tests\//, ]; diff --git a/src/platform/packages/shared/kbn-scout/tsconfig.json b/src/platform/packages/shared/kbn-scout/tsconfig.json index 9b08efff2f71..d4af0ba7eea0 100644 --- a/src/platform/packages/shared/kbn-scout/tsconfig.json +++ b/src/platform/packages/shared/kbn-scout/tsconfig.json @@ -30,5 +30,6 @@ "@kbn/scout-reporting", "@kbn/apm-synthtrace", "@kbn/apm-synthtrace-client", + "@kbn/projects-solutions-groups" ] } diff --git a/src/platform/packages/shared/serverless/settings/chat_project/README.mdx b/src/platform/packages/shared/serverless/settings/chat_project/README.mdx new file mode 100644 index 000000000000..8aaab9dbed19 --- /dev/null +++ b/src/platform/packages/shared/serverless/settings/chat_project/README.mdx @@ -0,0 +1,34 @@ +--- +id: serverless/packages/settings/chat_project +slug: /serverless/packages/settings/chat_project +title: Serverless Chat Advanced Settings +description: A package of settings for the Serverless Chat project. +tags: ['serverless', 'package'] +date: 2023-08-24 +--- + +This package contains a list of UI settings that are only available in the Serverless Chat project. +This list is consumed by the `serverless_chat` plugin, which sets up its project settings: + +```ts +export class ServerlessChatPlugin + implements + Plugin< + ServerlessChatPluginSetup, + ServerlessChatPluginStart, + SetupDependencies, + StartDependencies + > +{ + public setup( + { getStartServices, http }: CoreSetup, + pluginsSetup: SetupDependencies + ) { + pluginsSetup.serverless.setupProjectSettings(CHAT_PROJECT_SETTINGS); + return {}; + } +} +``` + +If you need to register a setting that should be available in the Serverless Chat project, make sure to add +its Id to this list. diff --git a/src/platform/packages/shared/serverless/settings/chat_project/index.ts b/src/platform/packages/shared/serverless/settings/chat_project/index.ts new file mode 100644 index 000000000000..abc4275a0414 --- /dev/null +++ b/src/platform/packages/shared/serverless/settings/chat_project/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 const CHAT_PROJECT_SETTINGS = []; diff --git a/src/platform/packages/shared/serverless/settings/chat_project/kibana.jsonc b/src/platform/packages/shared/serverless/settings/chat_project/kibana.jsonc new file mode 100644 index 000000000000..19cb54f93c8b --- /dev/null +++ b/src/platform/packages/shared/serverless/settings/chat_project/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/serverless-chat-settings", + "owner": "@elastic/search-kibana", + "group": "platform", + "visibility": "shared" +} diff --git a/src/platform/packages/shared/serverless/settings/chat_project/package.json b/src/platform/packages/shared/serverless/settings/chat_project/package.json new file mode 100644 index 000000000000..2f85d8d048ea --- /dev/null +++ b/src/platform/packages/shared/serverless/settings/chat_project/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/serverless-chat-settings", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} diff --git a/src/platform/packages/shared/serverless/settings/chat_project/tsconfig.json b/src/platform/packages/shared/serverless/settings/chat_project/tsconfig.json new file mode 100644 index 000000000000..d3b1bb09783b --- /dev/null +++ b/src/platform/packages/shared/serverless/settings/chat_project/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/src/platform/packages/shared/serverless/types/index.d.ts b/src/platform/packages/shared/serverless/types/index.d.ts index 7cad68909645..8d4ab285fd44 100644 --- a/src/platform/packages/shared/serverless/types/index.d.ts +++ b/src/platform/packages/shared/serverless/types/index.d.ts @@ -7,4 +7,5 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export type ProjectType = 'observability' | 'security' | 'search'; +// BOOKMARK - List of Kibana project types - TODO unify with the definitions under @kbn/projects-solutions-groups +export type ProjectType = 'observability' | 'security' | 'search' | 'chat'; diff --git a/tsconfig.base.json b/tsconfig.base.json index 515c1e51a59c..b3166cc7a8e0 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1444,6 +1444,8 @@ "@kbn/profiling-plugin/*": ["x-pack/solutions/observability/plugins/profiling/*"], "@kbn/profiling-utils": ["src/platform/packages/shared/kbn-profiling-utils"], "@kbn/profiling-utils/*": ["src/platform/packages/shared/kbn-profiling-utils/*"], + "@kbn/projects-solutions-groups": ["src/platform/packages/private/kbn-projects-solutions-groups"], + "@kbn/projects-solutions-groups/*": ["src/platform/packages/private/kbn-projects-solutions-groups/*"], "@kbn/random-sampling": ["x-pack/platform/packages/private/kbn-random-sampling"], "@kbn/random-sampling/*": ["x-pack/platform/packages/private/kbn-random-sampling/*"], "@kbn/react-field": ["src/platform/packages/shared/kbn-react-field"], @@ -1742,6 +1744,10 @@ "@kbn/server-route-repository-utils/*": ["src/platform/packages/shared/kbn-server-route-repository-utils/*"], "@kbn/serverless": ["x-pack/platform/plugins/shared/serverless"], "@kbn/serverless/*": ["x-pack/platform/plugins/shared/serverless/*"], + "@kbn/serverless-chat": ["x-pack/solutions/chat/plugins/serverless_chat"], + "@kbn/serverless-chat/*": ["x-pack/solutions/chat/plugins/serverless_chat/*"], + "@kbn/serverless-chat-settings": ["src/platform/packages/shared/serverless/settings/chat_project"], + "@kbn/serverless-chat-settings/*": ["src/platform/packages/shared/serverless/settings/chat_project/*"], "@kbn/serverless-common-settings": ["src/platform/packages/shared/serverless/settings/common"], "@kbn/serverless-common-settings/*": ["src/platform/packages/shared/serverless/settings/common/*"], "@kbn/serverless-observability": ["x-pack/solutions/observability/plugins/serverless_observability"], diff --git a/x-pack/.telemetryrc.json b/x-pack/.telemetryrc.json index d380bcab90c7..6f93bdf01c19 100644 --- a/x-pack/.telemetryrc.json +++ b/x-pack/.telemetryrc.json @@ -30,5 +30,10 @@ "output": "platform/plugins/private/telemetry_collection_xpack/schema/xpack_security.json", "root": "solutions/security", "exclude": [] + }, + { + "output": "platform/plugins/private/telemetry_collection_xpack/schema/xpack_chat.json", + "root": "solutions/chat", + "exclude": [] } ] diff --git a/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/README.md b/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/README.md index 09deab41d038..9195d032aa31 100644 --- a/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/README.md +++ b/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/README.md @@ -10,9 +10,11 @@ There are currently 7 files: It is automatically generated by `@kbn/telemetry-tools` based on the `schema` property provided by all the registered Usage Collectors via the `usageCollection.makeUsageCollector` API. More details in the [Schema field](../../../../usage_collection/README.md#schema-field) chapter in the UsageCollection's docs. - `xpack_platform.json`: Same as `xpack_plugins.json` but for collectors defined in `/x-pack/platform/*`. +[//]: # (BOOKMARK - List of Kibana solutions) - `xpack_observability.json`: Same as `xpack_plugins.json` but for collectors defined in `/x-pack/solutions/observability/*`. - `xpack_search.json`: Same as `xpack_plugins.json` but for collectors defined in `/x-pack/solutions/search/*`. - `xpack_security.json`: Same as `xpack_plugins.json` but for collectors defined in `/x-pack/solutions/security/*`. +- `xpack_chat.json`: Same as `xpack_plugins.json` but for collectors defined in `/x-pack/solutions/chat/*`. - `xpack_monitoring.json`: It declares the payload sent by the monitoring-sourced telemetry. The actual schema for the payload is declared under `properties.monitoringTelemetry.properties.stats.items`, but due to the general behaviour in the `@kbn/telemetry-tools`, it gets nested down in that path. NOTE: Despite its similarities to ES mappings, the intention of these files is not to define any index mappings. They should be considered as a tool to understand the format of the payload that will be sent when reporting telemetry to the Remote Service. diff --git a/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/xpack_chat.json b/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/xpack_chat.json new file mode 100644 index 000000000000..d5b0514b6491 --- /dev/null +++ b/x-pack/platform/plugins/private/telemetry_collection_xpack/schema/xpack_chat.json @@ -0,0 +1,3 @@ +{ + "properties": {} +} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/.gitignore b/x-pack/solutions/chat/plugins/serverless_chat/.gitignore new file mode 100644 index 000000000000..c3dca1b96fcc --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/.gitignore @@ -0,0 +1,2 @@ +/build +/target diff --git a/x-pack/solutions/chat/plugins/serverless_chat/README.mdx b/x-pack/solutions/chat/plugins/serverless_chat/README.mdx new file mode 100755 index 000000000000..d6ab2be6c099 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/README.mdx @@ -0,0 +1,3 @@ +# Serverless Chat project plugin + +The `serverlessChat` plugin is an internal plugin for Kibana's Chat Solution. diff --git a/x-pack/solutions/chat/plugins/serverless_chat/jest.config.dev.js b/x-pack/solutions/chat/plugins/serverless_chat/jest.config.dev.js new file mode 100644 index 000000000000..0e7e2e974a3f --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/jest.config.dev.js @@ -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. + */ + +/** @type {import('@jest/types').Config.InitialOptions} */ +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../../', + projects: [ + '/x-pack/solutions/chat/plugins/chat_serverless/server/*/jest.config.js', + '/x-pack/solutions/chat/plugins/chat_serverless/public/*/jest.config.js', + ], +}; diff --git a/x-pack/solutions/chat/plugins/serverless_chat/kibana.jsonc b/x-pack/solutions/chat/plugins/serverless_chat/kibana.jsonc new file mode 100644 index 000000000000..3bab9b4f3f39 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/kibana.jsonc @@ -0,0 +1,23 @@ +{ + "type": "plugin", + "id": "@kbn/serverless-chat", + "owner": "@elastic/search-kibana", + "group": "chat", + "visibility": "private", + "description": "Serverless customizations for chat.", + "plugin": { + "id": "serverlessChat", + "browser": true, + "server": true, + "configPath": [ + "xpack", + "serverless", + "chat" + ], + "requiredPlugins": [ + "serverless", + ], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/package.json b/x-pack/solutions/chat/plugins/serverless_chat/package.json new file mode 100644 index 000000000000..1e1eb22eea5c --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/package.json @@ -0,0 +1,11 @@ +{ + "name": "@kbn/serverless-chat", + "version": "1.0.0", + "license": "Elastic License 2.0", + "private": true, + "scripts": { + "build": "yarn plugin-helpers build", + "plugin-helpers": "node ../../../../../scripts/plugin_helpers", + "kbn": "node ../../../../../scripts/kbn" + } +} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/public/index.ts b/x-pack/solutions/chat/plugins/serverless_chat/public/index.ts new file mode 100644 index 000000000000..ca871c289afa --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/public/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. + */ + +import { ChatServerlessPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. +export function plugin() { + return new ChatServerlessPlugin(); +} + +export type { ChatServerlessPluginSetup, ChatServerlessPluginStart } from './types'; diff --git a/x-pack/solutions/chat/plugins/serverless_chat/public/jest.config.js b/x-pack/solutions/chat/plugins/serverless_chat/public/jest.config.js new file mode 100644 index 000000000000..b1e6452c0610 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/public/jest.config.js @@ -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. + */ + +/** @type {import('@jest/types').Config.InitialOptions} */ +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../../..', + /** all nested directories have their own Jest config file */ + testMatch: [ + '/x-pack/solutions/chat/plugins/serverless_chat/public/**/*.test.{js,mjs,ts,tsx}', + ], + roots: ['/x-pack/solutions/chat/plugins/serverless_chat/public'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/solutions/chat/plugins/serverless_chat/public', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/solutions/chat/plugins/serverless_chat/public/**/*.{ts,tsx}', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/*.test.{ts,tsx}', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/{__test__,__snapshots__,__examples__,*mock*,tests,test_helpers,integration_tests,types}/**/*', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/*mock*.{ts,tsx}', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/*.test.{ts,tsx}', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/*.d.ts', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/*.config.ts', + '!/x-pack/solutions/chat/plugins/serverless_chat/public/index.{js,ts,tsx}', + ], +}; diff --git a/x-pack/solutions/chat/plugins/serverless_chat/public/plugin.ts b/x-pack/solutions/chat/plugins/serverless_chat/public/plugin.ts new file mode 100644 index 000000000000..8e99c88665a2 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/public/plugin.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; + +import type { + ChatServerlessPluginSetup, + ChatServerlessPluginStart, + ChatServerlessPluginSetupDeps, + ChatServerlessPluginStartDeps, +} from './types'; + +export class ChatServerlessPlugin + implements + Plugin< + ChatServerlessPluginSetup, + ChatServerlessPluginStart, + ChatServerlessPluginSetupDeps, + ChatServerlessPluginStartDeps + > +{ + constructor() {} + + public setup( + core: CoreSetup, + setupDeps: ChatServerlessPluginSetupDeps + ): ChatServerlessPluginSetup { + return {}; + } + + public start( + core: CoreStart, + startDeps: ChatServerlessPluginStartDeps + ): ChatServerlessPluginStart { + return {}; + } + + public stop() {} +} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/public/types.ts b/x-pack/solutions/chat/plugins/serverless_chat/public/types.ts new file mode 100644 index 000000000000..f0b331bdbd0c --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/public/types.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 type { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ChatServerlessPluginSetup {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ChatServerlessPluginStart {} + +export interface ChatServerlessPluginSetupDeps { + serverless: ServerlessPluginSetup; +} + +export interface ChatServerlessPluginStartDeps { + serverless: ServerlessPluginStart; +} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/server/config.ts b/x-pack/solutions/chat/plugins/serverless_chat/server/config.ts new file mode 100644 index 000000000000..2c0d7816e2e6 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/server/config.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core/server'; + +export * from './types'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: false }), +}); + +type ConfigType = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export type ServerlessChatConfig = TypeOf; diff --git a/x-pack/solutions/chat/plugins/serverless_chat/server/index.ts b/x-pack/solutions/chat/plugins/serverless_chat/server/index.ts new file mode 100644 index 000000000000..7e11c609a1be --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/server/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PluginInitializerContext } from '@kbn/core/server'; +export { config } from './config'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. + +export async function plugin(initializerContext: PluginInitializerContext) { + const { ServerlessChatPlugin } = await import('./plugin'); + return new ServerlessChatPlugin(initializerContext); +} + +export type { ServerlessChatPluginSetup, ServerlessChatPluginStart } from './types'; diff --git a/x-pack/solutions/chat/plugins/serverless_chat/server/jest.config.js b/x-pack/solutions/chat/plugins/serverless_chat/server/jest.config.js new file mode 100644 index 000000000000..95ad8fab9e66 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/server/jest.config.js @@ -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. + */ + +/** @type {import('@jest/types').Config.InitialOptions} */ +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../../..', + roots: ['/x-pack/solutions/chat/plugins/serverless_chat/server/'], +}; diff --git a/x-pack/solutions/chat/plugins/serverless_chat/server/plugin.ts b/x-pack/solutions/chat/plugins/serverless_chat/server/plugin.ts new file mode 100644 index 000000000000..72d46cb3bd92 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/server/plugin.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + Logger, + PluginInitializerContext, + Plugin, + CoreSetup, + CoreStart, +} from '@kbn/core/server'; +import { CHAT_PROJECT_SETTINGS } from '@kbn/serverless-chat-settings'; + +import type { ServerlessChatConfig } from './config'; +import type { + ServerlessChatPluginSetup, + ServerlessChatPluginStart, + SetupDependencies, + StartDependencies, +} from './types'; + +export class ServerlessChatPlugin + implements + Plugin< + ServerlessChatPluginSetup, + ServerlessChatPluginStart, + SetupDependencies, + StartDependencies + > +{ + // @ts-ignore config is not used for now + private readonly config: ServerlessChatConfig; + // @ts-ignore logger is not used for now + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup, { serverless }: SetupDependencies) { + serverless.setupProjectSettings(CHAT_PROJECT_SETTINGS); + return {}; + } + + public start(core: CoreStart) { + return {}; + } + + public stop() {} +} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/server/types.ts b/x-pack/solutions/chat/plugins/serverless_chat/server/types.ts new file mode 100644 index 000000000000..d9c404776813 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/server/types.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 { ServerlessPluginSetup } from '@kbn/serverless/server'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessChatPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessChatPluginStart {} + +export interface SetupDependencies { + serverless: ServerlessPluginSetup; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface StartDependencies {} diff --git a/x-pack/solutions/chat/plugins/serverless_chat/tsconfig.json b/x-pack/solutions/chat/plugins/serverless_chat/tsconfig.json new file mode 100644 index 000000000000..4ad7cf6fc5b2 --- /dev/null +++ b/x-pack/solutions/chat/plugins/serverless_chat/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../../../typings/**/*", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/serverless", + "@kbn/config-schema", + "@kbn/serverless-chat-settings", + ] +} diff --git a/x-pack/test/api_integration/apis/telemetry/telemetry.ts b/x-pack/test/api_integration/apis/telemetry/telemetry.ts index af8d30069d14..0e59861fd69b 100644 --- a/x-pack/test/api_integration/apis/telemetry/telemetry.ts +++ b/x-pack/test/api_integration/apis/telemetry/telemetry.ts @@ -18,9 +18,11 @@ import ossPlatformTelemetrySchema from '@kbn/telemetry-plugin/schema/oss_platfor import ossPackagesTelemetrySchema from '@kbn/telemetry-plugin/schema/kbn_packages.json'; import xpackPluginsTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_plugins.json'; import xpackPlatformTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_platform.json'; +// BOOKMARK - List of Kibana Solutions import xpackObservabilityTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_observability.json'; import xpackSearchTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_search.json'; import xpackSecurityTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_security.json'; +import xpackChatTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_chat.json'; import type { UnencryptedTelemetryPayload } from '@kbn/telemetry-plugin/common/types'; import type { UsageStatsPayload, @@ -177,6 +179,7 @@ export default function ({ getService }: FtrProviderContext) { xpackObservabilityTelemetrySchema, xpackSearchTelemetrySchema, xpackSecurityTelemetrySchema, + xpackChatTelemetrySchema, ] as TelemetrySchemaObject[]; const plugins = schemas.reduce((acc, schema) => deepmerge(acc, schema)); diff --git a/x-pack/test/api_integration/apis/telemetry/telemetry_local.ts b/x-pack/test/api_integration/apis/telemetry/telemetry_local.ts index c19296360597..8b7819db84b7 100644 --- a/x-pack/test/api_integration/apis/telemetry/telemetry_local.ts +++ b/x-pack/test/api_integration/apis/telemetry/telemetry_local.ts @@ -14,9 +14,11 @@ import ossPackagesTelemetrySchema from '@kbn/telemetry-plugin/schema/kbn_package import xpackRootTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_root.json'; import xpackPluginsTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_plugins.json'; import xpackPlatformTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_platform.json'; +// BOOKMARK - List of Kibana Solutions import xpackObservabilityTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_observability.json'; import xpackSearchTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_search.json'; import xpackSecurityTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_security.json'; +import xpackChatTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_chat.json'; import { assertTelemetryPayload } from '@kbn/telemetry-tools'; import type { TelemetrySchemaObject } from '@kbn/telemetry-tools/src/schema_ftr_validations/schema_to_config_schema'; import { @@ -73,6 +75,7 @@ export default function ({ getService }: FtrProviderContext) { xpackObservabilityTelemetrySchema, xpackSearchTelemetrySchema, xpackSecurityTelemetrySchema, + xpackChatTelemetrySchema, ] as TelemetrySchemaObject[]; const plugins = schemas.reduce((acc, schema) => deepmerge(acc, schema)); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/telemetry/snapshot_telemetry.ts b/x-pack/test_serverless/api_integration/test_suites/common/telemetry/snapshot_telemetry.ts index 5655880f485f..e4541a77d95e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/telemetry/snapshot_telemetry.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/telemetry/snapshot_telemetry.ts @@ -14,9 +14,11 @@ import ossPackagesTelemetrySchema from '@kbn/telemetry-plugin/schema/kbn_package import ossPlatformTelemetrySchema from '@kbn/telemetry-plugin/schema/oss_platform.json'; import xpackPluginsTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_plugins.json'; import xpackPlatformTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_platform.json'; +// BOOKMARK - List of Kibana Solutions import xpackObservabilityTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_observability.json'; import xpackSearchTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_search.json'; import xpackSecurityTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_security.json'; +import xpackChatTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_chat.json'; import { assertTelemetryPayload } from '@kbn/telemetry-tools'; import type { TelemetrySchemaObject } from '@kbn/telemetry-tools/src/schema_ftr_validations/schema_to_config_schema'; import type { UsageStatsPayloadTestFriendly } from '@kbn/test-suites-xpack/api_integration/services/usage_api'; @@ -57,6 +59,7 @@ export default function ({ getService }: FtrProviderContext) { xpackObservabilityTelemetrySchema, xpackSearchTelemetrySchema, xpackSecurityTelemetrySchema, + xpackChatTelemetrySchema, ] as TelemetrySchemaObject[]; const plugins = schemas.reduce((acc, schema) => deepmerge(acc, schema)); diff --git a/yarn.lock b/yarn.lock index 677aa398228e..f0080861a15e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6566,6 +6566,10 @@ version "0.0.0" uid "" +"@kbn/projects-solutions-groups@link:src/platform/packages/private/kbn-projects-solutions-groups": + version "0.0.0" + uid "" + "@kbn/random-sampling@link:x-pack/platform/packages/private/kbn-random-sampling": version "0.0.0" uid "" @@ -7158,6 +7162,14 @@ version "0.0.0" uid "" +"@kbn/serverless-chat-settings@link:src/platform/packages/shared/serverless/settings/chat_project": + version "0.0.0" + uid "" + +"@kbn/serverless-chat@link:x-pack/solutions/chat/plugins/serverless_chat": + version "0.0.0" + uid "" + "@kbn/serverless-common-settings@link:src/platform/packages/shared/serverless/settings/common": version "0.0.0" uid ""