From cb1c0df2dbdcafcd3146d9bd959cce50f4f5ca75 Mon Sep 17 00:00:00 2001 From: Mark Hopkin Date: Thu, 19 Sep 2024 11:46:39 +0100 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 6d568b02ecf6070282241c7e92f35b7e3dc8cfc9 Merge: 1b0aa691795 eabb1022815 Author: Elastic Machine Date: Thu Sep 19 12:01:52 2024 +0200 Merge branch 'main' into siem-ea-9180-api commit eabb1022815a7c661a0e642c62d0a77ce338f9c9 Author: Julia Date: Thu Sep 19 10:28:48 2024 +0200 [ResponseOps][MW] Add telemetry for the maintenance window (#192483) Resolve: https://github.com/elastic/kibana/issues/184088 In this PR add telemetry collection of these metrics: - total number of MW in deployments - number of active MW with "repeat" toggle on (time based) - number of active MW with "filter alerts" toggle on (KQL based) ## Testing Create several MW with different settings (toggles on and off) To test changes reflected in telemetry object, modify this file: `x-pack/plugins/alerting/server/usage/task.ts` With: ``` async function scheduleTasks(logger: Logger, taskManager: TaskManagerStartContract) { try { await taskManager.ensureScheduled({ id: TASK_ID, taskType: TELEMETRY_TASK_TYPE, state: emptyState, params: {}, schedule: SCHEDULE, }); } catch (e) { logger.error(`Error scheduling ${TASK_ID}, received ${e.message}`); } await taskManager.runSoon(TASK_ID); } ``` This will cause the telemetry to be sent as soon as the server is restarted. **Run Telemetry usage payload API in your browser console to verify telemetry object:** https://docs.elastic.dev/telemetry/collection/snapshot-telemetry#telemetry-usage-payload-api P.S.: Add space at the beginning of URL ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Elastic Machine commit 210f5527a001a6326244506d0f6b1b28ecc5599c Author: Yulia Čech <6585477+yuliacech@users.noreply.github.com> Date: Thu Sep 19 10:25:33 2024 +0200 [Ingest Pipelines] Fixes processors description (#193183) ## Summary Fixes https://github.com/elastic/kibana/issues/191530 This PR adds a stringify helper that is safe to use with objects, arrays, text and numbers. `set` and `append` processors are using this new helper to display `value` in the processor description. Other type of processors don't seem to need it. This PR fixes the pipeline page so that other processors in the pipeline still can be edited via UI. This PR however doesn't fix the processors forms: both processors currently can't handle json objects when editing. This should be fix in a [separate issue](https://github.com/elastic/kibana/issues/193186). ### Screenshots Screenshot 2024-09-17 at 16 54 18 Screenshot 2024-09-17 at 16 54 34 ### How to test Use this commands in Console to create processors with a json in `value`. ``` PUT _ingest/pipeline/test2 { "processors": [ { "set" : { "field" : "payload", "value" : "test", "if" : "ctx.payload == \"-\"" } } ] } PUT _ingest/pipeline/test1 { "processors": [ { "append": { "field": "test", "value": { "redacted": true } } } ] } ``` ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) commit c676d2bd72f87fceecd8d459335ed56e36acf661 Author: natasha-moore-elastic <137783811+natasha-moore-elastic@users.noreply.github.com> Date: Thu Sep 19 09:13:14 2024 +0100 Improves Exceptions API docs content (#193040) ## Summary Resolves https://github.com/elastic/security-docs-internal/issues/33 by improving the Exceptions API docs content. Adds missing and improves existing operation summaries and operation descriptions to adhere to our [OAS standards](https://elasticco.atlassian.net/wiki/spaces/DOC/pages/450494532/API+reference+docs). --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit 9765f73ec2ab4d1ef2406247503b1ceaba1c3db9 Author: natasha-moore-elastic <137783811+natasha-moore-elastic@users.noreply.github.com> Date: Thu Sep 19 09:03:59 2024 +0100 Improves Timeline API docs content (#192744) ## Summary Resolves https://github.com/elastic/security-docs-internal/issues/35 by improving the Timeline API docs content. Adds missing and improves existing operation summaries and operation descriptions to adhere to our [OAS standards](https://elasticco.atlassian.net/wiki/spaces/DOC/pages/450494532/API+reference+docs). --------- Co-authored-by: Jatin Kathuria Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit f47987f5409e873241c497b6a61bc83dd927b4f3 Author: Alex Szabo Date: Thu Sep 19 09:53:15 2024 +0200 [ci] skip FTRs that fail on chrome 129 (#193293) ## Summary `google-chrome-stable` is now on version 129. Another set of tests started to fail when running against a VM with unpinned chrome version: https://buildkite.com/elastic/kibana-pull-request/builds/235162 This PR skips another 3 tests and adjusts all messages to point to the central issue. Relates to: https://github.com/elastic/kibana-operations/issues/199 commit 854cb15725f059aa80abea6d7155190ef88622ef Author: Walter Rafelsberger Date: Thu Sep 19 08:10:38 2024 +0200 [ML] Anomaly Detection: Adds popover links menu to anomaly explorer charts. (#186587) ## Summary Adds support for clicking on Anomaly Explorer charts to trigger the actions popover menu. - [x] ExplorerChartSingleMetric - [x] ExplorerChartDistribution - [x] Support for embedded charts Anomaly Explorer [ml-anomaly-charts-actions-0001.webm](https://github.com/elastic/kibana/assets/230104/9502b234-7df8-4290-9914-163936487af8) Embedding [ml-anomaly-charts-actions-embedding-0001.webm](https://github.com/elastic/kibana/assets/230104/ee519b47-e924-4947-b127-4f3ecf62616e) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) commit 32d751f8a05481988a9f7738080f6f75babb9859 Author: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu Sep 19 15:07:39 2024 +1000 [api-docs] 2024-09-19 Daily api_docs build (#193382) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/835 commit 2efd0f0d8bb9478aec0316d1760adc184feb6309 Author: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Thu Sep 19 05:53:05 2024 +0200 [ES|QL] Implement `OrderExpression` for `SORT` command arguments (#189959) ## Summary Closes https://github.com/elastic/kibana/issues/189491 - Adds *order expression* AST nodes, which are minted from `SORT` command. - Improves SORT command autocomplete suggestions. Shows fields on first space: image It now shows `NULLS FIRST` and `NULLS LAST`, even before `ASC` or `DESC` was entered, as `ASC` and `DESC` are optional: image Once `ASC` or `DESC` is entered, shows only nulls options: image It also now suggests partial modifier, if the in-progress text that user is typing matches it: image (However, we are not triggering autocomplete in those cases in UI, so no way to see it in UI right now.) ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Elastic Machine Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit 6f4be61d13431f2327cabc50c71b999451821948 Author: Dominique Clarke Date: Wed Sep 18 21:32:45 2024 -0400 [Synthetics] waterfall chart - handle cached resources (#193089) ## Summary Resolves https://github.com/elastic/kibana/issues/184794 Ensures that the cached resources display accurate timing information on the waterfall chart tooltips. The information displayed should match the information displayed in the flyout when the request url is clicked. Tooltip Screenshot 2024-09-16 at 8 49 55 PM Flyout Screenshot 2024-09-16 at 2 07 56 PM ### Release note Synthetics - resolves an issue for multi step browser journeys where timings for cached resources within the same step were inaccurate within the waterfall chart. ### Testing 1. Create a browser monitor with duplicate requests. For example: ``` step("multi resource step", async () => { await page.goto('https://github.com'); await page.goto('https://github.com'); await page.goto('https://github.com'); }) ``` 2. Navigate to the monitor details page 3. Find the last test run panel, click the view test details button, then click the view performance breakdown button ![image](https://github.com/user-attachments/assets/b66addcb-21f6-4eac-8c60-dc3387b33853) ![image](https://github.com/user-attachments/assets/67f04b9f-4ff6-4ce6-85d1-2a89869e4a2c) 4. Scroll down to the waterfall chart. If you use github, requests after about 115 should be cached. Note: some request may have been aborted and their waterfall tooltip won't show. Find a request that was not aborted, hover to see the tooltip, then click the request to view the flyout and confirm the information. commit f810bb5671dbc115c8d54cc95dfde4cbabcd770a Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 18:40:34 2024 -0500 Update docker.elastic.co/wolfi/chainguard-base:latest Docker digest to 6fbf078 (main) (#193356) This PR contains the following updates: | Package | Update | Change | |---|---|---| | docker.elastic.co/wolfi/chainguard-base | digest | `d4def25` -> `6fbf078` | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit 10f86c6b5355903fb0ce00f1fa916cc1afe9d45f Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 18:38:57 2024 -0500 Update dependency msw to ^2.4.5 (main) (#193363) This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.4` -> `^2.4.5`](https://renovatebot.com/diffs/npm/msw/2.4.6/2.4.5) | `2.4.8` (+2) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit bcc42d5aa085ddd28910d974fac22532e50492ce Author: Philippe Oberti Date: Thu Sep 19 01:02:36 2024 +0200 [kbn-expandable-flyout] - add support for resizable flyout (#192906) commit 3bea483f34e03ea1bbeb836350c650fd06673f10 Author: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Wed Sep 18 17:56:10 2024 -0400 [Security Solution] Adds enable on install UI workflow to prebuilt rules page (#191529) ## Summary Adds overflow button UI to all prebuilt rules install buttons in order to enable the rule when it is successfully installed. Previously, a user would have to navigate back to the rules page and find the rule(s) they just installed to enable, this combines those two workflows into a single button action - speeding up the out of the box rule implementation. ### Screenshots **Prebuilt rules table columns** Screenshot 2024-09-04 at 10 38 05 AM **Prebuilt rules table bulk install** Screenshot 2024-09-04 at 10 38 16 AM **Prebuilt rule details flyout** Screenshot 2024-09-04 at 10 38 44 AM ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) commit 4c51c00b8a1afa9d15e4f273cac4a9705dfc1daa Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 16:10:45 2024 -0500 Update dependency msw to ^2.4.4 (main) (#192955) This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.2` -> `^2.4.4`](https://renovatebot.com/diffs/npm/msw/2.4.2/2.4.4) | `2.4.8` (+3) | --- ### Release Notes
mswjs/msw (msw) ### [`v2.4.4`](https://togithub.com/mswjs/msw/releases/tag/v2.4.4) [Compare Source](https://togithub.com/mswjs/msw/compare/v2.4.3...v2.4.4) #### v2.4.4 (2024-09-08) ##### Bug Fixes - **fetch:** follow mocked redirect responses ([#​2268](https://togithub.com/mswjs/msw/issues/2268)) ([`f5785bf`](https://togithub.com/mswjs/msw/commit/f5785bfba1a026075feca4f74cadfcb636ffc257)) [@​kettanaito](https://togithub.com/kettanaito) - Adopts a new, Socket-based request interception algorithm. ### [`v2.4.3`](https://togithub.com/mswjs/msw/releases/tag/v2.4.3) [Compare Source](https://togithub.com/mswjs/msw/compare/v2.4.2...v2.4.3) #### v2.4.3 (2024-09-07) ##### Bug Fixes - revert "graphql" as optional peer dependency ([#​2267](https://togithub.com/mswjs/msw/issues/2267)) ([`7cd39e7`](https://togithub.com/mswjs/msw/commit/7cd39e787aa9766eef914bce3d65daec1ce16635)) [@​kettanaito](https://togithub.com/kettanaito)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit 798a26f93ce0501ed8fe72e6de94fd7454315d8e Author: Steph Milovic Date: Wed Sep 18 15:05:41 2024 -0600 [Security solution] `naturalLanguageToEsql` Tool added to default assistant graph (#192042) commit d4ee1ca64442a46dc24578620d0ff318a9fdc7c8 Author: Justin Kambic Date: Wed Sep 18 16:51:52 2024 -0400 [Synthetics] Remove dead code (#193335) ## Summary Gets rid of unused files and some types, constants, etc. that are no longer referenced in production code. commit 91ca8ab95c01f88ea2d79779f3670c88bf269da0 Author: Eyo O. Eyo <7893459+eokoneyo@users.noreply.github.com> Date: Wed Sep 18 22:26:44 2024 +0200 [Reporting] update puppeteer to version 23.3.1 (#192345) ## Summary Update for puppeteer, the following changeset updates puppeteer to version `23.3.1`. The chromium version required for this version of puppeteer is `128.0.6613.137` from revision `1331488`, as such the chromium binary included for windows and darwin platforms either match or were the closest revision to the expectation. The linux headless binary was built from commit `fe621c5aa2d6b987e964fb1b5066833da5fb613d` of the same revision. _**N.B.**_ Puppeteer 23.0.0 is earmarked as containing breaking changes see [here](https://github.com/puppeteer/puppeteer/blob/abda5dcc9912f4fa2c5a566403108db783f48538/packages/puppeteer-core/CHANGELOG.md#2300-2024-08-07), this PR considers the outlined changes and makes relevant adjustments so reporting continues working as is. ### How to verify linux headless build - clone the following repo https://github.com/tsullivan/kibana-dev-docker - pull this particular PR - follow the steps outlined in the repo, replacing any occurrence of `kibana--SNAPSHOT-linux-aarch64.tar.gz` from the repo above's step with the output of running build on this changeset. - before running step 4, modify the `kibana.yml` file from the `kibana-dev-docker` repo and include the following so we might be able to verify the version of chromium running; ```yaml logging.loggers: - name: plugins.reporting level: debug ``` - complete the steps outlined in the README, you'll have a linux distro of kibana running on port `5601` - Attempt creating exports of PDF and PNG reports, in dashboard, canvas, and visualizations, on report creation attempt we would see a log output that prints out the chromium version exactly matching this; Screenshot 2024-09-18 at 14 50 19 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine commit d84eda1063394a7fbfe4a936becca5d21c1e2d45 Author: Justin Kambic Date: Wed Sep 18 16:07:29 2024 -0400 [Uptime] Delete dead code (#193339) ## Summary Removes code that is unused from the Uptime plugin. commit 3c01b13f90d6c8b6c144e0c4ead771008d499d99 Author: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Wed Sep 18 11:53:36 2024 -0700 [ResponseOps] Connector OAS for framework fields (#192767) Resolves https://github.com/elastic/kibana/issues/192778 ## Summary This PR updates the following `response` schemas as well as the legacy route schemas for connector APIs to generate OAS documentation: - `POST /api/actions/connector/{id?}` - `GET /api/actions/connector/{id}` - `POST /api/actions/connector/{id}/_execute` - `PUT /api/actions/connector/{id}` The `request` schemas were updated in this [PR](https://github.com/elastic/kibana/pull/191678). ### To verify 1. Start ES 2. Add `server.oas.enabled: true` to `kibana.dev.yml` 3. Start Kibana `yarn start --no-base-path` 4. `curl -s -uelastic:changeme http://localhost:5601/api/oas\?pathStartsWith\=/api/actions/ | jq` --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Lisa Cawley commit e1db2969636658b48a8a53c58755e59995097d5d Author: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Wed Sep 18 20:39:25 2024 +0200 [Lens] Corrects incorrect copy for line chart & fix flaky test (#192734) ## Summary Corrects incorrect copy for line chart. Rewrites some of the tests to rtl. Unskips flaky or failing tests. Fixes https://github.com/elastic/kibana/issues/192476 Removes some errors from the console that appear during unit test running. --------- Co-authored-by: Elastic Machine commit 4d4afa55b378deb09936259d826f05a7bfeead12 Author: Rickyanto Ang Date: Wed Sep 18 10:55:00 2024 -0700 [Cloud Security] User Name Misconfiguration Table and Preview Contextual Flyout (#192946) ## Summary This PR is the implementation of Misconfiguration Preview and Data table on user.name flyout in Alerts Page. Screenshot 2024-09-14 at 12 54 37 AM How to test: Pre req: In order to test this, you need to generate some fake alerts. This [repo](https://github.com/elastic/security-documents-generator) will help you do that 1. Generate Some Alerts 2. Use the Reindex API to get some Findings data in (change the host.name field to match the host.name from alerts generated if you want to test Findings table in the left panel flyout) 3. Turn on Risky Entity Score if you want to test if both Risk Contribution and Insights tabs shows up, follow this [guide](https://www.elastic.co/guide/en/security/current/turn-on-risk-engine.html) to turn on Risk Entity Score commit b9d7de64f0574750cddf490ed4eba71108109976 Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 12:53:01 2024 -0500 Update OpenFeature (main) (#193332) Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit be2d64196270f683548747ec3ff0a365be666f94 Author: Katerina Date: Wed Sep 18 20:50:22 2024 +0300 [Inventory] Remove inventory dependency from observability plugin (#193251) ## Summary closes https://github.com/elastic/kibana/issues/193200 - Remove inventory dependency from observability plugin - Register inventory in different section in classic stateful sidenav https://github.com/user-attachments/assets/6c9c28bc-7483-4deb-b95a-67585a92f89f commit f40bf527ff84d6d3d393a068c7c5f9a44586680d Author: Melissa Alvarez Date: Wed Sep 18 11:04:17 2024 -0600 [ML] Serverless Security: Adds ES|QL visualizer menu item in nav (#192314) ## Summary Related issue: https://github.com/elastic/kibana/issues/192307 This PR add sthe ES|QL visualizer menu item to the Security solution's nav in serverless. image image ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: Elastic Machine commit de51a1a94e73ab4f2e3df06f75f3b25b0209f084 Author: Sid Date: Wed Sep 18 19:01:45 2024 +0200 Add debug logging for flaky session tests (#193279) ## Summary Add settings to the ES Test cluster to enable debug logs so that if this test fails in the future, we will have more logs to investigate the issue. __Related:__ https://github.com/elastic/kibana/issues/152260 commit 004631b6c229d9d87e43c1dc73321c90efb857dc Author: Tomasz Ciecierski Date: Wed Sep 18 18:56:06 2024 +0200 [EDR Workflows] Automated Actions in more rule types (#191874) commit 70b7d263352a73569f2809bb0b4d1e2624b43b28 Author: Nikita Indik Date: Wed Sep 18 18:21:00 2024 +0200 [Security Solution] ThreeWayDiff UI: Migrate to using `DiffableRule` TS type in `FieldReadOnly` component (#192342) **Partially addresses: https://github.com/elastic/kibana/issues/171520** **Is a follow-up PR to: https://github.com/elastic/kibana/pull/191499** This is the 2nd of the 3 PRs for `FieldReadOnly`. - The 1st [PR](https://github.com/elastic/kibana/pull/191499) added the `FieldReadOnly` and a bunch of field components. - This (2nd) PR moves away from using `DiffableAllFields` type in favour of `DiffableRule` and splits the large `FieldReadOnly` component into smaller ones for readability. - Next (3rd) PR will add the remaining field components. ## Summary This PR changes the TS type (`DiffableAllFields` -> `DiffableRule`) used by the `FieldReadOnly` component. This component displays a read-only view of a particular rule field, similar to how fields are shown on the Rule Details page. Using `DiffableRule` type makes the component compatible with the flyout context and is safer to use than `DiffableAllFields`. ### Changes - TS type used in the `FieldReadOnly` component and Storybook stories changed to `DiffableRule`. - `FieldReadOnly` field rendering was split into multiple files by rule type to make it more readable. - Added rule-mocking functions to Storybook to allow creation of `DiffableRule` mocks. - Added field components for `name`, `description` and `tags` fields. - Rewrote type narrowing for `Filters` component to a type guard (`isFilters`). - Fixed a couple of outdated code comments. ### Running `FinalReadOnly` and its field components are not yet integrated into the flyout, but you can view components in Storybook. 1. Run Storybook: `yarn storybook security_solution` 2. Go to `http://localhost:9001` in browser. Scherm­afbeelding 2024-09-03 om 13 05 11 commit 02ce1b91014eb59f019854b01325bbdf983d2218 Author: Alejandro Fernández Haro Date: Wed Sep 18 18:02:55 2024 +0200 [Feature Flags Service] Hello world 👋 (#188562) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Jean-Louis Leysens commit 38d6143f722459002f5556a9f7888ada4193b12d Author: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Wed Sep 18 16:45:59 2024 +0100 [Index Management] Restrict dot-prefixed index patterns in template form (#193196) Closes https://github.com/elastic/kibana/issues/190251 ## Summary This PR adds validation that restricts creating a template with a dot-prefixed index pattern. Screenshot 2024-09-18 at 10 49 47 Note: I tried adding tests for this validation [here](https://github.com/elastic/kibana/blob/6a3adf73dacaeda073674ac4a10e8a2597e67739/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx#L163), but it didn't work because the index pattern field is mocked in the tests and errors are not triggered from invalid values. commit 78b21cd9f98f65d93bfba4b3a2d0e5b33f481c26 Author: Tre Date: Wed Sep 18 16:31:11 2024 +0100 [Unskip] x-pack/.../summary_actions.ts (#193120) ## Summary Use retryForTime instead. Test against local (fake mki) and mki; both were security projects. Tested against `x-pack/test_serverless/api_integration/test_suites/security/common_configs/config.group1.ts` Resolves: https://github.com/elastic/kibana/issues/193061 --------- Co-authored-by: Elastic Machine commit bfbcf6291edcb82448e99f4d5a479fecf7f58211 Author: Kevin Delemme Date: Wed Sep 18 11:25:42 2024 -0400 chore(rca): show full name in notes and store profile id in model (#193211) commit 5bf4501f5f39f05c3586083e867679d9952eda9d Author: Tim Sullivan Date: Wed Sep 18 08:19:05 2024 -0700 [Spaces Management] Ensure current badge can only appear for single entry (#193195) ## Summary Closes #192811 ### Checklist Delete any items that are not applicable to this PR. - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or commit e3f3c68e8d2e106740db9b4612df867c583eb512 Author: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com> Date: Wed Sep 18 16:06:13 2024 +0100 [Inventory][ECO] Entities table (#193272) Real data: Screenshot 2024-09-18 at 14 23 17 Storybook: Screenshot 2024-09-18 at 14 23 22 Tooltips: Screenshot 2024-09-18 at 13 49 19 - Use ESQL to fetch the top 500 entities sorted by last seen property. - Display 20 entities per page. - Sorting is handles by the server and saved on the URL - Current page is saved on the URL - Filter entities types `service`, `host` or `container` - Filter only entities from the built in definition - LIMITATION: The EuiGrid doesn't have an embedded loading state, for now, I'm switching the entire view to display a loading spinner while data is being fetched. - PLUS: Storybook created with mock data. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit 5040e3580cb4a377257c0fe6f821a1f91908db7a Author: Sébastien Loix Date: Wed Sep 18 15:54:13 2024 +0100 [Chrome service] Expose handler to toggle the sidenav (#193192) commit 1b0aa691795520f85ddd0dfa49bb73dfe687e316 Merge: 1310ae113d4 26a50f71562 Author: Pablo Machado Date: Wed Sep 18 16:06:10 2024 +0200 Merge branch 'main' into siem-ea-9180-api commit 1310ae113d434d2cd9aea91b683ceae754d5a7b6 Author: machadoum Date: Wed Sep 18 14:54:27 2024 +0200 Fix CI commit 7eb1118734a70cb6d5e79899be9dd42b65b484ba Merge: c2b1724e81c 61d0b7f0d67 Author: Elastic Machine Date: Wed Sep 18 10:33:28 2024 +0200 Merge branch 'main' into siem-ea-9180-api commit c2b1724e81cc349f82d5854b40c5a1843eedb48c Author: machadoum Date: Tue Sep 17 17:06:14 2024 +0200 Improve get entity index function commit a8b96d8e7b5809d805b122f98283970d7349555f Author: machadoum Date: Tue Sep 17 16:40:48 2024 +0200 Fix build commit 1b94ce7fa2ac3cf3e6cccdfd616c0ca1245e16a8 Author: machadoum Date: Tue Sep 17 14:47:35 2024 +0200 Add code review suggestions commit 7064282ebe047bd959aac4d5d56a1e09123d916d Author: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Tue Sep 17 12:38:17 2024 +0000 [CI] Auto-commit changed files from 'yarn openapi:bundle' commit ab6e77346d9e17825dc9c80401981aa425ba51c0 Author: machadoum Date: Tue Sep 17 13:49:10 2024 +0200 Rename User and Host records commit 4216ff333768798d936d89fa772e40129028085f Author: machadoum Date: Tue Sep 17 13:45:24 2024 +0200 Fix API tests commit 500b631815d44a7e1d69ca03ddb11fd74db37b52 Author: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Tue Sep 17 10:17:06 2024 +0000 [CI] Auto-commit changed files from 'yarn openapi:bundle' commit 98250e97ee3b47f96f1de305082a8d3b86c3f825 Author: machadoum Date: Tue Sep 17 11:22:28 2024 +0200 Code review improvements commit fbb7479da346f520a47148e7299a44615a329819 Author: machadoum Date: Tue Sep 10 13:58:47 2024 +0200 Create list entities API add API test Add data client test --- .../ftr_security_serverless_configs.yml | 1 + .buildkite/ftr_security_stateful_configs.yml | 1 + .github/CODEOWNERS | 7 + api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 11 +- api_docs/deprecations_by_plugin.mdx | 17 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.devdocs.json | 77 + api_docs/elastic_assistant.mdx | 4 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 80 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/inference.devdocs.json | 36 +- api_docs/inference.mdx | 4 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.devdocs.json | 1047 +- api_docs/integration_assistant.mdx | 7 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.devdocs.json | 20 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cbor.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_cloud_security_posture.mdx | 2 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.devdocs.json | 18 +- api_docs/kbn_core_chrome_browser.mdx | 4 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- ...bn_core_feature_flags_browser.devdocs.json | 596 + api_docs/kbn_core_feature_flags_browser.mdx | 33 + ...eature_flags_browser_internal.devdocs.json | 218 + ...bn_core_feature_flags_browser_internal.mdx | 33 + ...e_feature_flags_browser_mocks.devdocs.json | 130 + .../kbn_core_feature_flags_browser_mocks.mdx | 30 + ...kbn_core_feature_flags_server.devdocs.json | 770 + api_docs/kbn_core_feature_flags_server.mdx | 33 + ...feature_flags_server_internal.devdocs.json | 267 + ...kbn_core_feature_flags_server_internal.mdx | 36 + ...re_feature_flags_server_mocks.devdocs.json | 182 + .../kbn_core_feature_flags_server_mocks.mdx | 30 + api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...equest_handler_context_server.devdocs.json | 68 +- ...re_http_request_handler_context_server.mdx | 4 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 16 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- .../kbn_core_lifecycle_browser.devdocs.json | 44 + api_docs/kbn_core_lifecycle_browser.mdx | 4 +- ..._core_lifecycle_browser_mocks.devdocs.json | 24 + api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- .../kbn_core_lifecycle_server.devdocs.json | 44 + api_docs/kbn_core_lifecycle_server.mdx | 4 +- ...n_core_lifecycle_server_mocks.devdocs.json | 20 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...st_helpers_http_setup_browser.devdocs.json | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.devdocs.json | 14700 +--------------- api_docs/kbn_esql_ast.mdx | 4 +- api_docs/kbn_esql_utils.mdx | 2 +- ..._esql_validation_autocomplete.devdocs.json | 8 + api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.devdocs.json | 24 +- api_docs/kbn_expandable_flyout.mdx | 4 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grid_layout.mdx | 2 +- api_docs/kbn_grouping.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- .../kbn_index_management_shared_types.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_recently_accessed.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- api_docs/kbn_security_ui_components.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- ...n_shared_ux_chrome_navigation.devdocs.json | 4 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_table_persist.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.devdocs.json | 20 + api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 8 + api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 42 - api_docs/observability.mdx | 4 +- .../observability_a_i_assistant.devdocs.json | 356 +- api_docs/observability_a_i_assistant.mdx | 4 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.devdocs.json | 374 + api_docs/observability_shared.mdx | 4 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 40 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 14 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.devdocs.json | 15 +- api_docs/spaces.mdx | 4 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- dev_docs/nav-kibana-dev.docnav.json | 10 +- docs/developer/plugin-list.asciidoc | 4 +- examples/feature_flags_example/README.md | 5 + .../common/feature_flags.ts | 12 + .../feature_flags_example/common/index.ts | 11 + examples/feature_flags_example/kibana.jsonc | 13 + .../public/application.tsx | 33 + .../public/components/app.tsx | 91 + .../feature_flags_example/public/index.ts | 12 +- .../feature_flags_example/public/plugin.ts | 40 + .../feature_flags_example/public/types.ts | 14 + .../feature_flags_example/server/index.ts | 77 + .../feature_flags_example/server/plugin.ts | 69 + .../server/routes/index.ts | 44 + examples/feature_flags_example/tsconfig.json | 24 + oas_docs/bundle.json | 401 + oas_docs/bundle.serverless.json | 401 + package.json | 17 +- .../src/chrome_service.test.tsx | 35 +- .../src/chrome_service.tsx | 20 +- .../src/ui/project/header.test.tsx | 1 + .../src/ui/project/header.tsx | 8 +- .../src/ui/project/navigation.tsx | 36 +- .../src/chrome_service.mock.ts | 7 +- .../core-chrome-browser/src/contracts.ts | 16 +- .../elasticsearch_route_handler_context.ts | 2 +- packages/core/feature-flags/README.mdx | 158 + .../README.md | 5 + .../index.ts | 10 + .../jest.config.js | 14 + .../kibana.jsonc | 5 + .../package.json | 6 + .../src/feature_flags_service.test.ts | 292 + .../src/feature_flags_service.ts | 203 + .../tsconfig.json | 26 + .../README.md | 3 + .../core-feature-flags-browser-mocks/index.ts | 58 + .../jest.config.js | 14 + .../kibana.jsonc | 5 + .../package.json | 6 + .../tsconfig.json | 23 + .../core-feature-flags-browser/README.md | 3 + .../core-feature-flags-browser/index.ts | 16 + .../core-feature-flags-browser/kibana.jsonc | 5 + .../core-feature-flags-browser/package.json | 6 + .../core-feature-flags-browser/src/types.ts | 165 + .../core-feature-flags-browser/tsconfig.json | 18 + .../README.md | 5 + .../index.ts | 12 + .../jest.config.js | 14 + .../kibana.jsonc | 5 + .../package.json | 6 + .../src/feature_flags_config.ts | 42 + .../feature_flags_request_handler_context.ts | 33 + .../src/feature_flags_service.test.ts | 260 + .../src/feature_flags_service.ts | 196 + .../tsconfig.json | 24 + .../core-feature-flags-server-mocks/README.md | 3 + .../core-feature-flags-server-mocks/index.ts | 88 + .../jest.config.js | 14 + .../kibana.jsonc | 5 + .../package.json | 6 + .../tsconfig.json | 21 + .../core-feature-flags-server/README.md | 3 + .../core-feature-flags-server/index.ts | 18 + .../core-feature-flags-server/kibana.jsonc | 5 + .../core-feature-flags-server/package.json | 6 + .../src/contracts.ts | 165 + .../src/feature_flag_definition.ts | 60 + .../src/request_handler_context.ts} | 20 +- .../core-feature-flags-server/tsconfig.json | 16 + .../src/core_route_handler_context.ts | 11 + .../core_route_handler_context_params.mock.ts | 2 + .../tsconfig.json | 3 + .../src/preboot_request_handler_context.ts | 12 + .../src/request_handler_context.ts | 26 + .../tsconfig.json | 3 +- .../src/injected_metadata_service.test.ts | 27 + .../src/injected_metadata_service.ts | 4 + .../src/types.ts | 5 + .../src/injected_metadata_service.mock.ts | 1 + .../src/types.ts | 3 + .../src/internal_core_setup.ts | 2 + .../src/internal_core_start.ts | 2 + .../tsconfig.json | 3 +- .../src/core_setup.mock.ts | 2 + .../src/core_start.mock.ts | 2 + .../tsconfig.json | 3 +- .../core-lifecycle-browser/src/core_setup.ts | 3 + .../core-lifecycle-browser/src/core_start.ts | 3 + .../core-lifecycle-browser/tsconfig.json | 3 +- .../src/internal_core_setup.ts | 2 + .../src/internal_core_start.ts | 2 + .../tsconfig.json | 4 +- .../src/core_setup.mock.ts | 2 + .../src/core_start.mock.ts | 2 + .../src/internal_core_setup.mock.ts | 2 + .../src/internal_core_start.mock.ts | 2 + .../core-lifecycle-server-mocks/tsconfig.json | 1 + .../core-lifecycle-server/src/core_setup.ts | 3 + .../core-lifecycle-server/src/core_start.ts | 3 + .../core-lifecycle-server/tsconfig.json | 3 +- .../src/plugin_context.ts | 2 + .../src/plugin_context.ts | 13 + .../rendering_service.test.ts.snap | 217 + .../src/rendering_service.test.ts | 17 + .../src/rendering_service.tsx | 18 +- .../src/test_helpers/params.ts | 2 + .../src/types.ts | 2 + .../tsconfig.json | 2 + .../src/core_system.ts | 9 + .../core-root-browser-internal/tsconfig.json | 1 + .../src/register_service_config.ts | 2 + .../core-root-server-internal/src/server.ts | 10 + .../core-root-server-internal/tsconfig.json | 1 + .../src/__tests__/ast_parser.sort.test.ts | 141 +- packages/kbn-esql-ast/src/ast_factory.ts | 4 +- packages/kbn-esql-ast/src/ast_helpers.ts | 21 + packages/kbn-esql-ast/src/ast_walker.ts | 63 +- .../__tests__/basic_pretty_printer.test.ts | 16 +- .../src/pretty_print/basic_pretty_printer.ts | 23 +- packages/kbn-esql-ast/src/types.ts | 18 +- packages/kbn-esql-ast/src/visitor/contexts.ts | 6 + .../src/visitor/global_visitor_context.ts | 14 + packages/kbn-esql-ast/src/visitor/types.ts | 7 +- .../autocomplete.command.sort.test.ts | 106 + .../src/autocomplete/autocomplete.test.ts | 70 - .../src/autocomplete/autocomplete.ts | 102 + .../autocomplete/commands/sort/helper.test.ts | 55 + .../src/autocomplete/commands/sort/helper.ts | 84 + .../src/definitions/builtin.ts | 14 + .../src/definitions/commands.ts | 6 +- .../src/shared/context.ts | 2 +- .../src/components/container.test.tsx | 180 + .../src/components/container.tsx | 241 + .../src/components/left_section.tsx | 24 +- .../src/components/preview_section.test.tsx | 11 +- .../src/components/preview_section.tsx | 28 +- .../components/resizable_container.test.tsx | 51 + .../src/components/resizable_container.tsx | 116 + .../src/components/right_section.tsx | 23 +- .../src/components/settings_menu.test.tsx | 362 +- .../src/components/settings_menu.tsx | 55 +- .../src/components/test_ids.ts | 15 + .../kbn-expandable-flyout/src/constants.ts | 3 + .../src/hooks/use_expandable_flyout_state.ts | 4 +- .../use_initialize_from_local_storage.test.ts | 55 +- .../use_initialize_from_local_storage.ts | 52 +- .../src/hooks/use_sections.test.tsx | 134 + .../src/hooks/use_sections.ts | 86 + .../src/hooks/use_sections_sizes.test.ts | 251 - .../src/hooks/use_sections_sizes.ts | 114 - .../src/hooks/use_window_width.test.ts | 150 + .../src/hooks/use_window_width.ts | 84 + .../src/index.stories.tsx | 83 +- .../kbn-expandable-flyout/src/index.test.tsx | 148 +- packages/kbn-expandable-flyout/src/index.tsx | 125 +- .../src/provider.test.tsx | 14 +- .../src/store/actions.ts | 63 + .../src/store/middlewares.test.ts | 205 +- .../src/store/middlewares.ts | 106 +- .../src/store/reducers.test.ts | 238 + .../src/store/reducers.ts | 34 + .../kbn-expandable-flyout/src/store/redux.ts | 20 +- .../kbn-expandable-flyout/src/store/state.ts | 64 + .../src/test/provider.tsx | 12 +- packages/kbn-optimizer/limits.yml | 6 +- .../kbn-screenshotting-server/src/paths.ts | 34 +- .../create_exception_list.schema.yaml | 6 +- .../create_exception_list_item.schema.yaml | 6 +- .../create_rule_exceptions.schema.yaml | 3 +- .../create_shared_exceptions_list.schema.yaml | 6 +- .../delete_exception_list.schema.yaml | 3 +- .../delete_exception_list_item.schema.yaml | 3 +- .../duplicate_exception_list.schema.yaml | 3 +- .../export_exception_list.schema.yaml | 4 +- .../find_exception_list_items.schema.yaml | 3 +- .../find_exception_lists.schema.yaml | 3 +- .../import_exceptions.schema.yaml | 4 +- .../api/quickstart_client.gen.ts | 55 +- .../read_exception_list.schema.yaml | 3 +- .../read_exception_list_item.schema.yaml | 3 +- .../read_exception_list_summary.schema.yaml | 3 +- .../update_exception_list.schema.yaml | 3 +- .../update_exception_list_item.schema.yaml | 3 +- ...eptions_api_2023_10_31.bundled.schema.yaml | 82 +- ...eptions_api_2023_10_31.bundled.schema.yaml | 82 +- .../chrome/navigation/src/services.tsx | 2 +- .../shared-ux/chrome/navigation/src/types.ts | 4 +- renovate.json | 17 +- src/core/public/index.ts | 5 + src/core/public/mocks.ts | 1 + src/core/server/index.ts | 5 + .../config/check_dynamic_config.test.ts | 2 + src/core/server/mocks.ts | 3 + src/core/tsconfig.json | 4 + .../tasks/os_packages/docker_generator/run.ts | 2 +- src/plugins/home/kibana.jsonc | 3 +- .../dashboard/group1/url_field_formatter.ts | 3 +- .../apps/dashboard/group5/embed_mode.ts | 4 +- .../discover/group6/_time_field_column.ts | 3 +- .../test_suites/core_plugins/rendering.ts | 2 - tsconfig.base.json | 14 + x-pack/build_chromium/linux/args.gn | 2 +- x-pack/packages/ml/anomaly_utils/types.ts | 2 +- .../client/create_observability_es_client.ts | 24 +- .../es/utils/esql_result_to_plain_objects.ts | 20 + .../navigation/src/constants.ts | 1 + .../routes/connector/response/schemas/v1.ts | 105 +- .../server/routes/connector/get/get.ts | 2 + .../plugins/actions/server/routes/create.ts | 6 +- .../plugins/actions/server/routes/execute.ts | 2 + .../actions/server/routes/legacy/create.ts | 2 + .../actions/server/routes/legacy/execute.ts | 2 + .../actions/server/routes/legacy/get.ts | 2 + .../actions/server/routes/legacy/update.ts | 2 + .../plugins/actions/server/routes/update.ts | 2 + ...s_upgrade_and_rollback_checks.test.ts.snap | 338 + .../server/usage/alerting_usage_collector.ts | 6 + .../lib/get_telemetry_from_kibana.test.ts | 178 +- .../usage/lib/get_telemetry_from_kibana.ts | 77 +- x-pack/plugins/alerting/server/usage/task.ts | 39 +- .../alerting/server/usage/task_state.ts | 6 + x-pack/plugins/alerting/server/usage/types.ts | 3 + x-pack/plugins/cloud/server/mocks.ts | 2 + .../cloud_chat/kibana.jsonc | 1 - .../cloud_chat/server/plugin.ts | 31 +- .../cloud_chat/server/routes/chat.test.ts | 26 +- .../cloud_chat/server/routes/chat.ts | 18 +- .../cloud_chat/tsconfig.json | 1 - .../cloud_experiments/README.mdx | 187 +- .../common/constants.test.ts | 25 - .../cloud_experiments/common/constants.ts | 51 - .../cloud_experiments/common/index.ts | 13 - .../common/metadata_service/index.ts | 1 + .../metadata_service/initialize_metadata.ts | 63 + .../metadata_service/metadata_service.test.ts | 85 +- .../metadata_service/metadata_service.ts | 129 +- .../metadata_service/remove_undefined.ts | 16 + .../cloud_experiments/common/mocks.ts | 19 - .../cloud_experiments/common/types.ts | 74 - .../cloud_experiments/kibana.jsonc | 4 +- .../public/launch_darkly_client/index.ts | 12 - .../launch_darkly_client.test.mock.ts | 27 - .../launch_darkly_client.test.ts | 195 - .../launch_darkly_client.ts | 104 - .../cloud_experiments/public/plugin.test.ts | 254 +- .../cloud_experiments/public/plugin.ts | 147 +- .../cloud_experiments/server/config.test.ts | 81 +- .../cloud_experiments/server/config.ts | 2 - .../server/launch_darkly_client/index.ts | 8 - .../launch_darkly_client.test.mock.ts | 25 - .../launch_darkly_client.test.ts | 217 - .../launch_darkly_client.ts | 97 - .../server/launch_darkly_client/mocks.ts | 26 - .../cloud_experiments/server/plugin.test.ts | 250 +- .../cloud_experiments/server/plugin.ts | 130 +- .../usage/register_usage_collector.test.ts | 22 +- .../server/usage/register_usage_collector.ts | 23 +- .../cloud_experiments/tsconfig.json | 6 +- x-pack/plugins/elastic_assistant/kibana.jsonc | 1 + .../server/__mocks__/request_context.ts | 2 + .../server/lib/langchain/executors/types.ts | 2 + .../graphs/default_assistant_graph/index.ts | 3 + .../elastic_assistant/server/plugin.ts | 1 + .../server/routes/attack_discovery/helpers.ts | 2 +- .../server/routes/chat/chat_complete_route.ts | 2 + .../server/routes/evaluate/post_evaluate.ts | 4 + .../server/routes/helpers.ts | 4 + .../routes/post_actions_connector_execute.ts | 2 + .../server/routes/request_context_factory.ts | 2 + .../plugins/elastic_assistant/server/types.ts | 9 + .../plugins/elastic_assistant/tsconfig.json | 1 + .../fleet/.storybook/context/index.tsx | 2 + .../template_form/template_form_schemas.tsx | 12 + .../pipeline_processors_editor.test.tsx | 35 + .../shared/map_processor_type_to_form.tsx | 5 +- .../stringify_value_description.test.ts | 29 + .../shared/stringify_value_description.ts | 22 + .../lens_configuration_flyout.test.tsx | 35 +- .../datasources/form_based/datapanel.test.tsx | 1062 +- .../datasources/form_based/datapanel.tsx | 4 +- .../dimension_panel/dimension_panel.test.tsx | 17 +- .../dimension_panel/field_input.test.tsx | 149 +- .../dimension_panel/format_selector.test.tsx | 4 +- .../form_based/layerpanel.test.tsx | 7 +- .../chart_switch/chart_switch.test.tsx | 7 +- .../editor_frame/editor_frame.test.tsx | 46 - .../dataview_picker/dataview_picker.tsx | 7 +- .../legend/legend_settings_popover.test.tsx | 8 +- .../public/visualization_container.test.tsx | 26 +- .../components/dimension_editor.test.tsx | 7 +- .../lens/public/visualizations/xy/types.ts | 39 +- .../__mocks__/mock_anomalies_table_data.json | 39 +- ...omalies_table_data_multiple_detectors.json | 975 + .../common/util/anomalies_table_utils.test.ts | 86 + .../ml/common/util/anomalies_table_utils.ts | 45 + .../anomalies_table/anomalies_table.test.js | 2 +- .../public/application/explorer/explorer.tsx | 1 + .../explorer_anomalies_container.tsx | 4 + .../explorer_chart_distribution.js | 107 +- .../explorer_chart_single_metric.js | 117 +- .../explorer_charts_container.js | 5 + .../application/explorer/explorer_utils.ts | 12 +- .../timeseries_chart/timeseries_chart.js | 10 +- .../timeseriesexplorer_embeddable_chart.js | 5 + .../anomaly_charts_react_container.tsx | 75 +- ...et_anomaly_charts_services_dependencies.ts | 5 + .../single_metric_viewer/get_services.ts | 5 +- x-pack/plugins/ml/public/embeddables/types.ts | 5 +- x-pack/plugins/ml/tsconfig.json | 5 +- .../inventory/common/entities.ts | 29 +- .../inventory/common/es_fields/entities.ts | 12 + .../entities_grid/entities_grid.stories.tsx | 65 + .../public/components/entities_grid/index.tsx | 229 +- .../entities_grid/mock/entities_mock.ts | 3014 ++++ .../public/pages/inventory_page/index.tsx | 57 +- .../inventory/public/plugin.tsx | 26 + .../inventory/public/routes/config.tsx | 16 + .../routes/entities/get_latest_entities.ts | 66 +- .../inventory/server/routes/entities/route.ts | 35 +- .../inventory/server/utils/with_apm_span.ts | 7 - .../inventory/tsconfig.json | 4 +- .../public/hooks/query_key_factory.ts | 2 + .../public/hooks/use_fetch_user_profiles.tsx | 63 + .../investigation_notes.tsx | 10 +- .../components/investigation_notes/note.tsx | 95 +- .../list/components/investigation_list.tsx | 27 + .../server/services/create_investigation.ts | 2 +- .../services/create_investigation_item.ts | 2 +- .../services/create_investigation_note.ts | 2 +- .../services/delete_investigation_item.ts | 2 +- .../services/delete_investigation_note.ts | 2 +- .../services/update_investigation_item.ts | 2 +- .../services/update_investigation_note.ts | 2 +- .../observability/kibana.jsonc | 14 +- .../observability/public/navigation_tree.ts | 19 +- .../observability/public/plugin.ts | 17 - .../observability/tsconfig.json | 9 +- .../observability_onboarding/README.md | 11 +- .../observability_onboarding/kibana.jsonc | 2 +- .../observability_onboarding/public/plugin.ts | 2 - .../observability_onboarding/tsconfig.json | 1 - .../common/translations/translations.ts | 38 - .../components/alerts/query_bar.tsx | 85 - .../components/certificates/index.ts | 3 + .../components/common/links/view_errors.tsx | 31 - .../getting_started/simple_monitor_form.tsx | 7 - .../management/monitor_list_table/tags.tsx | 47 - .../empty_state/empty_state_error.tsx | 58 - .../overview/overview/use_infinite_scroll.ts | 91 - .../components/not_found/not_found.tsx | 39 - .../network_data/data_formatting.test.ts | 125 +- .../common/network_data/data_formatting.ts | 72 +- .../common/network_data/types.ts | 16 +- .../step_screenshot/screenshot_link.tsx | 47 - .../step_waterfall_chart/waterfall/README.md | 12 +- .../waterfall/context/waterfall_context.tsx | 4 +- .../waterfall/middle_truncated_text.test.tsx | 25 +- .../waterfall/middle_truncated_text.tsx | 14 +- .../waterfall/waterfall_bar_chart.tsx | 20 +- .../waterfall/waterfall_chart_wrapper.tsx | 4 +- .../waterfall_flyout/use_flyout.test.tsx | 2 + .../waterfall_flyout.test.tsx | 2 + .../waterfall_flyout/waterfall_flyout.tsx | 8 +- .../waterfall/waterfall_sidebar_item.test.tsx | 4 +- .../waterfall/waterfall_sidebar_item.tsx | 10 +- .../waterfall_tooltip_content.test.tsx | 32 +- .../waterfall/waterfall_tooltip_content.tsx | 23 +- .../public/apps/synthetics/routes.tsx | 4 +- .../synthetics/utils/formatting/format.ts | 2 +- .../testing/__mocks__/screenshot_ref.mock.ts | 44 - .../synthetics/utils/testing/rtl_helpers.tsx | 29 - .../utils/testing/spy_use_fetcher.ts | 32 - .../utils/url_params/parse_is_paused.test.ts | 22 - .../utils/url_params/parse_is_paused.ts | 17 - .../utils/url_params/parse_url_int.test.ts | 25 - .../utils/url_params/parse_url_int.ts | 11 - .../server/alert_rules/tls_rule/types.ts | 23 - ..._project_code.ts => unzip_project_code.ts} | 0 .../routes/monitor_cruds/inspect_monitor.ts | 2 +- .../routes/pings/journey_screenshot_blocks.ts | 4 +- .../synthetics/server/telemetry/constants.ts | 2 - .../uptime/common/constants/data_filters.ts | 12 - .../uptime/common/field_names.ts | 22 - .../common/formatters/format_space_name.ts | 13 - .../uptime/common/formatters/index.ts | 8 - .../uptime/common/utils/t_enum.ts | 38 - .../lib/helper/spy_use_fetcher.ts | 32 - .../server/browsers/chromium/driver.ts | 25 +- .../browsers/chromium/driver_factory/index.ts | 2 +- .../model/rule_schema/rule_schemas.gen.ts | 3 + .../rule_schema/rule_schemas.schema.yaml | 12 + .../diff/three_way_diff/three_way_diff.ts | 1 + .../three_way_diff/three_way_diff_conflict.ts | 4 +- .../entity_store/common.gen.ts | 6 + .../entity_store/common.schema.yaml | 19 +- .../entity_store/entities/common.gen.ts | 77 + .../entity_store/entities/common.schema.yaml | 159 + .../entities/list_entities.gen.ts | 44 + .../entities/list_entities.schema.yaml | 82 + .../common/api/quickstart_client.gen.ts | 68 +- .../clean_draft_timelines_route.schema.yaml | 14 +- .../create_timelines_route.schema.yaml | 9 +- .../delete_note/delete_note_route.schema.yaml | 5 +- .../delete_timelines_route.schema.yaml | 7 +- .../export_timelines_route.schema.yaml | 11 +- .../get_draft_timelines_route.schema.yaml | 9 +- .../get_notes/get_notes_route.schema.yaml | 4 +- .../get_timeline/get_timeline_route.gen.ts | 2 +- .../get_timeline_route.schema.yaml | 7 +- .../get_timelines_route.schema.yaml | 5 +- .../import_timelines_route.schema.yaml | 11 +- ...ll_prepackaged_timelines_route.schema.yaml | 9 +- .../patch_timeline_route.schema.yaml | 10 +- .../persist_favorite_route.schema.yaml | 5 +- .../persist_note_route.schema.yaml | 5 +- .../pinned_events_route.schema.yaml | 7 +- .../resolve_timeline_route.schema.yaml | 6 +- .../common/detection_engine/utils.ts | 11 + .../entity_store/constants.ts} | 9 +- .../common/experimental_features.ts | 10 + ...ections_api_2023_10_31.bundled.schema.yaml | 12 + ...alytics_api_2023_10_31.bundled.schema.yaml | 240 + ...imeline_api_2023_10_31.bundled.schema.yaml | 155 +- ...ections_api_2023_10_31.bundled.schema.yaml | 12 + ...alytics_api_2023_10_31.bundled.schema.yaml | 240 + ...imeline_api_2023_10_31.bundled.schema.yaml | 155 +- x-pack/plugins/security_solution/kibana.jsonc | 1 - .../links/sections/ml_links.ts | 7 + .../links/sections/ml_translations.ts | 12 + .../csp_details/insights_tab_csp.tsx | 41 +- ...isconfiguration_findings_details_table.tsx | 12 +- .../components/index.tsx | 18 +- .../misconfiguration_preview.test.tsx | 5 +- .../misconfiguration_preview.tsx | 61 +- .../common/lib/kibana/kibana_react.mock.ts | 3 - .../components/step_rule_actions/index.tsx | 10 +- ...perform_specific_rules_install_mutation.ts | 25 +- .../components/rule_details/helpers.ts | 15 +- .../rule_details/rule_about_section.tsx | 2 +- .../common_rule_field_readonly.tsx | 91 + .../custom_query_rule_field_readonly.tsx | 36 + .../eql_rule_field_readonly.tsx | 34 + .../esql_rule_field_readonly.tsx | 29 + .../final_readonly/field_readonly.tsx | 134 +- .../data_source/data_source.stories.tsx | 18 +- .../fields/data_source/data_source.tsx | 4 +- .../description/description.stories.tsx | 35 + .../fields/description/description.tsx | 36 + .../fields/eql_query/eql_query.stories.tsx | 18 +- .../fields/eql_query/eql_query.tsx | 17 +- .../fields/esql_query/esql_query.stories.tsx | 16 +- .../fields/esql_query/esql_query.tsx | 4 +- .../final_readonly/fields/kql_query/index.tsx | 7 +- .../fields/kql_query/inline_kql_query.tsx | 12 +- .../fields/kql_query/kql_query.stories.tsx | 34 +- .../fields/kql_query/saved_kql_query.tsx | 8 +- .../machine_learning_job_id.stories.tsx | 11 +- .../machine_learning_job_id.tsx | 4 +- .../fields/name/name.stories.tsx | 34 + .../final_readonly/fields/name/name.tsx | 36 + .../related_integrations.stories.tsx | 11 +- .../required_fields.stories.tsx | 16 +- .../risk_score_mapping.stories.tsx | 14 +- .../severity_mapping.stories.tsx | 16 +- .../fields/tags/tags.stories.tsx | 34 + .../final_readonly/fields/tags/tags.tsx | 29 + .../fields/threat/threat.stories.tsx | 16 +- .../threat_index/threat_index.stories.tsx | 16 +- .../threat_indicator_path.stories.tsx | 14 +- .../threat_mapping/threat_mapping.stories.tsx | 16 +- .../threat_query/threat_query.stories.tsx | 18 +- .../fields/threat_query/threat_query.tsx | 4 +- .../machine_learning_rule_field_readonly.tsx | 33 + .../new_terms_rule_field_readonly.tsx | 38 + .../saved_query_rule_field_readonly.tsx | 38 + .../final_readonly/storybook/mocks.ts | 181 +- .../threat_match_rule_field_readonly.tsx | 59 + .../threshold_rule_field_readonly.tsx | 38 + .../add_prebuilt_rules_header_buttons.tsx | 86 +- .../add_prebuilt_rules_install_button.tsx | 118 + .../add_prebuilt_rules_table_context.tsx | 82 +- .../add_prebuilt_rules_table/translations.ts | 29 + .../use_add_prebuilt_rules_table_columns.tsx | 34 +- .../detection_engine/rules/translations.ts | 8 - .../public/entity_analytics/api/api.ts | 30 + .../entity_details/host_right/content.tsx | 2 +- .../user_details_left/index.test.tsx | 42 + .../user_details_left/index.tsx | 29 +- .../entity_details/user_details_left/tabs.tsx | 14 +- .../entity_details/user_right/content.tsx | 2 + .../entity_details/user_right/index.tsx | 32 +- .../security_solution/public/flyout/index.tsx | 4 +- .../e2e/automated_response_actions/form.cy.ts | 20 + .../cypress/tasks/response_actions.ts | 26 + .../plugins/security_solution/public/types.ts | 2 - .../nl_to_esql_tool.ts | 80 + .../server/assistant/tools/index.test.ts | 2 +- .../server/assistant/tools/index.ts | 7 +- .../rule_assets/prebuilt_rule_asset.test.ts | 1 + .../model/rule_assets/prebuilt_rule_asset.ts | 6 +- .../api/rules/create_rule/route.test.ts | 40 +- .../api/rules/update_rule/route.test.ts | 37 +- .../convert_rule_response_to_alerting_rule.ts | 12 +- .../type_specific_camel_to_snake.ts | 5 +- .../mergers/apply_rule_defaults.ts | 3 + .../mergers/apply_rule_patch.ts | 3 + .../rule_management/utils/validate.ts | 32 +- .../endpoint_response_action.ts | 5 +- ...dule_notification_response_actions.test.ts | 59 +- .../schedule_notification_response_actions.ts | 14 +- .../rule_response_actions/types.ts | 8 + .../rule_schema/model/rule_schemas.ts | 3 + .../rule_types/eql/create_eql_alert_type.ts | 13 +- .../rule_types/eql/eql.test.ts | 36 + .../detection_engine/rule_types/eql/eql.ts | 11 + .../rule_types/esql/create_esql_alert_type.ts | 16 +- .../detection_engine/rule_types/esql/esql.ts | 12 +- .../new_terms/create_new_terms_alert_type.ts | 16 +- .../rule_types/query/query.ts | 11 +- .../lib/detection_engine/rule_types/types.ts | 10 +- .../entity_store_data_client.test.ts.snap | 34 + .../entity_store/constants.ts | 2 + .../entity_store/definition.ts | 94 +- .../entity_store_data_client.mock.ts | 1 + .../entity_store_data_client.test.ts | 138 + .../entity_store/entity_store_data_client.ts | 55 + .../entity_store/routes/entities/list.ts | 92 + .../routes/register_entity_store_routes.ts | 2 + .../entity_store/utils/utils.ts | 19 +- .../security_solution/server/plugin.ts | 25 +- .../plugins/security_solution/tsconfig.json | 2 +- .../spaces_grid/spaces_grid_page.test.tsx | 45 +- .../spaces_grid/spaces_grid_page.tsx | 2 +- .../schema/xpack_plugins.json | 9 + .../translations/translations/fr-FR.json | 18 - .../translations/translations/ja-JP.json | 18 - .../translations/translations/zh-CN.json | 18 - .../alerting_and_actions_telemetry.ts | 59 +- .../services/security_solution_api.gen.ts | 59 +- .../security_solution_exceptions_api.gen.ts | 55 +- .../apps/lens/group6/workspace_size.ts | 5 +- .../security_solution/entity_store/data.json | 85 + .../entity_store/mappings.json | 303 + .../tests/session_concurrent_limit/cleanup.ts | 11 + .../session_concurrent_limit/global_limit.ts | 11 + .../tests/session_invalidate/invalidate.ts | 11 + .../configs/ess.config.ts | 28 + .../configs/serverless.config.ts | 24 + .../entities_list.ts | 71 + .../trial_license_complete_tier/index.ts} | 11 +- .../common/alerting/summary_actions.ts | 10 +- .../shared/services/alerting_api.ts | 40 + yarn.lock | 217 +- 1328 files changed, 23347 insertions(+), 22578 deletions(-) create mode 100644 api_docs/kbn_core_feature_flags_browser.devdocs.json create mode 100644 api_docs/kbn_core_feature_flags_browser.mdx create mode 100644 api_docs/kbn_core_feature_flags_browser_internal.devdocs.json create mode 100644 api_docs/kbn_core_feature_flags_browser_internal.mdx create mode 100644 api_docs/kbn_core_feature_flags_browser_mocks.devdocs.json create mode 100644 api_docs/kbn_core_feature_flags_browser_mocks.mdx create mode 100644 api_docs/kbn_core_feature_flags_server.devdocs.json create mode 100644 api_docs/kbn_core_feature_flags_server.mdx create mode 100644 api_docs/kbn_core_feature_flags_server_internal.devdocs.json create mode 100644 api_docs/kbn_core_feature_flags_server_internal.mdx create mode 100644 api_docs/kbn_core_feature_flags_server_mocks.devdocs.json create mode 100644 api_docs/kbn_core_feature_flags_server_mocks.mdx create mode 100755 examples/feature_flags_example/README.md create mode 100644 examples/feature_flags_example/common/feature_flags.ts create mode 100644 examples/feature_flags_example/common/index.ts create mode 100644 examples/feature_flags_example/kibana.jsonc create mode 100644 examples/feature_flags_example/public/application.tsx create mode 100644 examples/feature_flags_example/public/components/app.tsx rename packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts => examples/feature_flags_example/public/index.ts (60%) create mode 100644 examples/feature_flags_example/public/plugin.ts create mode 100644 examples/feature_flags_example/public/types.ts create mode 100644 examples/feature_flags_example/server/index.ts create mode 100644 examples/feature_flags_example/server/plugin.ts create mode 100644 examples/feature_flags_example/server/routes/index.ts create mode 100644 examples/feature_flags_example/tsconfig.json create mode 100644 packages/core/feature-flags/README.mdx create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/README.md create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/index.ts create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/jest.config.js create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/package.json create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts create mode 100644 packages/core/feature-flags/core-feature-flags-browser-internal/tsconfig.json create mode 100644 packages/core/feature-flags/core-feature-flags-browser-mocks/README.md create mode 100644 packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts create mode 100644 packages/core/feature-flags/core-feature-flags-browser-mocks/jest.config.js create mode 100644 packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc create mode 100644 packages/core/feature-flags/core-feature-flags-browser-mocks/package.json create mode 100644 packages/core/feature-flags/core-feature-flags-browser-mocks/tsconfig.json create mode 100644 packages/core/feature-flags/core-feature-flags-browser/README.md create mode 100644 packages/core/feature-flags/core-feature-flags-browser/index.ts create mode 100644 packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc create mode 100644 packages/core/feature-flags/core-feature-flags-browser/package.json create mode 100644 packages/core/feature-flags/core-feature-flags-browser/src/types.ts create mode 100644 packages/core/feature-flags/core-feature-flags-browser/tsconfig.json create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/README.md create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/index.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/jest.config.js create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/package.json create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_request_handler_context.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.test.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server-internal/tsconfig.json create mode 100644 packages/core/feature-flags/core-feature-flags-server-mocks/README.md create mode 100644 packages/core/feature-flags/core-feature-flags-server-mocks/index.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server-mocks/jest.config.js create mode 100644 packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc create mode 100644 packages/core/feature-flags/core-feature-flags-server-mocks/package.json create mode 100644 packages/core/feature-flags/core-feature-flags-server-mocks/tsconfig.json create mode 100644 packages/core/feature-flags/core-feature-flags-server/README.md create mode 100644 packages/core/feature-flags/core-feature-flags-server/index.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server/kibana.jsonc create mode 100644 packages/core/feature-flags/core-feature-flags-server/package.json create mode 100644 packages/core/feature-flags/core-feature-flags-server/src/contracts.ts create mode 100644 packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts rename packages/{kbn-expandable-flyout/src/hooks/use_window_size.ts => core/feature-flags/core-feature-flags-server/src/request_handler_context.ts} (51%) create mode 100644 packages/core/feature-flags/core-feature-flags-server/tsconfig.json create mode 100644 packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.sort.test.ts create mode 100644 packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.test.ts create mode 100644 packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts create mode 100644 packages/kbn-expandable-flyout/src/components/container.test.tsx create mode 100644 packages/kbn-expandable-flyout/src/components/container.tsx create mode 100644 packages/kbn-expandable-flyout/src/components/resizable_container.test.tsx create mode 100644 packages/kbn-expandable-flyout/src/components/resizable_container.tsx create mode 100644 packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx create mode 100644 packages/kbn-expandable-flyout/src/hooks/use_sections.ts delete mode 100644 packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts delete mode 100644 packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts create mode 100644 packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts create mode 100644 packages/kbn-expandable-flyout/src/hooks/use_window_width.ts create mode 100644 x-pack/packages/observability/observability_utils/es/utils/esql_result_to_plain_objects.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.test.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.ts delete mode 100755 x-pack/plugins/cloud_integrations/cloud_experiments/common/index.ts create mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/initialize_metadata.ts create mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/remove_undefined.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/common/mocks.ts delete mode 100755 x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/index.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.mock.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/index.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.mock.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.ts delete mode 100644 x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/mocks.ts create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.test.ts create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.ts rename x-pack/plugins/ml/{public/application/explorer => common}/__mocks__/mock_anomalies_table_data.json (97%) create mode 100644 x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data_multiple_detectors.json create mode 100644 x-pack/plugins/ml/common/util/anomalies_table_utils.test.ts create mode 100644 x-pack/plugins/ml/common/util/anomalies_table_utils.ts create mode 100644 x-pack/plugins/observability_solution/inventory/common/es_fields/entities.ts create mode 100644 x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx create mode 100644 x-pack/plugins/observability_solution/inventory/public/components/entities_grid/mock/entities_mock.ts delete mode 100644 x-pack/plugins/observability_solution/inventory/server/utils/with_apm_span.ts create mode 100644 x-pack/plugins/observability_solution/investigate_app/public/hooks/use_fetch_user_profiles.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/tags.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/empty_state/empty_state_error.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/use_infinite_scroll.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/not_found/not_found.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/screenshot_link.tsx delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/screenshot_ref.mock.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/spy_use_fetcher.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.test.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.test.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/types.ts rename x-pack/plugins/observability_solution/synthetics/server/common/{unzipt_project_code.ts => unzip_project_code.ts} (100%) delete mode 100644 x-pack/plugins/observability_solution/uptime/common/constants/data_filters.ts delete mode 100644 x-pack/plugins/observability_solution/uptime/common/field_names.ts delete mode 100644 x-pack/plugins/observability_solution/uptime/common/formatters/format_space_name.ts delete mode 100644 x-pack/plugins/observability_solution/uptime/common/formatters/index.ts delete mode 100644 x-pack/plugins/observability_solution/uptime/common/utils/t_enum.ts delete mode 100644 x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/spy_use_fetcher.ts create mode 100644 x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts create mode 100644 x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml create mode 100644 x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.gen.ts create mode 100644 x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.schema.yaml rename x-pack/plugins/{observability_solution/uptime/common/rules/status_rule.ts => security_solution/common/entity_analytics/entity_store/constants.ts} (52%) create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/common_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/custom_query_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/esql_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/machine_learning_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/new_terms_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/saved_query_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threat_match_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threshold_rule_field_readonly.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_install_button.tsx create mode 100644 x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/nl_to_esql_tool.ts create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/__snapshots__/entity_store_data_client.test.ts.snap create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/entities/list.ts create mode 100644 x-pack/test/functional/es_archives/security_solution/entity_store/data.json create mode 100644 x-pack/test/functional/es_archives/security_solution/entity_store/mappings.json create mode 100644 x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/ess.config.ts create mode 100644 x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/serverless.config.ts create mode 100644 x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entities_list.ts rename x-pack/{plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/get_title.ts => test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/index.ts} (50%) diff --git a/.buildkite/ftr_security_serverless_configs.yml b/.buildkite/ftr_security_serverless_configs.yml index 89ebb4aa12cd4..6d42c030b2d4f 100644 --- a/.buildkite/ftr_security_serverless_configs.yml +++ b/.buildkite/ftr_security_serverless_configs.yml @@ -81,6 +81,7 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/genai/knowledge_base/entries/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/basic_license_essentials_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/lists_and_exception_lists/exception_lists_items/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/lists_and_exception_lists/lists_items/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/explore/hosts/trial_license_complete_tier/configs/serverless.config.ts diff --git a/.buildkite/ftr_security_stateful_configs.yml b/.buildkite/ftr_security_stateful_configs.yml index 77a8c57029096..a2390fa2bd27f 100644 --- a/.buildkite/ftr_security_stateful_configs.yml +++ b/.buildkite/ftr_security_stateful_configs.yml @@ -62,6 +62,7 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/detections_response/user_roles/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/basic_license_essentials_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/lists_and_exception_lists/exception_lists_items/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/lists_and_exception_lists/lists_items/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/explore/hosts/trial_license_complete_tier/configs/ess.config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 76dccf659fb54..9284e5ba821f9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -183,6 +183,12 @@ packages/core/execution-context/core-execution-context-server-mocks @elastic/kib packages/core/fatal-errors/core-fatal-errors-browser @elastic/kibana-core packages/core/fatal-errors/core-fatal-errors-browser-internal @elastic/kibana-core packages/core/fatal-errors/core-fatal-errors-browser-mocks @elastic/kibana-core +packages/core/feature-flags/core-feature-flags-browser @elastic/kibana-core +packages/core/feature-flags/core-feature-flags-browser-internal @elastic/kibana-core +packages/core/feature-flags/core-feature-flags-browser-mocks @elastic/kibana-core +packages/core/feature-flags/core-feature-flags-server @elastic/kibana-core +packages/core/feature-flags/core-feature-flags-server-internal @elastic/kibana-core +packages/core/feature-flags/core-feature-flags-server-mocks @elastic/kibana-core test/plugin_functional/plugins/core_history_block @elastic/kibana-core packages/core/http/core-http-browser @elastic/kibana-core packages/core/http/core-http-browser-internal @elastic/kibana-core @@ -453,6 +459,7 @@ examples/expressions_explorer @elastic/kibana-visualizations src/plugins/expressions @elastic/kibana-visualizations packages/kbn-failed-test-reporter-cli @elastic/kibana-operations @elastic/appex-qa examples/feature_control_examples @elastic/kibana-security +examples/feature_flags_example @elastic/kibana-core x-pack/test/plugin_api_integration/plugins/feature_usage_test @elastic/kibana-security x-pack/plugins/features @elastic/kibana-core x-pack/test/functional_execution_context/plugins/alerts @elastic/kibana-core diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index fa76a733f2b6d..9ed71acfceac0 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-09-18 +date: 2024-09-19 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 9a46181de6b46..ed64fcdda776d 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-09-18 +date: 2024-09-19 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 cc6652e47ae99..d29944d472db0 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-09-18 +date: 2024-09-19 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 22bbb4ede5e08..ed11425824b38 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-09-18 +date: 2024-09-19 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 42478ec6eb029..53b27f764e367 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-09-18 +date: 2024-09-19 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 1231e63140773..77c919d900ac3 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-09-18 +date: 2024-09-19 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 9f4abd6788ba1..fbe0dfc66d6ec 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index ec3a16667e1c5..d08848dd3ab7b 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-09-18 +date: 2024-09-19 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 a08dd3494eee3..36448f1aff363 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-09-18 +date: 2024-09-19 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 74f682ccaf59a..14036c941eabb 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-09-18 +date: 2024-09-19 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 6971e0fccdc55..c488eb17c0a3f 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 866fc5adc3d80..3e369f1ce4704 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 308c257a9ab4d..c2037e08efc7c 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-09-18 +date: 2024-09-19 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 5e894decc24f8..206b59401defc 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-09-18 +date: 2024-09-19 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 da07ad7ee4404..5b0de299015b4 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-09-18 +date: 2024-09-19 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 b643c3efcb601..c15e48e575fe6 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-09-18 +date: 2024-09-19 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 94e834f1d10db..35d1c012733e3 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-09-18 +date: 2024-09-19 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 79e1ea56e0e86..ca7a6fb27ba72 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index ffaa25609e25e..30c7f2faa1d34 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-09-18 +date: 2024-09-19 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 9653a88cedf01..c6ecf88f3dc93 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index d74b5b5f74b54..9bce02e76e9f8 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index e6d4251d49fca..0b99232ddb3a6 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 2e140b502998c..0d10393c7ac44 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-09-18 +date: 2024-09-19 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 7c78b3bf84759..bb1116e215251 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 53a6f24e9b64c..8b715935d85d9 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-09-18 +date: 2024-09-19 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 f65e3a5c66493..2e3fd844ea627 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 4e30005f54eab..b0d223ed36891 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-09-18 +date: 2024-09-19 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 b6330b23d85c7..ac615ba564f2d 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-09-18 +date: 2024-09-19 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 fa3416438cc72..365e29e4de7d1 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index c4cb53186c59a..5ce3d1e7d3a65 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-09-18 +date: 2024-09-19 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 169c32ff979a5..78bc2a29e4761 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-09-18 +date: 2024-09-19 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 a320c32c52866..0819ed916e673 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-09-18 +date: 2024-09-19 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 851baa17b11f4..a70b90b8c5440 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -32,14 +32,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core, visualizations, triggersActionsUi | - | | | ruleRegistry, securitySolution, slo | - | | | security, actions, alerting, ruleRegistry, files, cases, fleet, securitySolution | - | -| | securitySolution, cloudChat, observabilityOnboarding | - | | | alerting, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | alerting, securitySolution | - | | | securitySolution | - | -| | cloudDefend, osquery, securitySolution, synthetics | - | -| | cloudDefend, osquery, securitySolution, synthetics | - | +| | cloudDefend, securitySolution, synthetics | - | +| | cloudDefend, securitySolution, synthetics | - | | | cases, securitySolution, security | - | | | @kbn/securitysolution-data-table, securitySolution | - | | | @kbn/securitysolution-data-table, securitySolution | - | @@ -67,8 +66,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | @kbn/monaco, securitySolution | - | | | cloudSecurityPosture, securitySolution | - | -| | cloudChat | - | -| | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | | | alerting, observabilityAIAssistant, fleet, cloudSecurityPosture, entityManager, serverlessSearch, transform, upgradeAssistant, apm, synthetics, security | - | | | actions, alerting | - | | | monitoring | - | @@ -147,6 +144,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | canvas | - | | | enterpriseSearch | - | +| | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | | | embeddableEnhanced | - | | | embeddableEnhanced | - | | | uiActionsEnhanced | - | @@ -205,7 +203,6 @@ Safe to remove. | | alerting | | | alerting | | | alerting | -| | cloudExperiments | | | data | | | data | | | data | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index ba63b5f0cd056..59fda57ae680d 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -375,7 +375,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode) | - | +| | [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode) | - | @@ -583,15 +583,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## cloudChat - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=CloudExperimentsPluginStart), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=CloudExperimentsPluginStart) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=getVariation), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=getVariation) | - | - - - ## cloudDefend | Deprecated API | Reference location(s) | Remove By | @@ -1145,7 +1136,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts#:~:text=CloudExperimentsPluginStart), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts#:~:text=CloudExperimentsPluginStart) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/server/plugin.ts#:~:text=legacy) | - | @@ -1165,8 +1155,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion) | - | | | [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion) | - | | | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatternId), [view_results_in_discover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/discover/view_results_in_discover.tsx#:~:text=indexPatternId), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=indexPatternId) | - | -| | [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id) | - | -| | [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id), [osquery_managed_policy_create_import_extension.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx#:~:text=policy_id) | - | | | [create_action_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts#:~:text=license%24) | 8.8.0 | | | [add_to_timeline_button.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/timelines/add_to_timeline_button.tsx#:~:text=getHoverActions) | - | | | [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion) | - | @@ -1354,7 +1342,6 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=alertFactory) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/types.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/types.ts#:~:text=CloudExperimentsPluginStart) | - | | | [wrap_search_source_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.ts#:~:text=create) | - | | | [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch) | - | | | [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion)+ 12 more | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index f6fd926d720a3..bcb2a7dfb8bce 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index a78c51504fd88..9a6ca17e5097b 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 0aaa377835179..2956e3c1fff47 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-09-18 +date: 2024-09-19 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 799b1f2f7b04b..5051d5eec9715 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-09-18 +date: 2024-09-19 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 b0de7a96a7991..669f55d105fd7 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-09-18 +date: 2024-09-19 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 bf6bd7c7a6672..4400f84cd4176 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-09-18 +date: 2024-09-19 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 dc7a18796d77d..8c059454eed28 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -209,6 +209,27 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.inference", + "type": "Object", + "tags": [], + "label": "inference", + "description": [], + "signature": [ + { + "pluginId": "inference", + "scope": "server", + "docId": "kibInferencePluginApi", + "section": "def-server.InferenceServerStart", + "text": "InferenceServerStart" + }, + " | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "elasticAssistant", "id": "def-server.AssistantToolParams.isEnabledKnowledgeBase", @@ -220,6 +241,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.AssistantToolParams.connectorId", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "elasticAssistant", "id": "def-server.AssistantToolParams.chain", @@ -1818,6 +1853,26 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStartDependencies.inference", + "type": "Object", + "tags": [], + "label": "inference", + "description": [], + "signature": [ + { + "pluginId": "inference", + "scope": "server", + "docId": "kibInferencePluginApi", + "section": "def-server.InferenceServerStart", + "text": "InferenceServerStart" + } + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "elasticAssistant", "id": "def-server.ElasticAssistantPluginStartDependencies.spaces", @@ -1958,6 +2013,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "elasticAssistant", + "id": "def-server.ElasticAssistantPluginStart.inference", + "type": "Object", + "tags": [], + "label": "inference", + "description": [ + "\nInference plugin start contract." + ], + "signature": [ + { + "pluginId": "inference", + "scope": "server", + "docId": "kibInferencePluginApi", + "section": "def-server.InferenceServerStart", + "text": "InferenceServerStart" + } + ], + "path": "x-pack/plugins/elastic_assistant/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "elasticAssistant", "id": "def-server.ElasticAssistantPluginStart.registerFeatures", diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 58270b814d621..9ac382f688ffa 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-09-18 +date: 2024-09-19 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 | |-------------------|-----------|------------------------|-----------------| -| 49 | 0 | 35 | 2 | +| 53 | 0 | 38 | 2 | ## Server diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 6584b208bd258..6a8ab26813525 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 9140d23fbbfae..c239b13ac36b8 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-09-18 +date: 2024-09-19 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 d3e7c3dfc9826..804c6f28dc0a5 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-09-18 +date: 2024-09-19 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 9d65858ad4886..8f021b66213fd 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-09-18 +date: 2024-09-19 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 8435830c1661b..98cca9fff6dc3 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 3b0ec1ffd2e21..2caaad0462184 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-09-18 +date: 2024-09-19 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 bb28c8c84c239..2cac616056835 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-09-18 +date: 2024-09-19 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 d3e4bd076e692..6dbe40028c309 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-09-18 +date: 2024-09-19 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 8599359553762..af2ca301e79b4 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-09-18 +date: 2024-09-19 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 060c98173d12d..c8dc68d4ded72 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-09-18 +date: 2024-09-19 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 c0491c1d33221..2e11f9022b774 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-09-18 +date: 2024-09-19 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 bd356cb665bea..3636b498eea6a 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-09-18 +date: 2024-09-19 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 ed6011650f2d9..67d93afe0b2bb 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-09-18 +date: 2024-09-19 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 25afcce15972c..f46305151ec05 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-09-18 +date: 2024-09-19 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 9ce20273592f7..5069c0da2c125 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-09-18 +date: 2024-09-19 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 4d2b955fff722..6b4dd9519d0dd 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-09-18 +date: 2024-09-19 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 e720ac86d32e6..006f57341b075 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-09-18 +date: 2024-09-19 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 89f4d145b8e7c..6ec96d011f44f 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-09-18 +date: 2024-09-19 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 71685134183d2..74a3b210fe6c9 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 936ec74eb6e51..b54fb51145dfd 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-09-18 +date: 2024-09-19 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 b91c58816f9b3..1441af154179a 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-09-18 +date: 2024-09-19 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 f1a2bd221e405..f8facbe84550d 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-09-18 +date: 2024-09-19 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 53c2c8d31c055..a74c7a9660bad 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-09-18 +date: 2024-09-19 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 097b95263bca4..f2f7b44975220 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-09-18 +date: 2024-09-19 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 d44e2623035f1..9cb109b5763ab 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-09-18 +date: 2024-09-19 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 3a0b9db7628e8..a03c685d602c0 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-09-18 +date: 2024-09-19 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 2d3ab44c2ece0..1f2b134b09902 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-09-18 +date: 2024-09-19 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 d83c2121e9b2f..f7fddce674289 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index b93096b491d77..9970f5cd7b2b3 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 0e2d5e4a11216..e2cb0dcee171a 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-09-18 +date: 2024-09-19 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 06476763fcf0d..40f4da577b3bd 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-09-18 +date: 2024-09-19 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 6ff9491e98ba4..ec31b8f803a34 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-09-18 +date: 2024-09-19 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 22adfe94c460e..532df3d04b95d 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 75ea32fc11c90..0e40a7c831668 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -1508,42 +1508,6 @@ "plugin": "cloudDefend", "path": "x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts" }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" @@ -1697,7 +1661,7 @@ "label": "elasticsearch", "description": [], "signature": [ - "{ privileges?: { cluster?: string[] | undefined; } | undefined; } | undefined" + "{ [key: string]: any; privileges?: { cluster?: string[] | undefined; } | undefined; } | undefined" ], "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", "deprecated": false, @@ -2950,7 +2914,7 @@ "section": "def-common.PackagePolicyConfigRecord", "text": "PackagePolicyConfigRecord" }, - " | undefined; elasticsearch?: { privileges?: { cluster?: string[] | undefined; } | undefined; } | undefined; overrides?: { inputs?: { [key: string]: any; } | undefined; } | null | undefined; }" + " | undefined; elasticsearch?: { [key: string]: any; privileges?: { cluster?: string[] | undefined; } | undefined; } | undefined; overrides?: { inputs?: { [key: string]: any; } | undefined; } | null | undefined; }" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -22069,7 +22033,7 @@ "label": "data_stream", "description": [], "signature": [ - "{ dataset: string; type: string; }" + "{ dataset: string; type?: string | undefined; }" ], "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", "deprecated": false, @@ -23839,42 +23803,6 @@ "plugin": "cloudDefend", "path": "x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts" }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" @@ -24028,7 +23956,7 @@ "label": "elasticsearch", "description": [], "signature": [ - "{ privileges?: { cluster?: string[] | undefined; } | undefined; } | undefined" + "{ [key: string]: any; privileges?: { cluster?: string[] | undefined; } | undefined; } | undefined" ], "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index e640e329a116f..963c29aeeaf2f 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-09-18 +date: 2024-09-19 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 96b315d3f0359..6c7502c23834e 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-09-18 +date: 2024-09-19 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 0e80e2cff68a0..27101147b048b 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-09-18 +date: 2024-09-19 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 7f1310f09f901..a595d8e442cdd 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-09-18 +date: 2024-09-19 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 38915d16cfc65..5e4060262a598 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-09-18 +date: 2024-09-19 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 a3e2168cf6cd0..1748ad11a6634 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index c9c1d98ae6e6e..3ba25d341191f 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-09-18 +date: 2024-09-19 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 447843126b9b9..4fbbd82c175f9 100644 --- a/api_docs/inference.devdocs.json +++ b/api_docs/inference.devdocs.json @@ -74,7 +74,9 @@ "section": "def-common.Message", "text": "Message" }, - "[]; } & TToolOptions) => ", + "[]; functionCalling?: ", + "FunctionCallingMode", + " | undefined; } & TToolOptions) => ", "ChatCompletionResponse", "" ], @@ -99,7 +101,9 @@ "section": "def-common.Message", "text": "Message" }, - "[]; } & TToolOptions" + "[]; functionCalling?: ", + "FunctionCallingMode", + " | undefined; } & TToolOptions" ], "path": "x-pack/plugins/inference/common/chat_complete/index.ts", "deprecated": false, @@ -123,7 +127,9 @@ "section": "def-common.Message", "text": "Message" }, - "[] | undefined; }) => ", + "[] | undefined; functionCalling?: ", + "FunctionCallingMode", + " | undefined; }) => ", "Observable", "<", "OutputEvent", @@ -166,7 +172,9 @@ "section": "def-common.Message", "text": "Message" }, - "[] | undefined; }" + "[] | undefined; functionCalling?: ", + "FunctionCallingMode", + " | undefined; }" ], "path": "x-pack/plugins/inference/common/output/index.ts", "deprecated": false, @@ -208,7 +216,7 @@ "label": "naturalLanguageToEsql", "description": [], "signature": [ - "({\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n ...rest\n}: ", + "({\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n functionCalling,\n ...rest\n}: ", "NlToEsqlTaskParams", ") => ", "Observable", @@ -225,7 +233,7 @@ "id": "def-server.naturalLanguageToEsql.$1", "type": "CompoundType", "tags": [], - "label": "{\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n ...rest\n}", + "label": "{\n client,\n connectorId,\n tools,\n toolChoice,\n logger,\n functionCalling,\n ...rest\n}", "description": [], "signature": [ "NlToEsqlTaskParams", @@ -338,7 +346,9 @@ "section": "def-common.Message", "text": "Message" }, - "[]; } & TToolOptions) => ", + "[]; functionCalling?: ", + "FunctionCallingMode", + " | undefined; } & TToolOptions) => ", "ChatCompletionResponse", "" ], @@ -363,7 +373,9 @@ "section": "def-common.Message", "text": "Message" }, - "[]; } & TToolOptions" + "[]; functionCalling?: ", + "FunctionCallingMode", + " | undefined; } & TToolOptions" ], "path": "x-pack/plugins/inference/common/chat_complete/index.ts", "deprecated": false, @@ -389,7 +401,9 @@ "section": "def-common.Message", "text": "Message" }, - "[] | undefined; }) => ", + "[] | undefined; functionCalling?: ", + "FunctionCallingMode", + " | undefined; }) => ", "Observable", "<", "OutputEvent", @@ -432,7 +446,9 @@ "section": "def-common.Message", "text": "Message" }, - "[] | undefined; }" + "[] | undefined; functionCalling?: ", + "FunctionCallingMode", + " | undefined; }" ], "path": "x-pack/plugins/inference/common/output/index.ts", "deprecated": false, diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 8919f15cbcaa6..66181618d8318 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.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 | |-------------------|-----------|------------------------|-----------------| -| 49 | 0 | 44 | 14 | +| 49 | 0 | 44 | 15 | ## Client diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 7c66db0442b60..d642ad0f5d423 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-09-18 +date: 2024-09-19 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 d9f83e6868799..8337adbc6aae9 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-09-18 +date: 2024-09-19 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 7687d3c2ca2ee..df459d1759558 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.devdocs.json b/api_docs/integration_assistant.devdocs.json index 6955e1caf5cac..4592eea7603b6 100644 --- a/api_docs/integration_assistant.devdocs.json +++ b/api_docs/integration_assistant.devdocs.json @@ -161,7 +161,39 @@ "common": { "classes": [], "functions": [], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "integrationAssistant", + "id": "def-common.ESProcessorItem", + "type": "Interface", + "tags": [], + "label": "ESProcessorItem", + "description": [ + "\nProcessor item for the Elasticsearch processor." + ], + "path": "x-pack/plugins/integration_assistant/common/api/model/processor_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "integrationAssistant", + "id": "def-common.ESProcessorItem.Unnamed", + "type": "IndexSignature", + "tags": [], + "label": "[key: string]: ESProcessorOptions", + "description": [], + "signature": [ + "[key: string]: ", + "ESProcessorOptions" + ], + "path": "x-pack/plugins/integration_assistant/common/api/model/processor_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [ { @@ -186,7 +218,7 @@ "signature": [ "{ connectorId: string; packageName: string; dataStreamName: string; logSamples: string[]; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -209,7 +241,7 @@ }, "[] | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -240,7 +272,7 @@ }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/build_integration/build_integration.ts", + "path": "x-pack/plugins/integration_assistant/common/api/build_integration/build_integration.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -283,7 +315,7 @@ }, "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -314,7 +346,7 @@ }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -357,7 +389,7 @@ }, "[] | undefined; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.ts", + "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -372,7 +404,7 @@ "signature": [ "{ results: { docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.ts", + "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -405,7 +437,7 @@ }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -422,7 +454,7 @@ "signature": [ "Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -457,7 +489,7 @@ }, "[] | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -488,26 +520,7 @@ }, "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "integrationAssistant", - "id": "def-common.ESProcessorItem", - "type": "Type", - "tags": [], - "label": "ESProcessorItem", - "description": [ - "\nProcessor item for the Elasticsearch processor." - ], - "signature": [ - "{ [x: string]: ", - "ESProcessorOptions", - "; }" - ], - "path": "x-pack/plugins/integration_assistant/common/api/model/processor_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -524,7 +537,7 @@ "signature": [ "\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\"" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -557,7 +570,7 @@ }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -604,6 +617,23 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.LangSmithOptions", + "type": "Type", + "tags": [], + "label": "LangSmithOptions", + "description": [ + "\nThe LangSmith options object." + ], + "signature": [ + "{ apiKey: string; projectName: string; }" + ], + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "integrationAssistant", "id": "def-common.Pipeline", @@ -632,7 +662,7 @@ }, "[] | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -690,7 +720,7 @@ }, "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -721,7 +751,7 @@ }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -738,7 +768,24 @@ "signature": [ "{ name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.SamplesFormatName", + "type": "Type", + "tags": [], + "label": "SamplesFormatName", + "description": [ + "\nThe name of the log samples format." + ], + "signature": [ + "\"ndjson\" | \"json\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"" + ], + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -755,7 +802,7 @@ "signature": [ "Zod.ZodObject<{ packageName: Zod.ZodString; dataStreamName: Zod.ZodString; logSamples: Zod.ZodArray; connectorId: Zod.ZodString; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; dataStreamName: string; logSamples: string[]; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }, { connectorId: string; packageName: string; dataStreamName: string; logSamples: string[]; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -768,7 +815,7 @@ "label": "AnalyzeLogsResponse", "description": [], "signature": [ - "Zod.ZodObject<{ results: Zod.ZodObject<{ samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; parsedSamples: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }, { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }>; additionalProcessors: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { results: { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }; additionalProcessors?: ", + "ESProcessorItemInput", + ">, \"many\">>; results: Zod.ZodObject<{ samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; parsedSamples: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }, { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }>; }, \"strip\", Zod.ZodTypeAny, { results: { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }; additionalProcessors?: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -793,16 +834,10 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { results: { samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; parsedSamples: string[]; }; additionalProcessors?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/analyze_logs/analyze_logs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -824,13 +859,7 @@ "text": "ESProcessorItem" }, ", Zod.ZodTypeDef, ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", ">, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -864,21 +887,9 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", @@ -896,6 +907,10 @@ "text": "ESProcessorItem" }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -911,7 +926,11 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -927,7 +946,26 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }>" + ], + "path": "x-pack/plugins/integration_assistant/common/api/build_integration/build_integration.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.CategorizationRequestBody", + "type": "Object", + "tags": [], + "label": "CategorizationRequestBody", + "description": [], + "signature": [ + "Zod.ZodObject<{ packageName: Zod.ZodString; dataStreamName: Zod.ZodString; rawSamples: Zod.ZodArray; currentPipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + ", Zod.ZodTypeDef, ", + "ESProcessorItemInput", + ">, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -959,7 +1001,11 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }, { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }>; connectorId: Zod.ZodString; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -975,22 +1021,26 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }>" + "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/build_integration/build_integration.ts", + "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "integrationAssistant", - "id": "def-common.CategorizationRequestBody", + "id": "def-common.CategorizationResponse", "type": "Object", "tags": [], - "label": "CategorizationRequestBody", + "label": "CategorizationResponse", "description": [], "signature": [ - "Zod.ZodObject<{ packageName: Zod.ZodString; dataStreamName: Zod.ZodString; rawSamples: Zod.ZodArray; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; currentPipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -1039,22 +1077,10 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }>; connectorId: Zod.ZodString; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", + "ESProcessorItemInput", + "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1070,7 +1096,11 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }, { pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }>; }, \"strip\", Zod.ZodTypeAny, { results: { pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1086,22 +1116,26 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }>" + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }, { results: { pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "integrationAssistant", - "id": "def-common.CategorizationResponse", + "id": "def-common.CheckPipelineRequestBody", "type": "Object", "tags": [], - "label": "CategorizationResponse", + "label": "CheckPipelineRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ results: Zod.ZodObject<{ docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -1150,22 +1172,10 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { pipeline: { processors: ", + "ESProcessorItemInput", + "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1181,7 +1191,41 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }, { pipeline: { processors: ", + "[] | undefined; }; }, { rawSamples: string[]; pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; }>" + ], + "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.CheckPipelineResponse", + "type": "Object", + "tags": [], + "label": "CheckPipelineResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ results: Zod.ZodObject<{ docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }, { docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }>; }, \"strip\", Zod.ZodTypeAny, { results: { docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }, { results: { docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }>" + ], + "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.DataStream", + "type": "Object", + "tags": [], + "label": "DataStream", + "description": [], + "signature": [ + "Zod.ZodObject<{ name: Zod.ZodString; title: Zod.ZodString; description: Zod.ZodString; inputTypes: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional[]; }>; }, \"strip\", Zod.ZodTypeAny, { results: { pipeline: { processors: ", + ", Zod.ZodTypeDef, ", + "ESProcessorItemInput", + ">, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1213,7 +1261,11 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }, { results: { pipeline: { processors: ", + "[] | undefined; }, { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1229,246 +1281,13 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }>" + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "integrationAssistant", - "id": "def-common.CheckPipelineRequestBody", - "type": "Object", - "tags": [], - "label": "CheckPipelineRequestBody", - "description": [], - "signature": [ - "Zod.ZodObject<{ rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { rawSamples: string[]; pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }; }, { rawSamples: string[]; pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }; }>" - ], - "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "integrationAssistant", - "id": "def-common.CheckPipelineResponse", - "type": "Object", - "tags": [], - "label": "CheckPipelineResponse", - "description": [], - "signature": [ - "Zod.ZodObject<{ results: Zod.ZodObject<{ docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }, { docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }>; }, \"strip\", Zod.ZodTypeAny, { results: { docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }, { results: { docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }>" - ], - "path": "x-pack/plugins/integration_assistant/common/api/check_pipeline/check_pipeline.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "integrationAssistant", - "id": "def-common.DataStream", - "type": "Object", - "tags": [], - "label": "DataStream", - "description": [], - "signature": [ - "Zod.ZodObject<{ name: Zod.ZodString; title: Zod.ZodString; description: Zod.ZodString; inputTypes: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>" - ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1483,115 +1302,20 @@ "signature": [ "Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "integrationAssistant", - "id": "def-common.EcsMappingRequestBody", - "type": "Object", - "tags": [], - "label": "EcsMappingRequestBody", - "description": [], - "signature": [ - "Zod.ZodObject<{ packageName: Zod.ZodString; dataStreamName: Zod.ZodString; rawSamples: Zod.ZodArray; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; mapping: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>>; additionalProcessors: Zod.ZodOptional, \"many\">>; connectorId: Zod.ZodString; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; mapping?: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\"> | undefined; additionalProcessors?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; mapping?: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\"> | undefined; additionalProcessors?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }>" - ], - "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "integrationAssistant", - "id": "def-common.EcsMappingResponse", - "type": "Object", - "tags": [], - "label": "EcsMappingResponse", - "description": [], - "signature": [ - "Zod.ZodObject<{ results: Zod.ZodObject<{ mapping: Zod.ZodObject<{}, \"passthrough\", Zod.ZodTypeAny, Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }, { processors: ", + { + "parentPluginId": "integrationAssistant", + "id": "def-common.EcsMappingRequestBody", + "type": "Object", + "tags": [], + "label": "EcsMappingRequestBody", + "description": [], + "signature": [ + "Zod.ZodObject<{ packageName: Zod.ZodString; dataStreamName: Zod.ZodString; rawSamples: Zod.ZodArray; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; mapping: Zod.ZodOptional, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>>; additionalProcessors: Zod.ZodOptional, \"many\">>; connectorId: Zod.ZodString; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; mapping?: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\"> | undefined; additionalProcessors?: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1607,7 +1333,24 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { pipeline: { processors: ", + "[] | undefined; }, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; mapping?: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\"> | undefined; additionalProcessors?: ", + "ESProcessorItemInput", + "[] | undefined; }>" + ], + "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.EcsMappingResponse", + "type": "Object", + "tags": [], + "label": "EcsMappingResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ results: Zod.ZodObject<{ mapping: Zod.ZodObject<{}, \"passthrough\", Zod.ZodTypeAny, Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1639,7 +1386,11 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }>; }, \"strip\", Zod.ZodTypeAny, { results: { pipeline: { processors: ", + "[] | undefined; }, { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1655,7 +1406,11 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }; }, { results: { pipeline: { processors: ", + "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }, { pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", + "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }>; }, \"strip\", Zod.ZodTypeAny, { results: { pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1671,9 +1426,13 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, + "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }; }, { results: { pipeline: { processors: ", + "ESProcessorItemInput", + "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", + "ESProcessorItemInput", "[] | undefined; }; mapping: {} & { [k: string]: unknown; }; }; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1695,16 +1454,10 @@ "text": "ESProcessorItem" }, ", Zod.ZodTypeDef, ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", ">" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/processor_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/processor_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1719,7 +1472,7 @@ "signature": [ "Zod.ZodEnum<[\"aws-cloudwatch\", \"aws-s3\", \"azure-blob-storage\", \"azure-eventhub\", \"cel\", \"cloudfoundry\", \"filestream\", \"gcp-pubsub\", \"gcs\", \"http_endpoint\", \"journald\", \"kafka\", \"tcp\", \"udp\"]>" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1741,13 +1494,7 @@ "text": "ESProcessorItem" }, ", Zod.ZodTypeDef, ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", ">, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -1781,21 +1522,9 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", @@ -1813,21 +1542,9 @@ "text": "ESProcessorItem" }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", @@ -1845,24 +1562,27 @@ "text": "ESProcessorItem" }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.LangSmithOptions", + "type": "Object", + "tags": [], + "label": "LangSmithOptions", + "description": [], + "signature": [ + "Zod.ZodObject<{ projectName: Zod.ZodString; apiKey: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { apiKey: string; projectName: string; }, { apiKey: string; projectName: string; }>" + ], + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1884,13 +1604,7 @@ "text": "ESProcessorItem" }, ", Zod.ZodTypeDef, ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", ">, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -1924,24 +1632,12 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1954,7 +1650,7 @@ "label": "RelatedRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ packageName: Zod.ZodString; dataStreamName: Zod.ZodString; rawSamples: Zod.ZodArray; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; currentPipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray; currentPipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -2003,22 +1687,10 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, - "[] | undefined; }>; connectorId: Zod.ZodString; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", + "ESProcessorItemInput", + "[] | undefined; }>; connectorId: Zod.ZodString; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; langSmithOptions: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -2035,24 +1707,12 @@ "text": "ESProcessorItem" }, "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }, { connectorId: string; packageName: string; rawSamples: string[]; samplesFormat: { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; dataStreamName: string; currentPipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }; langSmithOptions?: { apiKey: string; projectName: string; } | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2074,13 +1734,7 @@ "text": "ESProcessorItem" }, ", Zod.ZodTypeDef, ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", ">, \"many\">; on_failure: Zod.ZodOptional, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { processors: ", { "pluginId": "integrationAssistant", @@ -2114,21 +1762,9 @@ "text": "ESProcessorItem" }, "[] | undefined; }, { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { pipeline: { processors: ", { "pluginId": "integrationAssistant", @@ -2146,21 +1782,9 @@ "text": "ESProcessorItem" }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }, { pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }>; }, \"strip\", Zod.ZodTypeAny, { results: { pipeline: { processors: ", { "pluginId": "integrationAssistant", @@ -2178,24 +1802,12 @@ "text": "ESProcessorItem" }, "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }, { results: { pipeline: { processors: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[]; version?: number | undefined; name?: string | undefined; description?: string | undefined; on_failure?: ", - { - "pluginId": "integrationAssistant", - "scope": "common", - "docId": "kibIntegrationAssistantPluginApi", - "section": "def-common.ESProcessorItem", - "text": "ESProcessorItem" - }, + "ESProcessorItemInput", "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; }; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.ts", + "path": "x-pack/plugins/integration_assistant/common/api/related/related_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2210,7 +1822,22 @@ "signature": [ "Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"unsupported\" | \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>" ], - "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "integrationAssistant", + "id": "def-common.SamplesFormatName", + "type": "Object", + "tags": [], + "label": "SamplesFormatName", + "description": [], + "signature": [ + "Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>" + ], + "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 1430b02b6e927..adaf5e32f9ff8 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-scalability](https://github.com/orgs/elastic/teams/se | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 54 | 0 | 46 | 3 | +| 59 | 0 | 49 | 4 | ## Client @@ -44,6 +44,9 @@ Contact [@elastic/security-scalability](https://github.com/orgs/elastic/teams/se ### Objects +### Interfaces + + ### Consts, variables and types diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index b1a1bc9238d66..965f1fd3eeb24 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-09-18 +date: 2024-09-19 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 710e010cbdaf5..d58433a956b01 100644 --- a/api_docs/inventory.devdocs.json +++ b/api_docs/inventory.devdocs.json @@ -58,7 +58,25 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/inventory/entities\", undefined, ", + "<\"GET /internal/inventory/entities\", ", + "TypeC", + "<{ query: ", + "IntersectionC", + "<[", + "TypeC", + "<{ sortField: ", + "StringC", + "; sortDirection: ", + "UnionC", + "<[", + "LiteralC", + "<\"asc\">, ", + "LiteralC", + "<\"desc\">]>; }>, ", + "PartialC", + "<{ entityTypes: ", + "Type", + "<(\"service\" | \"host\" | \"container\")[], string, unknown>; }>]>; }>, ", "InventoryRouteHandlerResources", ", { entities: ", "LatestEntity", diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index 0ff3c79570e4c..1204fab3fbabd 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-09-18 +date: 2024-09-19 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 54af813e6e4d0..ec3a333bf1607 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 6e21d52e6f096..b2432c9731006 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index a21d41cddbbaa..2cef4b004471c 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index f8f67df652477..783aeef6789a2 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index a7f2bc611c9bc..e7354eb95c96d 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-09-18 +date: 2024-09-19 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 b9eab520c206f..2bb0f94957c28 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-09-18 +date: 2024-09-19 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 33ab30c9839a5..9852f5677b23b 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-09-18 +date: 2024-09-19 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 65a443f0364e3..6f202edfacab7 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-09-18 +date: 2024-09-19 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 21455aedaeed0..675c7c5e4db24 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-09-18 +date: 2024-09-19 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 bd31fd8461012..abcb5caba8ea8 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-09-18 +date: 2024-09-19 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 6a6de2f35bbe7..4742e50f6e00d 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-09-18 +date: 2024-09-19 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 f29c35fa37b50..6a9fdc5235ab6 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 0ff6a68717aef..04fd3b9533b27 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 89171b66a9ae5..7c9340bf0f6d9 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-09-18 +date: 2024-09-19 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 e667e5c7dc7a3..da8e66fde28b0 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-09-18 +date: 2024-09-19 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 eeaa17fcb00f4..4d9eee6838a6a 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 0426221a8f4fa..b2bf5bc09149f 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-09-18 +date: 2024-09-19 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 db05cf0c3006b..213476c2289f4 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-09-18 +date: 2024-09-19 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 7924c944f5f88..4aec2fc7a6ab7 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 1c24fa92ba4d7..95e0d9d7dc2e9 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-09-18 +date: 2024-09-19 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 7977a39649583..4137326507734 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-09-18 +date: 2024-09-19 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 f48a0cf72e970..8a8ae8d215191 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 2f1f7375d70a0..9b6c7093e3ba7 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-09-18 +date: 2024-09-19 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 095b28c5dd6d9..f9223489c42a5 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-09-18 +date: 2024-09-19 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 3e742c834b65d..98d1b165e9ff8 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-09-18 +date: 2024-09-19 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 0c361f1c7f232..588c903d7579d 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-09-18 +date: 2024-09-19 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 b6ac2550d9eb9..6754c37c58916 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-09-18 +date: 2024-09-19 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 4322726a86cc7..fb97731bf3e29 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-09-18 +date: 2024-09-19 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 7ff48da035e81..6dd30ff4a078f 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-09-18 +date: 2024-09-19 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 3d4f0d210da26..476ee7fd63c5c 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-09-18 +date: 2024-09-19 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 290d738d46ff3..3b21310b02e98 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-09-18 +date: 2024-09-19 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 73f05971b21f4..ead1c5f59e11a 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-09-18 +date: 2024-09-19 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 9f368f7e1de58..200a7d481f060 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-09-18 +date: 2024-09-19 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 b86353cdfc8d7..4d54a9dea3bac 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-09-18 +date: 2024-09-19 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 b59bdba03c3ab..f1a36dea79537 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-09-18 +date: 2024-09-19 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 6eccd1a966aaa..7c5481c3e699b 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-09-18 +date: 2024-09-19 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 48aaaecc1b1fe..6a3e05c3ea4cc 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-09-18 +date: 2024-09-19 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 fccf616cf2d60..7334cb8826fa7 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 1ccd7e675ee34..3f024fe6002c0 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-09-18 +date: 2024-09-19 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 7f5187eb92ac2..5fcccb2c79a57 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index cfd8455018706..d5d85aa90baa2 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 7f8f3c4576f9d..a97d123a5c655 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index c3ab61ef6875c..316f68651ad0e 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-09-18 +date: 2024-09-19 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 872213422102d..eff871690ddcb 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 302c8476004bc..fb0de4bf1a57a 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-09-18 +date: 2024-09-19 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 65040e0357e83..e251986021604 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-09-18 +date: 2024-09-19 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 dd6d660e795c8..14e5040833d45 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-09-18 +date: 2024-09-19 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 652d35164c6c8..b13f823d9baa1 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 06499b5edd6fc..181459e4b9f89 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-09-18 +date: 2024-09-19 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 396a90ead15fc..031601f15e157 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-09-18 +date: 2024-09-19 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 431a0ff3e01df..a3f34cfe9f32b 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-09-18 +date: 2024-09-19 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 637544bd22c10..71ff10f2487b2 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-09-18 +date: 2024-09-19 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 f6d8df86370ef..20063a8e6fc8f 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-09-18 +date: 2024-09-19 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 7bc1b5388e40b..b6ca456166c8b 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-09-18 +date: 2024-09-19 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 7c32bea3975bd..c66cf7b6c02f7 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-09-18 +date: 2024-09-19 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 43b712fd3f0ee..bac450f0a6adc 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 93d0264947e6e..7a1b68c7962d2 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 a2b0622b26029..cb5d8d997202e 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 c5ec7616e41f2..5e7b27d425a17 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index c60f285e56de9..4acd9706c8dc7 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-09-18 +date: 2024-09-19 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 d741714d001b0..2a39947efb85d 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 dee8c9ad52b97..84cddad68307a 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index f1e11716e12c8..6d01e985756c2 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 57ea0cca6acce..b1e90a921ee2e 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 bf7d3e031f5a2..ea52f7ac98ac5 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 076d769da248a..7592d46c44d91 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-09-18 +date: 2024-09-19 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 6c5034400a48e..4517d56c2cae8 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 d89774ab719f1..ac780c469f578 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 f6401c61dd6c2..259acec5dbf7d 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 90ac342e15875..377361544894d 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 82830bb7aff6e..1f48fa8edd8e4 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-09-18 +date: 2024-09-19 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 c708934989d0e..650218656579e 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 a0847a5a4c6bc..1eda1d4eb249f 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 1d5f622c53ccc..198be3abd86c0 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 c894465e4fa17..4aa6567baad3c 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-09-18 +date: 2024-09-19 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 d7b216ceed5fc..c950f1b7a7191 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-09-18 +date: 2024-09-19 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 3f239d1e655e1..3f238d298c2a1 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index f66b6baf4e4ec..947e0b5b92e53 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -2732,23 +2732,19 @@ }, { "parentPluginId": "@kbn/core-chrome-browser", - "id": "def-public.ChromeStart.getIsSideNavCollapsed$", - "type": "Function", + "id": "def-public.ChromeStart.sideNav", + "type": "Object", "tags": [], - "label": "getIsSideNavCollapsed$", - "description": [ - "\nGet an observable of the current collapsed state of the side nav." - ], + "label": "sideNav", + "description": [], "signature": [ - "() => ", + "{ getIsCollapsed$(): ", "Observable", - "" + "; setIsCollapsed(isCollapsed: boolean): void; }" ], "path": "packages/core/chrome/core-chrome-browser/src/contracts.ts", "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] + "trackAdoption": false }, { "parentPluginId": "@kbn/core-chrome-browser", diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 53497777411f1..22ed0d01a4ef8 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 207 | 0 | 100 | 0 | +| 207 | 0 | 101 | 0 | ## Client diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 887808e5cf11d..958672b179546 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 54f4083dd9246..958990ac4bb65 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 a8623170f0021..962a02901fff0 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 9560c5ac7fa34..e93c3ad050de8 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 7b7211f3a9fe1..75c036a31bf71 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 168340fad377d..885e6d9b699ca 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-09-18 +date: 2024-09-19 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 ba7caa1956fe6..8378a47454f06 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-09-18 +date: 2024-09-19 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 3c697de25d653..029a69b1f9482 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 e66bde1e3e9c1..3faea73eb0892 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 d4cf878da2ba1..95eeca208f028 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 6d0474e6e892a..8809e0da44586 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 a50d7560663bf..19eba63961e04 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 3118573731043..7138342511f2a 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-09-18 +date: 2024-09-19 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 24cc69bc6c7a8..114981efe6fdc 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-09-18 +date: 2024-09-19 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 7fbbe149fa5fc..b1b8561068183 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 a5875999b6529..6c54d776d4b21 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 a95cf117eba20..6e21065e7b3f1 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 b0b193d60ebfb..30c99b193c122 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 83077b7e44653..0192b706a5ca9 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-09-18 +date: 2024-09-19 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 d513be0015faa..9770a40b94511 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 28c745a2badfc..bc9ff9d057401 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 7d255590d7221..7db92d21054cf 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 61d36c61184ca..f9e5b295184b1 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-09-18 +date: 2024-09-19 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 4b286e632dd7d..d9320e2f19a94 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 5548cb7c2c1ed..79aec8ee176e7 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 a8be4654441fe..27f5426494047 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 e41cf499067d0..bd87bab1c5b88 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 88dabf6c0b120..493bd0a27ad18 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 61f766240215c..a8a039c520a7c 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 9f50db810529c..2acbad65865e9 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 fe881a2204b80..1dc82cb47712e 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-09-18 +date: 2024-09-19 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 ee4ee7b68fb6b..5e61dae29dc51 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-09-18 +date: 2024-09-19 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 1263d8301b02e..9ac71c0ec0e1c 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 2a224f6d03d96..b85661f46ce6f 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 44f33c7885b76..36285c083458c 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 0086360c74cf6..7f6720c4cd315 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_core_feature_flags_browser.devdocs.json new file mode 100644 index 0000000000000..51162d3e750cb --- /dev/null +++ b/api_docs/kbn_core_feature_flags_browser.devdocs.json @@ -0,0 +1,596 @@ +{ + "id": "@kbn/core-feature-flags-browser", + "client": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsSetup", + "type": "Interface", + "tags": [], + "label": "FeatureFlagsSetup", + "description": [ + "\nSetup contract of the Feature Flags Service" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsSetup.setProvider", + "type": "Function", + "tags": [], + "label": "setProvider", + "description": [ + "\nRegisters an OpenFeature provider to talk to the\n3rd-party service that manages the Feature Flags." + ], + "signature": [ + "(provider: ", + "Provider", + ") => void" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsSetup.setProvider.$1", + "type": "Object", + "tags": [], + "label": "provider", + "description": [ + "The {@link Provider | OpenFeature Provider} to handle the communication with the feature flags management system." + ], + "signature": [ + "Provider" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsSetup.appendContext", + "type": "Function", + "tags": [], + "label": "appendContext", + "description": [ + "\nAppends new keys to the evaluation context." + ], + "signature": [ + "(contextToAppend: ", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.EvaluationContext", + "text": "EvaluationContext" + }, + ") => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsSetup.appendContext.$1", + "type": "CompoundType", + "tags": [], + "label": "contextToAppend", + "description": [ + "The additional keys that should be appended/modified in the evaluation context." + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.EvaluationContext", + "text": "EvaluationContext" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart", + "type": "Interface", + "tags": [], + "label": "FeatureFlagsStart", + "description": [ + "\nSetup contract of the Feature Flags Service" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.appendContext", + "type": "Function", + "tags": [], + "label": "appendContext", + "description": [ + "\nAppends new keys to the evaluation context." + ], + "signature": [ + "(contextToAppend: ", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.EvaluationContext", + "text": "EvaluationContext" + }, + ") => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.appendContext.$1", + "type": "CompoundType", + "tags": [], + "label": "contextToAppend", + "description": [ + "The additional keys that should be appended/modified in the evaluation context." + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.EvaluationContext", + "text": "EvaluationContext" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getBooleanValue", + "type": "Function", + "tags": [], + "label": "getBooleanValue", + "description": [ + "\nEvaluates a boolean flag" + ], + "signature": [ + "(flagName: string, fallbackValue: boolean) => boolean" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getBooleanValue.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getBooleanValue.$2", + "type": "boolean", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "boolean" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getStringValue", + "type": "Function", + "tags": [], + "label": "getStringValue", + "description": [ + "\nEvaluates a string flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getStringValue.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getStringValue.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getNumberValue", + "type": "Function", + "tags": [], + "label": "getNumberValue", + "description": [ + "\nEvaluates a number flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getNumberValue.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getNumberValue.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getBooleanValue$", + "type": "Function", + "tags": [], + "label": "getBooleanValue$", + "description": [ + "\nReturns an observable of a boolean flag" + ], + "signature": [ + "(flagName: string, fallbackValue: boolean) => ", + "Observable", + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getBooleanValue$.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getBooleanValue$.$2", + "type": "boolean", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "boolean" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getStringValue$", + "type": "Function", + "tags": [], + "label": "getStringValue$", + "description": [ + "\nReturns an observable of a string flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => ", + "Observable", + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getStringValue$.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getStringValue$.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getNumberValue$", + "type": "Function", + "tags": [], + "label": "getNumberValue$", + "description": [ + "\nReturns an observable of a number flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => ", + "Observable", + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getNumberValue$.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.FeatureFlagsStart.getNumberValue$.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.EvaluationContext", + "type": "Type", + "tags": [], + "label": "EvaluationContext", + "description": [ + "\nThe evaluation context to use when retrieving the flags.\n\nWe use multi-context so that we can apply segmentation rules at different levels (`organization`/`kibana`).\n* `organization` includes any information that is common to all the projects/deployments in an organization. An example is the in_trial status.\n* The `kibana` context includes all the information that identifies a project/deployment. Examples are version, offering, and has_data.\nKind helps us specify which sub-context should receive the new attributes.\nIf no `kind` is provided, it defaults to `kibana`.\n" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.MultiContextEvaluationContext", + "text": "MultiContextEvaluationContext" + }, + " | ", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.SingleContextEvaluationContext", + "text": "SingleContextEvaluationContext" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.MultiContextEvaluationContext", + "type": "Type", + "tags": [], + "label": "MultiContextEvaluationContext", + "description": [ + "\nMulti-context format. The sub-contexts are provided in their nested properties." + ], + "signature": [ + "{ targetingKey?: string | undefined; } & Record & { kind: \"multi\"; organization?: ", + "EvaluationContext", + " | undefined; kibana?: ", + "EvaluationContext", + " | undefined; }" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser", + "id": "def-public.SingleContextEvaluationContext", + "type": "Type", + "tags": [], + "label": "SingleContextEvaluationContext", + "description": [ + "\nSingle Context format. If `kind` is not specified, it applies to the `kibana` sub-context." + ], + "signature": [ + "{ targetingKey?: string | undefined; } & Record & { kind?: \"kibana\" | \"organization\" | undefined; }" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx new file mode 100644 index 0000000000000..721f50f22c842 --- /dev/null +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -0,0 +1,33 @@ +--- +#### +#### 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: kibKbnCoreFeatureFlagsBrowserPluginApi +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-09-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] +--- +import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.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 | +|-------------------|-----------|------------------------|-----------------| +| 29 | 0 | 0 | 0 | + +## Client + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_core_feature_flags_browser_internal.devdocs.json b/api_docs/kbn_core_feature_flags_browser_internal.devdocs.json new file mode 100644 index 0000000000000..690abce26781e --- /dev/null +++ b/api_docs/kbn_core_feature_flags_browser_internal.devdocs.json @@ -0,0 +1,218 @@ +{ + "id": "@kbn/core-feature-flags-browser-internal", + "client": { + "classes": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService", + "type": "Class", + "tags": [ + "private" + ], + "label": "FeatureFlagsService", + "description": [ + "\nThe browser-side Feature Flags Service" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [ + "\nThe core service's constructor" + ], + "signature": [ + "any" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "core", + "description": [ + "{@link CoreContext }" + ], + "signature": [ + "CoreContext" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService.setup", + "type": "Function", + "tags": [], + "label": "setup", + "description": [ + "\nSetup lifecycle method" + ], + "signature": [ + "(deps: ", + { + "pluginId": "@kbn/core-feature-flags-browser-internal", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserInternalPluginApi", + "section": "def-public.FeatureFlagsSetupDeps", + "text": "FeatureFlagsSetupDeps" + }, + ") => ", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService.setup.$1", + "type": "Object", + "tags": [], + "label": "deps", + "description": [ + "{@link FeatureFlagsSetup } including the {@link InternalInjectedMetadataSetup } used to retrieve the feature flags." + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-browser-internal", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserInternalPluginApi", + "section": "def-public.FeatureFlagsSetupDeps", + "text": "FeatureFlagsSetupDeps" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [ + "\nStart lifecycle method" + ], + "signature": [ + "() => Promise<", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsService.stop", + "type": "Function", + "tags": [], + "label": "stop", + "description": [ + "\nStop lifecycle method" + ], + "signature": [ + "() => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsSetupDeps", + "type": "Interface", + "tags": [ + "private" + ], + "label": "FeatureFlagsSetupDeps", + "description": [ + "\nsetup method dependencies" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-internal", + "id": "def-public.FeatureFlagsSetupDeps.injectedMetadata", + "type": "Object", + "tags": [], + "label": "injectedMetadata", + "description": [ + "\nUsed to read the flag overrides set up in the configuration file." + ], + "signature": [ + "InternalInjectedMetadataSetup" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx new file mode 100644 index 0000000000000..4adc3c21c248c --- /dev/null +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -0,0 +1,33 @@ +--- +#### +#### 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: kibKbnCoreFeatureFlagsBrowserInternalPluginApi +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-09-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] +--- +import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.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 | +|-------------------|-----------|------------------------|-----------------| +| 9 | 0 | 0 | 0 | + +## Client + +### Classes + + +### Interfaces + + diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.devdocs.json b/api_docs/kbn_core_feature_flags_browser_mocks.devdocs.json new file mode 100644 index 0000000000000..1b445ec5e4c08 --- /dev/null +++ b/api_docs/kbn_core_feature_flags_browser_mocks.devdocs.json @@ -0,0 +1,130 @@ +{ + "id": "@kbn/core-feature-flags-browser-mocks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-mocks", + "id": "def-public.coreFeatureFlagsMock", + "type": "Object", + "tags": [], + "label": "coreFeatureFlagsMock", + "description": [ + "\nMocks for the Feature Flags service (browser-side)" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-browser-mocks", + "id": "def-public.coreFeatureFlagsMock.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [ + "/**\n * Mocks the entire feature flags service\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.PublicMethodsOf", + "text": "PublicMethodsOf" + }, + "<", + { + "pluginId": "@kbn/core-feature-flags-browser-internal", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserInternalPluginApi", + "section": "def-public.FeatureFlagsService", + "text": "FeatureFlagsService" + }, + ">>" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser-mocks", + "id": "def-public.coreFeatureFlagsMock.createSetup", + "type": "Function", + "tags": [], + "label": "createSetup", + "description": [ + "/**\n * Mocks the setup contract\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-browser-mocks", + "id": "def-public.coreFeatureFlagsMock.createStart", + "type": "Function", + "tags": [], + "label": "createStart", + "description": [ + "/**\n * Mocks the start contract\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + } + ], + "initialIsOpen": false + } + ] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx new file mode 100644 index 0000000000000..4bf9e3aefedce --- /dev/null +++ b/api_docs/kbn_core_feature_flags_browser_mocks.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: kibKbnCoreFeatureFlagsBrowserMocksPluginApi +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-09-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] +--- +import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.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 | +|-------------------|-----------|------------------------|-----------------| +| 4 | 0 | 0 | 0 | + +## Client + +### Objects + + diff --git a/api_docs/kbn_core_feature_flags_server.devdocs.json b/api_docs/kbn_core_feature_flags_server.devdocs.json new file mode 100644 index 0000000000000..db13ba23e7eb5 --- /dev/null +++ b/api_docs/kbn_core_feature_flags_server.devdocs.json @@ -0,0 +1,770 @@ +{ + "id": "@kbn/core-feature-flags-server", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition", + "type": "Interface", + "tags": [], + "label": "FeatureFlagDefinition", + "description": [ + "\nDefinition of a feature flag" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagDefinition", + "text": "FeatureFlagDefinition" + }, + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition.key", + "type": "string", + "tags": [], + "label": "key", + "description": [ + "\nThe ID of the feature flag. Used to reference it when evaluating the flag." + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nHuman friendly name." + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition.description", + "type": "string", + "tags": [], + "label": "description", + "description": [ + "\nDescription of the purpose of the feature flag." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition.tags", + "type": "Array", + "tags": [], + "label": "tags", + "description": [ + "\nTags to apply to the feature flag for easier categorizing. It may include the plugin, the solution, the team." + ], + "signature": [ + "string[]" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition.variationType", + "type": "Uncategorized", + "tags": [], + "label": "variationType", + "description": [ + "\nThe type of the values returned by the feature flag (\"string\", \"boolean\", or \"number\")." + ], + "signature": [ + "ValueType" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinition.variations", + "type": "Array", + "tags": [], + "label": "variations", + "description": [ + "\nList of variations of the feature flags." + ], + "signature": [ + "{ name: string; description?: string | undefined; value: ValueType extends \"string\" ? string : ValueType extends \"boolean\" ? boolean : number; }[]" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsSetup", + "type": "Interface", + "tags": [], + "label": "FeatureFlagsSetup", + "description": [ + "\nSetup contract of the Feature Flags Service" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsSetup.setProvider", + "type": "Function", + "tags": [], + "label": "setProvider", + "description": [ + "\nRegisters an OpenFeature provider to talk to the\n3rd-party service that manages the Feature Flags." + ], + "signature": [ + "(provider: ", + "Provider", + ") => void" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsSetup.setProvider.$1", + "type": "Object", + "tags": [], + "label": "provider", + "description": [ + "The {@link Provider | OpenFeature Provider} to handle the communication with the feature flags management system." + ], + "signature": [ + "Provider" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsSetup.appendContext", + "type": "Function", + "tags": [], + "label": "appendContext", + "description": [ + "\nAppends new keys to the evaluation context." + ], + "signature": [ + "(contextToAppend: ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.EvaluationContext", + "text": "EvaluationContext" + }, + ") => void" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsSetup.appendContext.$1", + "type": "CompoundType", + "tags": [], + "label": "contextToAppend", + "description": [ + "The additional keys that should be appended/modified in the evaluation context." + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.EvaluationContext", + "text": "EvaluationContext" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart", + "type": "Interface", + "tags": [], + "label": "FeatureFlagsStart", + "description": [ + "\nSetup contract of the Feature Flags Service" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.appendContext", + "type": "Function", + "tags": [], + "label": "appendContext", + "description": [ + "\nAppends new keys to the evaluation context." + ], + "signature": [ + "(contextToAppend: ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.EvaluationContext", + "text": "EvaluationContext" + }, + ") => void" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.appendContext.$1", + "type": "CompoundType", + "tags": [], + "label": "contextToAppend", + "description": [ + "The additional keys that should be appended/modified in the evaluation context." + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.EvaluationContext", + "text": "EvaluationContext" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getBooleanValue", + "type": "Function", + "tags": [], + "label": "getBooleanValue", + "description": [ + "\nEvaluates a boolean flag" + ], + "signature": [ + "(flagName: string, fallbackValue: boolean) => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getBooleanValue.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getBooleanValue.$2", + "type": "boolean", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "boolean" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getStringValue", + "type": "Function", + "tags": [], + "label": "getStringValue", + "description": [ + "\nEvaluates a string flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getStringValue.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getStringValue.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getNumberValue", + "type": "Function", + "tags": [], + "label": "getNumberValue", + "description": [ + "\nEvaluates a number flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getNumberValue.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getNumberValue.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getBooleanValue$", + "type": "Function", + "tags": [], + "label": "getBooleanValue$", + "description": [ + "\nReturns an observable of a boolean flag" + ], + "signature": [ + "(flagName: string, fallbackValue: boolean) => ", + "Observable", + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getBooleanValue$.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getBooleanValue$.$2", + "type": "boolean", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "boolean" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getStringValue$", + "type": "Function", + "tags": [], + "label": "getStringValue$", + "description": [ + "\nReturns an observable of a string flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => ", + "Observable", + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getStringValue$.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getStringValue$.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getNumberValue$", + "type": "Function", + "tags": [], + "label": "getNumberValue$", + "description": [ + "\nReturns an observable of a number flag" + ], + "signature": [ + "(flagName: string, fallbackValue: Value) => ", + "Observable", + "" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getNumberValue$.$1", + "type": "string", + "tags": [], + "label": "flagName", + "description": [ + "The flag ID to evaluate" + ], + "signature": [ + "string" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsStart.getNumberValue$.$2", + "type": "Uncategorized", + "tags": [], + "label": "fallbackValue", + "description": [ + "If the flag cannot be evaluated for whatever reason, the fallback value is provided." + ], + "signature": [ + "Value" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.EvaluationContext", + "type": "Type", + "tags": [], + "label": "EvaluationContext", + "description": [ + "\nThe evaluation context to use when retrieving the flags.\n\nWe use multi-context so that we can apply segmentation rules at different levels (`organization`/`kibana`).\n* `organization` includes any information that is common to all the projects/deployments in an organization. An example is the in_trial status.\n* The `kibana` context includes all the information that identifies a project/deployment. Examples are version, offering, and has_data.\nKind helps us specify which sub-context should receive the new attributes.\nIf no `kind` is provided, it defaults to `kibana`.\n" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.MultiContextEvaluationContext", + "text": "MultiContextEvaluationContext" + }, + " | ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.SingleContextEvaluationContext", + "text": "SingleContextEvaluationContext" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagDefinitions", + "type": "Type", + "tags": [], + "label": "FeatureFlagDefinitions", + "description": [ + "\nList of {@link FeatureFlagDefinition}" + ], + "signature": [ + "(", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagDefinition", + "text": "FeatureFlagDefinition" + }, + "<\"boolean\"> | ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagDefinition", + "text": "FeatureFlagDefinition" + }, + "<\"string\"> | ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagDefinition", + "text": "FeatureFlagDefinition" + }, + "<\"number\">)[]" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.FeatureFlagsRequestHandlerContext", + "type": "Type", + "tags": [], + "label": "FeatureFlagsRequestHandlerContext", + "description": [ + "\nThe HTTP request handler context for evaluating feature flags" + ], + "signature": [ + "{ getBooleanValue: (flagName: string, fallbackValue: boolean) => Promise; getStringValue: (flagName: string, fallbackValue: Value) => Promise; getNumberValue: (flagName: string, fallbackValue: Value) => Promise; }" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.MultiContextEvaluationContext", + "type": "Type", + "tags": [], + "label": "MultiContextEvaluationContext", + "description": [ + "\nMulti-context format. The sub-contexts are provided in their nested properties." + ], + "signature": [ + "{ targetingKey?: string | undefined; } & Record & { kind: \"multi\"; organization?: ", + "EvaluationContext", + " | undefined; kibana?: ", + "EvaluationContext", + " | undefined; }" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server", + "id": "def-server.SingleContextEvaluationContext", + "type": "Type", + "tags": [], + "label": "SingleContextEvaluationContext", + "description": [ + "\nSingle Context format. If `kind` is not specified, it applies to the `kibana` sub-context." + ], + "signature": [ + "{ targetingKey?: string | undefined; } & Record & { kind?: \"kibana\" | \"organization\" | undefined; }" + ], + "path": "packages/core/feature-flags/core-feature-flags-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx new file mode 100644 index 0000000000000..dde7caaa8329c --- /dev/null +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -0,0 +1,33 @@ +--- +#### +#### 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: kibKbnCoreFeatureFlagsServerPluginApi +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-09-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] +--- +import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.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 | +|-------------------|-----------|------------------------|-----------------| +| 38 | 0 | 0 | 0 | + +## Server + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_core_feature_flags_server_internal.devdocs.json b/api_docs/kbn_core_feature_flags_server_internal.devdocs.json new file mode 100644 index 0000000000000..b8515b428f6db --- /dev/null +++ b/api_docs/kbn_core_feature_flags_server_internal.devdocs.json @@ -0,0 +1,267 @@ +{ + "id": "@kbn/core-feature-flags-server-internal", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.FeatureFlagsService", + "type": "Class", + "tags": [ + "private" + ], + "label": "FeatureFlagsService", + "description": [ + "\nThe server-side Feature Flags Service" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.FeatureFlagsService.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [ + "\nThe core service's constructor" + ], + "signature": [ + "any" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.FeatureFlagsService.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "core", + "description": [ + "{@link CoreContext }" + ], + "signature": [ + "CoreContext" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.FeatureFlagsService.setup", + "type": "Function", + "tags": [], + "label": "setup", + "description": [ + "\nSetup lifecycle method" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/core-feature-flags-server-internal", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerInternalPluginApi", + "section": "def-server.InternalFeatureFlagsSetup", + "text": "InternalFeatureFlagsSetup" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.FeatureFlagsService.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [ + "\nStart lifecycle method" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsStart", + "text": "FeatureFlagsStart" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.FeatureFlagsService.stop", + "type": "Function", + "tags": [], + "label": "stop", + "description": [ + "\nStop lifecycle method" + ], + "signature": [ + "() => Promise" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.InternalFeatureFlagsSetup", + "type": "Interface", + "tags": [ + "private" + ], + "label": "InternalFeatureFlagsSetup", + "description": [ + "\nCore-internal contract for the setup lifecycle step." + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server-internal", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerInternalPluginApi", + "section": "def-server.InternalFeatureFlagsSetup", + "text": "InternalFeatureFlagsSetup" + }, + " extends ", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + } + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.InternalFeatureFlagsSetup.getOverrides", + "type": "Function", + "tags": [], + "label": "getOverrides", + "description": [ + "\nUsed by the rendering service to share the overrides with the service on the browser side." + ], + "signature": [ + "() => Record" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.featureFlagsConfig", + "type": "Object", + "tags": [ + "private" + ], + "label": "featureFlagsConfig", + "description": [ + "\nConfig descriptor for the feature flags service" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.featureFlagsConfig.path", + "type": "string", + "tags": [], + "label": "path", + "description": [ + "/**\n * All config is prefixed by `feature_flags`\n */" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-internal", + "id": "def-server.featureFlagsConfig.schema", + "type": "Object", + "tags": [], + "label": "schema", + "description": [ + "/**\n * The definition of the validation config schema\n */" + ], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ overrides: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + " | undefined>; }>" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx new file mode 100644 index 0000000000000..347d8d300b904 --- /dev/null +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -0,0 +1,36 @@ +--- +#### +#### 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: kibKbnCoreFeatureFlagsServerInternalPluginApi +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-09-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] +--- +import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.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 | +|-------------------|-----------|------------------------|-----------------| +| 11 | 0 | 0 | 0 | + +## Server + +### Objects + + +### Classes + + +### Interfaces + + diff --git a/api_docs/kbn_core_feature_flags_server_mocks.devdocs.json b/api_docs/kbn_core_feature_flags_server_mocks.devdocs.json new file mode 100644 index 0000000000000..7c450607542c2 --- /dev/null +++ b/api_docs/kbn_core_feature_flags_server_mocks.devdocs.json @@ -0,0 +1,182 @@ +{ + "id": "@kbn/core-feature-flags-server-mocks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-mocks", + "id": "def-server.coreFeatureFlagsMock", + "type": "Object", + "tags": [], + "label": "coreFeatureFlagsMock", + "description": [ + "\nMocks for the Feature Flags service (browser-side)" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-feature-flags-server-mocks", + "id": "def-server.coreFeatureFlagsMock.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [ + "/**\n * Mocks the entire feature flags service\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.PublicMethodsOf", + "text": "PublicMethodsOf" + }, + "<", + { + "pluginId": "@kbn/core-feature-flags-server-internal", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerInternalPluginApi", + "section": "def-server.FeatureFlagsService", + "text": "FeatureFlagsService" + }, + ">>" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-mocks", + "id": "def-server.coreFeatureFlagsMock.createInternalSetup", + "type": "Function", + "tags": [], + "label": "createInternalSetup", + "description": [ + "/**\n * Mocks the core-internal setup contract\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-server-internal", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerInternalPluginApi", + "section": "def-server.InternalFeatureFlagsSetup", + "text": "InternalFeatureFlagsSetup" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-mocks", + "id": "def-server.coreFeatureFlagsMock.createSetup", + "type": "Function", + "tags": [], + "label": "createSetup", + "description": [ + "/**\n * Mocks the setup contract\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-mocks", + "id": "def-server.coreFeatureFlagsMock.createStart", + "type": "Function", + "tags": [], + "label": "createStart", + "description": [ + "/**\n * Mocks the start contract\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-feature-flags-server-mocks", + "id": "def-server.coreFeatureFlagsMock.createRequestHandlerContext", + "type": "Function", + "tags": [], + "label": "createRequestHandlerContext", + "description": [ + "/**\n * Mocks the request handler context contract\n */" + ], + "signature": [ + "() => jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsRequestHandlerContext", + "text": "FeatureFlagsRequestHandlerContext" + }, + ">" + ], + "path": "packages/core/feature-flags/core-feature-flags-server-mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + } + ], + "initialIsOpen": false + } + ] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx new file mode 100644 index 0000000000000..a064a024ed9ed --- /dev/null +++ b/api_docs/kbn_core_feature_flags_server_mocks.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: kibKbnCoreFeatureFlagsServerMocksPluginApi +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-09-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] +--- +import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.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 | +|-------------------|-----------|------------------------|-----------------| +| 6 | 0 | 0 | 0 | + +## Server + +### Objects + + diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 3eea0a02c6e80..b171b7227d466 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 fd165a47192e1..0c6e103b198bb 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 7a6b150dbdab7..c307b34e653c9 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 0a982b26990d3..783fcd2b09c59 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-09-18 +date: 2024-09-19 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 8f251c42d44eb..75e523ca0ea52 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_core_http_request_handler_context_server.devdocs.json index 92953db4a39e4..8bb3cb0dff266 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.devdocs.json +++ b/api_docs/kbn_core_http_request_handler_context_server.devdocs.json @@ -31,7 +31,9 @@ "type": "Object", "tags": [], "label": "savedObjects", - "description": [], + "description": [ + "\n{@link SavedObjectsRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-saved-objects-server", @@ -51,7 +53,9 @@ "type": "Object", "tags": [], "label": "elasticsearch", - "description": [], + "description": [ + "\n{@link ElasticsearchRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-elasticsearch-server", @@ -65,13 +69,31 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-request-handler-context-server", + "id": "def-server.CoreRequestHandlerContext.featureFlags", + "type": "Object", + "tags": [], + "label": "featureFlags", + "description": [ + "\n{@link FeatureFlagsRequestHandlerContext}" + ], + "signature": [ + "{ getBooleanValue: (flagName: string, fallbackValue: boolean) => Promise; getStringValue: (flagName: string, fallbackValue: Value) => Promise; getNumberValue: (flagName: string, fallbackValue: Value) => Promise; }" + ], + "path": "packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-request-handler-context-server", "id": "def-server.CoreRequestHandlerContext.uiSettings", "type": "Object", "tags": [], "label": "uiSettings", - "description": [], + "description": [ + "\n{@link UiSettingsRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-ui-settings-server", @@ -91,7 +113,9 @@ "type": "Object", "tags": [], "label": "deprecations", - "description": [], + "description": [ + "\n{@link DeprecationsRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-deprecations-server", @@ -111,7 +135,9 @@ "type": "Object", "tags": [], "label": "security", - "description": [], + "description": [ + "\n{@link SecurityRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-security-server", @@ -131,7 +157,9 @@ "type": "Object", "tags": [], "label": "userProfile", - "description": [], + "description": [ + "\n{@link UserProfileRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-user-profile-server", @@ -154,7 +182,9 @@ "type": "Interface", "tags": [], "label": "PrebootCoreRequestHandlerContext", - "description": [], + "description": [ + "\nThe `core` context provided to route handler during the preboot phase." + ], "path": "packages/core/http/core-http-request-handler-context-server/src/preboot_request_handler_context.ts", "deprecated": false, "trackAdoption": false, @@ -165,7 +195,9 @@ "type": "Object", "tags": [], "label": "uiSettings", - "description": [], + "description": [ + "\n{@link PrebootUiSettingsRequestHandlerContext}" + ], "signature": [ { "pluginId": "@kbn/core-http-request-handler-context-server", @@ -188,7 +220,9 @@ "type": "Interface", "tags": [], "label": "PrebootRequestHandlerContext", - "description": [], + "description": [ + "\nBase context passed to a route handler during the preboot phase, containing the `core` context part." + ], "signature": [ { "pluginId": "@kbn/core-http-request-handler-context-server", @@ -216,7 +250,9 @@ "type": "Object", "tags": [], "label": "core", - "description": [], + "description": [ + "\nPromise that resolves the {@link PrebootCoreRequestHandlerContext}" + ], "signature": [ "Promise<", { @@ -241,7 +277,9 @@ "type": "Interface", "tags": [], "label": "PrebootUiSettingsRequestHandlerContext", - "description": [], + "description": [ + "\n`uiSettings` http request context provider during the preboot phase." + ], "path": "packages/core/http/core-http-request-handler-context-server/src/preboot_request_handler_context.ts", "deprecated": false, "trackAdoption": false, @@ -252,7 +290,9 @@ "type": "Object", "tags": [], "label": "client", - "description": [], + "description": [ + "\nThe {@link IUiSettingsClient | UI Settings client}." + ], "signature": [ { "pluginId": "@kbn/core-ui-settings-server", @@ -305,7 +345,9 @@ "type": "Object", "tags": [], "label": "core", - "description": [], + "description": [ + "\nPromise that resolves the {@link CoreRequestHandlerContext}" + ], "signature": [ "Promise<", { 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 baad8bc3d263a..08145941f03ce 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.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 | |-------------------|-----------|------------------------|-----------------| -| 16 | 0 | 13 | 0 | +| 17 | 0 | 0 | 0 | ## Server diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 10c673c3dd10a..419ec334f419a 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-09-18 +date: 2024-09-19 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 70f8a057dfa98..e98be0ff713e0 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 f47640247f412..67055448954e1 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 c6d82cb9bfa45..360e51e41af92 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 e9df92b61c362..bf2a19b47b7fe 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 ddd611dbeb970..596dec9690097 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3998,6 +3998,10 @@ "plugin": "triggersActionsUi", "path": "x-pack/plugins/triggers_actions_ui/server/routes/config.ts" }, + { + "plugin": "inference", + "path": "x-pack/plugins/inference/server/routes/connectors.ts" + }, { "plugin": "globalSearch", "path": "x-pack/plugins/global_search/server/routes/get_searchable_types.ts" @@ -4442,10 +4446,6 @@ "plugin": "indexLifecycleManagement", "path": "x-pack/plugins/index_lifecycle_management/server/routes/api/snapshot_repositories/register_fetch_route.ts" }, - { - "plugin": "inference", - "path": "x-pack/plugins/inference/server/routes/connectors.ts" - }, { "plugin": "ingestPipelines", "path": "x-pack/plugins/ingest_pipelines/server/routes/api/get.ts" @@ -6688,6 +6688,10 @@ "plugin": "triggersActionsUi", "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/indices.ts" }, + { + "plugin": "inference", + "path": "x-pack/plugins/inference/server/routes/chat_complete.ts" + }, { "plugin": "globalSearch", "path": "x-pack/plugins/global_search/server/routes/find.ts" @@ -7060,10 +7064,6 @@ "plugin": "indexLifecycleManagement", "path": "x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_add_policy_route.ts" }, - { - "plugin": "inference", - "path": "x-pack/plugins/inference/server/routes/chat_complete.ts" - }, { "plugin": "ingestPipelines", "path": "x-pack/plugins/ingest_pipelines/server/routes/api/create.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 8e9a8561ba4fe..ec98554b403f5 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-09-18 +date: 2024-09-19 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 58a91e7149338..8ca3c4fac051c 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 b56069268490c..3b2d889f8f68a 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index b589b6d849a08..bc5eb016cfda0 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 f56548b9b9e56..5b01d4a4fe5f1 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 52b7a3b7768f8..9d29fef8633ea 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-09-18 +date: 2024-09-19 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 93d041d8d02ba..4e41d91702c75 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 165b1ff710b81..cc0b5d30f759c 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 e8a3da1958a8b..f0093d24ffa61 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 f9abde11919f7..a61b35955ae35 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 a8c4ffc2f3877..1a8c594ff1b67 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_core_lifecycle_browser.devdocs.json index 295994fc63a54..6dc2ededac6e0 100644 --- a/api_docs/kbn_core_lifecycle_browser.devdocs.json +++ b/api_docs/kbn_core_lifecycle_browser.devdocs.json @@ -125,6 +125,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-lifecycle-browser", + "id": "def-public.CoreSetup.featureFlags", + "type": "Object", + "tags": [], + "label": "featureFlags", + "description": [ + "{@link FeatureFlagsSetup}" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + } + ], + "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-lifecycle-browser", "id": "def-public.CoreSetup.http", @@ -499,6 +521,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-lifecycle-browser", + "id": "def-public.CoreStart.featureFlags", + "type": "Object", + "tags": [], + "label": "featureFlags", + "description": [ + "{@link FeatureFlagsStart}" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsStart", + "text": "FeatureFlagsStart" + } + ], + "path": "packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-lifecycle-browser", "id": "def-public.CoreStart.http", diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 3a7022907d23b..9e1ece44c430e 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.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 | |-------------------|-----------|------------------------|-----------------| -| 36 | 0 | 0 | 0 | +| 38 | 0 | 0 | 0 | ## Client diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.devdocs.json b/api_docs/kbn_core_lifecycle_browser_mocks.devdocs.json index cb694e0347a00..253d371df5591 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.devdocs.json +++ b/api_docs/kbn_core_lifecycle_browser_mocks.devdocs.json @@ -70,6 +70,14 @@ "section": "def-public.FatalErrorsSetup", "text": "FatalErrorsSetup" }, + ">; featureFlags: jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + }, ">; getStartServices: jest.Mock; featureFlags: jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, ">; http: ", { "pluginId": "@kbn/core-http-browser-mocks", @@ -401,6 +417,14 @@ "section": "def-public.ExecutionContextSetup", "text": "ExecutionContextSetup" }, + ">; featureFlags: jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, ">; http: ", { "pluginId": "@kbn/core-http-browser-mocks", diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 21036821facb6..30bbd2a10a894 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_core_lifecycle_server.devdocs.json index bc9633a4c0006..9176697ed155e 100644 --- a/api_docs/kbn_core_lifecycle_server.devdocs.json +++ b/api_docs/kbn_core_lifecycle_server.devdocs.json @@ -300,6 +300,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-lifecycle-server", + "id": "def-server.CoreSetup.featureFlags", + "type": "Object", + "tags": [], + "label": "featureFlags", + "description": [ + "{@link FeatureFlagsSetup}" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsSetup", + "text": "FeatureFlagsSetup" + } + ], + "path": "packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-lifecycle-server", "id": "def-server.CoreSetup.http", @@ -755,6 +777,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-lifecycle-server", + "id": "def-server.CoreStart.featureFlags", + "type": "Object", + "tags": [], + "label": "featureFlags", + "description": [ + "{@link FeatureFlagsStart}" + ], + "signature": [ + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsStart", + "text": "FeatureFlagsStart" + } + ], + "path": "packages/core/lifecycle/core-lifecycle-server/src/core_start.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-lifecycle-server", "id": "def-server.CoreStart.http", diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 43b552eb6c105..918a65a7b4b9d 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.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 | |-------------------|-----------|------------------------|-----------------| -| 40 | 0 | 0 | 0 | +| 42 | 0 | 0 | 0 | ## Server diff --git a/api_docs/kbn_core_lifecycle_server_mocks.devdocs.json b/api_docs/kbn_core_lifecycle_server_mocks.devdocs.json index 0cb5b13788926..b0e66b991dc36 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.devdocs.json +++ b/api_docs/kbn_core_lifecycle_server_mocks.devdocs.json @@ -114,7 +114,15 @@ "section": "def-server.DocLinksServiceSetup", "text": "DocLinksServiceSetup" }, - "; elasticsearch: MockedInternalElasticSearchServiceSetup; http: ", + "; elasticsearch: MockedInternalElasticSearchServiceSetup; featureFlags: jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-server-internal", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerInternalPluginApi", + "section": "def-server.InternalFeatureFlagsSetup", + "text": "InternalFeatureFlagsSetup" + }, + ">; http: ", { "pluginId": "@kbn/core-http-server-mocks", "scope": "server", @@ -234,7 +242,15 @@ "section": "def-server.DocLinksServiceSetup", "text": "DocLinksServiceSetup" }, - "; elasticsearch: MockedInternalElasticsearchServiceStart; http: ", + "; elasticsearch: MockedInternalElasticsearchServiceStart; featureFlags: jest.Mocked<", + { + "pluginId": "@kbn/core-feature-flags-server", + "scope": "server", + "docId": "kibKbnCoreFeatureFlagsServerPluginApi", + "section": "def-server.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, + ">; http: ", { "pluginId": "@kbn/core-http-server-mocks", "scope": "server", diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index a7161c01d890b..c62edeccd0137 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 77aa81d09fb3b..61b094664f764 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 d8f3409abe55d..265325361d25c 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 e1d12229d8ab7..b5f156fe88553 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-09-18 +date: 2024-09-19 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 9c1e5ba3dd2b3..76967400fea71 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 277b727ebe895..cbf8741213c0c 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 f38a52f05f708..cde4a55c6de8d 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 c8b542949adc2..2a2cc31da838f 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 da5b6ec646275..7d287adca1f2a 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-09-18 +date: 2024-09-19 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 3d8c8bb2f060d..b9244ae1abb17 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 c0ed134e172b7..52b920762fbe7 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 00441e8309c55..218979ff31fc7 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 413b16e8596fe..af7fe8e19e747 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-09-18 +date: 2024-09-19 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 fc1e340abbf8e..227d7f6a58519 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 0e0f46b149985..1e5650e079a85 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 52926d839c70c..293fe9f0658e1 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 8e048f6af8e3c..7a253a4d4e978 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 8a3dbd73cfeaa..b7cdd17426a7a 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 208e8d4c31177..c57c89038615e 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 8490dfbcb541a..4325967630cff 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 e96184303d090..0fd92eb1c5461 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 a23389b54f67c..32cf621c34cab 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 608e940403572..49f4f3d274a4c 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 505e7b7327a17..acf7337fec743 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 c377cba3c6fd2..35bd5fc0b188e 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-09-18 +date: 2024-09-19 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 6dba3c5da5574..880f5a199861f 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-09-18 +date: 2024-09-19 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 d28009950afdd..c2f1025126f7d 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 c2cc07a47f2cf..72a8de7fea2d5 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-09-18 +date: 2024-09-19 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 c46a7eef251c7..7379ba432d315 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index b761c110d1d7f..7a61372f6c497 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 1c2f35f7583b4..52ebd954afd30 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 6c5b5d3d79b73..12f4aeb686c10 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 ce7a0bb6d9c04..a4fd7a6a7ae33 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index aadacc917d967..ef6ae34fe7fb2 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 78347f4b93a01..6e0acbec6b85f 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-09-18 +date: 2024-09-19 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 cbd6bb26db13d..baf5fa1b3c012 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 e623d3d5da309..cdd5aa9c2012f 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 0386bfbe61f17..b3f47b74192a0 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index f6a13127c9213..ad0c6561409e5 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index a90a6f28120d9..fcb23d250cb68 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 fae693d7839ae..a7febcbf41a4b 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 7d073e8bf1ade..85ea8df422479 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-09-18 +date: 2024-09-19 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 d036017dc47e8..183db1bf3bc09 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 27330a7acbc82..a0d0f3383026a 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 b9672a1321def..79b2f88a87ceb 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 f5c2714ef19ac..3cac016901f49 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 2cdb3785aff09..3222ed47c2a67 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-09-18 +date: 2024-09-19 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 9c78af4a1609f..ac9bac4acd090 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 80a1a41c6aeaf..f6db8b2f291af 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 abb6ca3b5c87c..c8ae50e55ecb2 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-09-18 +date: 2024-09-19 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 4e0fe4fba4715..9c4e71a7025e8 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 7d53592a54253..0ab0ee9c212c1 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 86f15d7190e75..afd04a105f1db 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 b27000d3374e9..d353a9c2b523b 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-09-18 +date: 2024-09-19 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 b4c9bf2c1e171..24b5bcfc91c68 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-09-18 +date: 2024-09-19 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 cb99f048c57d4..31ac9a9c160d4 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 04e3fb4cc903e..813c10bea560b 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 bcc20e30b8006..74afc99042dd7 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 0eed9a01b4262..d6fa421bd715d 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index e1c02b8c381eb..838543bb56e4a 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-09-18 +date: 2024-09-19 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 16aa84846beb9..c5b80b2fc4937 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 b3d40612f502e..43a04efe19a16 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 393e96f044e11..a27bfd67a5878 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_core_test_helpers_http_setup_browser.devdocs.json index aa57c4bb46738..af410ee15c4d9 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.devdocs.json +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.devdocs.json @@ -139,7 +139,7 @@ "section": "def-common.CustomBranding", "text": "CustomBranding" }, - ", [], unknown>; } & ", + ", [], unknown>; getFeatureFlags: jest.MockInstance<{ overrides: Record; } | undefined, [], unknown>; } & ", "InternalInjectedMetadataSetup" ], "path": "packages/core/test-helpers/core-test-helpers-http-setup-browser/src/http_test_setup.ts", 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 2323536c55a9b..9797e8efd6441 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 9e1f2965aa857..488ab75c77f46 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-09-18 +date: 2024-09-19 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 a2f9d33298d0b..a3cc6ea4fad3c 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-09-18 +date: 2024-09-19 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 6d98f80410fed..f8874ce76e1b7 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-09-18 +date: 2024-09-19 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 1bfea51422f84..2319a612e64e5 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 1a2b0025cc6bd..59f15638d97b2 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 0940e1a50feba..8639a38de2794 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 c715d1e7b3917..a98c7c5327526 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 d9a0c286d13e3..1c6733f6168d8 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 7e779b6686c63..dc28783a5a3b8 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 1e1a9990e39f5..ae084b9ccaba1 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-09-18 +date: 2024-09-19 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 4a56276c6811c..267e0e4e4bfc8 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-09-18 +date: 2024-09-19 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 36a329ae679cc..b2f3c4053e77a 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 94e34aa3318b9..0138052aface8 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 b634a9a4cc595..23e208f2e7f89 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-09-18 +date: 2024-09-19 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 0a96af557a08d..03b49ca093c2c 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 7103d115e22f2..2ab7bd0f61d84 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 2391e5b3564b1..f91a24a336c01 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 200dd15aa66d7..ff826573a9684 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 7765b9c682f12..348819d00a654 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 47f868255ab1b..dc800b585b00f 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-09-18 +date: 2024-09-19 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 1e0b019b0435c..e374be651f4b5 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-09-18 +date: 2024-09-19 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 3a97c6fdfdd9f..43b0071abf07c 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-09-18 +date: 2024-09-19 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 ea118537c813b..2764d8ba5fc96 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 1ec5c8dd54ba5..35c2ee31fa934 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-09-18 +date: 2024-09-19 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 b321ba8daa591..a732a9fbedef4 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 bce709ba117b5..ef96ea8134557 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-09-18 +date: 2024-09-19 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 b6e228af87f60..2c14b8dcfabd2 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 d409ae21ab537..e224835db716b 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-09-18 +date: 2024-09-19 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 946d00cb43531..7e0766f0b7f6d 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-09-18 +date: 2024-09-19 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 c72c8ac82c558..5d73c513b34d8 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-09-18 +date: 2024-09-19 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 26a5aaa97dd33..9fe39337f0d2e 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-09-18 +date: 2024-09-19 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 8f21c6fdc2e01..01cb913d8e2f1 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-09-18 +date: 2024-09-19 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 8839a5fb1f968..820f980a44b5f 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-09-18 +date: 2024-09-19 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 a16842faea22f..cfbe27366c0bb 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 7ea7761c773a7..ac8083f8a15c0 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-09-18 +date: 2024-09-19 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 5a9da803cce4a..50311c9db5306 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-09-18 +date: 2024-09-19 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 909177e7be2d7..337c676120115 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-09-18 +date: 2024-09-19 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 ef7cacefc320e..8b3373aca1ad5 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-09-18 +date: 2024-09-19 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 512a10b294f36..3bf7efc8b1594 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-09-18 +date: 2024-09-19 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 c805c155b0405..bcf0ef4b1c7f2 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-09-18 +date: 2024-09-19 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 43d2716b2f935..fd80b8d4ce088 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-09-18 +date: 2024-09-19 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 deecbda34e39b..41d8058035c8b 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-09-18 +date: 2024-09-19 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 573ce6b18472d..359cfe71e10f1 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-09-18 +date: 2024-09-19 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 b9a6b6c2ba6ab..7e8ef2ed9adc4 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-09-18 +date: 2024-09-19 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 b7115f8b8ccc7..ab5f28a816b76 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-09-18 +date: 2024-09-19 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 b8a6479f485fb..ad47e1d6bcf58 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-09-18 +date: 2024-09-19 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 4da4c2b22aa5b..2a8ea904d3602 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-09-18 +date: 2024-09-19 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 f37346975bdd4..31165b24f57cf 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-09-18 +date: 2024-09-19 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 854fc1232858e..fbcc7bb468bb5 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-09-18 +date: 2024-09-19 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 d05e784ac4bfd..7edfd59066feb 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-09-18 +date: 2024-09-19 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 95220ed5d6c74..6cf6c88cad2bb 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-09-18 +date: 2024-09-19 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 64edb18630234..649e987b58713 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 9b62a6ad3ee82..9f1346266fb64 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 18af87c253e48..d8243d8286aba 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-09-18 +date: 2024-09-19 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 cd12666ef736c..3e62d92cd92bc 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 5777ce92f6277..2345eefb548d3 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-09-18 +date: 2024-09-19 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 7b213b0ee57ee..dbbaad44b5e51 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-09-18 +date: 2024-09-19 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 0668c781cc407..9da40daa5c0bb 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-09-18 +date: 2024-09-19 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 c9816e081f36a..3ac851678ad60 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 29a8921bd078a..4e31c4b484b2d 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-09-18 +date: 2024-09-19 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.mdx b/api_docs/kbn_elastic_assistant_common.mdx index d396d3600c896..874acc40f8edd 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-09-18 +date: 2024-09-19 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 2aa2057a03a8d..57b45c4fb933c 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-09-18 +date: 2024-09-19 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 9d896e9953220..70789ac234832 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-09-18 +date: 2024-09-19 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 257f8875026b3..5696356c6033b 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-09-18 +date: 2024-09-19 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 084690d0241c3..a5d3e4508c5a1 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-09-18 +date: 2024-09-19 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 3c1ae5b12cb97..8a195619692c9 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index c574263f749eb..df6ccae0c8fc1 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index c3f7caca9f1fc..2a1820d7c7ede 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_esql_ast.devdocs.json index 365993fe49b14..da5921fc6985c 100644 --- a/api_docs/kbn_esql_ast.devdocs.json +++ b/api_docs/kbn_esql_ast.devdocs.json @@ -392,14702 +392,8 @@ "description": [], "signature": [ "Visitor", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; } & { visitFunctionCallExpression: (ctx: ", - "FunctionCallExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitRenameExpression: (ctx: ", - "RenameExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; } & { visitFunctionCallExpression: (ctx: ", - "FunctionCallExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitCommandOption: (ctx: ", - "CommandOptionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; } & { visitFunctionCallExpression: (ctx: ", - "FunctionCallExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitRenameExpression: (ctx: ", - "RenameExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; } & { visitFunctionCallExpression: (ctx: ", - "FunctionCallExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitCommand: (ctx: ", - "CommandVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitListLiteralExpression: (ctx: ", - "ListLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitInlineCastExpression: (ctx: ", - "InlineCastExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - "ESQLList", - ">) => string; } & { visitFunctionCallExpression: (ctx: ", - "FunctionCallExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitLiteralExpression: (ctx: ", - "LiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ">) => string; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLLiteral", - "text": "ESQLLiteral" - }, - ">) => string; } & { visitTimeIntervalLiteralExpression: (ctx: ", - "TimeIntervalLiteralExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { visitSourceExpression: (ctx: ", - "SourceExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", - ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; }, ", - "SharedData", - ">) => string; } & { visitColumnExpression: (ctx: ", - "ColumnExpressionVisitorContext", - "<", - "VisitorMethods", - " & { visitExpression: (ctx: ", - "ExpressionVisitorContext", - "<", - "VisitorMethods", ", ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLSingleAstItem", - "text": "ESQLSingleAstItem" - }, - ">) => string; } & { ...; }, ", - "SharedData", - ">) => string; } & { ...; }, ", - "SharedData", - ">) => string; } & { ...; } & { ...; }, ", - "SharedData", - ">) => string; } & { ...; } & { ...; }, ", - "SharedData", - ", ", - { - "pluginId": "@kbn/esql-ast", - "scope": "common", - "docId": "kibKbnEsqlAstPluginApi", - "section": "def-common.ESQLAstCommand", - "text": "ESQLAstCommand" - }, - ">) => string; } & { ...; }, ", - "SharedData", ">" ], "path": "packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts", @@ -15110,7 +416,7 @@ "section": "def-common.ESQLAst", "text": "ESQLAst" }, - ") => string" + ") => any" ], "path": "packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts", "deprecated": false, @@ -15202,7 +508,7 @@ "section": "def-common.ESQLSingleAstItem", "text": "ESQLSingleAstItem" }, - ") => string" + ") => any" ], "path": "packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts", "deprecated": false, @@ -18413,6 +3719,8 @@ "text": "ESQLAstItem" }, "> | ", + "ESQLOrderExpression", + " | ", "ESQLUnknownItem" ], "path": "packages/kbn-esql-ast/src/types.ts", diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index e6baced028f0a..f70e3a5792f5a 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 177 | 1 | 139 | 31 | +| 177 | 1 | 139 | 20 | ## Common diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 65f973339cc63..6ce298f16de46 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index 56be1787513e8..dd8f595a501ab 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -694,6 +694,8 @@ "text": "ESQLAstItem" }, "> | ", + "ESQLOrderExpression", + " | ", "ESQLUnknownItem", "; option: ", { @@ -814,6 +816,8 @@ "text": "ESQLAstItem" }, "> | ", + "ESQLOrderExpression", + " | ", "ESQLUnknownItem", " | undefined; option: ", { @@ -918,6 +922,8 @@ "text": "ESQLAstItem" }, "> | ", + "ESQLOrderExpression", + " | ", "ESQLUnknownItem", " | undefined; option: ", { @@ -1030,6 +1036,8 @@ "text": "ESQLAstItem" }, "> | ", + "ESQLOrderExpression", + " | ", "ESQLUnknownItem", " | undefined; setting: ", { diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 73e90361771e1..bdbe2d6d0de92 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-09-18 +date: 2024-09-19 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 e47591dbda9b0..30065fd74aee8 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-09-18 +date: 2024-09-19 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 c19b5c4106d99..62e7de9b1962a 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-09-18 +date: 2024-09-19 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 3379ae557f457..56671dc282906 100644 --- a/api_docs/kbn_expandable_flyout.devdocs.json +++ b/api_docs/kbn_expandable_flyout.devdocs.json @@ -13,7 +13,7 @@ "\nExpandable flyout UI React component.\nDisplays 3 sections (right, left, preview) depending on the panels in the context.\n\nThe behavior expects that the left and preview sections should only be displayed is a right section\nis already rendered." ], "signature": [ - "{ ({ customStyles, registeredPanels, flyoutCustomProps, ...flyoutProps }: React.PropsWithChildren<", + "{ ({ ...props }: React.PropsWithChildren<", { "pluginId": "@kbn/expandable-flyout", "scope": "public", @@ -32,7 +32,7 @@ "id": "def-public.ExpandableFlyout.$1", "type": "CompoundType", "tags": [], - "label": "{\n customStyles,\n registeredPanels,\n flyoutCustomProps,\n ...flyoutProps\n}", + "label": "{ ...props }", "description": [], "signature": [ "React.PropsWithChildren<", @@ -577,8 +577,8 @@ "text": "ExpandableFlyoutProps" }, " extends Omit<", - "EuiFlyoutProps", - "<\"div\">, \"onClose\">" + "EuiFlyoutResizableProps", + ", \"onClose\">" ], "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, @@ -658,6 +658,22 @@ "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/expandable-flyout", + "id": "def-public.ExpandableFlyoutProps.datatestsubj", + "type": "string", + "tags": [], + "label": "'data-test-subj'", + "description": [ + "\nOptional data test subject string to be used on the EuiFlyoutResizable component" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-expandable-flyout/src/index.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 3c5a1cef91cd3..a7c614cede2b8 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-09-18 +date: 2024-09-19 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 | |-------------------|-----------|------------------------|-----------------| -| 43 | 0 | 17 | 3 | +| 44 | 0 | 17 | 3 | ## Client diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index f94608944b219..1b52ed4b9a7fb 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-09-18 +date: 2024-09-19 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 87f95e9d7e825..dbe7d3299fcf5 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 71fcc8d6897c3..a86a471289d1d 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-09-18 +date: 2024-09-19 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 575d58efde160..916f196fb1f42 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-09-18 +date: 2024-09-19 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 4b2bd73e9dfc8..6b95407b28d3f 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-09-18 +date: 2024-09-19 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 1683a49fbd57c..687166a4e0cb0 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index d58b8cee401cf..d9ec516ff16c4 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-09-18 +date: 2024-09-19 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 460f77ec8a8a3..937e8d30f73d2 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-09-18 +date: 2024-09-19 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 9bd39c7917472..b239913fb3ad6 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-09-18 +date: 2024-09-19 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 2ce0ed09b5521..a37e9b6b037ad 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-09-18 +date: 2024-09-19 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 e738af29f43a8..de7750f2e5a81 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-09-18 +date: 2024-09-19 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 2b54d157addb1..26f5ddf150569 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-09-18 +date: 2024-09-19 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 fd1d5c1f0f9c7..05221ecf699d5 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-09-18 +date: 2024-09-19 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 a4fcb2f85d0c4..e379fbd0044c1 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 ef2fd28927e27..293518f142221 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-09-18 +date: 2024-09-19 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 0296000b19f99..9a3fd60ab58e4 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-09-18 +date: 2024-09-19 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 1d986622f2e10..43121374d49b4 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-09-18 +date: 2024-09-19 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 f314c8428db6d..0f1199d5c9582 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-09-18 +date: 2024-09-19 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 31a0e4fc63d9e..f528e5b6b1f8e 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-09-18 +date: 2024-09-19 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 df20d9ecf43fc..21d43ffea7ce7 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 4976fd06cabe9..5b3bec7a0e1f1 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-09-18 +date: 2024-09-19 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_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 8f64638c2d2ea..22e64a3f5e6b1 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-09-18 +date: 2024-09-19 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 1a60382da0068..17d84eab72cb2 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-09-18 +date: 2024-09-19 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 522f3361f49d4..6998285ce622c 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index e6600208f63bc..df103d3cef020 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-09-18 +date: 2024-09-19 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 1d7abb60087be..ac4c95e21537e 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 d4f287cc56d8d..40faf789d32ac 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index c202b80c05c84..d9f7baf1d03e1 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-09-18 +date: 2024-09-19 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 3e398a67359c5..50a292dabcb53 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-09-18 +date: 2024-09-19 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 69770a0766d50..18123fb4bb3fd 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-09-18 +date: 2024-09-19 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 15c5ca1a752ec..f2ad03b489f1f 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-09-18 +date: 2024-09-19 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 ff91dd727a9ae..647aa16197929 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 6e0cf4a25f9d8..151b9254e58ae 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 091c002b15cbb..c2630ff7d984c 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 e26866c3c6c17..03f4e936557c3 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-09-18 +date: 2024-09-19 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 46bc2ff5de9e7..4c8645025da80 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-09-18 +date: 2024-09-19 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 6977e3c84ec8b..8b1aad0c0a7c9 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 20f8322518b55..a23110409d23d 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-09-18 +date: 2024-09-19 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 9a5c0e5fdfb40..f8761f2ab1f48 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-09-18 +date: 2024-09-19 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 39e8f7fc1361e..a7e4fd3f37455 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-09-18 +date: 2024-09-19 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 0f15c6ddfe61a..3d4d7f1f111bd 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-09-18 +date: 2024-09-19 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 e0c2e0d8e494e..d94fe5872054a 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-09-18 +date: 2024-09-19 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 970e1a10e7cf2..35cc0b9d03752 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-09-18 +date: 2024-09-19 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 1bbce4974900a..34d940d0f248b 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-09-18 +date: 2024-09-19 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 8a0d78af24aca..720572b115752 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-09-18 +date: 2024-09-19 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 d969723036fe1..8070715df2aff 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-09-18 +date: 2024-09-19 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 4cc7139ed1b59..7e264c7764225 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-09-18 +date: 2024-09-19 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 9f291c840d5fd..ba91a364224dc 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-09-18 +date: 2024-09-19 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 f7e33e54a938d..87b690f7cf430 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-09-18 +date: 2024-09-19 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 26bd1addff19f..735129fc1e9f9 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-09-18 +date: 2024-09-19 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 0dec7debc67b0..a0dfbe92bf1d6 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 959a1bc970dcf..9483667fe3101 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-09-18 +date: 2024-09-19 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 f4295c0275d7d..b43df2f5eb337 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 00dcd101f288e..5f1b4655137a8 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 a2aaae798818e..1e3b2a4bfe07c 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 ee2b9072c4610..85c7fda88959e 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-09-18 +date: 2024-09-19 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 f2f6225f38576..047405f255340 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-09-18 +date: 2024-09-19 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 918f0231df347..c6265b02671f8 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-09-18 +date: 2024-09-19 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 9699b979d1a10..d6edb38e108d2 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 be16e45552106..ba6e47aded661 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-09-18 +date: 2024-09-19 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 a447da7562dad..ff2c617e6c3a8 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-09-18 +date: 2024-09-19 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 bd2e514da080b..5986e3f00e985 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 b607144aecb12..bd7b6e83e9c54 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index d454951e5766f..9b03481dc0477 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-09-18 +date: 2024-09-19 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 67e7e9a4bde13..0cde7c37492c9 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-09-18 +date: 2024-09-19 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 40bcfd94edf19..e7a95a6a2d0ae 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-09-18 +date: 2024-09-19 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 89a1c0e19dd18..2490828d20033 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-09-18 +date: 2024-09-19 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 ac1f4f4986603..a632b84b050ac 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-09-18 +date: 2024-09-19 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 21bf57b384c2c..d1f06b6a1b213 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-09-18 +date: 2024-09-19 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 dfb1406428a2e..e9ff9bd2f8f6f 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 556ee805ccd0b..9451ac2817c18 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 8afdbba19e542..c3d347da0a4c0 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 73c96b2a900b9..f038206904ddc 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 74fbf817833dc..d5a7bad532934 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 9963dfa357f0c..c4c4cd53f5f1b 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-09-18 +date: 2024-09-19 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 ab1963390cffc..07b58f68d8d94 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 848f193a35824..0ab5f2feb2727 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 2615bf74593c5..eb24b73ebd288 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-09-18 +date: 2024-09-19 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 0ac6c1e85d23d..099c21bf7f115 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 14c80cdc4af40..69c040cbe7954 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 a0de3dafbc125..eb3e55d42600a 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-09-18 +date: 2024-09-19 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 b62c84444ab4c..1d2b5ff137dce 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-09-18 +date: 2024-09-19 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 0e78d48a36bcc..7c44879563ee7 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 9dc35c63e61a6..1ee2401efa911 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-09-18 +date: 2024-09-19 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 bd4e46d3ab9a0..f4e368a53b240 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 cb376f7a14dd9..4692f9939e316 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-09-18 +date: 2024-09-19 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 bf26958cb6a59..d7698f6c5b2af 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 5ad08d697c05d..76442e7b0aaee 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-09-18 +date: 2024-09-19 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 6dbe11785fce5..cb486705d2908 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-09-18 +date: 2024-09-19 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 716831d816063..fae9dd763fdce 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-09-18 +date: 2024-09-19 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 864981073cfc7..bb3bb9ae70c52 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 881e43db79b86..cf778264c7d26 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index a3d164368e7db..0292c537db889 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-09-18 +date: 2024-09-19 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 39de97662be7b..36688269f3c51 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-09-18 +date: 2024-09-19 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 d4fc3b05fb4da..58b546bf539a5 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-09-18 +date: 2024-09-19 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 2d1cf93d0419d..c37253ad7c969 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-09-18 +date: 2024-09-19 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 6ed820e16feef..cfc1786625795 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 51e5a8f6f2579..76d24aca00b17 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index f51f8fb3176cf..53976516fda7e 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index fc951d69a7ba4..ba1f228fb1281 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 7c76a8c64e062..c9660f9140afe 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-09-18 +date: 2024-09-19 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 f2877ed1f7bd5..17462fc445c23 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-09-18 +date: 2024-09-19 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 acdfbe2283efb..0422570a0f427 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index d5703dd0e7d5f..afa3073154cd8 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index b55ba5c6dbb9e..f2f25f3fc9e91 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 1dc1d48ff212b..a5a11e5fe40e8 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-09-18 +date: 2024-09-19 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 9953280bd120f..8ff8414a65a6e 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-09-18 +date: 2024-09-19 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 a5f226ae81649..b7651bc7efb6c 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-09-18 +date: 2024-09-19 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 47aefb9d93117..de6bdd9ea4828 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 249479fe6ad24..6cbb7cf414131 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 2d5256d946477..b2742d985a2a5 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-09-18 +date: 2024-09-19 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 bf7b6a79892a3..b35db8d9a9f46 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-09-18 +date: 2024-09-19 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 d810becca8892..d3711b02973b1 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-09-18 +date: 2024-09-19 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 623346dd07852..d68396bb4a45c 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-09-18 +date: 2024-09-19 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 1a05627f6a602..4b684a8e7292e 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-09-18 +date: 2024-09-19 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 f7337ebec417f..8eaa9d0bac620 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-09-18 +date: 2024-09-19 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 9219c17c62c6a..ced241558dfd0 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-09-18 +date: 2024-09-19 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 3693870c62dca..bb630394d6664 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-09-18 +date: 2024-09-19 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 99510715c914e..338107ce91112 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-09-18 +date: 2024-09-19 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 5d8495d43046f..50cadcd9f3283 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-09-18 +date: 2024-09-19 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 a93e51a109614..950ebfb1e3e6f 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-09-18 +date: 2024-09-19 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 8fc0440bfbf3d..b0f2e3c95e09a 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-09-18 +date: 2024-09-19 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 1ce2ab09565f0..be42131a1b948 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-09-18 +date: 2024-09-19 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 05f5775f5c400..f3e33b8083ae6 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-09-18 +date: 2024-09-19 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 5b1feec9e364f..117662414b87c 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-09-18 +date: 2024-09-19 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 58942283ccd10..5ef3bafc51881 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-09-18 +date: 2024-09-19 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 fcea8171dc457..572cb6c28b6a6 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 34b288debe64c..88e200383af97 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-09-18 +date: 2024-09-19 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 1979b19defc6a..306db3bb7f5d1 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-09-18 +date: 2024-09-19 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 6a31818df65da..2ddb636339998 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-09-18 +date: 2024-09-19 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 0672f3a4ab7cf..d85f6c0e8c91d 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 69cd8d10a71ba..4480546482f67 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-09-18 +date: 2024-09-19 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 3337da9c8df14..e7fdad85a145e 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 9af70ef2dfeea..9129945aa7a87 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index 62f604785ce71..55f3a250eb3a6 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 8aed2d8920522..52a19b42aef18 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-09-18 +date: 2024-09-19 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 c45a58f813351..5fc123c2a5ead 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-09-18 +date: 2024-09-19 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 58ec026afc309..6b1ffc26edc90 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-09-18 +date: 2024-09-19 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 78df16f7d8223..85fd3e79f0c2e 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-09-18 +date: 2024-09-19 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 b2e8f6c9b6074..9571ac22fc124 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 91ba24bd3cba0..19bcc3cdf68a2 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-09-18 +date: 2024-09-19 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 74438c1622206..006a96d735b4e 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-09-18 +date: 2024-09-19 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 7c16d60e4e053..b1a92fb35375c 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 4efd34d6cf9e3..7938628ce8d28 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-09-18 +date: 2024-09-19 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 1b324dbf136f8..6a18814f3b9b5 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-09-18 +date: 2024-09-19 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 b824aadb2d4d9..59ce720467e9a 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-09-18 +date: 2024-09-19 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 28748430313ab..3198428b41f88 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index dab1433f6df34..db5ea76d21d26 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-09-18 +date: 2024-09-19 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 ea87c0aee5d90..6384582ce2d8e 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 0cf38e204c629..96441f1ce1a84 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 4ef751695f415..60bedea60d714 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-09-18 +date: 2024-09-19 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 9d21ba8c11064..72d270b61837a 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-09-18 +date: 2024-09-19 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 d98dd60491e35..72d1ea8d681b4 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-09-18 +date: 2024-09-19 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 d3523221243a3..d3201cc3a4a51 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-09-18 +date: 2024-09-19 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 306a18ebc4d6c..abc8b792757aa 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-09-18 +date: 2024-09-19 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 4e3250b99a0ec..baa9faa186cf6 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-09-18 +date: 2024-09-19 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 b85108c31f02f..7b2d532d1a2e8 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-09-18 +date: 2024-09-19 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 c6b6942024ff1..b2ba3bce1e743 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-09-18 +date: 2024-09-19 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 3ca3c7f1f6cb9..13c8ce4879833 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 1db005c199ee2..f045f8a89fd1c 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 1672aa918c2bf..0f133c4b78be9 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-09-18 +date: 2024-09-19 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 b418198fa8bce..c52762ae29916 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 04f5fc5c08877..f6ecb50139980 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-09-18 +date: 2024-09-19 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 218279e7fc474..50f3718b74331 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-09-18 +date: 2024-09-19 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 345653d4ecea3..7c2d3528a6b1c 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-09-18 +date: 2024-09-19 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 d4a1c8e53e7c9..2f93471f61239 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 b9ed9f3e8c77e..e75f70c47bd99 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-09-18 +date: 2024-09-19 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 b183080af573b..e9bf3761a2b3f 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-09-18 +date: 2024-09-19 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 e44c2226e7197..58f900a9b46f4 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-09-18 +date: 2024-09-19 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 167c83c818ad5..54ced479d3d4b 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 4871452417a76..128802154c6f7 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-09-18 +date: 2024-09-19 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 350d9a5b264df..258062397ba83 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-09-18 +date: 2024-09-19 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 bc6e40ec3e135..046c0343919bc 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 49c098d084990..ce7b09f044fe9 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-09-18 +date: 2024-09-19 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 71c35541ea0e2..47d04b3dad68a 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-09-18 +date: 2024-09-19 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 f85ce3c761143..480dffd2da99c 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-09-18 +date: 2024-09-19 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 25c5efbb2a912..6ab29bcf5c365 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 966e82cf5eff1..6d77c28eb58fe 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-09-18 +date: 2024-09-19 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 a56aec0da6af0..7aa552803667b 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-09-18 +date: 2024-09-19 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 b2f40263a4490..6783e9c61d43d 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-09-18 +date: 2024-09-19 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 432e81883a9b3..c98ea770ebc77 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-09-18 +date: 2024-09-19 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 269d86ffe227f..17d91c23691f0 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-09-18 +date: 2024-09-19 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 5c19ea05d0bd0..1b6f3f3b59e2a 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-09-18 +date: 2024-09-19 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 160ab2b9e3a6b..d981958348228 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-09-18 +date: 2024-09-19 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 a030f92763918..f7f2ce9ea8a0a 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-09-18 +date: 2024-09-19 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 594aa04f65443..ac67d13cb2317 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-09-18 +date: 2024-09-19 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 69e994e185df8..1c93664d81b7e 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-09-18 +date: 2024-09-19 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 8ce072f9f5e71..37f87f2c0f709 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-09-18 +date: 2024-09-19 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 34bbe0e98e6a5..4bef06f610198 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json index 0adc32c67e70c..5d4477ab0e5b6 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json +++ b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json @@ -210,9 +210,9 @@ "section": "def-public.ChromeNavLink", "text": "ChromeNavLink" }, - "[]>; }; getIsSideNavCollapsed$: () => ", + "[]>; }; sideNav: { getIsCollapsed$: () => ", "Observable", - "; }; http: { basePath: ", + "; }; }; http: { basePath: ", "BasePathService", "; getLoadingCount$(): ", "Observable", diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index def852ed46cea..9171277f5ac32 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-09-18 +date: 2024-09-19 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 018d337eb6290..190e4fbbbc7aa 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-09-18 +date: 2024-09-19 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 47ce0f10b9686..87aee4cc2d8f4 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-09-18 +date: 2024-09-19 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 6fe543b4d31d1..cff0527d84169 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-09-18 +date: 2024-09-19 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 732162b4fba72..f6fb4fa262770 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 7d1b843292b4e..b1bd2e467f08b 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 cb7bf6035dace..a387d90e06596 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-09-18 +date: 2024-09-19 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 b45ef077014cb..a53952c52a767 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-09-18 +date: 2024-09-19 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 11960fcb37200..cd3b674ec0938 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-09-18 +date: 2024-09-19 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 ba1448bcc1613..b3e65d9ef7606 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-09-18 +date: 2024-09-19 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 c46ab03b2ff7d..caebf9395fedc 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-09-18 +date: 2024-09-19 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 03b4c4bb2f92e..1235397985595 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 5768ffcc54a90..2f28b139d3ed9 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-09-18 +date: 2024-09-19 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 69c0ccabf383d..eca75c00b2de9 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 6cbd614211485..e5e0a75ccc259 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-09-18 +date: 2024-09-19 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 785a2b06353d8..41dbf025c083f 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 a97b5088fb52a..d3434cf5aaf85 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-09-18 +date: 2024-09-19 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 8d86407476ffe..653c4ae035748 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 86d87b0347969..e0b0186b16a64 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-09-18 +date: 2024-09-19 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 d29f3b48c08ae..1c8337c173817 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 131de5c61f7f4..8495d47f914bc 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-09-18 +date: 2024-09-19 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 da78d5fbcd993..5b7588c110621 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-09-18 +date: 2024-09-19 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 5536b67d44b32..d020903accff5 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 5629833c14dfb..2d05f399289e2 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 c1db733dd43e6..f52c714b7680d 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-09-18 +date: 2024-09-19 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 134f4de9b5e05..dd44dc1f48854 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-09-18 +date: 2024-09-19 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 f6f2c6fc14781..9c8e17b814489 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 402be8b8575c4..a46fa56326bef 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-09-18 +date: 2024-09-19 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 621bcbf8f4f2e..16808df4326fc 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-09-18 +date: 2024-09-19 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 36febadf492ff..d12d26c6cf6fe 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-09-18 +date: 2024-09-19 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 17b320cd7efeb..7cbb31fb55451 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-09-18 +date: 2024-09-19 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 11b6e563567cc..27f111fff1881 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-09-18 +date: 2024-09-19 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 74ddb79c02e73..67b59c1a1ed9c 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-09-18 +date: 2024-09-19 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 fad19db620815..87dc1ffeb45fb 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-09-18 +date: 2024-09-19 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 ccff707a6bf29..ce260b5f2c5ee 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-09-18 +date: 2024-09-19 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 712e8c974bf85..c88e51f2f04f3 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-09-18 +date: 2024-09-19 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 bcd72c2fccb23..84d4f37d45f26 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-09-18 +date: 2024-09-19 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 db5d372a599ea..17c7b88b00c29 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-09-18 +date: 2024-09-19 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 5730bf1b71546..0d8e5a387a518 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-09-18 +date: 2024-09-19 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 1223eeb279bf3..a1659192b7415 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-09-18 +date: 2024-09-19 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.mdx b/api_docs/kbn_sse_utils_server.mdx index fd030a47f2287..2dd435f02a2f7 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-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 2897152d6c13f..b928fa9db82d9 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-09-18 +date: 2024-09-19 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 cddcbec813473..84f1fb9bfc311 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-09-18 +date: 2024-09-19 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 31800df93aa89..5453e3403f17e 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-09-18 +date: 2024-09-19 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 08b5a822d80ec..801fbdc55033d 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-09-18 +date: 2024-09-19 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 eba6ca069a4b6..52a083a6a376b 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-09-18 +date: 2024-09-19 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 3f79107db86b9..95df013dd9e11 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-09-18 +date: 2024-09-19 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 bda231384590e..c66cddc5344ef 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-09-18 +date: 2024-09-19 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 96d711ceb5fa1..33d97c97444b9 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-09-18 +date: 2024-09-19 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 ad6c898efd3c6..c586c3e35b760 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-09-18 +date: 2024-09-19 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 dc13bcc01955d..219f226c4f981 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 2a9fc5835e8ff..25aab2a1c3f9a 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 1b245386a0080..cf943f158fd20 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-09-18 +date: 2024-09-19 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 073b60a3de15c..ffa4fbdd7b720 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 412a933e6d566..ad2bc69c0a2bb 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-09-18 +date: 2024-09-19 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 5de4ad17aac42..4d29baf0e531e 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-09-18 +date: 2024-09-19 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 5a1b0e2565018..a08084a49411d 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-09-18 +date: 2024-09-19 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 df039500d80f5..5ad824398a1fc 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-09-18 +date: 2024-09-19 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 c8b58d39967b4..59589984956da 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-09-18 +date: 2024-09-19 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 82aff3edcbc36..728d30672c29b 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-09-18 +date: 2024-09-19 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.devdocs.json b/api_docs/kbn_ui_theme.devdocs.json index f7b49a9d755a3..b7c9d0a6f2831 100644 --- a/api_docs/kbn_ui_theme.devdocs.json +++ b/api_docs/kbn_ui_theme.devdocs.json @@ -85,6 +85,26 @@ "plugin": "@kbn/monaco", "path": "packages/kbn-monaco/src/console/theme.ts" }, + { + "plugin": "@kbn/monaco", + "path": "packages/kbn-monaco/src/console/theme.ts" + }, + { + "plugin": "@kbn/monaco", + "path": "packages/kbn-monaco/src/console/theme.ts" + }, + { + "plugin": "@kbn/monaco", + "path": "packages/kbn-monaco/src/console/theme.ts" + }, + { + "plugin": "@kbn/monaco", + "path": "packages/kbn-monaco/src/console/theme.ts" + }, + { + "plugin": "@kbn/monaco", + "path": "packages/kbn-monaco/src/console/theme.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/resolver/view/use_colors.ts" diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index aff8ce133d282..52ff58aed0223 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-09-18 +date: 2024-09-19 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 20a78940c45fc..13bfdf4cc2f60 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-09-18 +date: 2024-09-19 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 449b79a4cfadc..3f18343c30ddd 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-09-18 +date: 2024-09-19 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 f56b6dc1159d7..0478402b03845 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-09-18 +date: 2024-09-19 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 c6b25999d9136..0d82326a631b2 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-09-18 +date: 2024-09-19 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 9250063bc753c..26b26ae3e9d9b 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-09-18 +date: 2024-09-19 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 e539ae3743c54..e3074c1af1bc7 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-09-18 +date: 2024-09-19 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 44fceab8f6f1d..b012ed26e5c91 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-09-18 +date: 2024-09-19 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 b6ffd809d04cb..3a7328118bafc 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-09-18 +date: 2024-09-19 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 62514a19a7e81..a602af088fa1c 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-09-18 +date: 2024-09-19 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 55ec968eec334..f8f5c57263d6c 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 74837b08fda4c..bfff8db3d4d8b 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 332891c22b470..9877d754d624a 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 a56735bea9def..ea85cfeabb8fb 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-09-18 +date: 2024-09-19 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 30f1f76a3ee81..80a7064e20161 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-09-18 +date: 2024-09-19 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 62610b6007111..0e946f38fd650 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 181ddfbc551c8..1e1ab9cf94995 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 2e754720af420..9cb8dd2e7031f 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-09-18 +date: 2024-09-19 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 244c55b71b9da..795667ebbec00 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -2531,6 +2531,14 @@ "section": "def-public.ExecutionContextSetup", "text": "ExecutionContextSetup" }, + " | undefined; featureFlags?: ", + { + "pluginId": "@kbn/core-feature-flags-browser", + "scope": "public", + "docId": "kibKbnCoreFeatureFlagsBrowserPluginApi", + "section": "def-public.FeatureFlagsStart", + "text": "FeatureFlagsStart" + }, " | undefined; http?: ", { "pluginId": "@kbn/core-http-browser", diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 99d316eb2e11a..58f13f075de76 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-09-18 +date: 2024-09-19 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 d576b784c64c4..81d8f6ddd4648 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-09-18 +date: 2024-09-19 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 b995326e40973..0829a0ac795d5 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 5a7780defb2c6..c710047ba6b6e 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-09-18 +date: 2024-09-19 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 882a53e2ead89..76332e67cef29 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-09-18 +date: 2024-09-19 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 93c9f60a455b5..eee1100c17031 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-09-18 +date: 2024-09-19 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 c9d5725309855..298e6be6ca152 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-09-18 +date: 2024-09-19 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 b163335947a02..d220eae67492d 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-09-18 +date: 2024-09-19 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 39a68e95475eb..dc2318e4f9c8e 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 10e64b275c599..7d1c393c9717b 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-09-18 +date: 2024-09-19 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 6a9d8dcc95858..67ac3b6ca4f02 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-09-18 +date: 2024-09-19 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 074570c861370..22f844d28cfb5 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-09-18 +date: 2024-09-19 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 c484fe58fb061..9b6df22e1c3ef 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-09-18 +date: 2024-09-19 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 3fc862ef5d40e..80c0baf510a60 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-09-18 +date: 2024-09-19 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 9c3619fc1162f..6a39921ec4b24 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-09-18 +date: 2024-09-19 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 0fb4067befcdc..0a4ac38f88dbc 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-09-18 +date: 2024-09-19 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 3f4eb94a8dd1b..1dab75c111c56 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-09-18 +date: 2024-09-19 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 ae7971dd21b32..2911dee7b1c6d 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-09-18 +date: 2024-09-19 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 e154daf3c7951..a3f8188c30996 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-09-18 +date: 2024-09-19 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 a7d0b54beceb8..1ee8bf8379e10 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-09-18 +date: 2024-09-19 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 7cf11e837bf07..9dcd98217c0d0 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-09-18 +date: 2024-09-19 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 84e903f956d1d..4e812756c97bf 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-09-18 +date: 2024-09-19 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 d731830fbda27..1aeeca81cbaa6 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-09-18 +date: 2024-09-19 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 c5f241c28ac69..f3ff1211a9c4a 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 632d7b4d8b47c..e62ffba52ccab 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -2892,27 +2892,6 @@ "path": "x-pack/plugins/observability_solution/observability/public/plugin.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.ObservabilityPublicPluginsSetup.inventory", - "type": "Object", - "tags": [], - "label": "inventory", - "description": [], - "signature": [ - { - "pluginId": "inventory", - "scope": "public", - "docId": "kibInventoryPluginApi", - "section": "def-public.InventoryPublicSetup", - "text": "InventoryPublicSetup" - }, - " | undefined" - ], - "path": "x-pack/plugins/observability_solution/observability/public/plugin.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false @@ -3863,27 +3842,6 @@ "path": "x-pack/plugins/observability_solution/observability/public/plugin.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.ObservabilityPublicPluginsStart.inventory", - "type": "Object", - "tags": [], - "label": "inventory", - "description": [], - "signature": [ - { - "pluginId": "inventory", - "scope": "public", - "docId": "kibInventoryPluginApi", - "section": "def-public.InventoryPublicStart", - "text": "InventoryPublicStart" - }, - " | undefined" - ], - "path": "x-pack/plugins/observability_solution/observability/public/plugin.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 42eb7d13d4d77..50fa55a3a656c 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.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 | |-------------------|-----------|------------------------|-----------------| -| 712 | 2 | 705 | 22 | +| 710 | 2 | 703 | 22 | ## Client diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 31336a2f1fb4e..75922418bef35 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -1147,6 +1147,21 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.FunctionDefinition.scopes", + "type": "Array", + "tags": [], + "label": "scopes", + "description": [], + "signature": [ + "AssistantScope", + "[] | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1459,7 +1474,9 @@ "section": "def-common.FunctionDefinition", "text": "FunctionDefinition" }, - ", \"name\" | \"description\" | \"parameters\">[] | undefined; functionCall?: string | undefined; signal: AbortSignal; }) => ", + ", \"name\" | \"description\" | \"parameters\">[] | undefined; functionCall?: string | undefined; signal: AbortSignal; scope: ", + "AssistantScope", + "; }) => ", "Observable", "<", { @@ -1582,6 +1599,20 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.ObservabilityAIAssistantChatService.chat.$2.scope", + "type": "CompoundType", + "tags": [], + "label": "scope", + "description": [], + "signature": [ + "\"search\" | \"observability\" | \"all\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", + "deprecated": false, + "trackAdoption": false } ] } @@ -1608,7 +1639,9 @@ }, "[]; persist: boolean; disableFunctions: boolean | { except: string[]; }; signal: AbortSignal; instructions?: ", "AdHocInstruction", - "[] | undefined; }) => ", + "[] | undefined; scope: ", + "AssistantScope", + "; }) => ", "Observable", "<", { @@ -1752,6 +1785,20 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.ObservabilityAIAssistantChatService.complete.$1.scope", + "type": "CompoundType", + "tags": [], + "label": "scope", + "description": [], + "signature": [ + "\"search\" | \"observability\" | \"all\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", + "deprecated": false, + "trackAdoption": false } ] } @@ -1766,7 +1813,9 @@ "label": "getFunctions", "description": [], "signature": [ - "(options?: { contexts?: string[] | undefined; filter?: string | undefined; } | undefined) => ", + "(options?: { contexts?: string[] | undefined; filter?: string | undefined; scope: ", + "AssistantScope", + "; } | undefined) => ", { "pluginId": "observabilityAIAssistant", "scope": "common", @@ -1818,6 +1867,20 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.ObservabilityAIAssistantChatService.getFunctions.$1.scope", + "type": "CompoundType", + "tags": [], + "label": "scope", + "description": [], + "signature": [ + "\"search\" | \"observability\" | \"all\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", + "deprecated": false, + "trackAdoption": false } ] } @@ -1927,7 +1990,9 @@ "section": "def-public.ChatActionClickHandler", "text": "ChatActionClickHandler" }, - ") => React.ReactNode" + ", scope?: ", + "AssistantScope", + " | undefined) => React.ReactNode" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -2024,6 +2089,22 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.ObservabilityAIAssistantChatService.renderFunction.$5", + "type": "CompoundType", + "tags": [], + "label": "scope", + "description": [], + "signature": [ + "AssistantScope", + " | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -2050,7 +2131,7 @@ "label": "callApi", "description": [], "signature": [ - "(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", + "(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -2370,7 +2451,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/functions\": ", + ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -2378,7 +2459,19 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/functions\", undefined, ", + "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -2766,7 +2859,15 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; }>; }>]>, ", + ", unknown>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -2790,7 +2891,15 @@ "StringC", "; connectorId: ", "StringC", - "; }>; }>, ", + "; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -2848,7 +2957,15 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; }>, ", + "; }>]>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -3178,7 +3295,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/functions\": ", + ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -3186,7 +3303,19 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/functions\", undefined, ", + "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -3574,7 +3703,15 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; }>; }>]>, ", + ", unknown>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -3598,7 +3735,15 @@ "StringC", "; connectorId: ", "StringC", - "; }>; }>, ", + "; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -3656,7 +3801,15 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; }>, ", + "; }>]>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -3937,6 +4090,20 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.ObservabilityAIAssistantService.scope", + "type": "CompoundType", + "tags": [], + "label": "scope", + "description": [], + "signature": [ + "\"search\" | \"observability\" | \"all\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -4613,7 +4780,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/functions\": ", + ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -4621,7 +4788,19 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/functions\", undefined, ", + "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -5009,7 +5188,15 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; }>; }>]>, ", + ", unknown>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -5033,7 +5220,15 @@ "StringC", "; connectorId: ", "StringC", - "; }>; }>, ", + "; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -5091,7 +5286,15 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; }>, ", + "; }>]>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -5652,7 +5855,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/functions\": ", + ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -5660,7 +5863,19 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/functions\", undefined, ", + "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -6048,7 +6263,15 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; }>; }>]>, ", + ", unknown>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -6072,7 +6295,15 @@ "StringC", "; connectorId: ", "StringC", - "; }>; }>, ", + "; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -6130,7 +6361,15 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; }>, ", + "; }>]>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -6187,7 +6426,7 @@ "label": "ObservabilityAIAssistantAPIEndpoint", "description": [], "signature": [ - "\"POST /internal/observability_ai_assistant/chat\" | \"POST /internal/observability_ai_assistant/chat/recall\" | \"POST /internal/observability_ai_assistant/chat/complete\" | \"POST /api/observability_ai_assistant/chat/complete 2023-10-31\" | \"GET /internal/observability_ai_assistant/conversation/{conversationId}\" | \"POST /internal/observability_ai_assistant/conversations\" | \"POST /internal/observability_ai_assistant/conversation\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/title\" | \"DELETE /internal/observability_ai_assistant/conversation/{conversationId}\" | \"GET /internal/observability_ai_assistant/connectors\" | \"GET /internal/observability_ai_assistant/functions\" | \"POST /internal/observability_ai_assistant/functions/recall\" | \"POST /internal/observability_ai_assistant/functions/summarize\" | \"POST /internal/observability_ai_assistant/kb/setup\" | \"GET /internal/observability_ai_assistant/kb/status\" | \"GET /internal/observability_ai_assistant/kb/entries\" | \"PUT /internal/observability_ai_assistant/kb/user_instructions\" | \"GET /internal/observability_ai_assistant/kb/user_instructions\" | \"POST /internal/observability_ai_assistant/kb/entries/import\" | \"POST /internal/observability_ai_assistant/kb/entries/save\" | \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\"" + "\"POST /internal/observability_ai_assistant/chat\" | \"POST /internal/observability_ai_assistant/chat/recall\" | \"POST /internal/observability_ai_assistant/chat/complete\" | \"POST /api/observability_ai_assistant/chat/complete 2023-10-31\" | \"GET /internal/observability_ai_assistant/conversation/{conversationId}\" | \"POST /internal/observability_ai_assistant/conversations\" | \"POST /internal/observability_ai_assistant/conversation\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/title\" | \"DELETE /internal/observability_ai_assistant/conversation/{conversationId}\" | \"GET /internal/observability_ai_assistant/connectors\" | \"GET /internal/observability_ai_assistant/{scope}/functions\" | \"POST /internal/observability_ai_assistant/functions/recall\" | \"POST /internal/observability_ai_assistant/functions/summarize\" | \"POST /internal/observability_ai_assistant/kb/setup\" | \"GET /internal/observability_ai_assistant/kb/status\" | \"GET /internal/observability_ai_assistant/kb/entries\" | \"PUT /internal/observability_ai_assistant/kb/user_instructions\" | \"GET /internal/observability_ai_assistant/kb/user_instructions\" | \"POST /internal/observability_ai_assistant/kb/entries/import\" | \"POST /internal/observability_ai_assistant/kb/entries/save\" | \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\"" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/api/index.ts", "deprecated": false, @@ -6598,7 +6837,9 @@ "label": "props", "description": [], "signature": [ - "{ connectorId?: string | undefined; service: ", + "{ scope: ", + "AssistantScope", + "; connectorId?: string | undefined; service: ", { "pluginId": "observabilityAIAssistant", "scope": "public", @@ -7212,7 +7453,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/functions\": ", + ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -7220,7 +7461,19 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/functions\", undefined, ", + "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -7608,7 +7861,15 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; }>; }>]>, ", + ", unknown>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -7632,7 +7893,15 @@ "StringC", "; connectorId: ", "StringC", - "; }>; }>, ", + "; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -7690,7 +7959,15 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; }>, ", + "; }>]>>; scope: ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -8544,6 +8821,21 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-common.FunctionDefinition.scopes", + "type": "Array", + "tags": [], + "label": "scopes", + "description": [], + "signature": [ + "AssistantScope", + "[] | undefined" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 88ce50eaa6121..1fcc33dfd65e3 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-09-18 +date: 2024-09-19 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 | |-------------------|-----------|------------------------|-----------------| -| 286 | 1 | 284 | 27 | +| 293 | 1 | 291 | 28 | ## Client diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 2c226e93668e1..9a78da55b3900 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index ceb0e71ccb639..2c9d82f458998 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-09-18 +date: 2024-09-19 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 0cb7ec36a3566..75bb69a167fb4 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-09-18 +date: 2024-09-19 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 49985c0ce23e1..5cb3b90bfcdd2 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index df684914c0f7b..3f8a9696ceff3 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -4355,6 +4355,106 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocatorDefinition", + "type": "Class", + "tags": [], + "label": "ServiceEntityLocatorDefinition", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.ServiceEntityLocatorDefinition", + "text": "ServiceEntityLocatorDefinition" + }, + " implements ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorDefinition", + "text": "LocatorDefinition" + }, + "<", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.ServiceEntityLocatorParams", + "text": "ServiceEntityLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocatorDefinition.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "\"SERVICE_ENTITY_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocatorDefinition.getLocation", + "type": "Function", + "tags": [], + "label": "getLocation", + "description": [], + "signature": [ + "({ serviceName }: ", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.ServiceEntityLocatorParams", + "text": "ServiceEntityLocatorParams" + }, + ") => Promise<{ app: string; path: string; state: {}; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocatorDefinition.getLocation.$1", + "type": "Object", + "tags": [], + "label": "{ serviceName }", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.ServiceEntityLocatorParams", + "text": "ServiceEntityLocatorParams" + } + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ServiceOverviewLocatorDefinition", @@ -4754,6 +4854,106 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocatorDefinition", + "type": "Class", + "tags": [], + "label": "TransactionDetailsByTraceIdLocatorDefinition", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.TransactionDetailsByTraceIdLocatorDefinition", + "text": "TransactionDetailsByTraceIdLocatorDefinition" + }, + " implements ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorDefinition", + "text": "LocatorDefinition" + }, + "<", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.TransactionDetailsByTraceIdLocatorParams", + "text": "TransactionDetailsByTraceIdLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocatorDefinition.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "\"TRANSACTION_DETAILS_BY_TRACE_ID_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocatorDefinition.getLocation", + "type": "Function", + "tags": [], + "label": "getLocation", + "description": [], + "signature": [ + "({ traceId }: ", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.TransactionDetailsByTraceIdLocatorParams", + "text": "TransactionDetailsByTraceIdLocatorParams" + }, + ") => Promise<{ app: string; path: string; state: {}; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocatorDefinition.getLocation.$1", + "type": "Object", + "tags": [], + "label": "{ traceId }", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.TransactionDetailsByTraceIdLocatorParams", + "text": "TransactionDetailsByTraceIdLocatorParams" + } + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false } ], "functions": [ @@ -5585,6 +5785,48 @@ "children": [], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocatorParams", + "type": "Interface", + "tags": [], + "label": "ServiceEntityLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.ServiceEntityLocatorParams", + "text": "ServiceEntityLocatorParams" + }, + " extends ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + } + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocatorParams.serviceName", + "type": "string", + "tags": [], + "label": "serviceName", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ServiceOverviewParams", @@ -5902,6 +6144,48 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocatorParams", + "type": "Interface", + "tags": [], + "label": "TransactionDetailsByTraceIdLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.TransactionDetailsByTraceIdLocatorParams", + "text": "TransactionDetailsByTraceIdLocatorParams" + }, + " extends ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + } + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocatorParams.traceId", + "type": "string", + "tags": [], + "label": "traceId", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "enums": [ @@ -7326,6 +7610,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.SERVICE_ENTITY_LOCATOR", + "type": "string", + "tags": [], + "label": "SERVICE_ENTITY_LOCATOR", + "description": [], + "signature": [ + "\"SERVICE_ENTITY_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.SERVICE_ENVIRONMENT", @@ -7476,6 +7775,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.ServiceEntityLocator", + "type": "Type", + "tags": [], + "label": "ServiceEntityLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.ServiceEntityLocatorParams", + "text": "ServiceEntityLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_entity_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ServiceOverviewLocator", @@ -7908,6 +8237,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.TRANSACTION_DETAILS_BY_TRACE_ID_LOCATOR", + "type": "string", + "tags": [], + "label": "TRANSACTION_DETAILS_BY_TRACE_ID_LOCATOR", + "description": [], + "signature": [ + "\"TRANSACTION_DETAILS_BY_TRACE_ID_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.TRANSACTION_DOM_INTERACTIVE", @@ -8118,6 +8462,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.TransactionDetailsByTraceIdLocator", + "type": "Type", + "tags": [], + "label": "TransactionDetailsByTraceIdLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.TransactionDetailsByTraceIdLocatorParams", + "text": "TransactionDetailsByTraceIdLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_trace_id_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.URL_FULL", diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 68fccf37506ae..3841f69b9dcdb 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 458 | 1 | 453 | 19 | +| 474 | 1 | 469 | 19 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index fa2be935f494d..44d60b6bb2e3c 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-09-18 +date: 2024-09-19 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 76ff46a9a46fb..12a68cf4d47d1 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-09-18 +date: 2024-09-19 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 6f2c6be6b270c..8b7d0fee618e1 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-09-18 +date: 2024-09-19 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 | |--------------|----------|------------------------| -| 854 | 728 | 45 | +| 860 | 733 | 45 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53054 | 245 | 39862 | 1970 | +| 53176 | 245 | 39877 | 1962 | ## Plugin Directory @@ -43,7 +43,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | 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 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | Defend for containers (D4C) | 52 | 0 | 43 | 2 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Provides the necessary APIs to implement A/B testing scenarios, fetching the variations in configuration and reporting back metrics to track conversion rates of the experiments. | 12 | 0 | 0 | 0 | +| cloudExperiments | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Provides the necessary APIs to implement A/B testing scenarios, fetching the variations in configuration and reporting back metrics to track conversion rates of the experiments. | 0 | 0 | 0 | 0 | | cloudFullStory | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | When Kibana runs on Elastic Cloud, this plugin registers FullStory as a shipper for telemetry. | 0 | 0 | 0 | 0 | | cloudLinks | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Adds the links to the Elastic Cloud console | 0 | 0 | 0 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 13 | 0 | 2 | 2 | @@ -68,7 +68,7 @@ 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 | 16 | 0 | 15 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 49 | 0 | 35 | 2 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 53 | 0 | 38 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 575 | 1 | 465 | 9 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | @@ -114,12 +114,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 1 | 0 | 1 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 243 | 0 | 238 | 1 | -| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 49 | 0 | 44 | 14 | +| | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 49 | 0 | 44 | 15 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 23 | 0 | 23 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 127 | 2 | 100 | 4 | -| | [@elastic/security-scalability](https://github.com/orgs/elastic/teams/security-scalability) | Plugin implementing the Integration Assistant API and UI | 54 | 0 | 46 | 3 | +| | [@elastic/security-scalability](https://github.com/orgs/elastic/teams/security-scalability) | Plugin implementing the Integration Assistant API and UI | 59 | 0 | 49 | 4 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 5 | 0 | 5 | 3 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 43 | 0 | 43 | 4 | @@ -151,13 +151,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 712 | 2 | 705 | 22 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 286 | 1 | 284 | 27 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 710 | 2 | 703 | 22 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 293 | 1 | 291 | 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) | - | 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) | - | 23 | 0 | 23 | 0 | -| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 458 | 1 | 453 | 19 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 474 | 1 | 469 | 19 | | | [@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 | @@ -196,7 +196,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 121 | 0 | 60 | 12 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 59 | 0 | 59 | 1 | | | [@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. | 261 | 0 | 67 | 0 | +| | [@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. | 262 | 0 | 67 | 0 | | | [@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 | | 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 | @@ -316,7 +316,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 207 | 0 | 100 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 207 | 0 | 101 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | @@ -353,12 +353,18 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 29 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 38 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 116 | 4 | 37 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 16 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 10 | 1 | 10 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 13 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 22 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 3 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | @@ -375,9 +381,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 36 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 38 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 40 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 42 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 41 | 0 | 34 | 0 | @@ -510,12 +516,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 269 | 1 | 209 | 15 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 27 | 0 | 27 | 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) | - | 177 | 1 | 139 | 31 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 177 | 1 | 139 | 20 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 73 | 0 | 69 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 199 | 0 | 187 | 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) | - | 43 | 0 | 17 | 3 | +| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 44 | 0 | 17 | 3 | | | [@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) | - | 49 | 0 | 40 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 0 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 6a609c7516bb2..475a25bcecca0 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 1e871b9b14c74..6a7cb962df0c4 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index d47cb3204acdd..8d41fd935826c 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-09-18 +date: 2024-09-19 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 d5f1ea40f27a9..daf1548822c30 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-09-18 +date: 2024-09-19 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 7e06b944d9753..2133c43aae0bc 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-09-18 +date: 2024-09-19 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 6097cfe772a78..9b10a13e37828 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-09-18 +date: 2024-09-19 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 8bd0c3a198cdc..437c1b589d3a5 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-09-18 +date: 2024-09-19 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 bd3e41af24f57..c47ad40ca0294 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-09-18 +date: 2024-09-19 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 36092437a308f..f78b57c27cf8f 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-09-18 +date: 2024-09-19 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 49129c7113dd5..cc436a6a8c0d0 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-09-18 +date: 2024-09-19 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 06bcd7b490db8..765fa84ab4b81 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-09-18 +date: 2024-09-19 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 4a029eb6acbce..bab2c2656ea2b 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-09-18 +date: 2024-09-19 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 63abf122ec357..f3e853fe8fc9d 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-09-18 +date: 2024-09-19 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 ecb81dfd1e9f6..e2d111ce10bd4 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-09-18 +date: 2024-09-19 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 a143fd453b1ee..24c0b2e66bc74 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-09-18 +date: 2024-09-19 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 39b19566a9343..517d894c5d23d 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-09-18 +date: 2024-09-19 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 40a8b687132d3..8376a73aae604 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-09-18 +date: 2024-09-19 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 5d5f1cbe1dd49..a5a24f994be59 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-09-18 +date: 2024-09-19 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 e8a47304cafc6..9406cb2724fd2 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-09-18 +date: 2024-09-19 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 e88ff4683ff2a..9b9ecdf965cb2 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-09-18 +date: 2024-09-19 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 48a38077264e3..724d9bdc0093f 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-09-18 +date: 2024-09-19 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 9b2165380b466..c44f1e084d94b 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index d6a794293e2de..5b3249d6453cb 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-09-18 +date: 2024-09-19 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 c47de5ffb1083..4b500f39b99c0 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 5105e0ae1bcb4..649ec1747823e 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-09-18 +date: 2024-09-19 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 e9a4783e5dfb0..e92f1c1fc97d4 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -390,7 +390,7 @@ "label": "data", "description": [], "signature": [ - "({ id: string; type: \"eql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"eql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; event_category_override?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"saved_query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; query?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"threshold\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threshold: { value: number; field: string | string[]; cardinality?: { value: number; field: string; }[] | undefined; }; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"threat_match\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { value: string; type: \"mapping\"; field: string; }[]; }[]; threat_index: string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"kuery\" | \"lucene\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { id: string; type: \"machine_learning\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: string | string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"new_terms\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"esql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"esql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; })[]" + "({ id: string; type: \"eql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"eql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; event_category_override?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; saved_id?: string | undefined; } | { id: string; type: \"saved_query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; query?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"threshold\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threshold: { value: number; field: string | string[]; cardinality?: { value: number; field: string; }[] | undefined; }; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"threat_match\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { value: string; type: \"mapping\"; field: string; }[]; }[]; threat_index: string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"kuery\" | \"lucene\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { id: string; type: \"machine_learning\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: string | string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"new_terms\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"esql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"esql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; })[]" ], "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management/logic/types.ts", "deprecated": false, @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"automatedResponseActionsForMoreRulesEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"assistantNaturalLanguageESQLTool\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"automatedResponseActionsForMoreRulesEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"assistantNaturalLanguageESQLTool\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1931,7 +1931,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ 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 securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: 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 jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: 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 automatedResponseActionsForMoreRulesEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: 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 jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3099,7 +3099,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: 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 jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: 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 automatedResponseActionsForMoreRulesEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: 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 jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3275,7 +3275,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ 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 securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: 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 jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: 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 automatedResponseActionsForMoreRulesEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: 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 jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3341,7 +3341,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly assistantBedrockChat: true; 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 jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly automatedResponseActionsForMoreRulesEnabled: false; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly assistantBedrockChat: true; readonly assistantNaturalLanguageESQLTool: 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 jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreEnabled: 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 81df964186e77..dd33b632b8d0a 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-09-18 +date: 2024-09-19 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 19cbfc2e6bafb..9801ba681ebfe 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-09-18 +date: 2024-09-19 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 79840e6b8878b..9f044c4d13023 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-09-18 +date: 2024-09-19 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 46c90ae388b6f..afff3efda9ad9 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-09-18 +date: 2024-09-19 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 661b37f511349..e6871a1543a4e 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-09-18 +date: 2024-09-19 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 ea1b986f5848c..83258dec5ca8e 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-09-18 +date: 2024-09-19 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 da09a02f5e074..156d5cb010e00 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 4215aea14bd4c..046c5756fc8ac 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index bbedbdc57b45e..429b93bf87257 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 13a28950ba1ed..4a7647ee1aea5 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.devdocs.json b/api_docs/spaces.devdocs.json index 320429beae408..c21f0b6a20fc3 100644 --- a/api_docs/spaces.devdocs.json +++ b/api_docs/spaces.devdocs.json @@ -2877,7 +2877,7 @@ "\nSetup contract for the Spaces plugin." ], "signature": [ - "{ hasOnlyDefaultSpace: boolean; }" + "{ hasOnlyDefaultSpace: boolean; isSolutionViewEnabled: boolean; }" ], "path": "x-pack/plugins/spaces/public/plugin.tsx", "deprecated": false, @@ -2986,6 +2986,19 @@ "path": "x-pack/plugins/spaces/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "spaces", + "id": "def-public.SpacesApi.isSolutionViewEnabled", + "type": "boolean", + "tags": [], + "label": "isSolutionViewEnabled", + "description": [ + "\nIndicates whether the solution view is enabled." + ], + "path": "x-pack/plugins/spaces/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "lifecycle": "start", diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 94a2e9c36a95a..b2bf462c7558f 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 261 | 0 | 67 | 0 | +| 262 | 0 | 67 | 0 | ## Client diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 1a8f7b7d2534c..746e80d55123a 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-09-18 +date: 2024-09-19 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 6f94fbfc317be..53f753faf7164 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 62da24cc1d05d..f96eb54d5b787 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-09-18 +date: 2024-09-19 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 53f64ab20f0fe..cbb61979b9db6 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-09-18 +date: 2024-09-19 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 2697f5f0bb155..c454fb6f87a9e 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 5c303985c965e..a3f15638b1faf 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 4f00747ec479a..86c536a6ea0ae 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-09-18 +date: 2024-09-19 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 5eefa9a9ebd21..0345d9b86b24e 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index d8d4fe3b89a9c..be6441092a53a 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-09-18 +date: 2024-09-19 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 b91e4fa165b4d..ed1a6889a4a85 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-09-18 +date: 2024-09-19 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 04cf49812adce..7bd9c10a5316b 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 5144196f6635f..c7c53fd3fec38 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-09-18 +date: 2024-09-19 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 5d9cb2b31eebb..9b070a43c2c0f 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-09-18 +date: 2024-09-19 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 f72e804b81bfe..8c0aeb892fb08 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-09-18 +date: 2024-09-19 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 69f8933fa04b7..f2b5f1b4f69a5 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-09-18 +date: 2024-09-19 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 6efe66e87fc52..a5a9ddc4fbad9 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-09-18 +date: 2024-09-19 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 2aa47ed448562..063b1145c64c0 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-09-18 +date: 2024-09-19 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 153a31cba2904..9604fda7ba56e 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-09-18 +date: 2024-09-19 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 688ad473a6507..411c8cd897007 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-09-18 +date: 2024-09-19 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 df3a3848fc744..b06b0978a5d7e 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-09-18 +date: 2024-09-19 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 77f96e867c9c0..0fa3933c116df 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index cb24c4a466b1f..50c6abcb515f9 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-09-18 +date: 2024-09-19 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 a59ada9c1358b..c496196374271 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-09-18 +date: 2024-09-19 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 0ea80b4e31bae..b29872f7d3045 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-09-18 +date: 2024-09-19 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 5069bfbdcd3a2..fd1dc05b2342e 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-09-18 +date: 2024-09-19 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 a906e098c5563..bd8202c5aba44 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-09-18 +date: 2024-09-19 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 06b417bf51209..22021798f10c9 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-09-18 +date: 2024-09-19 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 edd0cb1982c3e..90284453cbedf 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-09-18 +date: 2024-09-19 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 8be97aa70d9f3..d249bcf3d431e 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-09-18 +date: 2024-09-19 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 4274f05f63375..e39fb35c7ca7e 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-09-18 +date: 2024-09-19 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 cb16b1acafb38..bdd1dc74670f2 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 19a8c7760e56e..604c9238d8498 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-09-18 +date: 2024-09-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/dev_docs/nav-kibana-dev.docnav.json b/dev_docs/nav-kibana-dev.docnav.json index 2a9893898e8c5..dc8a4373f5450 100644 --- a/dev_docs/nav-kibana-dev.docnav.json +++ b/dev_docs/nav-kibana-dev.docnav.json @@ -136,10 +136,6 @@ }, { "id": "kibDevDocsEmbeddables" - }, - { - "id": "kibCloudExperimentsPlugin", - "label": "A/B testing on Elastic Cloud" } ] }, @@ -205,6 +201,10 @@ }, { "id": "kibDevTutorialCcsSetup" + }, + { + "id": "kibFeatureFlagsService", + "label": "Feature Flags" } ] }, @@ -646,4 +646,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 7e31cd50aeb81..38fc136ef1fac 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -499,8 +499,8 @@ The plugin exposes the static DefaultEditorController class to consume. |{kib-repo}blob/{branch}/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx[cloudExperiments] -|[!WARNING] -These APIs are deprecated and should not be used as we're working on a replacement Core Feature Flags Service that will arrive soon. +|[!NOTE] +This plugin no-longer exposes any evaluation APIs. Refer to for more information about how to interact with feature flags. |{kib-repo}blob/{branch}/x-pack/plugins/cloud_integrations/cloud_full_story/README.md[cloudFullStory] diff --git a/examples/feature_flags_example/README.md b/examples/feature_flags_example/README.md new file mode 100755 index 0000000000000..54ecd4126683d --- /dev/null +++ b/examples/feature_flags_example/README.md @@ -0,0 +1,5 @@ +# featureFlagsExample + +This plugin's goal is to demonstrate how to use the core feature flags service. + +Refer to [the docs](../../packages/core/feature-flags/README.mdx) to know more. diff --git a/examples/feature_flags_example/common/feature_flags.ts b/examples/feature_flags_example/common/feature_flags.ts new file mode 100644 index 0000000000000..fcff25bbd2c42 --- /dev/null +++ b/examples/feature_flags_example/common/feature_flags.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", 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 FeatureFlagExampleBoolean = 'example-boolean'; +export const FeatureFlagExampleString = 'example-string'; +export const FeatureFlagExampleNumber = 'example-number'; diff --git a/examples/feature_flags_example/common/index.ts b/examples/feature_flags_example/common/index.ts new file mode 100644 index 0000000000000..37bde8e9843e1 --- /dev/null +++ b/examples/feature_flags_example/common/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 const PLUGIN_ID = 'featureFlagsExample'; +export const PLUGIN_NAME = 'Feature Flags Example'; diff --git a/examples/feature_flags_example/kibana.jsonc b/examples/feature_flags_example/kibana.jsonc new file mode 100644 index 0000000000000..c2a855723bdac --- /dev/null +++ b/examples/feature_flags_example/kibana.jsonc @@ -0,0 +1,13 @@ +{ + "type": "plugin", + "id": "@kbn/feature-flags-example-plugin", + "owner": "@elastic/kibana-core", + "description": "Plugin that shows how to make use of the feature flags core service.", + "plugin": { + "id": "featureFlagsExample", + "server": true, + "browser": true, + "requiredPlugins": ["developerExamples"], + "optionalPlugins": [] + } +} diff --git a/examples/feature_flags_example/public/application.tsx b/examples/feature_flags_example/public/application.tsx new file mode 100644 index 0000000000000..eab558d9301bd --- /dev/null +++ b/examples/feature_flags_example/public/application.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; +import { KibanaRootContextProvider } from '@kbn/react-kibana-context-root'; +import { FeatureFlagsExampleApp } from './components/app'; + +export const renderApp = (coreStart: CoreStart, { element }: AppMountParameters) => { + const { notifications, http, featureFlags } = coreStart; + ReactDOM.render( + + + + + , + element + ); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/examples/feature_flags_example/public/components/app.tsx b/examples/feature_flags_example/public/components/app.tsx new file mode 100644 index 0000000000000..432e7dc348abc --- /dev/null +++ b/examples/feature_flags_example/public/components/app.tsx @@ -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", 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 { + EuiHorizontalRule, + EuiPageTemplate, + EuiTitle, + EuiText, + EuiLink, + EuiListGroup, + EuiListGroupItem, +} from '@elastic/eui'; +import type { CoreStart, FeatureFlagsStart } from '@kbn/core/public'; + +import useObservable from 'react-use/lib/useObservable'; +import { + FeatureFlagExampleBoolean, + FeatureFlagExampleNumber, + FeatureFlagExampleString, +} from '../../common/feature_flags'; +import { PLUGIN_NAME } from '../../common'; + +interface FeatureFlagsExampleAppDeps { + featureFlags: FeatureFlagsStart; + notifications: CoreStart['notifications']; + http: CoreStart['http']; +} + +export const FeatureFlagsExampleApp = ({ featureFlags }: FeatureFlagsExampleAppDeps) => { + // Fetching the feature flags synchronously + const bool = featureFlags.getBooleanValue(FeatureFlagExampleBoolean, false); + const str = featureFlags.getStringValue(FeatureFlagExampleString, 'red'); + const num = featureFlags.getNumberValue(FeatureFlagExampleNumber, 1); + + // Use React Hooks to observe feature flags changes + const bool$ = useObservable(featureFlags.getBooleanValue$(FeatureFlagExampleBoolean, false)); + const str$ = useObservable(featureFlags.getStringValue$(FeatureFlagExampleString, 'red')); + const num$ = useObservable(featureFlags.getNumberValue$(FeatureFlagExampleNumber, 1)); + + return ( + <> + + + +

{PLUGIN_NAME}

+
+
+ + +

Demo of the feature flags service

+
+ +

+ To learn more, refer to{' '} + + the docs + + . +

+ + +

+ The feature flags are: + + + +

+
+ +

+ The observed feature flags are: + + + +

+
+
+
+
+ + ); +}; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts b/examples/feature_flags_example/public/index.ts similarity index 60% rename from packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts rename to examples/feature_flags_example/public/index.ts index e53268466497d..9324fbb56bc2e 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts +++ b/examples/feature_flags_example/public/index.ts @@ -7,12 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; -import { useWindowSize } from './use_window_size'; +import { FeatureFlagsExamplePlugin } from './plugin'; -describe('useWindowSize', () => { - it('should return the window size', () => { - const hookResult = renderHook(() => useWindowSize()); - expect(hookResult.result.current).toEqual(1024); - }); -}); +export function plugin() { + return new FeatureFlagsExamplePlugin(); +} diff --git a/examples/feature_flags_example/public/plugin.ts b/examples/feature_flags_example/public/plugin.ts new file mode 100644 index 0000000000000..915c40dcaafe8 --- /dev/null +++ b/examples/feature_flags_example/public/plugin.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 { AppMountParameters, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; +import { AppPluginSetupDependencies } from './types'; +import { PLUGIN_NAME } from '../common'; + +export class FeatureFlagsExamplePlugin implements Plugin { + public setup(core: CoreSetup, deps: AppPluginSetupDependencies) { + // Register an application into the side navigation menu + core.application.register({ + id: 'featureFlagsExample', + title: PLUGIN_NAME, + async mount(params: AppMountParameters) { + // Load application bundle + const { renderApp } = await import('./application'); + // Get start services as specified in kibana.json + const [coreStart] = await core.getStartServices(); + // Render the application + return renderApp(coreStart, params); + }, + }); + + deps.developerExamples.register({ + appId: 'featureFlagsExample', + title: PLUGIN_NAME, + description: 'Plugin that shows how to make use of the feature flags core service.', + }); + } + + public start(core: CoreStart) {} + + public stop() {} +} diff --git a/examples/feature_flags_example/public/types.ts b/examples/feature_flags_example/public/types.ts new file mode 100644 index 0000000000000..7f3f7107a1385 --- /dev/null +++ b/examples/feature_flags_example/public/types.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". + */ + +import type { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; + +export interface AppPluginSetupDependencies { + developerExamples: DeveloperExamplesSetup; +} diff --git a/examples/feature_flags_example/server/index.ts b/examples/feature_flags_example/server/index.ts new file mode 100644 index 0000000000000..ad88372a7e11e --- /dev/null +++ b/examples/feature_flags_example/server/index.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", 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 { FeatureFlagDefinitions } from '@kbn/core-feature-flags-server'; +import type { PluginInitializerContext } from '@kbn/core-plugins-server'; +import { + FeatureFlagExampleBoolean, + FeatureFlagExampleNumber, + FeatureFlagExampleString, +} from '../common/feature_flags'; + +export const featureFlags: FeatureFlagDefinitions = [ + { + key: FeatureFlagExampleBoolean, + name: 'Example boolean', + description: 'This is a demo of a boolean flag', + tags: ['example', 'my-plugin'], + variationType: 'boolean', + variations: [ + { + name: 'On', + description: 'Auto-hides the bar', + value: true, + }, + { + name: 'Off', + description: 'Static always-on', + value: false, + }, + ], + }, + { + key: FeatureFlagExampleString, + name: 'Example string', + description: 'This is a demo of a string flag', + tags: ['example', 'my-plugin'], + variationType: 'string', + variations: [ + { + name: 'Pink', + value: '#D75489', + }, + { + name: 'Turquoise', + value: '#65BAAF', + }, + ], + }, + { + key: FeatureFlagExampleNumber, + name: 'Example Number', + description: 'This is a demo of a number flag', + tags: ['example', 'my-plugin'], + variationType: 'number', + variations: [ + { + name: 'Five', + value: 5, + }, + { + name: 'Ten', + value: 10, + }, + ], + }, +]; + +export async function plugin(initializerContext: PluginInitializerContext) { + const { FeatureFlagsExamplePlugin } = await import('./plugin'); + return new FeatureFlagsExamplePlugin(initializerContext); +} diff --git a/examples/feature_flags_example/server/plugin.ts b/examples/feature_flags_example/server/plugin.ts new file mode 100644 index 0000000000000..3abd4554eb335 --- /dev/null +++ b/examples/feature_flags_example/server/plugin.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 type { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '@kbn/core/server'; +import { combineLatest } from 'rxjs'; + +import { + FeatureFlagExampleBoolean, + FeatureFlagExampleNumber, + FeatureFlagExampleString, +} from '../common/feature_flags'; +import { defineRoutes } from './routes'; + +export class FeatureFlagsExamplePlugin implements Plugin { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + + // Register server side APIs + defineRoutes(router); + } + + public start(core: CoreStart) { + // Promise form: when we need to fetch it once, like in an HTTP request + void Promise.all([ + core.featureFlags.getBooleanValue(FeatureFlagExampleBoolean, false), + core.featureFlags.getStringValue(FeatureFlagExampleString, 'white'), + core.featureFlags.getNumberValue(FeatureFlagExampleNumber, 1), + ]).then(([bool, str, num]) => { + this.logger.info(`The feature flags are: + - ${FeatureFlagExampleBoolean}: ${bool} + - ${FeatureFlagExampleString}: ${str} + - ${FeatureFlagExampleNumber}: ${num} + `); + }); + + // Observable form: when we need to react to the changes + combineLatest([ + core.featureFlags.getBooleanValue$(FeatureFlagExampleBoolean, false), + core.featureFlags.getStringValue$(FeatureFlagExampleString, 'red'), + core.featureFlags.getNumberValue$(FeatureFlagExampleNumber, 1), + ]).subscribe(([bool, str, num]) => { + this.logger.info(`The observed feature flags are: + - ${FeatureFlagExampleBoolean}: ${bool} + - ${FeatureFlagExampleString}: ${str} + - ${FeatureFlagExampleNumber}: ${num} + `); + }); + } + + public stop() {} +} diff --git a/examples/feature_flags_example/server/routes/index.ts b/examples/feature_flags_example/server/routes/index.ts new file mode 100644 index 0000000000000..97ce19ec9981b --- /dev/null +++ b/examples/feature_flags_example/server/routes/index.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 type { IRouter } from '@kbn/core/server'; +import { schema } from '@kbn/config-schema'; +import { FeatureFlagExampleNumber } from '../../common/feature_flags'; + +export function defineRoutes(router: IRouter) { + router.versioned + .get({ + path: '/api/feature_flags_example/example', + access: 'public', + }) + .addVersion( + { + version: '2023-10-31', + validate: { + response: { + 200: { + body: () => + schema.object({ + number: schema.number(), + }), + }, + }, + }, + }, + async (context, request, response) => { + const { featureFlags } = await context.core; + + return response.ok({ + body: { + number: await featureFlags.getNumberValue(FeatureFlagExampleNumber, 1), + }, + }); + } + ); +} diff --git a/examples/feature_flags_example/tsconfig.json b/examples/feature_flags_example/tsconfig.json new file mode 100644 index 0000000000000..bbd68332f3d37 --- /dev/null +++ b/examples/feature_flags_example/tsconfig.json @@ -0,0 +1,24 @@ +{ + "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/shared-ux-page-kibana-template", + "@kbn/react-kibana-context-root", + "@kbn/core-feature-flags-server", + "@kbn/core-plugins-server", + "@kbn/config-schema", + "@kbn/developer-examples-plugin", + ] +} diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index f810ef1c95d8a..a523935afdbae 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -433,6 +433,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -518,6 +568,56 @@ ], "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -592,6 +692,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -659,6 +809,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -742,6 +942,56 @@ ], "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -776,6 +1026,7 @@ } }, { + "description": "An identifier for the connector.", "in": "path", "name": "id", "required": false, @@ -820,6 +1071,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -894,6 +1195,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -961,6 +1312,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index f810ef1c95d8a..a523935afdbae 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -433,6 +433,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -518,6 +568,56 @@ ], "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -592,6 +692,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -659,6 +809,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -742,6 +942,56 @@ ], "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -776,6 +1026,7 @@ } }, { + "description": "An identifier for the connector.", "in": "path", "name": "id", "required": false, @@ -820,6 +1071,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -894,6 +1195,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, @@ -961,6 +1312,56 @@ }, "responses": { "200": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "connector_type_id": { + "description": "The connector type identifier.", + "type": "string" + }, + "id": { + "description": "The identifier for the connector.", + "type": "string" + }, + "is_deprecated": { + "description": "Indicates whether the connector is deprecated.", + "type": "boolean" + }, + "is_missing_secrets": { + "description": "Indicates whether the connector is missing secrets.", + "type": "boolean" + }, + "is_preconfigured": { + "description": "Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ", + "type": "boolean" + }, + "is_system_action": { + "description": "Indicates whether the connector is used for system actions.", + "type": "boolean" + }, + "name": { + "description": " The name of the rule.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "connector_type_id", + "is_preconfigured", + "is_deprecated", + "is_system_action" + ], + "type": "object" + } + } + }, "description": "Indicates a successful call." } }, diff --git a/package.json b/package.json index 49b45c263c020..33fd113603e7a 100644 --- a/package.json +++ b/package.json @@ -287,6 +287,12 @@ "@kbn/core-execution-context-server-internal": "link:packages/core/execution-context/core-execution-context-server-internal", "@kbn/core-fatal-errors-browser": "link:packages/core/fatal-errors/core-fatal-errors-browser", "@kbn/core-fatal-errors-browser-internal": "link:packages/core/fatal-errors/core-fatal-errors-browser-internal", + "@kbn/core-feature-flags-browser": "link:packages/core/feature-flags/core-feature-flags-browser", + "@kbn/core-feature-flags-browser-internal": "link:packages/core/feature-flags/core-feature-flags-browser-internal", + "@kbn/core-feature-flags-browser-mocks": "link:packages/core/feature-flags/core-feature-flags-browser-mocks", + "@kbn/core-feature-flags-server": "link:packages/core/feature-flags/core-feature-flags-server", + "@kbn/core-feature-flags-server-internal": "link:packages/core/feature-flags/core-feature-flags-server-internal", + "@kbn/core-feature-flags-server-mocks": "link:packages/core/feature-flags/core-feature-flags-server-mocks", "@kbn/core-history-block-plugin": "link:test/plugin_functional/plugins/core_history_block", "@kbn/core-http-browser": "link:packages/core/http/core-http-browser", "@kbn/core-http-browser-internal": "link:packages/core/http/core-http-browser-internal", @@ -505,6 +511,7 @@ "@kbn/expressions-explorer-plugin": "link:examples/expressions_explorer", "@kbn/expressions-plugin": "link:src/plugins/expressions", "@kbn/feature-controls-examples-plugin": "link:examples/feature_control_examples", + "@kbn/feature-flags-example-plugin": "link:examples/feature_flags_example", "@kbn/feature-usage-test-plugin": "link:x-pack/test/plugin_api_integration/plugins/feature_usage_test", "@kbn/features-plugin": "link:x-pack/plugins/features", "@kbn/fec-alerts-test-plugin": "link:x-pack/test/functional_execution_context/plugins/alerts", @@ -988,6 +995,7 @@ "@langchain/openai": "^0.1.3", "@langtrase/trace-attributes": "^3.0.8", "@launchdarkly/node-server-sdk": "^9.5.4", + "@launchdarkly/openfeature-node-server": "^1.0.0", "@loaders.gl/core": "^3.4.7", "@loaders.gl/json": "^3.4.7", "@loaders.gl/shapefile": "^3.4.7", @@ -996,6 +1004,10 @@ "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mapbox/mapbox-gl-supported": "2.0.1", "@mapbox/vector-tile": "1.3.1", + "@openfeature/core": "^1.4.0", + "@openfeature/launchdarkly-client-provider": "^0.3.0", + "@openfeature/server-sdk": "^1.15.1", + "@openfeature/web-sdk": "^1.2.3", "@opentelemetry/api": "^1.1.0", "@opentelemetry/api-metrics": "^0.31.0", "@opentelemetry/exporter-metrics-otlp-grpc": "^0.34.0", @@ -1129,7 +1141,6 @@ "langchain": "^0.2.11", "langsmith": "^0.1.39", "launchdarkly-js-client-sdk": "^3.4.0", - "launchdarkly-node-server-sdk": "^7.0.3", "load-json-file": "^6.2.0", "lodash": "^4.17.21", "lru-cache": "^4.1.5", @@ -1173,7 +1184,7 @@ "pretty-ms": "6.0.0", "prop-types": "^15.8.1", "proxy-from-env": "1.0.0", - "puppeteer": "22.13.1", + "puppeteer": "23.3.1", "query-string": "^6.13.2", "rbush": "^3.0.1", "re-resizable": "^6.9.9", @@ -1748,7 +1759,7 @@ "mochawesome-merge": "^4.3.0", "mock-fs": "^5.1.2", "ms-chromium-edge-driver": "^0.5.1", - "msw": "^2.4.2", + "msw": "^2.4.5", "multistream": "^4.1.0", "mutation-observer": "^1.0.3", "native-hdr-histogram": "^1.0.0", diff --git a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx index 9ef4f740167fe..dc1ad36f01c5e 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx @@ -11,7 +11,7 @@ import { registerAnalyticsContextProviderMock } from './chrome_service.test.mock import { shallow, mount } from 'enzyme'; import React from 'react'; import * as Rx from 'rxjs'; -import { toArray } from 'rxjs'; +import { toArray, firstValueFrom } from 'rxjs'; import { injectedMetadataServiceMock } from '@kbn/core-injected-metadata-browser-mocks'; import { docLinksServiceMock } from '@kbn/core-doc-links-browser-mocks'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; @@ -556,6 +556,39 @@ describe('start', () => { `); }); }); + + describe('side nav', () => { + describe('isCollapsed$', () => { + it('should return false by default', async () => { + const { chrome, service } = await start(); + const isCollapsed = await firstValueFrom(chrome.sideNav.getIsCollapsed$()); + service.stop(); + expect(isCollapsed).toBe(false); + }); + + it('should read the localStorage value', async () => { + store.set('core.chrome.isSideNavCollapsed', 'true'); + const { chrome, service } = await start(); + const isCollapsed = await firstValueFrom(chrome.sideNav.getIsCollapsed$()); + service.stop(); + expect(isCollapsed).toBe(true); + }); + }); + + describe('setIsCollapsed', () => { + it('should update the isCollapsed$ observable', async () => { + const { chrome, service } = await start(); + const isCollapsed$ = chrome.sideNav.getIsCollapsed$(); + const isCollapsed = await firstValueFrom(isCollapsed$); + + chrome.sideNav.setIsCollapsed(!isCollapsed); + + const updatedIsCollapsed = await firstValueFrom(isCollapsed$); + service.stop(); + expect(updatedIsCollapsed).toBe(!isCollapsed); + }); + }); + }); }); describe('stop', () => { diff --git a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx index 3eb846cc15dc8..4605dd02fd229 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx @@ -54,6 +54,7 @@ import type { InternalChromeStart } from './types'; import { HeaderTopBanner } from './ui/header/header_top_banner'; const IS_LOCKED_KEY = 'core.chrome.isLocked'; +const IS_SIDENAV_COLLAPSED_KEY = 'core.chrome.isSideNavCollapsed'; const SNAPSHOT_REGEX = /-snapshot/i; interface ConstructorParams { @@ -86,7 +87,9 @@ export class ChromeService { private readonly docTitle = new DocTitleService(); private readonly projectNavigation: ProjectNavigationService; private mutationObserver: MutationObserver | undefined; - private readonly isSideNavCollapsed$ = new BehaviorSubject(true); + private readonly isSideNavCollapsed$ = new BehaviorSubject( + localStorage.getItem(IS_SIDENAV_COLLAPSED_KEY) === 'true' + ); private logger: Logger; private isServerless = false; @@ -360,6 +363,11 @@ export class ChromeService { projectNavigation.setProjectName(projectName); }; + const setIsSideNavCollapsed = (isCollapsed: boolean) => { + localStorage.setItem(IS_SIDENAV_COLLAPSED_KEY, JSON.stringify(isCollapsed)); + this.isSideNavCollapsed$.next(isCollapsed); + }; + if (!this.params.browserSupportsCsp && injectedMetadata.getCspConfig().warnLegacyBrowsers) { notifications.toasts.addWarning({ title: mountReactNode( @@ -431,9 +439,8 @@ export class ChromeService { docLinks={docLinks} kibanaVersion={injectedMetadata.getKibanaVersion()} prependBasePath={http.basePath.prepend} - toggleSideNav={(isCollapsed) => { - this.isSideNavCollapsed$.next(isCollapsed); - }} + isSideNavCollapsed$={this.isSideNavCollapsed$} + toggleSideNav={setIsSideNavCollapsed} > @@ -556,7 +563,10 @@ export class ChromeService { getBodyClasses$: () => bodyClasses$.pipe(takeUntil(this.stop$)), setChromeStyle, getChromeStyle$: () => chromeStyle$, - getIsSideNavCollapsed$: () => this.isSideNavCollapsed$.asObservable(), + sideNav: { + getIsCollapsed$: () => this.isSideNavCollapsed$.asObservable(), + setIsCollapsed: setIsSideNavCollapsed, + }, getActiveSolutionNavId$: () => projectNavigation.getActiveSolutionNavId$(), project: { setHome: setProjectHome, diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx index 3e4bc7a8a1fe5..743cd1726e03e 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx @@ -35,6 +35,7 @@ describe('Header', () => { navControlsCenter$: Rx.of([]), navControlsRight$: Rx.of([]), customBranding$: Rx.of({}), + isSideNavCollapsed$: Rx.of(false), prependBasePath: (str) => `hello/world/${str}`, toggleSideNav: jest.fn(), }; diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx index f3d92ff31638d..bf8b103709260 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx @@ -130,6 +130,7 @@ export interface Props { navControlsCenter$: Observable; navControlsRight$: Observable; prependBasePath: (url: string) => string; + isSideNavCollapsed$: Observable; toggleSideNav: (isCollapsed: boolean) => void; } @@ -248,7 +249,12 @@ export const ProjectHeader = ({ - {children} + + {children} + diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx index 9daf99bbbfc23..a607d69fb0633 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx @@ -7,34 +7,28 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import React, { useEffect, useRef, FC, PropsWithChildren } from 'react'; +import React, { FC, PropsWithChildren } from 'react'; import { EuiCollapsibleNavBeta } from '@elastic/eui'; -import useLocalStorage from 'react-use/lib/useLocalStorage'; +import useObservable from 'react-use/lib/useObservable'; +import type { Observable } from 'rxjs'; -const LOCAL_STORAGE_IS_COLLAPSED_KEY = 'PROJECT_NAVIGATION_COLLAPSED' as const; +interface Props { + toggleSideNav: (isVisible: boolean) => void; + isSideNavCollapsed$: Observable; +} -export const ProjectNavigation: FC< - PropsWithChildren<{ toggleSideNav: (isVisible: boolean) => void }> -> = ({ children, toggleSideNav }) => { - const isMounted = useRef(false); - const [isCollapsed, setIsCollapsed] = useLocalStorage(LOCAL_STORAGE_IS_COLLAPSED_KEY, false); - const onCollapseToggle = (nextIsCollapsed: boolean) => { - setIsCollapsed(nextIsCollapsed); - toggleSideNav(nextIsCollapsed); - }; - - useEffect(() => { - if (!isMounted.current && isCollapsed !== undefined) { - toggleSideNav(isCollapsed); - } - isMounted.current = true; - }, [isCollapsed, toggleSideNav]); +export const ProjectNavigation: FC> = ({ + children, + isSideNavCollapsed$, + toggleSideNav, +}) => { + const isCollapsed = useObservable(isSideNavCollapsed$, false); return ( { setBadge: jest.fn(), getBreadcrumbs$: jest.fn(), setBreadcrumbs: jest.fn(), - getIsSideNavCollapsed$: jest.fn(), + sideNav: { + getIsCollapsed$: jest.fn(), + setIsCollapsed: jest.fn(), + }, getBreadcrumbsAppendExtension$: jest.fn(), setBreadcrumbsAppendExtension: jest.fn(), getGlobalHelpExtensionMenuLinks$: jest.fn(), @@ -94,7 +97,7 @@ const createStartContractMock = () => { startContract.getIsNavDrawerLocked$.mockReturnValue(new BehaviorSubject(false)); startContract.getBodyClasses$.mockReturnValue(new BehaviorSubject([])); startContract.hasHeaderBanner$.mockReturnValue(new BehaviorSubject(false)); - startContract.getIsSideNavCollapsed$.mockReturnValue(new BehaviorSubject(false)); + startContract.sideNav.getIsCollapsed$.mockReturnValue(new BehaviorSubject(false)); return startContract; }; diff --git a/packages/core/chrome/core-chrome-browser/src/contracts.ts b/packages/core/chrome/core-chrome-browser/src/contracts.ts index c326e7107aa2a..1e9ea66bc0920 100644 --- a/packages/core/chrome/core-chrome-browser/src/contracts.ts +++ b/packages/core/chrome/core-chrome-browser/src/contracts.ts @@ -173,10 +173,18 @@ export interface ChromeStart { */ getChromeStyle$(): Observable; - /** - * Get an observable of the current collapsed state of the side nav. - */ - getIsSideNavCollapsed$(): Observable; + sideNav: { + /** + * Get an observable of the current collapsed state of the side nav. + */ + getIsCollapsed$(): Observable; + + /** + * Set the collapsed state of the side nav. + * @param isCollapsed The collapsed state of the side nav. + */ + setIsCollapsed(isCollapsed: boolean): void; + }; /** * Get the id of the currently active project navigation or `null` otherwise. diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_route_handler_context.ts b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_route_handler_context.ts index b4be404f137af..ce45e5c11833c 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_route_handler_context.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_route_handler_context.ts @@ -15,7 +15,7 @@ import type { import type { InternalElasticsearchServiceStart } from './types'; /** - * The {@link UiSettingsRequestHandlerContext} implementation. + * The {@link ElasticsearchRequestHandlerContext} implementation. * @internal */ export class CoreElasticsearchRouteHandlerContext implements ElasticsearchRequestHandlerContext { diff --git a/packages/core/feature-flags/README.mdx b/packages/core/feature-flags/README.mdx new file mode 100644 index 0000000000000..d1e3583aaf2b8 --- /dev/null +++ b/packages/core/feature-flags/README.mdx @@ -0,0 +1,158 @@ +--- +id: kibFeatureFlagsService +slug: /kibana-dev-docs/tutorials/feature-flags-service +title: Feature Flags service +description: The Feature Flags service provides the necessary APIs to evaluate dynamic feature flags. +date: 2024-07-26 +tags: ['kibana', 'dev', 'contributor', 'api docs', 'a/b testing', 'feature flags', 'flags'] +--- + +# Feature Flags Service + +The Feature Flags service provides the necessary APIs to evaluate dynamic feature flags. + +The service is always enabled, however, it will return the fallback value if a feature flags provider hasn't been attached. +Kibana only registers a provider when running on Elastic Cloud Hosted/Serverless. + +For a code example, refer to the [Feature Flags Example plugin](../../../examples/feature_flags_example) + +## Registering a feature flag + +Kibana follows a _gitops_ approach when managing feature flags. To declare a feature flag, add your flags definitions in +your plugin's `server/index.ts` file: + +```typescript +// /server/index.ts +import type { FeatureFlagDefinitions } from '@kbn/core-feature-flags-server'; +import type { PluginInitializerContext } from '@kbn/core-plugins-server'; + +export const featureFlags: FeatureFlagDefinitions = [ + { + key: 'my-cool-feature', + name: 'My cool feature', + description: 'Enables the cool feature to auto-hide the navigation bar', + tags: ['my-plugin', 'my-service', 'ui'], + variationType: 'boolean', + variations: [ + { + name: 'On', + description: 'Auto-hides the bar', + value: true, + }, + { + name: 'Off', + description: 'Static always-on', + value: false, + }, + ], + }, + {...}, +]; + +export async function plugin(initializerContext: PluginInitializerContext) { + const { FeatureFlagsExamplePlugin } = await import('./plugin'); + return new FeatureFlagsExamplePlugin(initializerContext); +} +``` + +After merging your PR, the CI will create/update the flags in our third-party feature flags provider. + +### Deprecation/removal strategy + +When your code doesn't use the feature flag anymore, it is recommended to clean up the feature flags when possible. +There are a few considerations to take into account when performing this clean-up: + +1. Always deprecate first, remove after +2. When to remove? + +#### Always deprecate first, remove after + +Just because the CI syncs the state of `main` to our feature flag provider, there is a high probability that the +previous version of the code that still relied on the feature flag is still running out there. + +For that reason, the recommendation is to always deprecate before removing the flags. This will keep evaluating the flags, +according to the segmentation rules configured for the flag. + +#### When to remove? + +After deprecation, we need to consider when it's safe to remove the flag. There are different scenarios that come with +different recommendations: + +* The segmentation rules of my flag are set up to return the fallback value 100% of the time: it should be safe to +remove the flag at any time. +* My flag only made it to Serverless (it never made it to Elastic Cloud Hosted): it should be safe to remove the flag +after 2 releases have been rolled out (roughly 2-3 weeks later). This is to ensure that all Serverless projects have +been upgraded and that we won't need to rollback to the previous version. +* My flag made it to Elastic Cloud Hosted: if we want to remove the flag, we should approach the affected customers to +fix the expected values via [config overrides](#config-overrides). + +In general, the recommendation is to check our telemetry to validate the usage of our flags. + +## Evaluating feature flags + +This service provides 2 ways to evaluate your feature flags, depending on the use case: + +1. **Single evaluation**: performs the evaluation once, and doesn't react to updates. These APIs are synchronous in the +browser, and asynchronous in the server. +2. **Observed evaluation**: observes the flag for any changes so that the code can adapt. These APIs return an RxJS observable. + +Also, the APIs are typed, so you need to use the appropriate API depending on the `variationType` you defined your flag: + +| Type | Single evaluation | Observed evaluation | +|:-------:|:--------------------------------------------------------|:---------------------------------------------------------| +| Boolean | `core.featureFlags.getBooleanValue(flagName, fallback)` | `core.featureFlags.getBooleanValue$(flagName, fallback)` | +| String | `core.featureFlags.getStringValue(flagName, fallback)` | `core.featureFlags.getStringValue$(flagName, fallback)` | +| Number | `core.featureFlags.getNumberValue(flagName, fallback)` | `core.featureFlags.getNumberValue$(flagName, fallback)` | + +### Request handler context + +Additionally, to make things easier in our HTTP handlers, the _Single evaluation_ APIs are available as part of the core +context provided to the handlers: + +```typescript +async (context, request, response) => { + const { featureFlags } = await context.core; + return response.ok({ + body: { + number: await featureFlags.getNumberValue('example-number', 1), + }, + }); +} +``` + +## Extending the evaluation context + +The should have +enough information to declare the segmentation rules for your feature flags. However, if your use case requires additional +context, feel free to call the API `core.featureFlags.setContext()` from your plugin. + +At the moment, we use 2 levels of context: `kibana` and `organization` that we can use for segmentation purposes at +different levels. By default, the API appends the context to the `kibana` scope. If you need to extend the `organization` +scope, make sure to add `kind: 'organization'` to the object provided to the `setContext` API. + +## Config overrides + +To help with testing, and to provide an escape hatch in cases where the flag evaluation is not behaving as intended, +the Feature Flags Service provides a way to force the values of a feature flag without attempting to resolve it via the +provider. In the `kibana.yml`, the following config sets the overrides: + +```yaml +feature_flags.overrides: + my-feature-flag: 'my-forced-value' +``` + +> [!WARNING] +> There is no validation regarding the variations nor the type of the flags. Use these overrides with caution. + +### Dynamic config + +When running in our test environments, the overrides can be updated without restarting Kibana via the HTTP `PUT /internal/core/_settings`: + +``` +PUT /internal/core/_settings +{ + "feature_flags.overrides": { + "my-feature-flag": "my-forced-value" + } +} +``` diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/README.md b/packages/core/feature-flags/core-feature-flags-browser-internal/README.md new file mode 100644 index 0000000000000..f5696d4530483 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/README.md @@ -0,0 +1,5 @@ +# @kbn/core-feature-flags-browser-internal + +Internal implementation of the browser-side Feature Flags Service. + +It should only be imported by _Core_ packages. \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/index.ts b/packages/core/feature-flags/core-feature-flags-browser-internal/index.ts new file mode 100644 index 0000000000000..e22aeeecd35fb --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/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 { FeatureFlagsService, type FeatureFlagsSetupDeps } from './src/feature_flags_service'; diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/jest.config.js b/packages/core/feature-flags/core-feature-flags-browser-internal/jest.config.js new file mode 100644 index 0000000000000..be4a9c1b14073 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/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/core/feature-flags/core-feature-flags-browser-internal'], +}; diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc new file mode 100644 index 0000000000000..150509b99f519 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-browser", + "id": "@kbn/core-feature-flags-browser-internal", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/package.json b/packages/core/feature-flags/core-feature-flags-browser-internal/package.json new file mode 100644 index 0000000000000..de82d53b1c964 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-feature-flags-browser-internal", + "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/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts new file mode 100644 index 0000000000000..596d64c7b77ae --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts @@ -0,0 +1,292 @@ +/* + * Copyright 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 { apm } from '@elastic/apm-rum'; +import { type Client, OpenFeature, type Provider } from '@openfeature/web-sdk'; +import { coreContextMock } from '@kbn/core-base-browser-mocks'; +import type { FeatureFlagsStart } from '@kbn/core-feature-flags-browser'; +import { injectedMetadataServiceMock } from '@kbn/core-injected-metadata-browser-mocks'; +import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; +import { FeatureFlagsService } from '..'; + +async function isSettledPromise(p: Promise) { + const immediateValue = {}; + const result = await Promise.race([p, immediateValue]); + return result !== immediateValue; +} + +describe('FeatureFlagsService Browser', () => { + let featureFlagsService: FeatureFlagsService; + let featureFlagsClient: Client; + let injectedMetadata: jest.Mocked; + + beforeEach(() => { + const getClientSpy = jest.spyOn(OpenFeature, 'getClient'); + featureFlagsService = new FeatureFlagsService(coreContextMock.create()); + featureFlagsClient = getClientSpy.mock.results[0].value; + injectedMetadata = injectedMetadataServiceMock.createSetupContract(); + }); + + afterEach(async () => { + await featureFlagsService.stop(); + jest.clearAllMocks(); + await OpenFeature.clearProviders(); + await OpenFeature.clearContexts(); + }); + + describe('provider handling', () => { + test('appends a provider (without awaiting)', () => { + expect.assertions(1); + const { setProvider } = featureFlagsService.setup({ injectedMetadata }); + const spy = jest.spyOn(OpenFeature, 'setProviderAndWait'); + const fakeProvider = { metadata: { name: 'fake provider' } } as Provider; + setProvider(fakeProvider); + expect(spy).toHaveBeenCalledWith(fakeProvider); + }); + + test('throws an error if called twice', () => { + const { setProvider } = featureFlagsService.setup({ injectedMetadata }); + const fakeProvider = { metadata: { name: 'fake provider' } } as Provider; + setProvider(fakeProvider); + expect(() => setProvider(fakeProvider)).toThrowErrorMatchingInlineSnapshot( + `"A provider has already been set. This API cannot be called twice."` + ); + }); + + test('awaits initialization in the start context', async () => { + const { setProvider } = featureFlagsService.setup({ injectedMetadata }); + let externalResolve: Function = () => void 0; + const spy = jest.spyOn(OpenFeature, 'setProviderAndWait').mockImplementation(async () => { + await new Promise((resolve) => { + externalResolve = resolve; + }); + }); + const fakeProvider = {} as Provider; + setProvider(fakeProvider); + expect(spy).toHaveBeenCalledWith(fakeProvider); + const startPromise = featureFlagsService.start(); + await expect(isSettledPromise(startPromise)).resolves.toBe(false); + externalResolve(); + await new Promise((resolve) => process.nextTick(resolve)); // Wait for the promise resolution to spread + await expect(isSettledPromise(startPromise)).resolves.toBe(true); + }); + + test('do not hold for too long during initialization', async () => { + const { setProvider } = featureFlagsService.setup({ injectedMetadata }); + const spy = jest.spyOn(OpenFeature, 'setProviderAndWait').mockImplementation(async () => { + await new Promise(() => {}); // never resolves + }); + const apmCaptureErrorSpy = jest.spyOn(apm, 'captureError'); + const fakeProvider = {} as Provider; + setProvider(fakeProvider); + expect(spy).toHaveBeenCalledWith(fakeProvider); + const startPromise = featureFlagsService.start(); + await expect(isSettledPromise(startPromise)).resolves.toBe(false); + await new Promise((resolve) => setTimeout(resolve, 2100)); // A bit longer than 2 seconds + await expect(isSettledPromise(startPromise)).resolves.toBe(true); + expect(apmCaptureErrorSpy).toHaveBeenCalledWith( + expect.stringContaining('The feature flags provider took too long to initialize.') + ); + }); + }); + + describe('context handling', () => { + let setContextSpy: jest.SpyInstance; + + beforeEach(() => { + setContextSpy = jest.spyOn(OpenFeature, 'setContext'); + }); + + test('appends context to the provider', async () => { + const { appendContext } = featureFlagsService.setup({ injectedMetadata }); + await appendContext({ kind: 'multi' }); + expect(setContextSpy).toHaveBeenCalledWith({ kind: 'multi' }); + }); + + test('appends context to the provider (start method)', async () => { + featureFlagsService.setup({ injectedMetadata }); + const { appendContext } = await featureFlagsService.start(); + await appendContext({ kind: 'multi' }); + expect(setContextSpy).toHaveBeenCalledWith({ kind: 'multi' }); + }); + + test('full multi context pass-through', async () => { + const { appendContext } = featureFlagsService.setup({ injectedMetadata }); + const context = { + kind: 'multi' as const, + kibana: { + key: 'kibana-1', + }, + organization: { + key: 'organization-1', + }, + }; + await appendContext(context); + expect(setContextSpy).toHaveBeenCalledWith(context); + }); + + test('appends to the existing context', async () => { + const { appendContext } = featureFlagsService.setup({ injectedMetadata }); + const initialContext = { + kind: 'multi' as const, + kibana: { + key: 'kibana-1', + }, + organization: { + key: 'organization-1', + }, + }; + await appendContext(initialContext); + expect(setContextSpy).toHaveBeenCalledWith(initialContext); + + await appendContext({ kind: 'multi', kibana: { has_data: true } }); + expect(setContextSpy).toHaveBeenCalledWith({ + ...initialContext, + kibana: { + ...initialContext.kibana, + has_data: true, + }, + }); + }); + + test('converts single-contexts to multi-context', async () => { + const { appendContext } = featureFlagsService.setup({ injectedMetadata }); + await appendContext({ kind: 'organization', key: 'organization-1' }); + expect(setContextSpy).toHaveBeenCalledWith({ + kind: 'multi', + organization: { + key: 'organization-1', + }, + }); + }); + + test('if no `kind` provided, it defaults to the kibana context', async () => { + const { appendContext } = featureFlagsService.setup({ injectedMetadata }); + await appendContext({ key: 'key-1', has_data: false }); + expect(setContextSpy).toHaveBeenCalledWith({ + kind: 'multi', + kibana: { + key: 'key-1', + has_data: false, + }, + }); + }); + }); + + describe('flag evaluation', () => { + let startContract: FeatureFlagsStart; + let apmSpy: jest.SpyInstance; + let addHandlerSpy: jest.SpyInstance; + + beforeEach(async () => { + addHandlerSpy = jest.spyOn(featureFlagsClient, 'addHandler'); + injectedMetadata.getFeatureFlags.mockReturnValue({ + overrides: { 'my-overridden-flag': true }, + }); + featureFlagsService.setup({ injectedMetadata }); + startContract = await featureFlagsService.start(); + apmSpy = jest.spyOn(apm, 'addLabels'); + }); + + // We don't need to test the client, just our APIs, so testing that it returns the fallback value should be enough. + test('get boolean flag', () => { + const value = false; + expect(startContract.getBooleanValue('my-flag', value)).toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + }); + + test('get string flag', () => { + const value = 'my-default'; + expect(startContract.getStringValue('my-flag', value)).toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + }); + + test('get number flag', () => { + const value = 42; + expect(startContract.getNumberValue('my-flag', value)).toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + }); + + test('observe a boolean flag', async () => { + const value = false; + const flag$ = startContract.getBooleanValue$('my-flag', value); + const observedValues: boolean[] = []; + flag$.subscribe((v) => observedValues.push(v)); + // Initial emission + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + expect(observedValues).toHaveLength(1); + + // Does not reevaluate and emit if the other flags are changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['another-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(1); // still 1 + + // Reevaluates and emits when the observed flag is changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['my-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(2); + }); + + test('observe a string flag', async () => { + const value = 'my-value'; + const flag$ = startContract.getStringValue$('my-flag', value); + const observedValues: string[] = []; + flag$.subscribe((v) => observedValues.push(v)); + // Initial emission + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + expect(observedValues).toHaveLength(1); + + // Does not reevaluate and emit if the other flags are changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['another-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(1); // still 1 + + // Reevaluates and emits when the observed flag is changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['my-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(2); + }); + + test('observe a number flag', async () => { + const value = 42; + const flag$ = startContract.getNumberValue$('my-flag', value); + const observedValues: number[] = []; + flag$.subscribe((v) => observedValues.push(v)); + // Initial emission + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + expect(observedValues).toHaveLength(1); + + // Does not reevaluate and emit if the other flags are changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['another-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(1); // still 1 + + // Reevaluates and emits when the observed flag is changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['my-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(2); + }); + + test('with overrides', async () => { + const getBooleanValueSpy = jest.spyOn(featureFlagsClient, 'getBooleanValue'); + expect(startContract.getBooleanValue('my-overridden-flag', false)).toEqual(true); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-overridden-flag': true }); + expect(getBooleanValueSpy).not.toHaveBeenCalled(); + + // Only to prove the spy works + expect(startContract.getBooleanValue('another-flag', false)).toEqual(false); + expect(getBooleanValueSpy).toHaveBeenCalledTimes(1); + expect(getBooleanValueSpy).toHaveBeenCalledWith('another-flag', false); + }); + }); +}); diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts new file mode 100644 index 0000000000000..0f7e572ef5ce0 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts @@ -0,0 +1,203 @@ +/* + * Copyright 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 { CoreContext } from '@kbn/core-base-browser-internal'; +import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; +import type { Logger } from '@kbn/logging'; +import type { + EvaluationContext, + FeatureFlagsSetup, + FeatureFlagsStart, + MultiContextEvaluationContext, +} from '@kbn/core-feature-flags-browser'; +import { apm } from '@elastic/apm-rum'; +import { type Client, ClientProviderEvents, OpenFeature } from '@openfeature/web-sdk'; +import deepMerge from 'deepmerge'; +import { filter, map, startWith, Subject } from 'rxjs'; + +/** + * setup method dependencies + * @private + */ +export interface FeatureFlagsSetupDeps { + /** + * Used to read the flag overrides set up in the configuration file. + */ + injectedMetadata: InternalInjectedMetadataSetup; +} + +/** + * The browser-side Feature Flags Service + * @private + */ +export class FeatureFlagsService { + private readonly featureFlagsClient: Client; + private readonly logger: Logger; + private isProviderReadyPromise?: Promise; + private context: MultiContextEvaluationContext = { kind: 'multi' }; + private overrides: Record = {}; + + /** + * The core service's constructor + * @param core {@link CoreContext} + */ + constructor(core: CoreContext) { + this.logger = core.logger.get('feature-flags-service'); + this.featureFlagsClient = OpenFeature.getClient(); + OpenFeature.setLogger(this.logger.get('open-feature')); + } + + /** + * Setup lifecycle method + * @param deps {@link FeatureFlagsSetup} including the {@link InternalInjectedMetadataSetup} used to retrieve the feature flags. + */ + public setup(deps: FeatureFlagsSetupDeps): FeatureFlagsSetup { + const featureFlagsInjectedMetadata = deps.injectedMetadata.getFeatureFlags(); + if (featureFlagsInjectedMetadata) { + this.overrides = featureFlagsInjectedMetadata.overrides; + } + return { + setProvider: (provider) => { + if (this.isProviderReadyPromise) { + throw new Error('A provider has already been set. This API cannot be called twice.'); + } + this.isProviderReadyPromise = OpenFeature.setProviderAndWait(provider); + }, + appendContext: (contextToAppend) => this.appendContext(contextToAppend), + }; + } + + /** + * Start lifecycle method + */ + public async start(): Promise { + const featureFlagsChanged$ = new Subject(); + this.featureFlagsClient.addHandler(ClientProviderEvents.ConfigurationChanged, (event) => { + if (event?.flagsChanged) { + featureFlagsChanged$.next(event.flagsChanged); + } + }); + const observeFeatureFlag$ = (flagName: string) => + featureFlagsChanged$.pipe( + filter((flagNames) => flagNames.includes(flagName)), + startWith([flagName]) // only to emit on the first call + ); + + await this.waitForProviderInitialization(); + + return { + appendContext: (contextToAppend) => this.appendContext(contextToAppend), + getBooleanValue: (flagName: string, fallbackValue: boolean) => + this.evaluateFlag(this.featureFlagsClient.getBooleanValue, flagName, fallbackValue), + getStringValue: (flagName: string, fallbackValue: Value) => + this.evaluateFlag(this.featureFlagsClient.getStringValue, flagName, fallbackValue), + getNumberValue: (flagName: string, fallbackValue: Value) => + this.evaluateFlag(this.featureFlagsClient.getNumberValue, flagName, fallbackValue), + getBooleanValue$: (flagName, fallbackValue) => { + return observeFeatureFlag$(flagName).pipe( + map(() => + this.evaluateFlag(this.featureFlagsClient.getBooleanValue, flagName, fallbackValue) + ) + ); + }, + getStringValue$: (flagName: string, fallbackValue: Value) => { + return observeFeatureFlag$(flagName).pipe( + map(() => + this.evaluateFlag( + this.featureFlagsClient.getStringValue, + flagName, + fallbackValue + ) + ) + ); + }, + getNumberValue$: (flagName: string, fallbackValue: Value) => { + return observeFeatureFlag$(flagName).pipe( + map(() => + this.evaluateFlag( + this.featureFlagsClient.getNumberValue, + flagName, + fallbackValue + ) + ) + ); + }, + }; + } + + /** + * Stop lifecycle method + */ + public async stop() { + await OpenFeature.close(); + } + + /** + * Waits for the provider initialization with a timeout to avoid holding the page load for too long + * @private + */ + private async waitForProviderInitialization() { + // Adding a timeout here to avoid hanging the start for too long if the provider is unresponsive + let timeoutId: NodeJS.Timeout | undefined; + await Promise.race([ + this.isProviderReadyPromise, + new Promise((resolve) => { + timeoutId = setTimeout(resolve, 2 * 1000); + }).then(() => { + const msg = `The feature flags provider took too long to initialize. + Won't hold the page load any longer. + Feature flags will return the provided fallbacks until the provider is eventually initialized.`; + this.logger.warn(msg); + apm.captureError(msg); + }), + ]); + clearTimeout(timeoutId); + } + + /** + * Wrapper to evaluate flags with the common config overrides interceptions + APM and counters reporting + * @param evaluationFn The actual evaluation API + * @param flagName The name of the flag to evaluate + * @param fallbackValue The fallback value + * @private + */ + private evaluateFlag( + evaluationFn: (flagName: string, fallbackValue: T) => T, + flagName: string, + fallbackValue: T + ): T { + const value = + typeof this.overrides[flagName] !== 'undefined' + ? (this.overrides[flagName] as T) + : // We have to bind the evaluation or the client will lose its internal context + evaluationFn.bind(this.featureFlagsClient)(flagName, fallbackValue); + apm.addLabels({ [`flag_${flagName}`]: value }); + // TODO: increment usage counter + return value; + } + + /** + * Formats the provided context to fulfill the expected multi-context structure. + * @param contextToAppend The {@link EvaluationContext} to append. + * @private + */ + private async appendContext(contextToAppend: EvaluationContext): Promise { + // If no kind provided, default to the project|deployment level. + const { kind = 'kibana', ...rest } = contextToAppend; + // Format the context to fulfill the expected multi-context structure + const formattedContextToAppend: MultiContextEvaluationContext = + kind === 'multi' + ? (contextToAppend as MultiContextEvaluationContext) + : { kind: 'multi', [kind]: rest }; + + // Merge the formatted context to append to the global context, and set it in the OpenFeature client. + this.context = deepMerge(this.context, formattedContextToAppend); + await OpenFeature.setContext(this.context); + } +} diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/tsconfig.json b/packages/core/feature-flags/core-feature-flags-browser-internal/tsconfig.json new file mode 100644 index 0000000000000..3ed73d73e75a3 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-base-browser-internal", + "@kbn/core-feature-flags-browser", + "@kbn/logging", + "@kbn/core-base-browser-mocks", + "@kbn/core-injected-metadata-browser-internal", + "@kbn/core-injected-metadata-browser-mocks", + ] +} diff --git a/packages/core/feature-flags/core-feature-flags-browser-mocks/README.md b/packages/core/feature-flags/core-feature-flags-browser-mocks/README.md new file mode 100644 index 0000000000000..db756eddf2f1a --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/README.md @@ -0,0 +1,3 @@ +# @kbn/core-feature-flags-browser-mocks + +Browser-side Jest mocks for the Feature Flags Service. diff --git a/packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts b/packages/core/feature-flags/core-feature-flags-browser-mocks/index.ts new file mode 100644 index 0000000000000..ad8cdae6a5ef1 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/index.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", 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 { FeatureFlagsSetup, FeatureFlagsStart } from '@kbn/core-feature-flags-browser'; +import type { FeatureFlagsService } from '@kbn/core-feature-flags-browser-internal'; +import type { PublicMethodsOf } from '@kbn/utility-types'; +import { of } from 'rxjs'; + +const createFeatureFlagsSetup = (): jest.Mocked => { + return { + setProvider: jest.fn(), + appendContext: jest.fn().mockImplementation(Promise.resolve), + }; +}; + +const createFeatureFlagsStart = (): jest.Mocked => { + return { + appendContext: jest.fn().mockImplementation(Promise.resolve), + getBooleanValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getNumberValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getStringValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getBooleanValue$: jest.fn().mockImplementation((_, fallback) => of(fallback)), + getStringValue$: jest.fn().mockImplementation((_, fallback) => of(fallback)), + getNumberValue$: jest.fn().mockImplementation((_, fallback) => of(fallback)), + }; +}; + +const createFeatureFlagsServiceMock = (): jest.Mocked> => { + return { + setup: jest.fn().mockImplementation(createFeatureFlagsSetup), + start: jest.fn().mockImplementation(async () => createFeatureFlagsStart()), + stop: jest.fn().mockImplementation(Promise.resolve), + }; +}; + +/** + * Mocks for the Feature Flags service (browser-side) + */ +export const coreFeatureFlagsMock = { + /** + * Mocks the entire feature flags service + */ + create: createFeatureFlagsServiceMock, + /** + * Mocks the setup contract + */ + createSetup: createFeatureFlagsSetup, + /** + * Mocks the start contract + */ + createStart: createFeatureFlagsStart, +}; diff --git a/packages/core/feature-flags/core-feature-flags-browser-mocks/jest.config.js b/packages/core/feature-flags/core-feature-flags-browser-mocks/jest.config.js new file mode 100644 index 0000000000000..f259faecb6046 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/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/core/feature-flags/core-feature-flags-browser-mocks'], +}; diff --git a/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc new file mode 100644 index 0000000000000..0917a098841c4 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-browser", + "id": "@kbn/core-feature-flags-browser-mocks", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/feature-flags/core-feature-flags-browser-mocks/package.json b/packages/core/feature-flags/core-feature-flags-browser-mocks/package.json new file mode 100644 index 0000000000000..77e9150ce7834 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-feature-flags-browser-mocks", + "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/core/feature-flags/core-feature-flags-browser-mocks/tsconfig.json b/packages/core/feature-flags/core-feature-flags-browser-mocks/tsconfig.json new file mode 100644 index 0000000000000..b7d1b3ca28cbb --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-feature-flags-browser", + "@kbn/core-feature-flags-browser-internal", + "@kbn/utility-types", + ] +} diff --git a/packages/core/feature-flags/core-feature-flags-browser/README.md b/packages/core/feature-flags/core-feature-flags-browser/README.md new file mode 100644 index 0000000000000..5a6743adc5a09 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser/README.md @@ -0,0 +1,3 @@ +# @kbn/core-feature-flags-browser + +Browser-side type definitions for the Feature Flags Service. diff --git a/packages/core/feature-flags/core-feature-flags-browser/index.ts b/packages/core/feature-flags/core-feature-flags-browser/index.ts new file mode 100644 index 0000000000000..6c79c96f01878 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser/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", 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 { + EvaluationContext, + MultiContextEvaluationContext, + SingleContextEvaluationContext, + FeatureFlagsSetup, + FeatureFlagsStart, +} from './src/types'; diff --git a/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc new file mode 100644 index 0000000000000..56187119509b9 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-browser", + "id": "@kbn/core-feature-flags-browser", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/feature-flags/core-feature-flags-browser/package.json b/packages/core/feature-flags/core-feature-flags-browser/package.json new file mode 100644 index 0000000000000..235f52c0521f1 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-feature-flags-browser", + "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/core/feature-flags/core-feature-flags-browser/src/types.ts b/packages/core/feature-flags/core-feature-flags-browser/src/types.ts new file mode 100644 index 0000000000000..844675aab4603 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser/src/types.ts @@ -0,0 +1,165 @@ +/* + * Copyright 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 { Provider } from '@openfeature/web-sdk'; +import { type EvaluationContext as OpenFeatureEvaluationContext } from '@openfeature/core'; +import type { Observable } from 'rxjs'; + +/** + * The evaluation context to use when retrieving the flags. + * + * We use multi-context so that we can apply segmentation rules at different levels (`organization`/`kibana`). + * * `organization` includes any information that is common to all the projects/deployments in an organization. An example is the in_trial status. + * * The `kibana` context includes all the information that identifies a project/deployment. Examples are version, offering, and has_data. + * Kind helps us specify which sub-context should receive the new attributes. + * If no `kind` is provided, it defaults to `kibana`. + * + * @example Providing properties for both contexts + * { + * kind: 'multi', + * organization: { + * key: 1234, + * in_trial: true, + * }, + * kibana: { + * key: 12345567890, + * version: 8.15.0, + * buildHash: 'ffffffffaaaaaaaa', + * }, + * } + * + * @example Appending context to the organization sub-context + * { + * kind: 'organization', + * key: 1234, + * in_trial: true, + * } + * + * @example Appending context to the `kibana` sub-context + * { + * key: 12345567890, + * version: 8.15.0, + * buildHash: 'ffffffffaaaaaaaa', + * } + * } + * + * @public + */ +export type EvaluationContext = MultiContextEvaluationContext | SingleContextEvaluationContext; + +/** + * Multi-context format. The sub-contexts are provided in their nested properties. + * @public + */ +export type MultiContextEvaluationContext = OpenFeatureEvaluationContext & { + /** + * Static `multi` string + */ + kind: 'multi'; + /** + * The Elastic Cloud organization-specific context. + */ + organization?: OpenFeatureEvaluationContext; + /** + * The deployment/project-specific context. + */ + kibana?: OpenFeatureEvaluationContext; +}; + +/** + * Single Context format. If `kind` is not specified, it applies to the `kibana` sub-context. + */ +export type SingleContextEvaluationContext = OpenFeatureEvaluationContext & { + /** + * The sub-context that it's updated. Defaults to `kibana`. + */ + kind?: 'organization' | 'kibana'; +}; + +/** + * Setup contract of the Feature Flags Service + * @public + */ +export interface FeatureFlagsSetup { + /** + * Registers an OpenFeature provider to talk to the + * 3rd-party service that manages the Feature Flags. + * @param provider The {@link Provider | OpenFeature Provider} to handle the communication with the feature flags management system. + * @public + */ + setProvider(provider: Provider): void; + + /** + * Appends new keys to the evaluation context. + * @param contextToAppend The additional keys that should be appended/modified in the evaluation context. + * @public + */ + appendContext(contextToAppend: EvaluationContext): Promise; +} + +/** + * Setup contract of the Feature Flags Service + * @public + */ +export interface FeatureFlagsStart { + /** + * Appends new keys to the evaluation context. + * @param contextToAppend The additional keys that should be appended/modified in the evaluation context. + * @public + */ + appendContext(contextToAppend: EvaluationContext): Promise; + + /** + * Evaluates a boolean flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getBooleanValue(flagName: string, fallbackValue: boolean): boolean; + + /** + * Evaluates a string flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getStringValue(flagName: string, fallbackValue: Value): Value; + + /** + * Evaluates a number flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getNumberValue(flagName: string, fallbackValue: Value): Value; + + /** + * Returns an observable of a boolean flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getBooleanValue$(flagName: string, fallbackValue: boolean): Observable; + + /** + * Returns an observable of a string flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getStringValue$(flagName: string, fallbackValue: Value): Observable; + + /** + * Returns an observable of a number flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getNumberValue$(flagName: string, fallbackValue: Value): Observable; +} diff --git a/packages/core/feature-flags/core-feature-flags-browser/tsconfig.json b/packages/core/feature-flags/core-feature-flags-browser/tsconfig.json new file mode 100644 index 0000000000000..9fa73d55be770 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-browser/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/README.md b/packages/core/feature-flags/core-feature-flags-server-internal/README.md new file mode 100644 index 0000000000000..288d47fdc95eb --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/README.md @@ -0,0 +1,5 @@ +# @kbn/core-feature-flags-server-internal + +Internal implementation of the server-side Feature Flags Service. + +It should only be imported by _Core_ packages. diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/index.ts b/packages/core/feature-flags/core-feature-flags-server-internal/index.ts new file mode 100644 index 0000000000000..97083327e609d --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/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", 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 { featureFlagsConfig } from './src/feature_flags_config'; +export { FeatureFlagsService, type InternalFeatureFlagsSetup } from './src/feature_flags_service'; +export { CoreFeatureFlagsRouteHandlerContext } from './src/feature_flags_request_handler_context'; diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/jest.config.js b/packages/core/feature-flags/core-feature-flags-server-internal/jest.config.js new file mode 100644 index 0000000000000..67b65d2040c54 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/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/core/feature-flags/core-feature-flags-server-internal'], +}; diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc new file mode 100644 index 0000000000000..60a01597c0454 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-server", + "id": "@kbn/core-feature-flags-server-internal", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/package.json b/packages/core/feature-flags/core-feature-flags-server-internal/package.json new file mode 100644 index 0000000000000..33383b043fa5c --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-feature-flags-server-internal", + "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/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts new file mode 100644 index 0000000000000..fe6725456806b --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_config.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 { ServiceConfigDescriptor } from '@kbn/core-base-server-internal'; +import { schema } from '@kbn/config-schema'; + +/** + * The definition of the validation config schema + * @private + */ +const configSchema = schema.object({ + overrides: schema.maybe(schema.recordOf(schema.string(), schema.any())), +}); + +/** + * Type definition of the Feature Flags configuration + * @private + */ +export interface FeatureFlagsConfig { + overrides?: Record; +} + +/** + * Config descriptor for the feature flags service + * @private + */ +export const featureFlagsConfig: ServiceConfigDescriptor = { + /** + * All config is prefixed by `feature_flags` + */ + path: 'feature_flags', + /** + * The definition of the validation config schema + */ + schema: configSchema, +}; diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_request_handler_context.ts b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_request_handler_context.ts new file mode 100644 index 0000000000000..f0ac4da69b1a9 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_request_handler_context.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 type { + FeatureFlagsRequestHandlerContext, + FeatureFlagsStart, +} from '@kbn/core-feature-flags-server'; + +/** + * The {@link FeatureFlagsRequestHandlerContext} implementation. + * @internal + */ +export class CoreFeatureFlagsRouteHandlerContext implements FeatureFlagsRequestHandlerContext { + constructor(private readonly featureFlags: FeatureFlagsStart) {} + + public getBooleanValue(flagName: string, fallback: boolean): Promise { + return this.featureFlags.getBooleanValue(flagName, fallback); + } + + public getStringValue(flagName: string, fallback: Value): Promise { + return this.featureFlags.getStringValue(flagName, fallback); + } + + public getNumberValue(flagName: string, fallback: Value): Promise { + return this.featureFlags.getNumberValue(flagName, fallback); + } +} diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.test.ts b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.test.ts new file mode 100644 index 0000000000000..7bad676b9528b --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.test.ts @@ -0,0 +1,260 @@ +/* + * Copyright 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 apm from 'elastic-apm-node'; +import { type Client, OpenFeature, type Provider } from '@openfeature/server-sdk'; +import { mockCoreContext } from '@kbn/core-base-server-mocks'; +import { configServiceMock } from '@kbn/config-mocks'; +import type { FeatureFlagsStart } from '@kbn/core-feature-flags-server'; +import { FeatureFlagsService } from '..'; + +describe('FeatureFlagsService Server', () => { + let featureFlagsService: FeatureFlagsService; + let featureFlagsClient: Client; + + beforeEach(() => { + const getClientSpy = jest.spyOn(OpenFeature, 'getClient'); + featureFlagsService = new FeatureFlagsService( + mockCoreContext.create({ + configService: configServiceMock.create({ + atPath: { + overrides: { + 'my-overridden-flag': true, + }, + }, + }), + }) + ); + featureFlagsClient = getClientSpy.mock.results[0].value; + }); + + afterEach(async () => { + await featureFlagsService.stop(); + jest.clearAllMocks(); + await OpenFeature.clearProviders(); + }); + + describe('provider handling', () => { + test('appends a provider (no async operation)', () => { + expect.assertions(1); + const { setProvider } = featureFlagsService.setup(); + const spy = jest.spyOn(OpenFeature, 'setProvider'); + const fakeProvider = { metadata: { name: 'fake provider' } } as Provider; + setProvider(fakeProvider); + expect(spy).toHaveBeenCalledWith(fakeProvider); + }); + + test('throws an error if called twice', () => { + const { setProvider } = featureFlagsService.setup(); + const fakeProvider = { metadata: { name: 'fake provider' } } as Provider; + setProvider(fakeProvider); + expect(() => setProvider(fakeProvider)).toThrowErrorMatchingInlineSnapshot( + `"A provider has already been set. This API cannot be called twice."` + ); + }); + }); + + describe('context handling', () => { + let setContextSpy: jest.SpyInstance; + + beforeEach(() => { + setContextSpy = jest.spyOn(OpenFeature, 'setContext'); + }); + + test('appends context to the provider', () => { + const { appendContext } = featureFlagsService.setup(); + appendContext({ kind: 'multi' }); + expect(setContextSpy).toHaveBeenCalledWith({ kind: 'multi' }); + }); + + test('appends context to the provider (start method)', () => { + featureFlagsService.setup(); + const { appendContext } = featureFlagsService.start(); + appendContext({ kind: 'multi' }); + expect(setContextSpy).toHaveBeenCalledWith({ kind: 'multi' }); + }); + + test('full multi context pass-through', () => { + const { appendContext } = featureFlagsService.setup(); + const context = { + kind: 'multi' as const, + kibana: { + key: 'kibana-1', + }, + organization: { + key: 'organization-1', + }, + }; + appendContext(context); + expect(setContextSpy).toHaveBeenCalledWith(context); + }); + + test('appends to the existing context', () => { + const { appendContext } = featureFlagsService.setup(); + const initialContext = { + kind: 'multi' as const, + kibana: { + key: 'kibana-1', + }, + organization: { + key: 'organization-1', + }, + }; + appendContext(initialContext); + expect(setContextSpy).toHaveBeenCalledWith(initialContext); + + appendContext({ kind: 'multi', kibana: { has_data: true } }); + expect(setContextSpy).toHaveBeenCalledWith({ + ...initialContext, + kibana: { + ...initialContext.kibana, + has_data: true, + }, + }); + }); + + test('converts single-contexts to multi-context', () => { + const { appendContext } = featureFlagsService.setup(); + appendContext({ kind: 'organization', key: 'organization-1' }); + expect(setContextSpy).toHaveBeenCalledWith({ + kind: 'multi', + organization: { + key: 'organization-1', + }, + }); + }); + + test('if no `kind` provided, it defaults to the kibana context', () => { + const { appendContext } = featureFlagsService.setup(); + appendContext({ key: 'key-1', has_data: false }); + expect(setContextSpy).toHaveBeenCalledWith({ + kind: 'multi', + kibana: { + key: 'key-1', + has_data: false, + }, + }); + }); + }); + + describe('flag evaluation', () => { + let startContract: FeatureFlagsStart; + let apmSpy: jest.SpyInstance; + let addHandlerSpy: jest.SpyInstance; + + beforeEach(() => { + addHandlerSpy = jest.spyOn(featureFlagsClient, 'addHandler'); + featureFlagsService.setup(); + startContract = featureFlagsService.start(); + apmSpy = jest.spyOn(apm, 'addLabels'); + }); + + // We don't need to test the client, just our APIs, so testing that it returns the fallback value should be enough. + test('get boolean flag', async () => { + const value = false; + await expect(startContract.getBooleanValue('my-flag', value)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + }); + + test('get string flag', async () => { + const value = 'my-default'; + await expect(startContract.getStringValue('my-flag', value)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + }); + + test('get number flag', async () => { + const value = 42; + await expect(startContract.getNumberValue('my-flag', value)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + }); + + test('observe a boolean flag', async () => { + const value = false; + const flag$ = startContract.getBooleanValue$('my-flag', value); + const observedValues: boolean[] = []; + flag$.subscribe((v) => observedValues.push(v)); + // Initial emission + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + expect(observedValues).toHaveLength(1); + + // Does not reevaluate and emit if the other flags are changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['another-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(1); // still 1 + + // Reevaluates and emits when the observed flag is changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['my-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(2); + }); + + test('observe a string flag', async () => { + const value = 'my-value'; + const flag$ = startContract.getStringValue$('my-flag', value); + const observedValues: string[] = []; + flag$.subscribe((v) => observedValues.push(v)); + // Initial emission + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + expect(observedValues).toHaveLength(1); + + // Does not reevaluate and emit if the other flags are changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['another-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(1); // still 1 + + // Reevaluates and emits when the observed flag is changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['my-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(2); + }); + + test('observe a number flag', async () => { + const value = 42; + const flag$ = startContract.getNumberValue$('my-flag', value); + const observedValues: number[] = []; + flag$.subscribe((v) => observedValues.push(v)); + // Initial emission + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-flag': value }); + expect(observedValues).toHaveLength(1); + + // Does not reevaluate and emit if the other flags are changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['another-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(1); // still 1 + + // Reevaluates and emits when the observed flag is changed + addHandlerSpy.mock.calls[0][1]({ flagsChanged: ['my-flag'] }); + await expect(firstValueFrom(flag$)).resolves.toEqual(value); + expect(observedValues).toHaveLength(2); + }); + + test('with overrides', async () => { + const getBooleanValueSpy = jest.spyOn(featureFlagsClient, 'getBooleanValue'); + await expect(startContract.getBooleanValue('my-overridden-flag', false)).resolves.toEqual( + true + ); + expect(apmSpy).toHaveBeenCalledWith({ 'flag_my-overridden-flag': true }); + expect(getBooleanValueSpy).not.toHaveBeenCalled(); + + // Only to prove the spy works + await expect(startContract.getBooleanValue('another-flag', false)).resolves.toEqual(false); + expect(getBooleanValueSpy).toHaveBeenCalledTimes(1); + expect(getBooleanValueSpy).toHaveBeenCalledWith('another-flag', false); + }); + }); + + test('returns overrides', () => { + const { getOverrides } = featureFlagsService.setup(); + expect(getOverrides()).toStrictEqual({ 'my-overridden-flag': true }); + }); +}); diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts new file mode 100644 index 0000000000000..7b01ebde731fe --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/src/feature_flags_service.ts @@ -0,0 +1,196 @@ +/* + * Copyright 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 { CoreContext } from '@kbn/core-base-server-internal'; +import type { + EvaluationContext, + FeatureFlagsSetup, + FeatureFlagsStart, + MultiContextEvaluationContext, +} from '@kbn/core-feature-flags-server'; +import type { Logger } from '@kbn/logging'; +import apm from 'elastic-apm-node'; +import { + type Client, + OpenFeature, + ServerProviderEvents, + NOOP_PROVIDER, +} from '@openfeature/server-sdk'; +import deepMerge from 'deepmerge'; +import { filter, switchMap, startWith, Subject } from 'rxjs'; +import { type FeatureFlagsConfig, featureFlagsConfig } from './feature_flags_config'; + +/** + * Core-internal contract for the setup lifecycle step. + * @private + */ +export interface InternalFeatureFlagsSetup extends FeatureFlagsSetup { + /** + * Used by the rendering service to share the overrides with the service on the browser side. + */ + getOverrides: () => Record; +} + +/** + * The server-side Feature Flags Service + * @private + */ +export class FeatureFlagsService { + private readonly featureFlagsClient: Client; + private readonly logger: Logger; + private overrides: Record = {}; + private context: MultiContextEvaluationContext = { kind: 'multi' }; + + /** + * The core service's constructor + * @param core {@link CoreContext} + */ + constructor(private readonly core: CoreContext) { + this.logger = core.logger.get('feature-flags-service'); + this.featureFlagsClient = OpenFeature.getClient(); + OpenFeature.setLogger(this.logger.get('open-feature')); + } + + /** + * Setup lifecycle method + */ + public setup(): InternalFeatureFlagsSetup { + // Register "overrides" to be changed via the dynamic config endpoint (enabled in test environments only) + this.core.configService.addDynamicConfigPaths(featureFlagsConfig.path, ['overrides']); + + this.core.configService + .atPath(featureFlagsConfig.path) + .subscribe(({ overrides = {} }) => { + this.overrides = overrides; + }); + + return { + getOverrides: () => this.overrides, + setProvider: (provider) => { + if (OpenFeature.providerMetadata !== NOOP_PROVIDER.metadata) { + throw new Error('A provider has already been set. This API cannot be called twice.'); + } + OpenFeature.setProvider(provider); + }, + appendContext: (contextToAppend) => this.appendContext(contextToAppend), + }; + } + + /** + * Start lifecycle method + */ + public start(): FeatureFlagsStart { + const featureFlagsChanged$ = new Subject(); + this.featureFlagsClient.addHandler(ServerProviderEvents.ConfigurationChanged, (event) => { + if (event?.flagsChanged) { + featureFlagsChanged$.next(event.flagsChanged); + } + }); + const observeFeatureFlag$ = (flagName: string) => + featureFlagsChanged$.pipe( + filter((flagNames) => flagNames.includes(flagName)), + startWith([flagName]) // only to emit on the first call + ); + + return { + appendContext: (contextToAppend) => this.appendContext(contextToAppend), + getBooleanValue: async (flagName, fallbackValue) => + this.evaluateFlag(this.featureFlagsClient.getBooleanValue, flagName, fallbackValue), + getStringValue: async (flagName: string, fallbackValue: Value) => + await this.evaluateFlag( + this.featureFlagsClient.getStringValue, + flagName, + fallbackValue + ), + getNumberValue: async (flagName: string, fallbackValue: Value) => + await this.evaluateFlag( + this.featureFlagsClient.getNumberValue, + flagName, + fallbackValue + ), + getBooleanValue$: (flagName, fallbackValue) => { + return observeFeatureFlag$(flagName).pipe( + switchMap(() => + this.evaluateFlag(this.featureFlagsClient.getBooleanValue, flagName, fallbackValue) + ) + ); + }, + getStringValue$: (flagName: string, fallbackValue: Value) => { + return observeFeatureFlag$(flagName).pipe( + switchMap(() => + this.evaluateFlag( + this.featureFlagsClient.getStringValue, + flagName, + fallbackValue + ) + ) + ); + }, + getNumberValue$: (flagName: string, fallbackValue: Value) => { + return observeFeatureFlag$(flagName).pipe( + switchMap(() => + this.evaluateFlag( + this.featureFlagsClient.getNumberValue, + flagName, + fallbackValue + ) + ) + ); + }, + }; + } + + /** + * Stop lifecycle method + */ + public async stop() { + await OpenFeature.close(); + } + + /** + * Wrapper to evaluate flags with the common config overrides interceptions + APM and counters reporting + * @param evaluationFn The actual evaluation API + * @param flagName The name of the flag to evaluate + * @param fallbackValue The fallback value + * @private + */ + private async evaluateFlag( + evaluationFn: (flagName: string, fallbackValue: T) => Promise, + flagName: string, + fallbackValue: T + ): Promise { + const value = + typeof this.overrides[flagName] !== 'undefined' + ? (this.overrides[flagName] as T) + : // We have to bind the evaluation or the client will lose its internal context + await evaluationFn.bind(this.featureFlagsClient)(flagName, fallbackValue); + apm.addLabels({ [`flag_${flagName}`]: value }); + // TODO: increment usage counter + return value; + } + + /** + * Formats the provided context to fulfill the expected multi-context structure. + * @param contextToAppend The {@link EvaluationContext} to append. + * @private + */ + private appendContext(contextToAppend: EvaluationContext): void { + // If no kind provided, default to the project|deployment level. + const { kind = 'kibana', ...rest } = contextToAppend; + // Format the context to fulfill the expected multi-context structure + const formattedContextToAppend: MultiContextEvaluationContext = + kind === 'multi' + ? (contextToAppend as MultiContextEvaluationContext) + : { kind: 'multi', [kind]: rest }; + + // Merge the formatted context to append to the global context, and set it in the OpenFeature client. + this.context = deepMerge(this.context, formattedContextToAppend); + OpenFeature.setContext(this.context); + } +} diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/tsconfig.json b/packages/core/feature-flags/core-feature-flags-server-internal/tsconfig.json new file mode 100644 index 0000000000000..72a97ef56eb4f --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-internal/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-base-server-internal", + "@kbn/core-feature-flags-server", + "@kbn/logging", + "@kbn/core-base-server-mocks", + "@kbn/config-schema", + "@kbn/config-mocks", + ] +} diff --git a/packages/core/feature-flags/core-feature-flags-server-mocks/README.md b/packages/core/feature-flags/core-feature-flags-server-mocks/README.md new file mode 100644 index 0000000000000..caf2c4a13f8fb --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/README.md @@ -0,0 +1,3 @@ +# @kbn/core-feature-flags-server-mocks + +Server-side Jest mocks for the Feature Flags Service. diff --git a/packages/core/feature-flags/core-feature-flags-server-mocks/index.ts b/packages/core/feature-flags/core-feature-flags-server-mocks/index.ts new file mode 100644 index 0000000000000..182f6dbc21102 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/index.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", 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 { PublicMethodsOf } from '@kbn/utility-types'; +import type { + FeatureFlagsRequestHandlerContext, + FeatureFlagsSetup, + FeatureFlagsStart, +} from '@kbn/core-feature-flags-server'; +import type { + FeatureFlagsService, + InternalFeatureFlagsSetup, +} from '@kbn/core-feature-flags-server-internal'; +import { of } from 'rxjs'; + +const createFeatureFlagsInternalSetup = (): jest.Mocked => { + return { + ...createFeatureFlagsSetup(), + getOverrides: jest.fn().mockReturnValue({}), + }; +}; + +const createFeatureFlagsSetup = (): jest.Mocked => { + return { + setProvider: jest.fn(), + appendContext: jest.fn(), + }; +}; + +const createFeatureFlagsStart = (): jest.Mocked => { + return { + appendContext: jest.fn(), + getBooleanValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getNumberValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getStringValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getBooleanValue$: jest.fn().mockImplementation((_, fallback) => of(fallback)), + getStringValue$: jest.fn().mockImplementation((_, fallback) => of(fallback)), + getNumberValue$: jest.fn().mockImplementation((_, fallback) => of(fallback)), + }; +}; + +const createRequestHandlerContext = (): jest.Mocked => { + return { + getBooleanValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getNumberValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + getStringValue: jest.fn().mockImplementation(async (_, fallback) => fallback), + }; +}; + +const createFeatureFlagsServiceMock = (): jest.Mocked> => { + return { + setup: jest.fn().mockImplementation(createFeatureFlagsInternalSetup), + start: jest.fn().mockImplementation(createFeatureFlagsStart), + stop: jest.fn().mockImplementation(Promise.resolve), + }; +}; + +/** + * Mocks for the Feature Flags service (browser-side) + */ +export const coreFeatureFlagsMock = { + /** + * Mocks the entire feature flags service + */ + create: createFeatureFlagsServiceMock, + /** + * Mocks the core-internal setup contract + */ + createInternalSetup: createFeatureFlagsInternalSetup, + /** + * Mocks the setup contract + */ + createSetup: createFeatureFlagsSetup, + /** + * Mocks the start contract + */ + createStart: createFeatureFlagsStart, + /** + * Mocks the request handler context contract + */ + createRequestHandlerContext, +}; diff --git a/packages/core/feature-flags/core-feature-flags-server-mocks/jest.config.js b/packages/core/feature-flags/core-feature-flags-server-mocks/jest.config.js new file mode 100644 index 0000000000000..bc50c37548c95 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/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/core/feature-flags/core-feature-flags-server-mocks'], +}; diff --git a/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc new file mode 100644 index 0000000000000..69b03f0badbdc --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-server", + "id": "@kbn/core-feature-flags-server-mocks", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/feature-flags/core-feature-flags-server-mocks/package.json b/packages/core/feature-flags/core-feature-flags-server-mocks/package.json new file mode 100644 index 0000000000000..f009e55f76a8e --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-feature-flags-server-mocks", + "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/core/feature-flags/core-feature-flags-server-mocks/tsconfig.json b/packages/core/feature-flags/core-feature-flags-server-mocks/tsconfig.json new file mode 100644 index 0000000000000..c672eb28c83a9 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/utility-types", + "@kbn/core-feature-flags-server", + "@kbn/core-feature-flags-server-internal", + ] +} diff --git a/packages/core/feature-flags/core-feature-flags-server/README.md b/packages/core/feature-flags/core-feature-flags-server/README.md new file mode 100644 index 0000000000000..86b6fc210d0d4 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/README.md @@ -0,0 +1,3 @@ +# @kbn/core-feature-flags-server + +Server-side type definitions for the Feature Flags Service. diff --git a/packages/core/feature-flags/core-feature-flags-server/index.ts b/packages/core/feature-flags/core-feature-flags-server/index.ts new file mode 100644 index 0000000000000..7538b68686cd9 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export type { + EvaluationContext, + MultiContextEvaluationContext, + SingleContextEvaluationContext, + FeatureFlagsSetup, + FeatureFlagsStart, +} from './src/contracts'; +export type { FeatureFlagDefinition, FeatureFlagDefinitions } from './src/feature_flag_definition'; +export type { FeatureFlagsRequestHandlerContext } from './src/request_handler_context'; diff --git a/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc new file mode 100644 index 0000000000000..dc896ed83b97b --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-server", + "id": "@kbn/core-feature-flags-server", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/feature-flags/core-feature-flags-server/package.json b/packages/core/feature-flags/core-feature-flags-server/package.json new file mode 100644 index 0000000000000..d1f18a98a3840 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-feature-flags-server", + "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/core/feature-flags/core-feature-flags-server/src/contracts.ts b/packages/core/feature-flags/core-feature-flags-server/src/contracts.ts new file mode 100644 index 0000000000000..34fc3a3a73383 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/src/contracts.ts @@ -0,0 +1,165 @@ +/* + * Copyright 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 { Provider } from '@openfeature/server-sdk'; +import { type EvaluationContext as OpenFeatureEvaluationContext } from '@openfeature/core'; +import type { Observable } from 'rxjs'; + +/** + * The evaluation context to use when retrieving the flags. + * + * We use multi-context so that we can apply segmentation rules at different levels (`organization`/`kibana`). + * * `organization` includes any information that is common to all the projects/deployments in an organization. An example is the in_trial status. + * * The `kibana` context includes all the information that identifies a project/deployment. Examples are version, offering, and has_data. + * Kind helps us specify which sub-context should receive the new attributes. + * If no `kind` is provided, it defaults to `kibana`. + * + * @example Providing properties for both contexts + * { + * kind: 'multi', + * organization: { + * key: 1234, + * in_trial: true, + * }, + * kibana: { + * key: 12345567890, + * version: 8.15.0, + * buildHash: 'ffffffffaaaaaaaa', + * }, + * } + * + * @example Appending context to the organization sub-context + * { + * kind: 'organization', + * key: 1234, + * in_trial: true, + * } + * + * @example Appending context to the `kibana` sub-context + * { + * key: 12345567890, + * version: 8.15.0, + * buildHash: 'ffffffffaaaaaaaa', + * } + * } + * + * @public + */ +export type EvaluationContext = MultiContextEvaluationContext | SingleContextEvaluationContext; + +/** + * Multi-context format. The sub-contexts are provided in their nested properties. + * @public + */ +export type MultiContextEvaluationContext = OpenFeatureEvaluationContext & { + /** + * Static `multi` string + */ + kind: 'multi'; + /** + * The Elastic Cloud organization-specific context. + */ + organization?: OpenFeatureEvaluationContext; + /** + * The deployment/project-specific context. + */ + kibana?: OpenFeatureEvaluationContext; +}; + +/** + * Single Context format. If `kind` is not specified, it applies to the `kibana` sub-context. + */ +export type SingleContextEvaluationContext = OpenFeatureEvaluationContext & { + /** + * The sub-context that it's updated. Defaults to `kibana`. + */ + kind?: 'organization' | 'kibana'; +}; + +/** + * Setup contract of the Feature Flags Service + * @public + */ +export interface FeatureFlagsSetup { + /** + * Registers an OpenFeature provider to talk to the + * 3rd-party service that manages the Feature Flags. + * @param provider The {@link Provider | OpenFeature Provider} to handle the communication with the feature flags management system. + * @public + */ + setProvider(provider: Provider): void; + + /** + * Appends new keys to the evaluation context. + * @param contextToAppend The additional keys that should be appended/modified in the evaluation context. + * @public + */ + appendContext(contextToAppend: EvaluationContext): void; +} + +/** + * Setup contract of the Feature Flags Service + * @public + */ +export interface FeatureFlagsStart { + /** + * Appends new keys to the evaluation context. + * @param contextToAppend The additional keys that should be appended/modified in the evaluation context. + * @public + */ + appendContext(contextToAppend: EvaluationContext): void; + + /** + * Evaluates a boolean flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getBooleanValue(flagName: string, fallbackValue: boolean): Promise; + + /** + * Evaluates a string flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getStringValue(flagName: string, fallbackValue: Value): Promise; + + /** + * Evaluates a number flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getNumberValue(flagName: string, fallbackValue: Value): Promise; + + /** + * Returns an observable of a boolean flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getBooleanValue$(flagName: string, fallbackValue: boolean): Observable; + + /** + * Returns an observable of a string flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getStringValue$(flagName: string, fallbackValue: Value): Observable; + + /** + * Returns an observable of a number flag + * @param flagName The flag ID to evaluate + * @param fallbackValue If the flag cannot be evaluated for whatever reason, the fallback value is provided. + * @public + */ + getNumberValue$(flagName: string, fallbackValue: Value): Observable; +} diff --git a/packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts b/packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts new file mode 100644 index 0000000000000..3ea761484fc2a --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/src/feature_flag_definition.ts @@ -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", 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". + */ + +/** + * List of {@link FeatureFlagDefinition} + */ +export type FeatureFlagDefinitions = Array< + | FeatureFlagDefinition<'boolean'> + | FeatureFlagDefinition<'string'> + | FeatureFlagDefinition<'number'> +>; + +/** + * Definition of a feature flag + */ +export interface FeatureFlagDefinition { + /** + * The ID of the feature flag. Used to reference it when evaluating the flag. + */ + key: string; + /** + * Human friendly name. + */ + name: string; + /** + * Description of the purpose of the feature flag. + */ + description?: string; + /** + * Tags to apply to the feature flag for easier categorizing. It may include the plugin, the solution, the team. + */ + tags: string[]; + /** + * The type of the values returned by the feature flag ("string", "boolean", or "number"). + */ + variationType: ValueType; + /** + * List of variations of the feature flags. + */ + variations: Array<{ + /** + * Human friendly name of the variation. + */ + name: string; + /** + * Description of the variation. + */ + description?: string; + /** + * The value of the variation. + */ + value: ValueType extends 'string' ? string : ValueType extends 'boolean' ? boolean : number; + }>; +} diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_size.ts b/packages/core/feature-flags/core-feature-flags-server/src/request_handler_context.ts similarity index 51% rename from packages/kbn-expandable-flyout/src/hooks/use_window_size.ts rename to packages/core/feature-flags/core-feature-flags-server/src/request_handler_context.ts index 268e70b8f6d6c..25f521e18f1c9 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_window_size.ts +++ b/packages/core/feature-flags/core-feature-flags-server/src/request_handler_context.ts @@ -7,20 +7,12 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { useLayoutEffect, useState } from 'react'; +import type { FeatureFlagsStart } from '..'; /** - * Hook that returns the browser window width + * The HTTP request handler context for evaluating feature flags */ -export const useWindowSize = (): number => { - const [width, setWidth] = useState(0); - useLayoutEffect(() => { - function updateSize() { - setWidth(window.innerWidth); - } - window.addEventListener('resize', updateSize); - updateSize(); - return () => window.removeEventListener('resize', updateSize); - }, []); - return width; -}; +export type FeatureFlagsRequestHandlerContext = Pick< + FeatureFlagsStart, + 'getBooleanValue' | 'getStringValue' | 'getNumberValue' +>; diff --git a/packages/core/feature-flags/core-feature-flags-server/tsconfig.json b/packages/core/feature-flags/core-feature-flags-server/tsconfig.json new file mode 100644 index 0000000000000..f5bb1b00512e4 --- /dev/null +++ b/packages/core/feature-flags/core-feature-flags-server/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts index 2e1e3b790b55a..376eb5a2bd24f 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts +++ b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts @@ -33,12 +33,15 @@ import { CoreUserProfileRouteHandlerContext, type InternalUserProfileServiceStart, } from '@kbn/core-user-profile-server-internal'; +import { CoreFeatureFlagsRouteHandlerContext } from '@kbn/core-feature-flags-server-internal'; +import type { FeatureFlagsStart } from '@kbn/core-feature-flags-server'; /** * Subset of `InternalCoreStart` used by {@link CoreRouteHandlerContext} * @internal */ export interface CoreRouteHandlerContextParams { + featureFlags: FeatureFlagsStart; elasticsearch: InternalElasticsearchServiceStart; savedObjects: InternalSavedObjectsServiceStart; uiSettings: InternalUiSettingsServiceStart; @@ -53,6 +56,7 @@ export interface CoreRouteHandlerContextParams { * @internal */ export class CoreRouteHandlerContext implements CoreRequestHandlerContext { + #featureFlags?: CoreFeatureFlagsRouteHandlerContext; #elasticsearch?: CoreElasticsearchRouteHandlerContext; #savedObjects?: CoreSavedObjectsRouteHandlerContext; #uiSettings?: CoreUiSettingsRouteHandlerContext; @@ -65,6 +69,13 @@ export class CoreRouteHandlerContext implements CoreRequestHandlerContext { private readonly request: KibanaRequest ) {} + public get featureFlags() { + if (!this.#featureFlags) { + this.#featureFlags = new CoreFeatureFlagsRouteHandlerContext(this.coreStart.featureFlags); + } + return this.#featureFlags; + } + public get elasticsearch() { if (!this.#elasticsearch) { this.#elasticsearch = new CoreElasticsearchRouteHandlerContext( diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts index 1839f51a68c62..01b3c7aee4656 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts +++ b/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; import { savedObjectsServiceMock } from '@kbn/core-saved-objects-server-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; @@ -16,6 +17,7 @@ import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export const createCoreRouteHandlerContextParamsMock = () => { return { + featureFlags: coreFeatureFlagsMock.createStart(), elasticsearch: elasticsearchServiceMock.createInternalStart(), savedObjects: savedObjectsServiceMock.createInternalStartContract(), uiSettings: uiSettingsServiceMock.createStartContract(), diff --git a/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json b/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json index 9e5ab96901e86..99c86608d99de 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json +++ b/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json @@ -27,6 +27,9 @@ "@kbn/core-security-server-mocks", "@kbn/core-user-profile-server-internal", "@kbn/core-user-profile-server-mocks", + "@kbn/core-feature-flags-server-internal", + "@kbn/core-feature-flags-server", + "@kbn/core-feature-flags-server-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/http/core-http-request-handler-context-server/src/preboot_request_handler_context.ts b/packages/core/http/core-http-request-handler-context-server/src/preboot_request_handler_context.ts index 8f2755403e1d8..294adf380d8e1 100644 --- a/packages/core/http/core-http-request-handler-context-server/src/preboot_request_handler_context.ts +++ b/packages/core/http/core-http-request-handler-context-server/src/preboot_request_handler_context.ts @@ -11,22 +11,34 @@ import type { RequestHandlerContextBase } from '@kbn/core-http-server'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; /** + * `uiSettings` http request context provider during the preboot phase. * @public */ export interface PrebootUiSettingsRequestHandlerContext { + /** + * The {@link IUiSettingsClient | UI Settings client}. + */ client: IUiSettingsClient; } /** + * The `core` context provided to route handler during the preboot phase. * @public */ export interface PrebootCoreRequestHandlerContext { + /** + * {@link PrebootUiSettingsRequestHandlerContext} + */ uiSettings: PrebootUiSettingsRequestHandlerContext; } /** + * Base context passed to a route handler during the preboot phase, containing the `core` context part. * @public */ export interface PrebootRequestHandlerContext extends RequestHandlerContextBase { + /** + * Promise that resolves the {@link PrebootCoreRequestHandlerContext} + */ core: Promise; } diff --git a/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts b/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts index 0dc5655c820fa..1d77e033b8e62 100644 --- a/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts +++ b/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts @@ -14,6 +14,7 @@ import type { DeprecationsRequestHandlerContext } from '@kbn/core-deprecations-s import type { UiSettingsRequestHandlerContext } from '@kbn/core-ui-settings-server'; import type { SecurityRequestHandlerContext } from '@kbn/core-security-server'; import type { UserProfileRequestHandlerContext } from '@kbn/core-user-profile-server'; +import type { FeatureFlagsRequestHandlerContext } from '@kbn/core-feature-flags-server'; /** * The `core` context provided to route handler. @@ -30,11 +31,33 @@ import type { UserProfileRequestHandlerContext } from '@kbn/core-user-profile-se * @public */ export interface CoreRequestHandlerContext { + /** + * {@link SavedObjectsRequestHandlerContext} + */ savedObjects: SavedObjectsRequestHandlerContext; + /** + * {@link ElasticsearchRequestHandlerContext} + */ elasticsearch: ElasticsearchRequestHandlerContext; + /** + * {@link FeatureFlagsRequestHandlerContext} + */ + featureFlags: FeatureFlagsRequestHandlerContext; + /** + * {@link UiSettingsRequestHandlerContext} + */ uiSettings: UiSettingsRequestHandlerContext; + /** + * {@link DeprecationsRequestHandlerContext} + */ deprecations: DeprecationsRequestHandlerContext; + /** + * {@link SecurityRequestHandlerContext} + */ security: SecurityRequestHandlerContext; + /** + * {@link UserProfileRequestHandlerContext} + */ userProfile: UserProfileRequestHandlerContext; } @@ -44,6 +67,9 @@ export interface CoreRequestHandlerContext { * @public */ export interface RequestHandlerContext extends RequestHandlerContextBase { + /** + * Promise that resolves the {@link CoreRequestHandlerContext} + */ core: Promise; } diff --git a/packages/core/http/core-http-request-handler-context-server/tsconfig.json b/packages/core/http/core-http-request-handler-context-server/tsconfig.json index 4606770c753d7..905a13801f223 100644 --- a/packages/core/http/core-http-request-handler-context-server/tsconfig.json +++ b/packages/core/http/core-http-request-handler-context-server/tsconfig.json @@ -17,7 +17,8 @@ "@kbn/core-deprecations-server", "@kbn/core-ui-settings-server", "@kbn/core-security-server", - "@kbn/core-user-profile-server" + "@kbn/core-user-profile-server", + "@kbn/core-feature-flags-server" ], "exclude": [ "target/**/*", diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.test.ts b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.test.ts index dd1e768a64709..dd315b38fe3c2 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.test.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.test.ts @@ -9,6 +9,7 @@ import type { DiscoveredPlugin } from '@kbn/core-base-common'; import { InjectedMetadataService } from './injected_metadata_service'; +import type { InjectedMetadataParams } from '..'; describe('setup.getElasticsearchInfo()', () => { it('returns elasticsearch info from injectedMetadata', () => { @@ -160,3 +161,29 @@ describe('setup.getLegacyMetadata()', () => { }).toThrowError(); }); }); + +describe('setup.getFeatureFlags()', () => { + it('returns injectedMetadata.featureFlags', () => { + const injectedMetadata = new InjectedMetadataService({ + injectedMetadata: { + featureFlags: { + overrides: { + 'my-overridden-flag': 1234, + }, + }, + }, + } as unknown as InjectedMetadataParams); + + const contract = injectedMetadata.setup(); + expect(contract.getFeatureFlags()).toStrictEqual({ overrides: { 'my-overridden-flag': 1234 } }); + }); + + it('returns empty injectedMetadata.featureFlags', () => { + const injectedMetadata = new InjectedMetadataService({ + injectedMetadata: {}, + } as unknown as InjectedMetadataParams); + + const contract = injectedMetadata.setup(); + expect(contract.getFeatureFlags()).toBeUndefined(); + }); +}); diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts index 624c213ce11bc..b9594b9f042e3 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts @@ -95,6 +95,10 @@ export class InjectedMetadataService { getCustomBranding: () => { return this.state.customBranding; }, + + getFeatureFlags: () => { + return this.state.featureFlags; + }, }; } } diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts index f8c730414746d..244b99da0c207 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts @@ -58,6 +58,11 @@ export interface InternalInjectedMetadataSetup { }; }; getCustomBranding: () => CustomBranding; + getFeatureFlags: () => + | { + overrides: Record; + } + | undefined; } /** @internal */ diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts b/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts index 9ee48eda09210..804134cabd4b9 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts @@ -30,6 +30,7 @@ const createSetupContractMock = () => { getPlugins: jest.fn(), getKibanaBuildNumber: jest.fn(), getCustomBranding: jest.fn(), + getFeatureFlags: jest.fn(), }; setupContract.getBasePath.mockReturnValue('/base-path'); setupContract.getServerBasePath.mockReturnValue('/server-base-path'); diff --git a/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts b/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts index 498e1ff0f15e9..1ee75dbfc0d5d 100644 --- a/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts +++ b/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts @@ -63,6 +63,9 @@ export interface InjectedMetadata { mode: EnvironmentMode; packageInfo: PackageInfo; }; + featureFlags?: { + overrides: Record; + }; anonymousStatusPage: boolean; i18n: { translationsUrl: string; diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts index 9730936cedb93..07695d37bea69 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts @@ -13,6 +13,7 @@ import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata- import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { InternalSecurityServiceSetup } from '@kbn/core-security-browser-internal'; import type { InternalUserProfileServiceSetup } from '@kbn/core-user-profile-browser-internal'; +import type { FeatureFlagsSetup } from '@kbn/core-feature-flags-browser'; /** @internal */ export interface InternalCoreSetup @@ -21,6 +22,7 @@ export interface InternalCoreSetup 'application' | 'plugins' | 'getStartServices' | 'http' | 'security' | 'userProfile' > { application: InternalApplicationSetup; + featureFlags: FeatureFlagsSetup; injectedMetadata: InternalInjectedMetadataSetup; http: InternalHttpSetup; security: InternalSecurityServiceSetup; diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts index 0571ca18955b1..f422275f53019 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts @@ -13,11 +13,13 @@ import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata- import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { InternalSecurityServiceStart } from '@kbn/core-security-browser-internal'; import type { InternalUserProfileServiceStart } from '@kbn/core-user-profile-browser-internal'; +import type { FeatureFlagsStart } from '@kbn/core-feature-flags-browser'; /** @internal */ export interface InternalCoreStart extends Omit { application: InternalApplicationStart; + featureFlags: FeatureFlagsStart; injectedMetadata: InternalInjectedMetadataStart; http: InternalHttpStart; security: InternalSecurityServiceStart; diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json index 4fd531018418d..84c55c0e87b90 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json @@ -17,7 +17,8 @@ "@kbn/core-injected-metadata-browser-internal", "@kbn/core-http-browser-internal", "@kbn/core-security-browser-internal", - "@kbn/core-user-profile-browser-internal" + "@kbn/core-user-profile-browser-internal", + "@kbn/core-feature-flags-browser" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts index 1a3f6e22ff39a..9937286104efe 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts @@ -21,6 +21,7 @@ import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-moc import { securityServiceMock } from '@kbn/core-security-browser-mocks'; import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks'; import { createCoreStartMock } from './core_start.mock'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-browser-mocks'; export function createCoreSetupMock({ basePath = '', @@ -38,6 +39,7 @@ export function createCoreSetupMock({ docLinks: docLinksServiceMock.createSetupContract(), executionContext: executionContextServiceMock.createSetupContract(), fatalErrors: fatalErrorsServiceMock.createSetupContract(), + featureFlags: coreFeatureFlagsMock.createSetup(), getStartServices: jest.fn, any, any]>, []>(() => Promise.resolve([createCoreStartMock({ basePath }), pluginStartDeps, pluginStartContract]) ), diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts index 71f5dd0db3958..f6f5aa5493f73 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts @@ -24,6 +24,7 @@ import { chromeServiceMock } from '@kbn/core-chrome-browser-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks'; import { securityServiceMock } from '@kbn/core-security-browser-mocks'; import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-browser-mocks'; export function createCoreStartMock({ basePath = '' } = {}) { const mock = { @@ -33,6 +34,7 @@ export function createCoreStartMock({ basePath = '' } = {}) { customBranding: customBrandingServiceMock.createStartContract(), docLinks: docLinksServiceMock.createStartContract(), executionContext: executionContextServiceMock.createStartContract(), + featureFlags: coreFeatureFlagsMock.createStart(), http: httpServiceMock.createStartContract({ basePath }), i18n: i18nServiceMock.createStartContract(), notifications: notificationServiceMock.createStartContract(), diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json index b6df8220f8603..cc1f0ed785dbc 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json @@ -28,7 +28,8 @@ "@kbn/core-chrome-browser-mocks", "@kbn/core-custom-branding-browser-mocks", "@kbn/core-security-browser-mocks", - "@kbn/core-user-profile-browser-mocks" + "@kbn/core-user-profile-browser-mocks", + "@kbn/core-feature-flags-browser-mocks" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts index a989bdda60426..bef46aa4b84c1 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts @@ -10,6 +10,7 @@ import type { ThemeServiceSetup } from '@kbn/core-theme-browser'; import type { AnalyticsServiceSetup } from '@kbn/core-analytics-browser'; import type { ExecutionContextSetup } from '@kbn/core-execution-context-browser'; +import type { FeatureFlagsSetup } from '@kbn/core-feature-flags-browser'; import type { HttpSetup } from '@kbn/core-http-browser'; import type { FatalErrorsSetup } from '@kbn/core-fatal-errors-browser'; import type { IUiSettingsClient, SettingsStart } from '@kbn/core-ui-settings-browser'; @@ -44,6 +45,8 @@ export interface CoreSetup & { elasticsearch: ReturnType; @@ -61,6 +62,7 @@ export function createCoreSetupMock({ userSettings: userSettingsServiceMock.createSetupContract(), docLinks: docLinksServiceMock.createSetupContract(), elasticsearch: elasticsearchServiceMock.createSetup(), + featureFlags: coreFeatureFlagsMock.createSetup(), http: httpMock, i18n: i18nServiceMock.createSetupContract(), savedObjects: savedObjectsServiceMock.createInternalSetupContract(), diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts index 8bbdb322bb14a..d4b341bcf2f54 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts @@ -22,6 +22,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; export function createCoreStartMock() { const mock: MockedKeys = { @@ -29,6 +30,7 @@ export function createCoreStartMock() { capabilities: capabilitiesServiceMock.createStartContract(), docLinks: docLinksServiceMock.createStartContract(), elasticsearch: elasticsearchServiceMock.createStart(), + featureFlags: coreFeatureFlagsMock.createStart(), http: httpServiceMock.createStartContract(), metrics: metricsServiceMock.createStartContract(), savedObjects: savedObjectsServiceMock.createStartContract(), diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts index 4919fa0c65eb5..4e6ca5b75059f 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts @@ -29,6 +29,7 @@ import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mock import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; export function createInternalCoreSetupMock() { const setupDeps = { @@ -37,6 +38,7 @@ export function createInternalCoreSetupMock() { context: contextServiceMock.createSetupContract(), docLinks: docLinksServiceMock.createSetupContract(), elasticsearch: elasticsearchServiceMock.createInternalSetup(), + featureFlags: coreFeatureFlagsMock.createInternalSetup(), http: httpServiceMock.createInternalSetupContract(), savedObjects: savedObjectsServiceMock.createInternalSetupContract(), status: statusServiceMock.createInternalSetupContract(), diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts index 4e0d63f654516..248a9712057f4 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts @@ -21,6 +21,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; export function createInternalCoreStartMock() { const startDeps = { @@ -28,6 +29,7 @@ export function createInternalCoreStartMock() { capabilities: capabilitiesServiceMock.createStartContract(), docLinks: docLinksServiceMock.createStartContract(), elasticsearch: elasticsearchServiceMock.createInternalStart(), + featureFlags: coreFeatureFlagsMock.createStart(), http: httpServiceMock.createInternalStartContract(), metrics: metricsServiceMock.createInternalStartContract(), savedObjects: savedObjectsServiceMock.createInternalStartContract(), diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json index bacda3278557b..89ec5b0e1b7ba 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json @@ -37,6 +37,7 @@ "@kbn/core-user-settings-server-mocks", "@kbn/core-security-server-mocks", "@kbn/core-user-profile-server-mocks", + "@kbn/core-feature-flags-server-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts index 63f56f22cc145..59616a5d65ecd 100644 --- a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts @@ -13,6 +13,7 @@ import type { DeprecationsServiceSetup } from '@kbn/core-deprecations-server'; import type { DocLinksServiceSetup } from '@kbn/core-doc-links-server'; import type { ElasticsearchServiceSetup } from '@kbn/core-elasticsearch-server'; import type { ExecutionContextSetup } from '@kbn/core-execution-context-server'; +import type { FeatureFlagsSetup } from '@kbn/core-feature-flags-server'; import type { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; import type { HttpResources } from '@kbn/core-http-resources-server'; import type { HttpServiceSetup } from '@kbn/core-http-server'; @@ -52,6 +53,8 @@ export interface CoreSetup & { /** {@link HttpResources} */ diff --git a/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts b/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts index ae6135c55800f..13d871df8b759 100644 --- a/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts @@ -12,6 +12,7 @@ import type { CapabilitiesStart } from '@kbn/core-capabilities-server'; import type { DocLinksServiceStart } from '@kbn/core-doc-links-server'; import type { ElasticsearchServiceStart } from '@kbn/core-elasticsearch-server'; import type { ExecutionContextStart } from '@kbn/core-execution-context-server'; +import type { FeatureFlagsStart } from '@kbn/core-feature-flags-server'; import type { HttpServiceStart } from '@kbn/core-http-server'; import type { MetricsServiceStart } from '@kbn/core-metrics-server'; import type { SavedObjectsServiceStart } from '@kbn/core-saved-objects-server'; @@ -40,6 +41,8 @@ export interface CoreStart { elasticsearch: ElasticsearchServiceStart; /** {@link ExecutionContextStart} */ executionContext: ExecutionContextStart; + /** {@link FeatureFlagsStart} */ + featureFlags: FeatureFlagsStart; /** {@link HttpServiceStart} */ http: HttpServiceStart; /** {@link MetricsServiceStart} */ diff --git a/packages/core/lifecycle/core-lifecycle-server/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server/tsconfig.json index ed35724914dec..c8b95eed1e6d7 100644 --- a/packages/core/lifecycle/core-lifecycle-server/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-server/tsconfig.json @@ -32,7 +32,8 @@ "@kbn/core-user-settings-server", "@kbn/core-plugins-contracts-server", "@kbn/core-security-server", - "@kbn/core-user-profile-server" + "@kbn/core-user-profile-server", + "@kbn/core-feature-flags-server" ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts index ad242905f7751..b78e5cec0b276 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts @@ -82,6 +82,7 @@ export function createPluginSetupContext< }, customBranding: deps.customBranding, fatalErrors: deps.fatalErrors, + featureFlags: deps.featureFlags, executionContext: deps.executionContext, http: { ...deps.http, @@ -147,6 +148,7 @@ export function createPluginStartContext< customBranding: deps.customBranding, docLinks: deps.docLinks, executionContext: deps.executionContext, + featureFlags: deps.featureFlags, http: { ...deps.http, staticAssets: { diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts index 76306751427cf..539b629974982 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts @@ -218,6 +218,10 @@ export function createPluginSetupContext({ withContext: deps.executionContext.withContext, getAsLabels: deps.executionContext.getAsLabels, }, + featureFlags: { + setProvider: deps.featureFlags.setProvider, + appendContext: deps.featureFlags.appendContext, + }, http: { createCookieSessionStorageFactory: deps.http.createCookieSessionStorageFactory, registerRouteHandlerContext: < @@ -332,6 +336,15 @@ export function createPluginStartContext({ getCapabilities: deps.elasticsearch.getCapabilities, }, executionContext: deps.executionContext, + featureFlags: { + appendContext: deps.featureFlags.appendContext, + getBooleanValue: deps.featureFlags.getBooleanValue, + getStringValue: deps.featureFlags.getStringValue, + getNumberValue: deps.featureFlags.getNumberValue, + getBooleanValue$: deps.featureFlags.getBooleanValue$, + getStringValue$: deps.featureFlags.getStringValue$, + getNumberValue$: deps.featureFlags.getNumberValue$, + }, http: { auth: deps.http.auth, basePath: deps.http.basePath, diff --git a/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap index e92e760b400e5..c858b6a8470d2 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap +++ b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap @@ -39,6 +39,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -121,6 +124,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -199,6 +205,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -281,6 +290,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -359,6 +371,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -437,6 +452,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -519,6 +537,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -597,6 +618,90 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, + "i18n": Object { + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", + }, + "legacyMetadata": Object { + "globalUiSettings": Object { + "defaults": Object {}, + "user": Object {}, + }, + "uiSettings": Object { + "defaults": Object { + "registered": Object { + "name": "title", + }, + }, + "user": Object {}, + }, + }, + "logging": Any, + "publicBaseUrl": "http://myhost.com/mock-server-basepath", + "serverBasePath": "/mock-server-basepath", + "theme": Object { + "darkMode": "theme:darkMode", + "stylesheetPaths": Object { + "dark": Array [ + "/style-1.css", + "/style-2.css", + ], + "default": Array [ + "/style-1.css", + "/style-2.css", + ], + }, + "version": "v8", + }, + "uiPlugins": Array [], + "version": Any, +} +`; + +exports[`RenderingService preboot() render() renders feature flags overrides 1`] = ` +Object { + "anonymousStatusPage": false, + "apmConfig": Object { + "stubApmConfig": true, + }, + "assetsHrefBase": "http://foo.bar:1773", + "basePath": "/mock-server-basepath", + "branch": Any, + "buildNumber": Any, + "clusterInfo": Object {}, + "csp": Object { + "warnLegacyBrowsers": true, + }, + "customBranding": Object {}, + "env": Object { + "mode": Object { + "dev": Any, + "name": Any, + "prod": Any, + }, + "packageInfo": Object { + "branch": Any, + "buildDate": "2023-05-15T23:12:09.000Z", + "buildFlavor": Any, + "buildNum": Any, + "buildSha": Any, + "buildShaShort": "XXXXXX", + "dist": Any, + "version": Any, + }, + }, + "externalUrl": Object { + "policy": Array [ + Object { + "allow": true, + }, + ], + }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -680,6 +785,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -762,6 +870,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -845,6 +956,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -932,6 +1046,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -1010,6 +1127,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -1093,6 +1213,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -1180,6 +1303,9 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, @@ -1263,6 +1389,97 @@ Object { }, ], }, + "featureFlags": Object { + "overrides": Object {}, + }, + "i18n": Object { + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", + }, + "legacyMetadata": Object { + "globalUiSettings": Object { + "defaults": Object {}, + "user": Object {}, + }, + "uiSettings": Object { + "defaults": Object { + "registered": Object { + "name": "title", + }, + }, + "user": Object {}, + }, + }, + "logging": Any, + "publicBaseUrl": "http://myhost.com/mock-server-basepath", + "serverBasePath": "/mock-server-basepath", + "theme": Object { + "darkMode": "theme:darkMode", + "stylesheetPaths": Object { + "dark": Array [ + "/style-1.css", + "/style-2.css", + ], + "default": Array [ + "/style-1.css", + "/style-2.css", + ], + }, + "version": "v8", + }, + "uiPlugins": Array [], + "version": Any, +} +`; + +exports[`RenderingService setup() render() renders feature flags overrides 1`] = ` +Object { + "anonymousStatusPage": false, + "apmConfig": Object { + "stubApmConfig": true, + }, + "assetsHrefBase": "/mock-server-basepath", + "basePath": "/mock-server-basepath", + "branch": Any, + "buildNumber": Any, + "clusterInfo": Object { + "cluster_build_flavor": "default", + "cluster_name": "cluster-name", + "cluster_uuid": "cluster-uuid", + "cluster_version": "8.0.0", + }, + "csp": Object { + "warnLegacyBrowsers": true, + }, + "customBranding": Object {}, + "env": Object { + "mode": Object { + "dev": Any, + "name": Any, + "prod": Any, + }, + "packageInfo": Object { + "branch": Any, + "buildDate": "2023-05-15T23:12:09.000Z", + "buildFlavor": Any, + "buildNum": Any, + "buildSha": Any, + "buildShaShort": "XXXXXX", + "dist": Any, + "version": Any, + }, + }, + "externalUrl": Object { + "policy": Array [ + Object { + "allow": true, + }, + ], + }, + "featureFlags": Object { + "overrides": Object { + "my-overridden-flag": 1234, + }, + }, "i18n": Object { "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, diff --git a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts index 1a746e1dbd784..b22697a494788 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts @@ -82,6 +82,10 @@ function renderTestCases( }); }); + afterEach(() => { + mockRenderingSetupDeps.featureFlags.getOverrides.mockReset(); + }); + it('renders "core" page', async () => { const [render] = await getRender(); const content = await render(createKibanaRequest(), uiSettings); @@ -245,6 +249,19 @@ function renderTestCases( expect(data).toMatchSnapshot(INJECTED_METADATA); }); + it('renders feature flags overrides', async () => { + mockRenderingSetupDeps.featureFlags.getOverrides.mockReturnValueOnce({ + 'my-overridden-flag': 1234, + }); + const [render] = await getRender(); + const content = await render(createKibanaRequest(), uiSettings, { + isAnonymousPage: false, + }); + const dom = load(content); + const data = JSON.parse(dom('kbn-injected-metadata').attr('data') ?? '""'); + expect(data).toMatchSnapshot(INJECTED_METADATA); + }); + it('renders "core" with logging config injected', async () => { const loggingConfig = { root: { diff --git a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx index 25a10be54f5bd..a696328475853 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx @@ -51,6 +51,7 @@ type RenderOptions = | (RenderingPrebootDeps & { status?: never; elasticsearch?: never; + featureFlags?: never; customBranding?: never; userSettings?: never; }); @@ -85,6 +86,7 @@ export class RenderingService { public async setup({ elasticsearch, + featureFlags, http, status, uiPlugins, @@ -106,6 +108,7 @@ export class RenderingService { return { render: this.render.bind(this, { elasticsearch, + featureFlags, http, uiPlugins, status, @@ -125,8 +128,16 @@ export class RenderingService { }, { isAnonymousPage = false, includeExposedConfigKeys }: IRenderOptions = {} ) { - const { elasticsearch, http, uiPlugins, status, customBranding, userSettings, i18n } = - renderOptions; + const { + elasticsearch, + featureFlags, + http, + uiPlugins, + status, + customBranding, + userSettings, + i18n, + } = renderOptions; const env = { mode: this.coreContext.env.mode, @@ -251,6 +262,9 @@ export class RenderingService { assetsHrefBase: staticAssetsHrefBase, logging: loggingConfig, env, + featureFlags: { + overrides: featureFlags?.getOverrides() || {}, + }, clusterInfo, apmConfig, anonymousStatusPage: status?.isStatusPageAnonymous() ?? false, diff --git a/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts index b8a3f1fe0c35b..735358f5aa92f 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts @@ -14,6 +14,7 @@ import { statusServiceMock } from '@kbn/core-status-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks'; import { i18nServiceMock } from '@kbn/core-i18n-server-mocks'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; const context = mockCoreContext.create(); const httpPreboot = httpServiceMock.createInternalPrebootContract(); @@ -39,6 +40,7 @@ export const mockRenderingPrebootDeps = { }; export const mockRenderingSetupDeps = { elasticsearch, + featureFlags: coreFeatureFlagsMock.createInternalSetup(), http: httpSetup, uiPlugins: createUiPlugins(), customBranding, diff --git a/packages/core/rendering/core-rendering-server-internal/src/types.ts b/packages/core/rendering/core-rendering-server-internal/src/types.ts index 57fee5e26cf48..1897ffdc08eb3 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/types.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/types.ts @@ -24,6 +24,7 @@ import type { CustomBranding } from '@kbn/core-custom-branding-common'; import type { InternalUserSettingsServiceSetup } from '@kbn/core-user-settings-server-internal'; import type { I18nServiceSetup } from '@kbn/core-i18n-server'; import type { InternalI18nServicePreboot } from '@kbn/core-i18n-server-internal'; +import type { InternalFeatureFlagsSetup } from '@kbn/core-feature-flags-server-internal'; /** @internal */ export interface RenderingMetadata { @@ -49,6 +50,7 @@ export interface RenderingPrebootDeps { /** @internal */ export interface RenderingSetupDeps { elasticsearch: InternalElasticsearchServiceSetup; + featureFlags: InternalFeatureFlagsSetup; http: InternalHttpServiceSetup; status: InternalStatusServiceSetup; uiPlugins: UiPlugins; diff --git a/packages/core/rendering/core-rendering-server-internal/tsconfig.json b/packages/core/rendering/core-rendering-server-internal/tsconfig.json index 2689069f79d79..28a22d3d51ca9 100644 --- a/packages/core/rendering/core-rendering-server-internal/tsconfig.json +++ b/packages/core/rendering/core-rendering-server-internal/tsconfig.json @@ -45,6 +45,8 @@ "@kbn/core-i18n-server-internal", "@kbn/core-i18n-server-mocks", "@kbn/apm-config-loader", + "@kbn/core-feature-flags-server-internal", + "@kbn/core-feature-flags-server-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/root/core-root-browser-internal/src/core_system.ts b/packages/core/root/core-root-browser-internal/src/core_system.ts index 8428333b96686..44e25b257e32c 100644 --- a/packages/core/root/core-root-browser-internal/src/core_system.ts +++ b/packages/core/root/core-root-browser-internal/src/core_system.ts @@ -22,6 +22,7 @@ import { I18nService } from '@kbn/core-i18n-browser-internal'; import { ExecutionContextService } from '@kbn/core-execution-context-browser-internal'; import type { FatalErrorsSetup } from '@kbn/core-fatal-errors-browser'; import { FatalErrorsService } from '@kbn/core-fatal-errors-browser-internal'; +import { FeatureFlagsService } from '@kbn/core-feature-flags-browser-internal'; import { HttpService } from '@kbn/core-http-browser-internal'; import { SettingsService, UiSettingsService } from '@kbn/core-ui-settings-browser-internal'; import { DeprecationsService } from '@kbn/core-deprecations-browser-internal'; @@ -85,6 +86,7 @@ export class CoreSystem { private readonly loggingSystem: BrowserLoggingSystem; private readonly analytics: AnalyticsService; private readonly fatalErrors: FatalErrorsService; + private readonly featureFlags: FeatureFlagsService; private readonly injectedMetadata: InjectedMetadataService; private readonly notifications: NotificationsService; private readonly http: HttpService; @@ -132,6 +134,7 @@ export class CoreSystem { // Stop Core before rendering any fatal errors into the DOM this.stop(); }); + this.featureFlags = new FeatureFlagsService(this.coreContext); this.security = new SecurityService(this.coreContext); this.userProfile = new UserProfileService(this.coreContext); this.theme = new ThemeService(); @@ -251,11 +254,13 @@ export class CoreSystem { const application = this.application.setup({ http, analytics }); this.coreApp.setup({ application, http, injectedMetadata, notifications }); + const featureFlags = this.featureFlags.setup({ injectedMetadata }); const core: InternalCoreSetup = { analytics, application, fatalErrors: this.fatalErrorsSetup, + featureFlags, http, injectedMetadata, notifications, @@ -357,12 +362,15 @@ export class CoreSystem { theme, }); + const featureFlags = await this.featureFlags.start(); + const core: InternalCoreStart = { analytics, application, chrome, docLinks, executionContext, + featureFlags, http, theme, savedObjects, @@ -439,6 +447,7 @@ export class CoreSystem { this.deprecations.stop(); this.theme.stop(); this.analytics.stop(); + this.featureFlags.stop(); this.security.stop(); this.userProfile.stop(); this.rootDomElement.textContent = ''; diff --git a/packages/core/root/core-root-browser-internal/tsconfig.json b/packages/core/root/core-root-browser-internal/tsconfig.json index e576ecf8cf920..a44a523d05744 100644 --- a/packages/core/root/core-root-browser-internal/tsconfig.json +++ b/packages/core/root/core-root-browser-internal/tsconfig.json @@ -67,6 +67,7 @@ "@kbn/core-user-profile-browser-mocks", "@kbn/core-user-profile-browser-internal", "@kbn/core-injected-metadata-common-internal", + "@kbn/core-feature-flags-browser-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/root/core-root-server-internal/src/register_service_config.ts b/packages/core/root/core-root-server-internal/src/register_service_config.ts index 3b131d721b4e8..ae38eba4c9ddc 100644 --- a/packages/core/root/core-root-server-internal/src/register_service_config.ts +++ b/packages/core/root/core-root-server-internal/src/register_service_config.ts @@ -33,6 +33,7 @@ import { config as deprecationConfig } from '@kbn/core-deprecations-server-inter import { statusConfig } from '@kbn/core-status-server-internal'; import { uiSettingsConfig } from '@kbn/core-ui-settings-server-internal'; import { config as pluginsConfig } from '@kbn/core-plugins-server-internal'; +import { featureFlagsConfig } from '@kbn/core-feature-flags-server-internal'; import { elasticApmConfig } from './root/elastic_config'; import { serverlessConfig } from './root/serverless_config'; import { coreConfig } from './core_config'; @@ -48,6 +49,7 @@ export function registerServiceConfig(configService: ConfigService) { coreAppConfig, elasticApmConfig, executionContextConfig, + featureFlagsConfig, externalUrlConfig, httpConfig, i18nConfig, diff --git a/packages/core/root/core-root-server-internal/src/server.ts b/packages/core/root/core-root-server-internal/src/server.ts index 64cf2c936e3be..447db192c3048 100644 --- a/packages/core/root/core-root-server-internal/src/server.ts +++ b/packages/core/root/core-root-server-internal/src/server.ts @@ -20,6 +20,7 @@ import { NodeService } from '@kbn/core-node-server-internal'; import { AnalyticsService } from '@kbn/core-analytics-server-internal'; import { EnvironmentService } from '@kbn/core-environment-server-internal'; import { ExecutionContextService } from '@kbn/core-execution-context-server-internal'; +import { FeatureFlagsService } from '@kbn/core-feature-flags-server-internal'; import { PrebootService } from '@kbn/core-preboot-server-internal'; import { ContextService } from '@kbn/core-http-context-server-internal'; import { HttpService } from '@kbn/core-http-server-internal'; @@ -69,6 +70,7 @@ export class Server { private readonly capabilities: CapabilitiesService; private readonly context: ContextService; private readonly elasticsearch: ElasticsearchService; + private readonly featureFlags: FeatureFlagsService; private readonly http: HttpService; private readonly rendering: RenderingService; private readonly log: Logger; @@ -118,6 +120,7 @@ export class Server { const core = { coreId, configService: this.configService, env, logger: this.logger }; this.analytics = new AnalyticsService(core); this.context = new ContextService(core); + this.featureFlags = new FeatureFlagsService(core); this.http = new HttpService(core); this.rendering = new RenderingService(core); this.plugins = new PluginsService(core); @@ -325,9 +328,11 @@ export class Server { const customBrandingSetup = this.customBranding.setup(); const userSettingsServiceSetup = this.userSettingsService.setup(); + const featureFlagsSetup = this.featureFlags.setup(); const renderingSetup = await this.rendering.setup({ elasticsearch: elasticsearchServiceSetup, + featureFlags: featureFlagsSetup, http: httpSetup, status: statusSetup, uiPlugins, @@ -352,6 +357,7 @@ export class Server { elasticsearch: elasticsearchServiceSetup, environment: environmentSetup, executionContext: executionContextSetup, + featureFlags: featureFlagsSetup, http: httpSetup, i18n: i18nServiceSetup, savedObjects: savedObjectsSetup, @@ -432,6 +438,8 @@ export class Server { exposedConfigsToUsage: this.plugins.getExposedPluginConfigsToUsage(), }); + const featureFlagsStart = this.featureFlags.start(); + this.status.start(); this.coreStart = { @@ -441,6 +449,7 @@ export class Server { docLinks: docLinkStart, elasticsearch: elasticsearchStart, executionContext: executionContextStart, + featureFlags: featureFlagsStart, http: httpStart, metrics: metricsStart, savedObjects: savedObjectsStart, @@ -484,6 +493,7 @@ export class Server { await this.status.stop(); await this.logging.stop(); await this.customBranding.stop(); + await this.featureFlags.stop(); this.node.stop(); this.deprecations.stop(); this.security.stop(); diff --git a/packages/core/root/core-root-server-internal/tsconfig.json b/packages/core/root/core-root-server-internal/tsconfig.json index 528e1aacc0a93..843a701db807b 100644 --- a/packages/core/root/core-root-server-internal/tsconfig.json +++ b/packages/core/root/core-root-server-internal/tsconfig.json @@ -76,6 +76,7 @@ "@kbn/core-usage-data-server-mocks", "@kbn/core-user-profile-server-mocks", "@kbn/core-user-profile-server-internal", + "@kbn/core-feature-flags-server-internal", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-esql-ast/src/__tests__/ast_parser.sort.test.ts b/packages/kbn-esql-ast/src/__tests__/ast_parser.sort.test.ts index c57a75644bcec..bb5e6aeb1e6b4 100644 --- a/packages/kbn-esql-ast/src/__tests__/ast_parser.sort.test.ts +++ b/packages/kbn-esql-ast/src/__tests__/ast_parser.sort.test.ts @@ -11,11 +11,49 @@ import { getAstAndSyntaxErrors as parse } from '../ast_parser'; describe('SORT', () => { describe('correctly formatted', () => { - // Un-skip one https://github.com/elastic/kibana/issues/189491 fixed. - it.skip('example from documentation', () => { + it('sorting order without modifiers', () => { + const text = `FROM employees | SORT height`; + const { ast, errors } = parse(text); + + expect(errors.length).toBe(0); + expect(ast).toMatchObject([ + {}, + { + type: 'command', + name: 'sort', + args: [ + { + type: 'column', + name: 'height', + }, + ], + }, + ]); + }); + + it('sort expression is a function call', () => { + const text = `from a_index | sort values(textField)`; + const { ast, errors } = parse(text); + + expect(errors.length).toBe(0); + expect(ast).toMatchObject([ + {}, + { + type: 'command', + name: 'sort', + args: [ + { + type: 'function', + name: 'values', + }, + ], + }, + ]); + }); + + it('with order modifier "DESC"', () => { const text = ` FROM employees - | KEEP first_name, last_name, height | SORT height DESC `; const { ast, errors } = parse(text); @@ -23,22 +61,57 @@ describe('SORT', () => { expect(errors.length).toBe(0); expect(ast).toMatchObject([ {}, + { + type: 'command', + name: 'sort', + args: [ + { + type: 'order', + order: 'DESC', + nulls: '', + args: [ + { + type: 'column', + name: 'height', + }, + ], + }, + ], + }, + ]); + }); + + it('with nulls modifier "NULLS LAST"', () => { + const text = ` + FROM employees + | SORT height NULLS LAST + `; + const { ast, errors } = parse(text); + + expect(errors.length).toBe(0); + expect(ast).toMatchObject([ {}, { type: 'command', name: 'sort', args: [ { - type: 'column', - name: 'height', + type: 'order', + order: '', + nulls: 'NULLS LAST', + args: [ + { + type: 'column', + name: 'height', + }, + ], }, ], }, ]); }); - // Un-skip once https://github.com/elastic/kibana/issues/189491 fixed. - it.skip('can parse various sorting columns with options', () => { + it('can parse various sorting columns with options', () => { const text = 'FROM a | SORT a, b ASC, c DESC, d NULLS FIRST, e NULLS LAST, f ASC NULLS FIRST, g DESC NULLS LAST'; const { ast, errors } = parse(text); @@ -55,28 +128,58 @@ describe('SORT', () => { name: 'a', }, { - type: 'column', - name: 'b', + order: 'ASC', + nulls: '', + args: [ + { + name: 'b', + }, + ], }, { - type: 'column', - name: 'c', + order: 'DESC', + nulls: '', + args: [ + { + name: 'c', + }, + ], }, { - type: 'column', - name: 'd', + order: '', + nulls: 'NULLS FIRST', + args: [ + { + name: 'd', + }, + ], }, { - type: 'column', - name: 'e', + order: '', + nulls: 'NULLS LAST', + args: [ + { + name: 'e', + }, + ], }, { - type: 'column', - name: 'f', + order: 'ASC', + nulls: 'NULLS FIRST', + args: [ + { + name: 'f', + }, + ], }, { - type: 'column', - name: 'g', + order: 'DESC', + nulls: 'NULLS LAST', + args: [ + { + name: 'g', + }, + ], }, ], }, diff --git a/packages/kbn-esql-ast/src/ast_factory.ts b/packages/kbn-esql-ast/src/ast_factory.ts index 44b8c03aa1e7f..f5c3ca7a3b621 100644 --- a/packages/kbn-esql-ast/src/ast_factory.ts +++ b/packages/kbn-esql-ast/src/ast_factory.ts @@ -53,7 +53,7 @@ import { visitDissect, visitGrok, collectBooleanExpression, - visitOrderExpression, + visitOrderExpressions, getPolicyName, getMatchField, getEnrichClauses, @@ -238,7 +238,7 @@ export class AstListener implements ESQLParserListener { exitSortCommand(ctx: SortCommandContext) { const command = createCommand('sort', ctx); this.ast.push(command); - command.args.push(...visitOrderExpression(ctx.orderExpression_list())); + command.args.push(...visitOrderExpressions(ctx.orderExpression_list())); } /** diff --git a/packages/kbn-esql-ast/src/ast_helpers.ts b/packages/kbn-esql-ast/src/ast_helpers.ts index 76f576f1ec019..7d4a94fde19a8 100644 --- a/packages/kbn-esql-ast/src/ast_helpers.ts +++ b/packages/kbn-esql-ast/src/ast_helpers.ts @@ -42,6 +42,7 @@ import type { ESQLNumericLiteralType, FunctionSubtype, ESQLNumericLiteral, + ESQLOrderExpression, } from './types'; import { parseIdentifier } from './parser/helpers'; @@ -222,6 +223,26 @@ export function createFunction( return node; } +export const createOrderExpression = ( + ctx: ParserRuleContext, + arg: ESQLAstItem, + order: ESQLOrderExpression['order'], + nulls: ESQLOrderExpression['nulls'] +) => { + const node: ESQLOrderExpression = { + type: 'order', + name: '', + order, + nulls, + args: [arg], + text: ctx.getText(), + location: getPosition(ctx.start, ctx.stop), + incomplete: Boolean(ctx.exception), + }; + + return node; +}; + function walkFunctionStructure( args: ESQLAstItem[], initialLocation: ESQLLocation, diff --git a/packages/kbn-esql-ast/src/ast_walker.ts b/packages/kbn-esql-ast/src/ast_walker.ts index 3599f2f5fabec..d57c4d1c64ae4 100644 --- a/packages/kbn-esql-ast/src/ast_walker.ts +++ b/packages/kbn-esql-ast/src/ast_walker.ts @@ -84,6 +84,7 @@ import { textExistsAndIsValid, createInlineCast, createUnknownItem, + createOrderExpression, } from './ast_helpers'; import { getPosition } from './ast_position_utils'; import { @@ -97,6 +98,7 @@ import { ESQLUnnamedParamLiteral, ESQLPositionalParamLiteral, ESQLNamedParamLiteral, + ESQLOrderExpression, } from './types'; export function collectAllSourceIdentifiers(ctx: FromCommandContext): ESQLAstItem[] { @@ -608,34 +610,43 @@ export function visitByOption( return [option]; } -export function visitOrderExpression(ctx: OrderExpressionContext[]) { - const ast: ESQLAstItem[] = []; - for (const orderCtx of ctx) { - const expression = collectBooleanExpression(orderCtx.booleanExpression()); - if (orderCtx._ordering) { - const terminalNode = - orderCtx.getToken(esql_parser.ASC, 0) || orderCtx.getToken(esql_parser.DESC, 0); - const literal = createLiteral('string', terminalNode); - if (literal) { - expression.push(literal); - } - } - if (orderCtx.NULLS()) { - expression.push(createLiteral('string', orderCtx.NULLS()!)!); - if (orderCtx._nullOrdering && orderCtx._nullOrdering.text !== '') { - const innerTerminalNode = - orderCtx.getToken(esql_parser.FIRST, 0) || orderCtx.getToken(esql_parser.LAST, 0); - const literal = createLiteral('string', innerTerminalNode); - if (literal) { - expression.push(literal); - } - } - } +const visitOrderExpression = (ctx: OrderExpressionContext): ESQLOrderExpression | ESQLAstItem => { + const arg = collectBooleanExpression(ctx.booleanExpression())[0]; - if (expression.length) { - ast.push(...expression); - } + let order: ESQLOrderExpression['order'] = ''; + let nulls: ESQLOrderExpression['nulls'] = ''; + + const ordering = ctx._ordering?.text?.toUpperCase(); + + if (ordering) order = ordering as ESQLOrderExpression['order']; + + const nullOrdering = ctx._nullOrdering?.text?.toUpperCase(); + + switch (nullOrdering) { + case 'LAST': + nulls = 'NULLS LAST'; + break; + case 'FIRST': + nulls = 'NULLS FIRST'; + break; } + + if (!order && !nulls) { + return arg; + } + + return createOrderExpression(ctx, arg, order, nulls); +}; + +export function visitOrderExpressions( + ctx: OrderExpressionContext[] +): Array { + const ast: Array = []; + + for (const orderCtx of ctx) { + ast.push(visitOrderExpression(orderCtx)); + } + return ast; } diff --git a/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts b/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts index 3b4734da9d45f..caf8c55dba3e0 100644 --- a/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts +++ b/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts @@ -50,18 +50,22 @@ describe('single line query', () => { expect(text).toBe('FROM a | SORT b'); }); - /** @todo Enable once order expressions are supported. */ - test.skip('order expression with ASC modifier', () => { + test('order expression with ASC modifier', () => { const { text } = reprint('FROM a | SORT b ASC'); expect(text).toBe('FROM a | SORT b ASC'); }); - /** @todo Enable once order expressions are supported. */ - test.skip('order expression with ASC and NULLS FIRST modifier', () => { - const { text } = reprint('FROM a | SORT b ASC NULLS FIRST'); + test('order expression with NULLS LAST modifier', () => { + const { text } = reprint('FROM a | SORT b NULLS LAST'); - expect(text).toBe('FROM a | SORT b ASC NULLS FIRST'); + expect(text).toBe('FROM a | SORT b NULLS LAST'); + }); + + test('order expression with DESC and NULLS FIRST modifier', () => { + const { text } = reprint('FROM a | SORT b DESC NULLS FIRST'); + + expect(text).toBe('FROM a | SORT b DESC NULLS FIRST'); }); }); diff --git a/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts b/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts index 6c190dcd3c5d9..1aa3d492c7583 100644 --- a/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts +++ b/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts @@ -133,7 +133,7 @@ export class BasicPrettyPrinter { : word.toUpperCase(); } - protected readonly visitor = new Visitor() + protected readonly visitor: Visitor = new Visitor() .on('visitExpression', (ctx) => { return ''; }) @@ -229,6 +229,21 @@ export class BasicPrettyPrinter { return `${ctx.visitArgument(0)} ${this.keyword('AS')} ${ctx.visitArgument(1)}`; }) + .on('visitOrderExpression', (ctx) => { + const node = ctx.node; + let text = ctx.visitArgument(0); + + if (node.order) { + text += ` ${node.order}`; + } + + if (node.nulls) { + text += ` ${node.nulls}`; + } + + return text; + }) + .on('visitCommandOption', (ctx) => { const opts = this.opts; const option = opts.lowercaseOptions ? ctx.node.name : ctx.node.name.toUpperCase(); @@ -281,14 +296,14 @@ export class BasicPrettyPrinter { }); public print(query: ESQLAstQueryNode) { - return this.visitor.visitQuery(query); + return this.visitor.visitQuery(query, undefined); } public printCommand(command: ESQLAstCommand) { - return this.visitor.visitCommand(command); + return this.visitor.visitCommand(command, undefined); } public printExpression(expression: ESQLAstExpressionNode) { - return this.visitor.visitExpression(expression); + return this.visitor.visitExpression(expression, undefined); } } diff --git a/packages/kbn-esql-ast/src/types.ts b/packages/kbn-esql-ast/src/types.ts index da42ec24bd69b..e98057258ee61 100644 --- a/packages/kbn-esql-ast/src/types.ts +++ b/packages/kbn-esql-ast/src/types.ts @@ -26,6 +26,7 @@ export type ESQLSingleAstItem = | ESQLLiteral // "literal expression" | ESQLCommandMode | ESQLInlineCast // "inline cast expression" + | ESQLOrderExpression | ESQLUnknownItem; export type ESQLAstField = ESQLFunction | ESQLColumn; @@ -135,11 +136,26 @@ export interface ESQLUnaryExpression extends ESQLFunction<'unary-expression'> { args: [ESQLAstItem]; } -export interface ESQLPostfixUnaryExpression extends ESQLFunction<'postfix-unary-expression'> { +export interface ESQLPostfixUnaryExpression + extends ESQLFunction<'postfix-unary-expression', Name> { subtype: 'postfix-unary-expression'; args: [ESQLAstItem]; } +/** + * Represents an order expression used in SORT commands. + * + * ``` + * ... | SORT field ASC NULLS FIRST + * ``` + */ +export interface ESQLOrderExpression extends ESQLAstBaseItem { + type: 'order'; + order: '' | 'ASC' | 'DESC'; + nulls: '' | 'NULLS FIRST' | 'NULLS LAST'; + args: [field: ESQLAstItem]; +} + export interface ESQLBinaryExpression extends ESQLFunction<'binary-expression', BinaryExpressionOperator> { subtype: 'binary-expression'; diff --git a/packages/kbn-esql-ast/src/visitor/contexts.ts b/packages/kbn-esql-ast/src/visitor/contexts.ts index 2cedf0d6ba8a3..c646b7f446227 100644 --- a/packages/kbn-esql-ast/src/visitor/contexts.ts +++ b/packages/kbn-esql-ast/src/visitor/contexts.ts @@ -26,6 +26,7 @@ import type { ESQLIntegerLiteral, ESQLList, ESQLLiteral, + ESQLOrderExpression, ESQLSingleAstItem, ESQLSource, ESQLTimeInterval, @@ -543,3 +544,8 @@ export class RenameExpressionVisitorContext< Methods extends VisitorMethods = VisitorMethods, Data extends SharedData = SharedData > extends VisitorContext {} + +export class OrderExpressionVisitorContext< + Methods extends VisitorMethods = VisitorMethods, + Data extends SharedData = SharedData +> extends VisitorContext {} diff --git a/packages/kbn-esql-ast/src/visitor/global_visitor_context.ts b/packages/kbn-esql-ast/src/visitor/global_visitor_context.ts index 8260776cca2f5..793803bc48f54 100644 --- a/packages/kbn-esql-ast/src/visitor/global_visitor_context.ts +++ b/packages/kbn-esql-ast/src/visitor/global_visitor_context.ts @@ -16,6 +16,7 @@ import type { ESQLInlineCast, ESQLList, ESQLLiteral, + ESQLOrderExpression, ESQLSource, ESQLTimeInterval, } from '../types'; @@ -400,6 +401,10 @@ export class GlobalVisitorContext< if (!this.methods.visitInlineCastExpression) break; return this.visitInlineCastExpression(parent, expressionNode, input as any); } + case 'order': { + if (!this.methods.visitOrderExpression) break; + return this.visitOrderExpression(parent, expressionNode, input as any); + } case 'option': { switch (expressionNode.name) { case 'as': { @@ -487,4 +492,13 @@ export class GlobalVisitorContext< const context = new contexts.RenameExpressionVisitorContext(this, node, parent); return this.visitWithSpecificContext('visitRenameExpression', context, input); } + + public visitOrderExpression( + parent: contexts.VisitorContext | null, + node: ESQLOrderExpression, + input: types.VisitorInput + ): types.VisitorOutput { + const context = new contexts.OrderExpressionVisitorContext(this, node, parent); + return this.visitWithSpecificContext('visitOrderExpression', context, input); + } } diff --git a/packages/kbn-esql-ast/src/visitor/types.ts b/packages/kbn-esql-ast/src/visitor/types.ts index 28259fb1cbaf4..c5b18a727bc3c 100644 --- a/packages/kbn-esql-ast/src/visitor/types.ts +++ b/packages/kbn-esql-ast/src/visitor/types.ts @@ -61,7 +61,8 @@ export type ExpressionVisitorInput = AnyToVoid< VisitorInput & VisitorInput & VisitorInput & - VisitorInput + VisitorInput & + VisitorInput >; /** @@ -76,7 +77,8 @@ export type ExpressionVisitorOutput = | VisitorOutput | VisitorOutput | VisitorOutput - | VisitorOutput; + | VisitorOutput + | VisitorOutput; /** * Input that satisfies any command visitor input constraints. @@ -203,6 +205,7 @@ export interface VisitorMethods< any, any >; + visitOrderExpression?: Visitor, any, any>; } /** diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.sort.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.sort.test.ts new file mode 100644 index 0000000000000..924790ed470f5 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.sort.test.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 { setup, getFieldNamesByType } from './helpers'; + +describe('autocomplete.suggest', () => { + describe('SORT ( [ ASC / DESC ] [ NULLS FIST / NULLS LAST ] )+', () => { + describe('SORT ...', () => { + test('suggests command on first character', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions( + 'from a | sort /', + [...getFieldNamesByType('any')].map((field) => `${field} `) + ); + await assertSuggestions( + 'from a | sort column, /', + [...getFieldNamesByType('any')].map((field) => `${field} `) + ); + }); + }); + + describe('... [ ASC / DESC ] ...', () => { + test('suggests all modifiers on first space', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField /', [ + 'ASC ', + 'DESC ', + 'NULLS FIRST ', + 'NULLS LAST ', + ',', + '| ', + ]); + }); + + test('when user starts to type ASC modifier', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField A/', ['ASC ']); + }); + + test('when user starts to type DESC modifier', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField d/', ['DESC ']); + await assertSuggestions('from a | sort stringField des/', ['DESC ']); + await assertSuggestions('from a | sort stringField DES/', ['DESC ']); + }); + }); + + describe('... [ NULLS FIST / NULLS LAST ]', () => { + test('suggests command on first character', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField ASC /', [ + 'NULLS FIRST ', + 'NULLS LAST ', + ',', + '| ', + ]); + }); + + test('when user starts to type NULLS modifiers', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField N/', ['NULLS FIRST ', 'NULLS LAST ']); + await assertSuggestions('from a | sort stringField null/', ['NULLS FIRST ', 'NULLS LAST ']); + await assertSuggestions('from a | sort stringField nulls/', [ + 'NULLS FIRST ', + 'NULLS LAST ', + ]); + await assertSuggestions('from a | sort stringField nulls /', [ + 'NULLS FIRST ', + 'NULLS LAST ', + ]); + }); + + test('when user types NULLS FIRST', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField NULLS F/', ['NULLS FIRST ']); + await assertSuggestions('from a | sort stringField NULLS FI/', ['NULLS FIRST ']); + }); + + test('when user types NULLS LAST', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField NULLS L/', ['NULLS LAST ']); + await assertSuggestions('from a | sort stringField NULLS LAS/', ['NULLS LAST ']); + }); + + test('after nulls are entered, suggests comma or pipe', async () => { + const { assertSuggestions } = await setup(); + + await assertSuggestions('from a | sort stringField NULLS LAST /', [',', '| ']); + }); + }); + }); +}); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index a58a55f124c4e..2a8c8e53fcab7 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -330,22 +330,6 @@ describe('autocomplete', () => { testSuggestions('from a | dissect keywordField/', []); }); - describe('sort', () => { - testSuggestions('from a | sort /', [ - ...getFieldNamesByType('any').map((name) => `${name} `), - ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), - ]); - testSuggestions('from a | sort keywordField /', ['ASC ', 'DESC ', ',', '| ']); - testSuggestions('from a | sort keywordField desc /', [ - 'NULLS FIRST ', - 'NULLS LAST ', - ',', - '| ', - ]); - // @TODO: improve here - // testSuggestions('from a | sort keywordField desc ', ['first', 'last']); - }); - describe('limit', () => { testSuggestions('from a | limit /', ['10 ', '100 ', '1000 ']); testSuggestions('from a | limit 4 /', ['| ']); @@ -672,23 +656,6 @@ describe('autocomplete', () => { // RENAME field AS var0 testSuggestions('FROM index1 | RENAME field AS v/', ['var0']); - // SORT field - testSuggestions('FROM index1 | SORT f/', [ - ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), - ...getFieldNamesByType('any').map((field) => `${field} `), - ]); - - // SORT field order - testSuggestions('FROM index1 | SORT keywordField a/', ['ASC ', 'DESC ', ',', '| ']); - - // SORT field order nulls - testSuggestions('FROM index1 | SORT keywordField ASC n/', [ - 'NULLS FIRST ', - 'NULLS LAST ', - ',', - '| ', - ]); - // STATS argument testSuggestions('FROM index1 | STATS f/', [ 'var0 = ', @@ -1015,27 +982,6 @@ describe('autocomplete', () => { // LIMIT number testSuggestions('FROM a | LIMIT /', ['10 ', '100 ', '1000 '].map(attachTriggerCommand)); - // SORT field - testSuggestions( - 'FROM a | SORT /', - [ - ...getFieldNamesByType('any').map((field) => `${field} `), - ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), - ].map(attachTriggerCommand) - ); - - // SORT field order - testSuggestions('FROM a | SORT field /', [ - ',', - ...['ASC ', 'DESC ', '| '].map(attachTriggerCommand), - ]); - - // SORT field order nulls - testSuggestions('FROM a | SORT field ASC /', [ - ',', - ...['NULLS FIRST ', 'NULLS LAST ', '| '].map(attachTriggerCommand), - ]); - // STATS argument testSuggestions( 'FROM a | STATS /', @@ -1266,22 +1212,6 @@ describe('autocomplete', () => { '>= $0', 'IN $0', ]); - testSuggestions('FROM a | SORT doubleField IS NOT N/', [ - { text: 'IS NOT NULL', rangeToReplace: { start: 27, end: 34 } }, - 'IS NULL', - '% $0', - '* $0', - '+ $0', - '- $0', - '/ $0', - '!= $0', - '< $0', - '<= $0', - '== $0', - '> $0', - '>= $0', - 'IN $0', - ]); describe('dot-separated field names', () => { testSuggestions( 'FROM a | KEEP field.nam/', diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index a1be88b0b1436..50937abbde9fc 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -102,6 +102,7 @@ import { removeQuoteForSuggestedSources, getValidSignaturesAndTypesToSuggestNext, } from './helper'; +import { getSortPos } from './commands/sort/helper'; import { FunctionParameter, FunctionReturnType, @@ -192,6 +193,10 @@ export async function suggest( } if (astContext.type === 'expression') { + if (astContext.command.name === 'sort') { + return await suggestForSortCmd(innerText, getFieldsByType); + } + // suggest next possible argument, or option // otherwise a variable return getExpressionSuggestionsByType( @@ -1833,3 +1838,100 @@ async function getOptionArgsSuggestions( } return suggestions; } + +const sortModifierSuggestions = { + ASC: { + label: 'ASC', + text: 'ASC ', + detail: '', + kind: 'Keyword', + sortText: '1-ASC', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, + DESC: { + label: 'DESC', + text: 'DESC ', + detail: '', + kind: 'Keyword', + sortText: '1-DESC', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, + NULLS_FIRST: { + label: 'NULLS FIRST', + text: 'NULLS FIRST ', + detail: '', + kind: 'Keyword', + sortText: '2-NULLS FIRST', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, + NULLS_LAST: { + label: 'NULLS LAST', + text: 'NULLS LAST ', + detail: '', + kind: 'Keyword', + sortText: '2-NULLS LAST', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, +}; + +export const suggestForSortCmd = async (innerText: string, getFieldsByType: GetFieldsByTypeFn) => { + const { pos, order, nulls } = getSortPos(innerText); + + switch (pos) { + case 'space2': { + return [ + sortModifierSuggestions.ASC, + sortModifierSuggestions.DESC, + sortModifierSuggestions.NULLS_FIRST, + sortModifierSuggestions.NULLS_LAST, + ...getFinalSuggestions({ + comma: true, + }), + ]; + } + case 'order': { + const suggestions: SuggestionRawDefinition[] = []; + for (const modifier of Object.values(sortModifierSuggestions)) { + if (modifier.label.startsWith(order)) { + suggestions.push(modifier); + } + } + return suggestions; + } + case 'space3': { + return [ + sortModifierSuggestions.NULLS_FIRST, + sortModifierSuggestions.NULLS_LAST, + ...getFinalSuggestions({ + comma: true, + }), + ]; + } + case 'nulls': { + const end = innerText.length + 1; + const start = end - nulls.length; + const suggestions: SuggestionRawDefinition[] = []; + for (const modifier of Object.values(sortModifierSuggestions)) { + if (modifier.label.startsWith(nulls)) { + suggestions.push({ + ...modifier, + rangeToReplace: { + start, + end, + }, + }); + } + } + return suggestions; + } + case 'space4': { + return [ + ...getFinalSuggestions({ + comma: true, + }), + ]; + } + } + + return (await getFieldsByType('any', [], { advanceCursor: true })) as SuggestionRawDefinition[]; +}; diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.test.ts new file mode 100644 index 0000000000000..82059b6b7765c --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.test.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", 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 { getSortPos } from './helper'; + +test('returns correct position on complete modifier matches', () => { + expect(getSortPos('from a | ').pos).toBe('none'); + expect(getSortPos('from a | s').pos).toBe('pre-start'); + expect(getSortPos('from a | so').pos).toBe('pre-start'); + expect(getSortPos('from a | sor').pos).toBe('pre-start'); + expect(getSortPos('from a | sort').pos).toBe('start'); + expect(getSortPos('from a | sort ').pos).toBe('space1'); + expect(getSortPos('from a | sort col').pos).toBe('column'); + expect(getSortPos('from a | sort col ').pos).toBe('space2'); + expect(getSortPos('from a | sort col ASC').pos).toBe('order'); + expect(getSortPos('from a | sort col DESC ').pos).toBe('space3'); + expect(getSortPos('from a | sort col DESC NULLS FIRST').pos).toBe('nulls'); + expect(getSortPos('from a | sort col DESC NULLS LAST ').pos).toBe('space4'); + expect(getSortPos('from a | sort col DESC NULLS LAST, ').pos).toBe('space1'); + expect(getSortPos('from a | sort col DESC NULLS LAST, col2').pos).toBe('column'); + expect(getSortPos('from a | sort col DESC NULLS LAST, col2 DESC').pos).toBe('order'); + expect(getSortPos('from a | sort col DESC NULLS LAST, col2 NULLS LAST').pos).toBe('nulls'); + expect(getSortPos('from a | sort col DESC NULLS LAST, col2 NULLS LAST ').pos).toBe('space4'); +}); + +test('returns ASC/DESC matched text', () => { + expect(getSortPos('from a | sort col ASC').pos).toBe('order'); + expect(getSortPos('from a | sort col asc').order).toBe('ASC'); + + expect(getSortPos('from a | sort col as').pos).toBe('order'); + expect(getSortPos('from a | sort col as').order).toBe('AS'); + + expect(getSortPos('from a | sort col DE').pos).toBe('order'); + expect(getSortPos('from a | sort col DE').order).toBe('DE'); +}); + +test('returns NULLS FIRST/NULLS LAST matched text', () => { + expect(getSortPos('from a | sort col ASC NULLS FIRST').pos).toBe('nulls'); + expect(getSortPos('from a | sort col ASC NULLS FIRST').nulls).toBe('NULLS FIRST'); + + expect(getSortPos('from a | sort col ASC nulls fi').pos).toBe('nulls'); + expect(getSortPos('from a | sort col ASC nulls fi').nulls).toBe('NULLS FI'); + + expect(getSortPos('from a | sort col nul').pos).toBe('nulls'); + expect(getSortPos('from a | sort col nul').nulls).toBe('NUL'); + + expect(getSortPos('from a | sort col1, col2 NULLS LA').pos).toBe('nulls'); + expect(getSortPos('from a | sort col1, col2 NULLS LA').nulls).toBe('NULLS LA'); +}); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts new file mode 100644 index 0000000000000..dfa5ce0f4d5f7 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.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", 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 regexStart = /.+\|\s*so?r?(?t?)(.+,)?(?\s+)?/i; +const regex = + /.+\|\s*sort(.+,)?((?\s+)(?[^\s]+)(?\s*)(?(AS?C?)|(DE?S?C?))?(?\s*)(?NU?L?L?S? ?(FI?R?S?T?|LA?S?T?)?)?(?\s*))?/i; + +export interface SortCaretPosition { + /** + * Position of the caret in the sort command: + * + * ``` + * SORT [ASC/DESC] [NULLS FIRST/NULLS LAST] + * | | | | | | | | + * | | | | | | | space4 + * | | | | | | nulls + * | | | | | space3 + * | | | | order + * | | | space 2 + * | | | + * | | column + * | start + * pre-start + * ``` + */ + pos: + | 'none' + | 'pre-start' + | 'start' + | 'space1' + | 'column' + | 'space2' + | 'order' + | 'space3' + | 'nulls' + | 'space4'; + order: string; + nulls: string; +} + +export const getSortPos = (query: string): SortCaretPosition => { + const match = query.match(regex); + let pos: SortCaretPosition['pos'] = 'none'; + let order: SortCaretPosition['order'] = ''; + let nulls: SortCaretPosition['nulls'] = ''; + + if (match?.groups?.space4) { + pos = 'space4'; + } else if (match?.groups?.nulls) { + pos = 'nulls'; + nulls = match.groups.nulls.toUpperCase(); + } else if (match?.groups?.space3) { + pos = 'space3'; + } else if (match?.groups?.order) { + pos = 'order'; + order = match.groups.order.toUpperCase(); + } else if (match?.groups?.space2) { + pos = 'space2'; + } else if (match?.groups?.column) { + pos = 'column'; + } else { + const match2 = query.match(regexStart); + + if (match2?.groups?.space1) { + pos = 'space1'; + } else if (match2?.groups?.start) { + pos = 'start'; + } else if (match2) { + pos = 'pre-start'; + } + } + + return { + pos, + order, + nulls, + }; +}; diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts index d2ff04e4d9baa..c59daa2130417 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/builtin.ts @@ -641,6 +641,20 @@ const otherDefinitions: FunctionDefinition[] = [ }, ], }, + { + name: 'order-expression', + type: 'builtin', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definition.infoDoc', { + defaultMessage: 'Specify column sorting modifiers', + }), + supportedCommands: ['sort'], + signatures: [ + { + params: [{ name: 'column', type: 'any' }], + returnType: 'void', + }, + ], + }, ]; export const builtinFunctions: FunctionDefinition[] = [ diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts index 349bfcf4a358a..979e718fb4174 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts @@ -383,11 +383,7 @@ export const commandDefinitions: CommandDefinition[] = [ modes: [], signature: { multipleParams: true, - params: [ - { name: 'expression', type: 'any' }, - { name: 'direction', type: 'string', optional: true, values: ['ASC', 'DESC'] }, - { name: 'nulls', type: 'string', optional: true, values: ['NULLS FIRST', 'NULLS LAST'] }, - ], + params: [{ name: 'expression', type: 'any' }], }, }, { diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/context.ts b/packages/kbn-esql-validation-autocomplete/src/shared/context.ts index 22429e1ff9cb7..0f7f830c1417a 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/context.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/context.ts @@ -35,7 +35,7 @@ function findNode(nodes: ESQLAstItem[], offset: number): ESQLSingleAstItem | und return ret; } } else { - if (node.location.min <= offset && node.location.max >= offset) { + if (node && node.location && node.location.min <= offset && node.location.max >= offset) { if ('args' in node) { const ret = findNode(node.args, offset); // if the found node is the marker, then return its parent diff --git a/packages/kbn-expandable-flyout/src/components/container.test.tsx b/packages/kbn-expandable-flyout/src/components/container.test.tsx new file mode 100644 index 0000000000000..fa27d81fa4437 --- /dev/null +++ b/packages/kbn-expandable-flyout/src/components/container.test.tsx @@ -0,0 +1,180 @@ +/* + * Copyright 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 { render } from '@testing-library/react'; + +import { Panel } from '../types'; +import { + LEFT_SECTION_TEST_ID, + PREVIEW_SECTION_TEST_ID, + SETTINGS_MENU_BUTTON_TEST_ID, + RIGHT_SECTION_TEST_ID, +} from './test_ids'; +import { initialUiState, type State } from '../store/state'; +import { TestProvider } from '../test/provider'; +import { REDUX_ID_FOR_MEMORY_STORAGE } from '../constants'; +import { Container } from './container'; + +const id = REDUX_ID_FOR_MEMORY_STORAGE; +const registeredPanels: Panel[] = [ + { + key: 'key', + component: () =>
{'component'}
, + }, +]; + +describe('Container', () => { + it(`shouldn't render flyout if no panels`, () => { + const state: State = { + panels: { + byId: {}, + }, + ui: initialUiState, + }; + + const result = render( + + + + ); + + expect(result.asFragment()).toMatchInlineSnapshot(``); + }); + + it('should render collapsed flyout (right section)', () => { + const state: State = { + panels: { + byId: { + [id]: { + right: { + id: 'key', + }, + left: undefined, + preview: undefined, + }, + }, + }, + ui: initialUiState, + }; + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(RIGHT_SECTION_TEST_ID)).toBeInTheDocument(); + }); + + it('should render expanded flyout (right and left sections)', () => { + const state: State = { + panels: { + byId: { + [id]: { + right: { + id: 'key', + }, + left: { + id: 'key', + }, + preview: undefined, + }, + }, + }, + ui: initialUiState, + }; + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(LEFT_SECTION_TEST_ID)).toBeInTheDocument(); + }); + + it('should render preview section', () => { + const state: State = { + panels: { + byId: { + [id]: { + right: undefined, + left: undefined, + preview: [ + { + id: 'key', + }, + ], + }, + }, + }, + ui: initialUiState, + }; + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(PREVIEW_SECTION_TEST_ID)).toBeInTheDocument(); + }); + + it('should not render flyout when right has value but does not matches registered panels', () => { + const state: State = { + panels: { + byId: { + [id]: { + right: { + id: 'key1', + }, + left: undefined, + preview: undefined, + }, + }, + }, + ui: initialUiState, + }; + + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('my-test-flyout')).toBeNull(); + expect(queryByTestId(RIGHT_SECTION_TEST_ID)).toBeNull(); + }); + + it('should render the menu to change display options', () => { + const state: State = { + panels: { + byId: { + [id]: { + right: { + id: 'key', + }, + left: undefined, + preview: undefined, + }, + }, + }, + ui: initialUiState, + }; + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(SETTINGS_MENU_BUTTON_TEST_ID)).toBeInTheDocument(); + }); +}); diff --git a/packages/kbn-expandable-flyout/src/components/container.tsx b/packages/kbn-expandable-flyout/src/components/container.tsx new file mode 100644 index 0000000000000..9d858d08be23c --- /dev/null +++ b/packages/kbn-expandable-flyout/src/components/container.tsx @@ -0,0 +1,241 @@ +/* + * Copyright 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, { memo, useCallback, useMemo } from 'react'; +import { Interpolation, Theme } from '@emotion/react'; +import { EuiFlyoutProps, EuiFlyoutResizable } from '@elastic/eui'; +import { EuiFlyoutResizableProps } from '@elastic/eui/src/components/flyout/flyout_resizable'; +import { changeUserCollapsedWidthAction, changeUserExpandedWidthAction } from '../store/actions'; +import { + selectDefaultWidths, + selectPushVsOverlay, + selectUserFlyoutWidths, + useDispatch, + useSelector, +} from '../store/redux'; +import { RightSection } from './right_section'; +import { useSections } from '../hooks/use_sections'; +import { useExpandableFlyoutState } from '../hooks/use_expandable_flyout_state'; +import { useExpandableFlyoutApi } from '../hooks/use_expandable_flyout_api'; +import type { FlyoutPanelProps, Panel } from '../types'; +import { SettingsMenu } from './settings_menu'; +import { PreviewSection } from './preview_section'; +import { ResizableContainer } from './resizable_container'; + +const COLLAPSED_FLYOUT_MIN_WIDTH = 380; +const EXPANDED_FLYOUT_MIN_WIDTH = 740; + +export interface ContainerProps extends Omit { + /** + * List of all registered panels available for render + */ + registeredPanels: Panel[]; + /** + * Allows for custom styles to be passed to the EuiFlyout component + */ + customStyles?: Interpolation; + /** + * Callback function to let application's code the flyout is closed + */ + onClose?: EuiFlyoutProps['onClose']; + /** + * Set of properties that drive a settings menu + */ + flyoutCustomProps?: { + /** + * Hide the gear icon and settings menu if true + */ + hideSettings?: boolean; + /** + * Control if the option to render in overlay or push mode is enabled or not + */ + pushVsOverlay?: { + /** + * Disables the option + */ + disabled: boolean; + /** + * Tooltip to display + */ + tooltip: string; + }; + /** + * Control if the option to resize the flyout is enabled or not + */ + resize?: { + /** + * Disables the option + */ + disabled: boolean; + /** + * Tooltip to display + */ + tooltip: string; + }; + }; + /** + * Optional data test subject string + */ + 'data-test-subj'?: string; +} + +/** + * Expandable flyout UI React component. + * Displays 3 sections (right, left, preview) depending on the panels in the context. + * + * The behavior expects that the left and preview sections should only be displayed is a right section + * is already rendered. + */ +export const Container: React.FC = memo( + ({ customStyles, registeredPanels, flyoutCustomProps, ...flyoutProps }) => { + const dispatch = useDispatch(); + + const { left, right, preview } = useExpandableFlyoutState(); + const { closeFlyout } = useExpandableFlyoutApi(); + + // for flyout where the push vs overlay option is disable in the UI we fall back to overlay mode + const type = useSelector(selectPushVsOverlay); + const flyoutType = flyoutCustomProps?.pushVsOverlay?.disabled ? 'overlay' : type; + + const flyoutWidths = useSelector(selectUserFlyoutWidths); + const defaultWidths = useSelector(selectDefaultWidths); + + // retrieves the sections to be displayed + const { + leftSection, + rightSection, + previewSection, + mostRecentPreview, + mostRecentPreviewBanner, + } = useSections({ + registeredPanels, + }); + + // calculates what needs to be rendered + const showLeft = useMemo(() => leftSection != null && left != null, [leftSection, left]); + const showRight = useMemo(() => rightSection != null && right != null, [rightSection, right]); + const showPreview = useMemo( + () => previewSection != null && preview != null, + [previewSection, preview] + ); + + const showCollapsed = useMemo(() => !showLeft && showRight, [showLeft, showRight]); + const showExpanded = useMemo(() => showLeft && showRight, [showLeft, showRight]); + + const leftComponent = useMemo( + () => (leftSection ? leftSection.component({ ...(left as FlyoutPanelProps) }) : null), + [leftSection, left] + ); + const rightComponent = useMemo( + () => (rightSection ? rightSection.component({ ...(right as FlyoutPanelProps) }) : null), + [rightSection, right] + ); + + const previewComponent = useMemo( + () => + previewSection + ? previewSection.component({ + ...(mostRecentPreview as FlyoutPanelProps), + }) + : null, + [previewSection, mostRecentPreview] + ); + + // we want to set a minimum flyout width different when in collapsed and expanded mode + const minFlyoutWidth = useMemo( + () => (showExpanded ? EXPANDED_FLYOUT_MIN_WIDTH : COLLAPSED_FLYOUT_MIN_WIDTH), + [showExpanded] + ); + + const flyoutWidth = useMemo(() => { + if (showCollapsed) { + return flyoutWidths.collapsedWidth || defaultWidths.rightWidth; + } + if (showExpanded) { + return flyoutWidths.expandedWidth || defaultWidths.rightWidth + defaultWidths.leftWidth; + } + }, [ + showCollapsed, + showExpanded, + flyoutWidths.collapsedWidth, + flyoutWidths.expandedWidth, + defaultWidths.rightWidth, + defaultWidths.leftWidth, + ]); + + // callback function called when user changes the flyout's width + const onResize = useCallback( + (width: number) => { + if (showExpanded) { + dispatch( + changeUserExpandedWidthAction({ + width, + savedToLocalStorage: true, + }) + ); + } else if (showCollapsed) { + dispatch( + changeUserCollapsedWidthAction({ + width, + savedToLocalStorage: true, + }) + ); + } + }, + [dispatch, showCollapsed, showExpanded] + ); + + // don't need to render if the windowWidth is 0 or if nothing needs to be rendered + if (!showExpanded && !showCollapsed && !showPreview) { + return null; + } + + return ( + // @ts-ignore // TODO figure out why it's throwing a 'Types of property ref are incompatible' error + { + closeFlyout(); + if (flyoutProps.onClose) { + flyoutProps.onClose(e); + } + }} + css={customStyles} + onResize={onResize} + minWidth={minFlyoutWidth} + > + {showCollapsed && } + + {showExpanded && ( + + )} + + {showPreview && ( + + )} + + {!flyoutCustomProps?.hideSettings && } + + ); + } +); + +Container.displayName = 'Container'; diff --git a/packages/kbn-expandable-flyout/src/components/left_section.tsx b/packages/kbn-expandable-flyout/src/components/left_section.tsx index c0bd285e9b162..591062116a971 100644 --- a/packages/kbn-expandable-flyout/src/components/left_section.tsx +++ b/packages/kbn-expandable-flyout/src/components/left_section.tsx @@ -8,7 +8,7 @@ */ import { EuiFlexItem } from '@elastic/eui'; -import React, { memo, useMemo } from 'react'; +import React, { memo } from 'react'; import { LEFT_SECTION_TEST_ID } from './test_ids'; interface LeftSectionProps { @@ -16,27 +16,15 @@ interface LeftSectionProps { * Component to be rendered */ component: React.ReactElement; - /** - * Width used when rendering the panel - */ - width: number; } /** * Left section of the expanded flyout rendering a panel */ -export const LeftSection: React.FC = memo( - ({ component, width }: LeftSectionProps) => { - const style = useMemo( - () => ({ height: '100%', width: `${width}px` }), - [width] - ); - return ( - - {component} - - ); - } -); +export const LeftSection: React.FC = memo(({ component }: LeftSectionProps) => ( + + {component} + +)); LeftSection.displayName = 'LeftSection'; diff --git a/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx b/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx index 9916f2e784dfa..6476ac91c0031 100644 --- a/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx +++ b/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx @@ -16,7 +16,7 @@ import { PREVIEW_SECTION_TEST_ID, } from './test_ids'; import { TestProvider } from '../test/provider'; -import { State } from '../store/state'; +import { initialUiState, State } from '../store/state'; describe('PreviewSection', () => { const context: State = { @@ -33,18 +33,15 @@ describe('PreviewSection', () => { }, }, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; const component =
{'component'}
; - const left = 500; it('should render back button and close button in header', () => { const { getByTestId } = render( - + ); @@ -62,7 +59,7 @@ describe('PreviewSection', () => { const { getByTestId, getByText } = render( - + ); diff --git a/packages/kbn-expandable-flyout/src/components/preview_section.tsx b/packages/kbn-expandable-flyout/src/components/preview_section.tsx index f461c8c3710bf..d759e5500534b 100644 --- a/packages/kbn-expandable-flyout/src/components/preview_section.tsx +++ b/packages/kbn-expandable-flyout/src/components/preview_section.tsx @@ -17,9 +17,10 @@ import { EuiSplitPanel, transparentize, } from '@elastic/eui'; -import React, { memo } from 'react'; +import React, { memo, useMemo } from 'react'; import { css } from '@emotion/react'; import { has } from 'lodash'; +import { selectDefaultWidths, selectUserSectionWidths, useSelector } from '../store/redux'; import { PREVIEW_SECTION_BACK_BUTTON_TEST_ID, PREVIEW_SECTION_CLOSE_BUTTON_TEST_ID, @@ -66,14 +67,14 @@ interface PreviewSectionProps { * Component to be rendered */ component: React.ReactElement; - /** - * Left position used when rendering the panel - */ - leftPosition: number; /** * Preview banner shown at the top of preview panel */ banner?: PreviewBanner; + /** + * Flag to indicate whether the preview section is expanded, use to calculate the width of the section + */ + showExpanded: boolean; } /** @@ -81,11 +82,20 @@ interface PreviewSectionProps { * Will display a back and close button in the header for the previous and close feature respectively. */ export const PreviewSection: React.FC = memo( - ({ component, leftPosition, banner }: PreviewSectionProps) => { + ({ component, banner, showExpanded }: PreviewSectionProps) => { const { euiTheme } = useEuiTheme(); const { closePreviewPanel, previousPreviewPanel } = useExpandableFlyoutApi(); - const left = leftPosition + 4; + const { rightPercentage } = useSelector(selectUserSectionWidths); + const defaultPercentages = useSelector(selectDefaultWidths); + + // Calculate the width of the preview section based on the following + // - if only the right section is visible, then we use 100% of the width (minus some padding) + // - if both the right and left sections are visible, we use the width of the right section (minus the same padding) + const width = useMemo(() => { + const percentage = rightPercentage ? rightPercentage : defaultPercentages.rightPercentage; + return showExpanded ? `calc(${percentage}% - 8px)` : `calc(100% - 8px)`; + }, [defaultPercentages.rightPercentage, rightPercentage, showExpanded]); const closeButton = ( @@ -122,14 +132,14 @@ export const PreviewSection: React.FC = memo( top: 8px; bottom: 8px; right: 4px; - left: ${left}px; + width: ${width}; z-index: 1000; `} > {'left component'}; +const rightComponent =
{'right component'}
; + +describe('ResizableContainer', () => { + it('should render left and right component as well as resize button', () => { + const state = { + ...initialState, + ui: { + ...initialState.ui, + userSectionWidths: { + leftPercentage: 50, + rightPercentage: 50, + }, + }, + }; + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(RESIZABLE_LEFT_SECTION_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(RESIZABLE_BUTTON_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(RESIZABLE_RIGHT_SECTION_TEST_ID)).toBeInTheDocument(); + }); +}); diff --git a/packages/kbn-expandable-flyout/src/components/resizable_container.tsx b/packages/kbn-expandable-flyout/src/components/resizable_container.tsx new file mode 100644 index 0000000000000..c7da40167a7fd --- /dev/null +++ b/packages/kbn-expandable-flyout/src/components/resizable_container.tsx @@ -0,0 +1,116 @@ +/* + * Copyright 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 { EuiResizableContainer } from '@elastic/eui'; +import React, { memo, useCallback, useMemo } from 'react'; +import { css } from '@emotion/react'; +import { changeUserSectionWidthsAction } from '../store/actions'; +import { + selectDefaultWidths, + selectUserSectionWidths, + useDispatch, + useSelector, +} from '../store/redux'; +import { + RESIZABLE_BUTTON_TEST_ID, + RESIZABLE_LEFT_SECTION_TEST_ID, + RESIZABLE_RIGHT_SECTION_TEST_ID, +} from './test_ids'; +import { LeftSection } from './left_section'; +import { RightSection } from './right_section'; + +const RIGHT_SECTION_MIN_WIDTH = '380px'; +const LEFT_SECTION_MIN_WIDTH = '380px'; +const LEFT_PANEL_ID = 'left'; +const RIGHT_PANEL_ID = 'right'; + +interface ResizableContainerProps { + /** + * The component to render on the left side of the flyout + */ + leftComponent: React.ReactElement; + /** + * The component to render on the right side of the flyout + */ + rightComponent: React.ReactElement; + /** + * If the preview section is shown we disable the resize button + */ + showPreview: boolean; +} + +/** + * Component that renders the left and right section when the flyout is in expanded mode. + * It allows the resizing of the sections, saving the percentages in local storage. + */ +export const ResizableContainer: React.FC = memo( + ({ leftComponent, rightComponent, showPreview }: ResizableContainerProps) => { + const dispatch = useDispatch(); + + const { leftPercentage, rightPercentage } = useSelector(selectUserSectionWidths); + const defaultPercentages = useSelector(selectDefaultWidths); + + const initialLeftPercentage = useMemo( + () => leftPercentage || defaultPercentages.leftPercentage, + [defaultPercentages.leftPercentage, leftPercentage] + ); + const initialRightPercentage = useMemo( + () => rightPercentage || defaultPercentages.rightPercentage, + [defaultPercentages.rightPercentage, rightPercentage] + ); + + const onWidthChange = useCallback( + (newSizes) => + dispatch( + changeUserSectionWidthsAction({ + ...newSizes, + savedToLocalStorage: true, + }) + ), + [dispatch] + ); + + return ( + + {(EuiResizablePanel, EuiResizableButton) => ( + <> + + + + + + + + + )} + + ); + } +); + +ResizableContainer.displayName = 'ResizableContainer'; diff --git a/packages/kbn-expandable-flyout/src/components/right_section.tsx b/packages/kbn-expandable-flyout/src/components/right_section.tsx index 73931e44ad5fe..ab6598b9f8e3a 100644 --- a/packages/kbn-expandable-flyout/src/components/right_section.tsx +++ b/packages/kbn-expandable-flyout/src/components/right_section.tsx @@ -8,7 +8,7 @@ */ import { EuiFlexItem } from '@elastic/eui'; -import React, { memo, useMemo } from 'react'; +import React, { memo } from 'react'; import { RIGHT_SECTION_TEST_ID } from './test_ids'; interface RightSectionProps { @@ -16,28 +16,17 @@ interface RightSectionProps { * Component to be rendered */ component: React.ReactElement; - /** - * Width used when rendering the panel - */ - width: number; } /** * Right section of the expanded flyout rendering a panel */ export const RightSection: React.FC = memo( - ({ component, width }: RightSectionProps) => { - const style = useMemo( - () => ({ height: '100%', width: `${width}px` }), - [width] - ); - - return ( - - {component} - - ); - } + ({ component }: RightSectionProps) => ( + + {component} + + ) ); RightSection.displayName = 'RightSection'; diff --git a/packages/kbn-expandable-flyout/src/components/settings_menu.test.tsx b/packages/kbn-expandable-flyout/src/components/settings_menu.test.tsx index 9ef33a649671d..f9a6991f55b52 100644 --- a/packages/kbn-expandable-flyout/src/components/settings_menu.test.tsx +++ b/packages/kbn-expandable-flyout/src/components/settings_menu.test.tsx @@ -13,6 +13,9 @@ import { render } from '@testing-library/react'; import { SettingsMenu } from './settings_menu'; import { SETTINGS_MENU_BUTTON_TEST_ID, + SETTINGS_MENU_FLYOUT_RESIZE_BUTTON_TEST_ID, + SETTINGS_MENU_FLYOUT_RESIZE_INFORMATION_ICON_TEST_ID, + SETTINGS_MENU_FLYOUT_RESIZE_TITLE_TEST_ID, SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID, SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID, SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID, @@ -21,8 +24,14 @@ import { } from './test_ids'; import { TestProvider } from '../test/provider'; import { localStorageMock } from '../../__mocks__'; -import { EXPANDABLE_FLYOUT_LOCAL_STORAGE, PUSH_VS_OVERLAY_LOCAL_STORAGE } from '../constants'; -import { initialPanelsState } from '../store/state'; +import { + USER_COLLAPSED_WIDTH_LOCAL_STORAGE, + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + USER_EXPANDED_WIDTH_LOCAL_STORAGE, + USER_SECTION_WIDTHS_LOCAL_STORAGE, + PUSH_VS_OVERLAY_LOCAL_STORAGE, +} from '../constants'; +import { initialPanelsState, initialUiState } from '../store/state'; describe('SettingsMenu', () => { beforeEach(() => { @@ -31,144 +40,251 @@ describe('SettingsMenu', () => { }); }); - it('should render the flyout type button group', () => { - const flyoutCustomProps = { - hideSettings: false, - pushVsOverlay: { - disabled: false, - tooltip: '', - }, - }; - - const { getByTestId, queryByTestId } = render( - - - - ); - - getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); - - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_TITLE_TEST_ID)).toBeInTheDocument(); - expect( - queryByTestId(SETTINGS_MENU_FLYOUT_TYPE_INFORMATION_ICON_TEST_ID) - ).not.toBeInTheDocument(); - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID)).toBeInTheDocument(); - }); + describe('push vs overlay', () => { + it('should render the flyout type button group', () => { + const flyoutCustomProps = { + hideSettings: false, + pushVsOverlay: { + disabled: false, + tooltip: '', + }, + }; - it('should have the type selected if option is enabled', () => { - const state = { - panels: initialPanelsState, - ui: { - pushVsOverlay: 'push' as const, - }, - }; - const flyoutCustomProps = { - hideSettings: false, - pushVsOverlay: { - disabled: false, - tooltip: '', - }, - }; - - const { getByTestId } = render( - - - - ); - - getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); - - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID)).toHaveClass( - 'euiButtonGroupButton-isSelected' - ); - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID)).not.toHaveClass( - 'euiButtonGroupButton-isSelected' - ); - }); + const { getByTestId, queryByTestId } = render( + + + + ); + + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_TITLE_TEST_ID)).toBeInTheDocument(); + expect( + queryByTestId(SETTINGS_MENU_FLYOUT_TYPE_INFORMATION_ICON_TEST_ID) + ).not.toBeInTheDocument(); + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID)).toBeInTheDocument(); + }); - it('should select correct the flyout type', () => { - const flyoutCustomProps = { - hideSettings: false, - pushVsOverlay: { - disabled: false, - tooltip: '', - }, - }; + it('should have the type selected if option is enabled', () => { + const state = { + panels: initialPanelsState, + ui: { + ...initialUiState, + pushVsOverlay: 'push' as const, + }, + }; + const flyoutCustomProps = { + hideSettings: false, + pushVsOverlay: { + disabled: false, + tooltip: '', + }, + }; - const { getByTestId } = render( - - - - ); + const { getByTestId } = render( + + + + ); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); - getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); - getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID).click(); + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID)).toHaveClass( + 'euiButtonGroupButton-isSelected' + ); + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID)).not.toHaveClass( + 'euiButtonGroupButton-isSelected' + ); + }); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual( - JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push' }) - ); + it('should select correct the flyout type', () => { + const flyoutCustomProps = { + hideSettings: false, + pushVsOverlay: { + disabled: false, + tooltip: '', + }, + }; - getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID).click(); + const { getByTestId } = render( + + + + ); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual( - JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'overlay' }) - ); - }); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); - it('should render the the flyout type button group disabled', () => { - const flyoutCustomProps = { - hideSettings: false, - pushVsOverlay: { - disabled: true, - tooltip: 'This option is disabled', - }, - }; + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID).click(); - const { getByTestId } = render( - - - - ); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual( + JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push' }) + ); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID).click(); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual( + JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'overlay' }) + ); + }); - getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID)).toHaveAttribute('disabled'); + it('should render the the flyout type button group disabled', () => { + const flyoutCustomProps = { + hideSettings: false, + pushVsOverlay: { + disabled: true, + tooltip: 'This option is disabled', + }, + }; - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_INFORMATION_ICON_TEST_ID)).toBeInTheDocument(); + const { getByTestId } = render( + + + + ); - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID)).toHaveClass( - 'euiButtonGroupButton-isSelected' - ); - expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID)).not.toHaveClass( - 'euiButtonGroupButton-isSelected' - ); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); - getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID).click(); + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID)).toHaveAttribute( + 'disabled' + ); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_INFORMATION_ICON_TEST_ID)).toBeInTheDocument(); + + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID)).toHaveClass( + 'euiButtonGroupButton-isSelected' + ); + expect(getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID)).not.toHaveClass( + 'euiButtonGroupButton-isSelected' + ); + + getByTestId(SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID).click(); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should not render the information icon if the tooltip is empty', () => { + const flyoutCustomProps = { + hideSettings: false, + pushVsOverlay: { + disabled: true, + tooltip: '', + }, + }; + + const { getByTestId, queryByTestId } = render( + + + + ); + + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + + expect( + queryByTestId(SETTINGS_MENU_FLYOUT_TYPE_INFORMATION_ICON_TEST_ID) + ).not.toBeInTheDocument(); + }); }); - it('should not render the information icon if the tooltip is empty', () => { - const flyoutCustomProps = { - hideSettings: false, - pushVsOverlay: { - disabled: true, - tooltip: '', - }, - }; - - const { getByTestId, queryByTestId } = render( - - - - ); - - getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); - expect( - queryByTestId(SETTINGS_MENU_FLYOUT_TYPE_INFORMATION_ICON_TEST_ID) - ).not.toBeInTheDocument(); + describe('resize', () => { + it('should render the flyout resize button', () => { + const flyoutCustomProps = { + hideSettings: false, + resize: { + disabled: false, + tooltip: '', + }, + }; + const { getByTestId, queryByTestId } = render( + + + + ); + + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + + expect(getByTestId(SETTINGS_MENU_FLYOUT_RESIZE_TITLE_TEST_ID)).toBeInTheDocument(); + expect( + queryByTestId(SETTINGS_MENU_FLYOUT_RESIZE_INFORMATION_ICON_TEST_ID) + ).not.toBeInTheDocument(); + expect(getByTestId(SETTINGS_MENU_FLYOUT_RESIZE_BUTTON_TEST_ID)).toBeInTheDocument(); + }); + + it('should reset correctly when clicked', () => { + const flyoutCustomProps = { + hideSettings: false, + resize: { + disabled: false, + tooltip: '', + }, + }; + + localStorage.setItem( + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + JSON.stringify({ + [USER_COLLAPSED_WIDTH_LOCAL_STORAGE]: '250', + [USER_EXPANDED_WIDTH_LOCAL_STORAGE]: '500', + [USER_SECTION_WIDTHS_LOCAL_STORAGE]: { left: 50, right: 50 }, + }) + ); + + const { getByTestId } = render( + + + + ); + + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + getByTestId(SETTINGS_MENU_FLYOUT_RESIZE_BUTTON_TEST_ID).click(); + + const expandableFlyout = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + expect(expandableFlyout).not.toBe(null); + + expect(expandableFlyout).not.toHaveProperty(USER_COLLAPSED_WIDTH_LOCAL_STORAGE); + expect(expandableFlyout).not.toHaveProperty(USER_EXPANDED_WIDTH_LOCAL_STORAGE); + expect(expandableFlyout).not.toHaveProperty(USER_SECTION_WIDTHS_LOCAL_STORAGE); + }); + + it('should render the the flyout resize button disabled', () => { + const flyoutCustomProps = { + hideSettings: false, + resize: { + disabled: true, + tooltip: 'This option is disabled', + }, + }; + + const { getByTestId } = render( + + + + ); + + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + expect(getByTestId(SETTINGS_MENU_FLYOUT_RESIZE_BUTTON_TEST_ID)).toHaveAttribute('disabled'); + expect(getByTestId(SETTINGS_MENU_FLYOUT_RESIZE_INFORMATION_ICON_TEST_ID)).toBeInTheDocument(); + }); + + it('should not render the information icon if the tooltip is empty', () => { + const flyoutCustomProps = { + hideSettings: false, + resize: { + disabled: true, + tooltip: '', + }, + }; + + const { getByTestId, queryByTestId } = render( + + + + ); + + getByTestId(SETTINGS_MENU_BUTTON_TEST_ID).click(); + expect( + queryByTestId(SETTINGS_MENU_FLYOUT_RESIZE_INFORMATION_ICON_TEST_ID) + ).not.toBeInTheDocument(); + }); }); }); diff --git a/packages/kbn-expandable-flyout/src/components/settings_menu.tsx b/packages/kbn-expandable-flyout/src/components/settings_menu.tsx index 7229921bfdd39..e632f8bb0172c 100644 --- a/packages/kbn-expandable-flyout/src/components/settings_menu.tsx +++ b/packages/kbn-expandable-flyout/src/components/settings_menu.tsx @@ -8,6 +8,7 @@ */ import { + EuiButtonEmpty, EuiButtonGroup, EuiButtonIcon, EuiContextMenu, @@ -22,9 +23,12 @@ import { import { css } from '@emotion/css'; import React, { memo, useCallback, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { changePushVsOverlayAction } from '../store/actions'; +import { changePushVsOverlayAction, resetAllUserChangedWidthsAction } from '../store/actions'; import { SETTINGS_MENU_BUTTON_TEST_ID, + SETTINGS_MENU_FLYOUT_RESIZE_BUTTON_TEST_ID, + SETTINGS_MENU_FLYOUT_RESIZE_INFORMATION_ICON_TEST_ID, + SETTINGS_MENU_FLYOUT_RESIZE_TITLE_TEST_ID, SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID, SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID, SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID, @@ -60,6 +64,12 @@ const FLYOUT_TYPE_OVERLAY_TOOLTIP = i18n.translate('expandableFlyout.settingsMen const FLYOUT_TYPE_PUSH_TOOLTIP = i18n.translate('expandableFlyout.settingsMenu.pushTooltip', { defaultMessage: 'Displays the flyout next to the page', }); +const FLYOUT_RESIZE_TITLE = i18n.translate('expandableFlyout.renderMenu.flyoutResizeTitle', { + defaultMessage: 'Flyout size', +}); +const FLYOUT_RESIZE_BUTTON = i18n.translate('expandableFlyout.renderMenu.flyoutResizeButton', { + defaultMessage: 'Reset size', +}); export interface FlyoutCustomProps { /** @@ -79,6 +89,19 @@ export interface FlyoutCustomProps { */ tooltip: string; }; + /** + * Control if the option to resize the flyout is enabled or not + */ + resize?: { + /** + * Disables the option + */ + disabled: boolean; + /** + * Tooltip to display + */ + tooltip: string; + }; } export interface SettingsMenuProps { @@ -119,6 +142,11 @@ export const SettingsMenu: React.FC = memo( [dispatch, flyoutCustomProps?.pushVsOverlay?.disabled] ); + const resetSizeOnClick = useCallback(() => { + dispatch(resetAllUserChangedWidthsAction()); + setPopover(false); + }, [dispatch]); + const panels = [ { id: 0, @@ -133,9 +161,6 @@ export const SettingsMenu: React.FC = memo( )} @@ -163,6 +188,28 @@ export const SettingsMenu: React.FC = memo( isDisabled={flyoutCustomProps?.pushVsOverlay?.disabled} data-test-subj={SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_TEST_ID} /> + + +

+ {FLYOUT_RESIZE_TITLE}{' '} + {flyoutCustomProps?.resize?.tooltip && ( + + + + )} +

+
+ + + {FLYOUT_RESIZE_BUTTON} + ), }, diff --git a/packages/kbn-expandable-flyout/src/components/test_ids.ts b/packages/kbn-expandable-flyout/src/components/test_ids.ts index 498342f1a227d..22d2e00ed66c7 100644 --- a/packages/kbn-expandable-flyout/src/components/test_ids.ts +++ b/packages/kbn-expandable-flyout/src/components/test_ids.ts @@ -7,6 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +export const FLYOUT_TEST_ID = 'resizableFlyout'; + export const RIGHT_SECTION_TEST_ID = 'rightSection'; export const LEFT_SECTION_TEST_ID = 'leftSection'; @@ -33,3 +35,16 @@ export const SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_OVERLAY_TEST_ID = export const SETTINGS_MENU_FLYOUT_TYPE_BUTTON_GROUP_PUSH_TEST_ID = 'settingsMenuFlyoutTypeButtonGroupPushOption'; + +export const SETTINGS_MENU_FLYOUT_RESIZE_TITLE_TEST_ID = 'settingsMenuFlyoutSizeTitle'; + +export const SETTINGS_MENU_FLYOUT_RESIZE_INFORMATION_ICON_TEST_ID = + 'settingsMenuFlyoutSizeInformationIcon'; + +export const SETTINGS_MENU_FLYOUT_RESIZE_BUTTON_TEST_ID = 'settingsMenuFlyoutSizeButton'; + +export const RESIZABLE_LEFT_SECTION_TEST_ID = 'resizableLeftSection'; + +export const RESIZABLE_RIGHT_SECTION_TEST_ID = 'resizableRightSection'; + +export const RESIZABLE_BUTTON_TEST_ID = 'resizableButton'; diff --git a/packages/kbn-expandable-flyout/src/constants.ts b/packages/kbn-expandable-flyout/src/constants.ts index 7ec81a9de4b67..dfabd845a3f20 100644 --- a/packages/kbn-expandable-flyout/src/constants.ts +++ b/packages/kbn-expandable-flyout/src/constants.ts @@ -14,3 +14,6 @@ export const REDUX_ID_FOR_MEMORY_STORAGE = 'memory'; export const EXPANDABLE_FLYOUT_LOCAL_STORAGE = 'expandableFlyout.ui'; export const PUSH_VS_OVERLAY_LOCAL_STORAGE = 'pushVsOverlay'; +export const USER_COLLAPSED_WIDTH_LOCAL_STORAGE = 'collapsedWidth'; +export const USER_EXPANDED_WIDTH_LOCAL_STORAGE = 'expandedWidth'; +export const USER_SECTION_WIDTHS_LOCAL_STORAGE = 'sectionWidths'; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_expandable_flyout_state.ts b/packages/kbn-expandable-flyout/src/hooks/use_expandable_flyout_state.ts index 49cac7d97a895..88a94f66d54ae 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_expandable_flyout_state.ts +++ b/packages/kbn-expandable-flyout/src/hooks/use_expandable_flyout_state.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { useMemo } from 'react'; import { REDUX_ID_FOR_MEMORY_STORAGE } from '../constants'; import { useExpandableFlyoutContext } from '../context'; import { selectPanelsById, useSelector } from '../store/redux'; @@ -17,6 +18,7 @@ import { selectPanelsById, useSelector } from '../store/redux'; export const useExpandableFlyoutState = () => { const { urlKey } = useExpandableFlyoutContext(); // if no urlKey is provided, we are in memory storage mode and use the reserved word 'memory' - const id = urlKey || REDUX_ID_FOR_MEMORY_STORAGE; + const id = useMemo(() => urlKey || REDUX_ID_FOR_MEMORY_STORAGE, [urlKey]); + return useSelector(selectPanelsById(id)); }; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts index 70cc4f31f2636..26b3daf8161db 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts +++ b/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts @@ -10,9 +10,20 @@ import { renderHook } from '@testing-library/react-hooks'; import { useInitializeFromLocalStorage } from './use_initialize_from_local_storage'; import { localStorageMock } from '../../__mocks__'; -import { EXPANDABLE_FLYOUT_LOCAL_STORAGE, PUSH_VS_OVERLAY_LOCAL_STORAGE } from '../constants'; +import { + USER_COLLAPSED_WIDTH_LOCAL_STORAGE, + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + USER_EXPANDED_WIDTH_LOCAL_STORAGE, + USER_SECTION_WIDTHS_LOCAL_STORAGE, + PUSH_VS_OVERLAY_LOCAL_STORAGE, +} from '../constants'; import { useDispatch } from '../store/redux'; -import { changePushVsOverlayAction } from '../store/actions'; +import { + changeUserCollapsedWidthAction, + changeUserExpandedWidthAction, + changeUserSectionWidthsAction, + changePushVsOverlayAction, +} from '../store/actions'; jest.mock('../store/redux'); @@ -25,7 +36,7 @@ describe('useInitializeFromLocalStorage', () => { // if this test fails, it's very likely because the data format of the values saved in local storage // has changed and we might need to run a migration - it('should retrieve push/overlay value from local storage', () => { + it('should retrieve values from local storage', () => { const mockUseDispatch = jest.fn(); (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); @@ -33,6 +44,9 @@ describe('useInitializeFromLocalStorage', () => { EXPANDABLE_FLYOUT_LOCAL_STORAGE, JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push', + [USER_COLLAPSED_WIDTH_LOCAL_STORAGE]: 250, + [USER_EXPANDED_WIDTH_LOCAL_STORAGE]: 500, + [USER_SECTION_WIDTHS_LOCAL_STORAGE]: { left: 50, right: 50 }, }) ); @@ -44,6 +58,25 @@ describe('useInitializeFromLocalStorage', () => { savedToLocalStorage: false, }) ); + expect(mockUseDispatch).toHaveBeenCalledWith( + changeUserCollapsedWidthAction({ + width: 250, + savedToLocalStorage: false, + }) + ); + expect(mockUseDispatch).toHaveBeenCalledWith( + changeUserExpandedWidthAction({ + width: 500, + savedToLocalStorage: false, + }) + ); + expect(mockUseDispatch).toHaveBeenCalledWith( + changeUserSectionWidthsAction({ + right: 50, + left: 50, + savedToLocalStorage: false, + }) + ); }); it('should not dispatch action if expandable flyout key is not present in local storage', () => { @@ -51,9 +84,12 @@ describe('useInitializeFromLocalStorage', () => { (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); localStorage.setItem( - EXPANDABLE_FLYOUT_LOCAL_STORAGE, + 'wrong_top_level_key', JSON.stringify({ - wrong_key: 'push', + [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push', + [USER_COLLAPSED_WIDTH_LOCAL_STORAGE]: 250, + [USER_EXPANDED_WIDTH_LOCAL_STORAGE]: 500, + [USER_SECTION_WIDTHS_LOCAL_STORAGE]: { left: 50, right: 50 }, }) ); @@ -62,10 +98,17 @@ describe('useInitializeFromLocalStorage', () => { expect(mockUseDispatch).not.toHaveBeenCalled(); }); - it('should not dispatch action if expandable flyout key is present in local storage but not push/overlay', () => { + it('should not dispatch action if expandable flyout key is present in local storage but no has no properties', () => { const mockUseDispatch = jest.fn(); (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + localStorage.setItem( + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + JSON.stringify({ + wrong_key: 'push', + }) + ); + renderHook(() => useInitializeFromLocalStorage()); expect(mockUseDispatch).not.toHaveBeenCalled(); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.ts b/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.ts index 7af92a726a394..9c88fe29e75d7 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.ts +++ b/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.ts @@ -7,12 +7,27 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { EXPANDABLE_FLYOUT_LOCAL_STORAGE, PUSH_VS_OVERLAY_LOCAL_STORAGE } from '../constants'; +import { + USER_COLLAPSED_WIDTH_LOCAL_STORAGE, + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + USER_EXPANDED_WIDTH_LOCAL_STORAGE, + USER_SECTION_WIDTHS_LOCAL_STORAGE, + PUSH_VS_OVERLAY_LOCAL_STORAGE, +} from '../constants'; import { useDispatch } from '../store/redux'; -import { changePushVsOverlayAction } from '../store/actions'; +import { + changeUserCollapsedWidthAction, + changeUserExpandedWidthAction, + changeUserSectionWidthsAction, + changePushVsOverlayAction, +} from '../store/actions'; /** - * Hook to initialize the push vs overlay redux state from local storage + * Hook to initialize all the values in redux state from local storage + * - push vs overlay + * - user's custom collapsed width + * - user's custom expanded width + * - user's custom section percentages */ export const useInitializeFromLocalStorage = () => { const dispatch = useDispatch(); @@ -29,4 +44,35 @@ export const useInitializeFromLocalStorage = () => { }) ); } + + const userCollapsedFlyoutWidth = JSON.parse(expandableFlyout)[USER_COLLAPSED_WIDTH_LOCAL_STORAGE]; + if (userCollapsedFlyoutWidth) { + dispatch( + changeUserCollapsedWidthAction({ + width: parseInt(userCollapsedFlyoutWidth, 10), + savedToLocalStorage: false, + }) + ); + } + + const userExpandedFlyoutWidth = JSON.parse(expandableFlyout)[USER_EXPANDED_WIDTH_LOCAL_STORAGE]; + if (userExpandedFlyoutWidth) { + dispatch( + changeUserExpandedWidthAction({ + width: parseInt(userExpandedFlyoutWidth, 10), + savedToLocalStorage: false, + }) + ); + } + + const userSectionWidths = JSON.parse(expandableFlyout)[USER_SECTION_WIDTHS_LOCAL_STORAGE]; + if (userSectionWidths) { + dispatch( + changeUserSectionWidthsAction({ + right: userSectionWidths.right, + left: userSectionWidths.left, + savedToLocalStorage: false, + }) + ); + } }; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx b/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx new file mode 100644 index 0000000000000..4526f128affd3 --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx @@ -0,0 +1,134 @@ +/* + * Copyright 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 { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react-hooks'; +import type { UseSectionsParams, UseSectionsResult } from './use_sections'; +import { useSections } from './use_sections'; +import { useExpandableFlyoutState } from '../..'; + +jest.mock('../..'); + +describe('useSections', () => { + let hookResult: RenderHookResult; + + it('should return undefined for all values if no registeredPanels', () => { + (useExpandableFlyoutState as jest.Mock).mockReturnValue({ + left: undefined, + right: undefined, + preview: undefined, + }); + + const initialProps: UseSectionsParams = { + registeredPanels: [], + }; + hookResult = renderHook((props: UseSectionsParams) => useSections(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + leftSection: undefined, + rightSection: undefined, + previewSection: undefined, + mostRecentPreviewBanner: undefined, + mostRecentPreview: undefined, + }); + }); + + it('should return all sections', () => { + (useExpandableFlyoutState as jest.Mock).mockReturnValue({ + left: { id: 'left' }, + right: { id: 'right' }, + preview: [{ id: 'preview' }], + }); + + const initialProps: UseSectionsParams = { + registeredPanels: [ + { + key: 'right', + component: () =>
{'component'}
, + }, + { + key: 'left', + component: () =>
{'component'}
, + }, + { + key: 'preview', + component: () =>
{'component'}
, + }, + ], + }; + hookResult = renderHook((props: UseSectionsParams) => useSections(props), { + initialProps, + }); + + expect(hookResult.result.current.rightSection?.key).toEqual('right'); + expect(hookResult.result.current.rightSection?.component).toBeDefined(); + + expect(hookResult.result.current.leftSection?.key).toEqual('left'); + expect(hookResult.result.current.leftSection?.component).toBeDefined(); + + expect(hookResult.result.current.previewSection?.key).toEqual('preview'); + expect(hookResult.result.current.previewSection?.component).toBeDefined(); + + expect(hookResult.result.current.mostRecentPreviewBanner).toEqual(undefined); + expect(hookResult.result.current.mostRecentPreview).toEqual({ id: 'preview' }); + }); + + it('should return preview banner', () => { + (useExpandableFlyoutState as jest.Mock).mockReturnValue({ + preview: [ + { + id: 'preview', + params: { + banner: { + title: 'title', + backgroundColor: 'primary', + textColor: 'red', + }, + }, + }, + ], + }); + + const initialProps: UseSectionsParams = { + registeredPanels: [ + { + key: 'preview', + component: () =>
{'component'}
, + }, + ], + }; + hookResult = renderHook((props: UseSectionsParams) => useSections(props), { + initialProps, + }); + + expect(hookResult.result.current.mostRecentPreviewBanner).toEqual({ + title: 'title', + backgroundColor: 'primary', + textColor: 'red', + }); + }); + + it('should return most recent preview', () => { + (useExpandableFlyoutState as jest.Mock).mockReturnValue({ + preview: [{ id: 'preview1' }, { id: 'preview2' }, { id: 'preview3' }], + }); + + const initialProps: UseSectionsParams = { + registeredPanels: [], + }; + hookResult = renderHook((props: UseSectionsParams) => useSections(props), { + initialProps, + }); + + expect(hookResult.result.current.mostRecentPreview).toEqual({ id: 'preview3' }); + }); +}); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections.ts b/packages/kbn-expandable-flyout/src/hooks/use_sections.ts new file mode 100644 index 0000000000000..5267030790e38 --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_sections.ts @@ -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", 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 { useMemo } from 'react'; +import { isPreviewBanner, PreviewBanner } from '../components/preview_section'; +import { FlyoutPanelProps, useExpandableFlyoutState } from '../..'; +import { Panel } from '../types'; + +export interface UseSectionsParams { + /** + * List of all registered panels available for render + */ + registeredPanels: Panel[]; +} + +export interface UseSectionsResult { + /** + * The left section to be displayed in the flyout. + */ + leftSection: Panel | undefined; + /** + * The right section to be displayed in the flyout. + */ + rightSection: Panel | undefined; + /** + * The preview section to be displayed in the flyout. + */ + previewSection: Panel | undefined; + /** + * The most recent preview information to be displayed in the preview section. + */ + mostRecentPreview: FlyoutPanelProps | undefined; + /** + * The preview banner to be displayed in preview section. + */ + mostRecentPreviewBanner: PreviewBanner | undefined; +} + +/** + * Hook that retrieves the left, right, and preview sections to be displayed in the flyout. + */ +export const useSections = ({ registeredPanels }: UseSectionsParams): UseSectionsResult => { + const { left, preview, right } = useExpandableFlyoutState(); + + const rightSection = useMemo( + () => registeredPanels.find((panel) => panel.key === right?.id), + [right, registeredPanels] + ); + const leftSection = useMemo( + () => registeredPanels.find((panel) => panel.key === left?.id), + [left, registeredPanels] + ); + // retrieve the last preview panel (most recent) + const mostRecentPreview = useMemo( + () => (preview ? preview[preview.length - 1] : undefined), + [preview] + ); + const previewSection = useMemo( + () => registeredPanels.find((panel) => panel.key === mostRecentPreview?.id), + [mostRecentPreview, registeredPanels] + ); + const mostRecentPreviewBanner = useMemo( + () => + isPreviewBanner(mostRecentPreview?.params?.banner) + ? mostRecentPreview?.params?.banner + : undefined, + [mostRecentPreview?.params?.banner] + ); + + return useMemo( + () => ({ + leftSection, + rightSection, + previewSection, + mostRecentPreviewBanner, + mostRecentPreview, + }), + [leftSection, rightSection, previewSection, mostRecentPreviewBanner, mostRecentPreview] + ); +}; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts deleted file mode 100644 index f1e9c4e3bf072..0000000000000 --- a/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts +++ /dev/null @@ -1,251 +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 { renderHook } from '@testing-library/react-hooks'; -import type { RenderHookResult } from '@testing-library/react-hooks'; -import type { UserSectionsSizesParams, UserSectionsSizesResult } from './use_sections_sizes'; -import { useSectionSizes } from './use_sections_sizes'; - -describe('useSectionSizes', () => { - let hookResult: RenderHookResult; - - describe('Right section', () => { - it('should return 0 for right section if it is hidden', () => { - const initialProps = { - windowWidth: 350, - showRight: false, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 0, - leftSectionWidth: 0, - flyoutWidth: '0px', - previewSectionLeft: 0, - }); - }); - - it('should return the window width for right section size for tiny screen', () => { - const initialProps = { - windowWidth: 350, - showRight: true, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 350, - leftSectionWidth: 0, - flyoutWidth: '350px', - previewSectionLeft: 0, - }); - }); - - it('should return 380 for right section size for medium screen', () => { - const initialProps = { - windowWidth: 600, - showRight: true, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 380, - leftSectionWidth: 0, - flyoutWidth: '380px', - previewSectionLeft: 0, - }); - }); - - it('should return 500 for right section size for large screen', () => { - const initialProps = { - windowWidth: 1300, - showRight: true, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current.rightSectionWidth).toBeGreaterThan(420); - expect(hookResult.result.current.rightSectionWidth).toBeLessThan(750); - expect(hookResult.result.current.leftSectionWidth).toEqual(0); - expect(hookResult.result.current.flyoutWidth).toEqual( - `${hookResult.result.current.rightSectionWidth}px` - ); - expect(hookResult.result.current.previewSectionLeft).toEqual(0); - }); - - it('should return 750 for right section size for very large screen', () => { - const initialProps = { - windowWidth: 2500, - showRight: true, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 750, - leftSectionWidth: 0, - flyoutWidth: '750px', - previewSectionLeft: 0, - }); - }); - }); - - describe('Left section', () => { - it('should return 0 for left section if it is hidden', () => { - const initialProps = { - windowWidth: 500, - showRight: true, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 380, - leftSectionWidth: 0, - flyoutWidth: '380px', - previewSectionLeft: 0, - }); - }); - - it('should return the remaining for left section', () => { - const initialProps = { - windowWidth: 500, - showRight: true, - showLeft: true, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 380, - leftSectionWidth: 72, - flyoutWidth: '452px', - previewSectionLeft: 0, - }); - }); - - it('should return 80% of remaining for left section', () => { - const initialProps = { - windowWidth: 2500, - showRight: true, - showLeft: true, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current.rightSectionWidth).toEqual(750); - expect(hookResult.result.current.leftSectionWidth).toEqual((2500 - 750) * 0.8); - expect(hookResult.result.current.flyoutWidth).toEqual( - `${ - hookResult.result.current.rightSectionWidth + hookResult.result.current.leftSectionWidth - }px` - ); - expect(hookResult.result.current.previewSectionLeft).toEqual(0); - }); - - it('should return max out at 1500px for really big screens', () => { - const initialProps = { - windowWidth: 2700, - showRight: true, - showLeft: true, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current.rightSectionWidth).toEqual(750); - expect(hookResult.result.current.leftSectionWidth).toEqual(1500); - expect(hookResult.result.current.flyoutWidth).toEqual( - `${ - hookResult.result.current.rightSectionWidth + hookResult.result.current.leftSectionWidth - }px` - ); - expect(hookResult.result.current.previewSectionLeft).toEqual(0); - }); - }); - - describe('Preview section', () => { - it('should return the 0 for preview section if it is hidden', () => { - const initialProps = { - windowWidth: 600, - showRight: true, - showLeft: false, - showPreview: false, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 380, - leftSectionWidth: 0, - flyoutWidth: '380px', - previewSectionLeft: 0, - }); - }); - - it('should return the 0 for preview section when left section is hidden', () => { - const initialProps = { - windowWidth: 600, - showRight: true, - showLeft: false, - showPreview: true, - }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 380, - leftSectionWidth: 0, - flyoutWidth: '380px', - previewSectionLeft: 0, - }); - }); - - it('should return for preview section when left section is visible', () => { - const initialProps = { windowWidth: 600, showRight: true, showLeft: true, showPreview: true }; - hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { - initialProps, - }); - - expect(hookResult.result.current).toEqual({ - rightSectionWidth: 380, - leftSectionWidth: 172, - flyoutWidth: '552px', - previewSectionLeft: 172, - }); - }); - }); -}); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts b/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts deleted file mode 100644 index b255010b06967..0000000000000 --- a/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts +++ /dev/null @@ -1,114 +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". - */ - -const RIGHT_SECTION_MIN_WIDTH = 380; -const MIN_RESOLUTION_BREAKPOINT = 992; -const RIGHT_SECTION_MAX_WIDTH = 750; -const MAX_RESOLUTION_BREAKPOINT = 1920; - -const LEFT_SECTION_MAX_WIDTH = 1500; - -const FULL_WIDTH_BREAKPOINT = 1600; -const FULL_WIDTH_PADDING = 48; - -export interface UserSectionsSizesParams { - /** - * The width of the browser window - */ - windowWidth: number; - /** - * True if the right section is visible, false otherwise - */ - showRight: boolean; - /** - * True if the left section is visible, false otherwise - */ - showLeft: boolean; - /** - * True if the preview section is visible, false otherwise - */ - showPreview: boolean; -} - -export interface UserSectionsSizesResult { - /** - * Width of the right section in pixels - */ - rightSectionWidth: number; - /** - * Width of the left section in pixels - */ - leftSectionWidth: number; - /** - * Width of the flyout in pixels - */ - flyoutWidth: string; - /** - * Left position of the preview section in pixels - */ - previewSectionLeft: number; -} - -/** - * Hook that calculate the different width for the sections of the flyout and the flyout itself - */ -export const useSectionSizes = ({ - windowWidth, - showRight, - showLeft, - showPreview, -}: UserSectionsSizesParams): UserSectionsSizesResult => { - let rightSectionWidth: number = 0; - if (showRight) { - if (windowWidth < MIN_RESOLUTION_BREAKPOINT) { - // the right section's width will grow from 380px (at 992px resolution) while handling tiny screens by not going smaller than the window width - rightSectionWidth = Math.min(RIGHT_SECTION_MIN_WIDTH, windowWidth); - } else { - const ratioWidth = - (RIGHT_SECTION_MAX_WIDTH - RIGHT_SECTION_MIN_WIDTH) * - ((windowWidth - MIN_RESOLUTION_BREAKPOINT) / - (MAX_RESOLUTION_BREAKPOINT - MIN_RESOLUTION_BREAKPOINT)); - - // the right section's width will grow to 750px (at 1920px resolution) and will never go bigger than 750px in higher resolutions - rightSectionWidth = Math.min(RIGHT_SECTION_MIN_WIDTH + ratioWidth, RIGHT_SECTION_MAX_WIDTH); - } - } - - let leftSectionWidth: number = 0; - if (showLeft) { - // the left section's width will be nearly the remaining space for resolution lower than 1600px - if (windowWidth <= FULL_WIDTH_BREAKPOINT) { - leftSectionWidth = windowWidth - rightSectionWidth - FULL_WIDTH_PADDING; - } else { - // the left section's width will be taking 80% of the remaining space for resolution higher than 1600px, while never going bigger than 1500px - leftSectionWidth = Math.min( - ((windowWidth - rightSectionWidth) * 80) / 100, - LEFT_SECTION_MAX_WIDTH - ); - } - } - - const flyoutWidth: string = - showRight && showLeft ? `${rightSectionWidth + leftSectionWidth}px` : `${rightSectionWidth}px`; - - // preview section's width should only be similar to the right section. - // Though because the preview is rendered with an absolute position in the flyout, we calculate its left position instead of the width - let previewSectionLeft: number = 0; - if (showPreview) { - // the preview section starts where the left section ends - previewSectionLeft = leftSectionWidth; - } - - return { - rightSectionWidth, - leftSectionWidth, - flyoutWidth, - previewSectionLeft, - }; -}; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts new file mode 100644 index 0000000000000..72ab9148743db --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts @@ -0,0 +1,150 @@ +/* + * Copyright 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 { renderHook } from '@testing-library/react-hooks'; +import { + FULL_WIDTH_PADDING, + MAX_RESOLUTION_BREAKPOINT, + MIN_RESOLUTION_BREAKPOINT, + RIGHT_SECTION_MAX_WIDTH, + RIGHT_SECTION_MIN_WIDTH, + useWindowWidth, +} from './use_window_width'; +import { useDispatch } from '../store/redux'; +import { setDefaultWidthsAction } from '../store/actions'; + +jest.mock('../store/redux'); + +describe('useWindowWidth', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should return the window size and dispatch setDefaultWidthsAction', () => { + global.innerWidth = 1024; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + expect(hookResult.result.current).toEqual(1024); + expect(mockUseDispatch).toHaveBeenCalled(); + }); + + it('should not dispatch action if window.innerWidth is 0', () => { + global.innerWidth = 0; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + expect(hookResult.result.current).toEqual(0); + expect(mockUseDispatch).not.toHaveBeenCalled(); + }); + + it('should handle very small screens', () => { + global.innerWidth = 300; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + expect(hookResult.result.current).toEqual(300); + expect(mockUseDispatch).toHaveBeenCalledWith( + setDefaultWidthsAction({ + left: -48, + right: 300, + preview: 300, + }) + ); + }); + + it('should handle small screens', () => { + global.innerWidth = 500; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + expect(hookResult.result.current).toEqual(500); + expect(mockUseDispatch).toHaveBeenCalledWith( + setDefaultWidthsAction({ + left: 72, + right: 380, + preview: 380, + }) + ); + }); + + it('should handle medium screens', () => { + global.innerWidth = 1300; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + const right = + RIGHT_SECTION_MIN_WIDTH + + (RIGHT_SECTION_MAX_WIDTH - RIGHT_SECTION_MIN_WIDTH) * + ((1300 - MIN_RESOLUTION_BREAKPOINT) / + (MAX_RESOLUTION_BREAKPOINT - MIN_RESOLUTION_BREAKPOINT)); + const left = 1300 - right - FULL_WIDTH_PADDING; + const preview = right; + + expect(hookResult.result.current).toEqual(1300); + expect(mockUseDispatch).toHaveBeenCalledWith( + setDefaultWidthsAction({ + left, + right, + preview, + }) + ); + }); + + it('should handle large screens', () => { + global.innerWidth = 2500; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + expect(hookResult.result.current).toEqual(2500); + expect(mockUseDispatch).toHaveBeenCalledWith( + setDefaultWidthsAction({ + left: 1400, + right: 750, + preview: 750, + }) + ); + }); + + it('should handle very large screens', () => { + global.innerWidth = 3800; + + const mockUseDispatch = jest.fn(); + (useDispatch as jest.Mock).mockImplementation(() => mockUseDispatch); + + const hookResult = renderHook(() => useWindowWidth()); + + expect(hookResult.result.current).toEqual(3800); + expect(mockUseDispatch).toHaveBeenCalledWith( + setDefaultWidthsAction({ + left: 1500, + right: 750, + preview: 750, + }) + ); + }); +}); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_width.ts b/packages/kbn-expandable-flyout/src/hooks/use_window_width.ts new file mode 100644 index 0000000000000..3df9eef08a4f8 --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_window_width.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", 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 { useLayoutEffect, useState } from 'react'; +import { useDispatch } from '../store/redux'; +import { setDefaultWidthsAction } from '../store/actions'; + +export const RIGHT_SECTION_MIN_WIDTH = 380; +export const MIN_RESOLUTION_BREAKPOINT = 992; +export const RIGHT_SECTION_MAX_WIDTH = 750; +export const MAX_RESOLUTION_BREAKPOINT = 1920; + +const LEFT_SECTION_MAX_WIDTH = 1500; + +const FULL_WIDTH_BREAKPOINT = 1600; +export const FULL_WIDTH_PADDING = 48; + +/** + * Hook that returns the browser window width + */ +export const useWindowWidth = (): number => { + const dispatch = useDispatch(); + + const [width, setWidth] = useState(0); + + useLayoutEffect(() => { + function updateSize() { + setWidth(window.innerWidth); + + const windowWidth = window.innerWidth; + if (windowWidth !== 0) { + let rightSectionWidth: number; + if (windowWidth < MIN_RESOLUTION_BREAKPOINT) { + // the right section's width will grow from 380px (at 992px resolution) while handling tiny screens by not going smaller than the window width + rightSectionWidth = Math.min(RIGHT_SECTION_MIN_WIDTH, windowWidth); + } else { + const ratioWidth = + (RIGHT_SECTION_MAX_WIDTH - RIGHT_SECTION_MIN_WIDTH) * + ((windowWidth - MIN_RESOLUTION_BREAKPOINT) / + (MAX_RESOLUTION_BREAKPOINT - MIN_RESOLUTION_BREAKPOINT)); + + // the right section's width will grow to 750px (at 1920px resolution) and will never go bigger than 750px in higher resolutions + rightSectionWidth = Math.min( + RIGHT_SECTION_MIN_WIDTH + ratioWidth, + RIGHT_SECTION_MAX_WIDTH + ); + } + + let leftSectionWidth: number; + // the left section's width will be nearly the remaining space for resolution lower than 1600px + if (windowWidth <= FULL_WIDTH_BREAKPOINT) { + leftSectionWidth = windowWidth - rightSectionWidth - FULL_WIDTH_PADDING; + } else { + // the left section's width will be taking 80% of the remaining space for resolution higher than 1600px, while never going bigger than 1500px + leftSectionWidth = Math.min( + ((windowWidth - rightSectionWidth) * 80) / 100, + LEFT_SECTION_MAX_WIDTH + ); + } + + const previewSectionWidth: number = rightSectionWidth; + + dispatch( + setDefaultWidthsAction({ + right: rightSectionWidth, + left: leftSectionWidth, + preview: previewSectionWidth, + }) + ); + } + } + window.addEventListener('resize', updateSize); + updateSize(); + return () => window.removeEventListener('resize', updateSize); + }, [dispatch]); + + return width; +}; diff --git a/packages/kbn-expandable-flyout/src/index.stories.tsx b/packages/kbn-expandable-flyout/src/index.stories.tsx index 6e6e7207d8f15..1e8e08d96c073 100644 --- a/packages/kbn-expandable-flyout/src/index.stories.tsx +++ b/packages/kbn-expandable-flyout/src/index.stories.tsx @@ -21,7 +21,7 @@ import { } from '@elastic/eui'; import { ExpandableFlyout } from '.'; import { TestProvider } from './test/provider'; -import { State } from './store/state'; +import { initialUiState, State } from './store/state'; export default { component: ExpandableFlyout, @@ -114,9 +114,7 @@ export const Right: Story = () => { }, }, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; return ( @@ -144,9 +142,7 @@ export const Left: Story = () => { }, }, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; return ( @@ -178,9 +174,7 @@ export const Preview: Story = () => { }, }, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; return ( @@ -215,9 +209,7 @@ export const MultiplePreviews: Story = () => { }, }, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; return ( @@ -230,7 +222,7 @@ export const MultiplePreviews: Story = () => { ); }; -export const CollapsedPushVsOverlay: Story = () => { +export const CollapsedPushMode: Story = () => { const state: State = { panels: { byId: { @@ -244,6 +236,7 @@ export const CollapsedPushVsOverlay: Story = () => { }, }, ui: { + ...initialUiState, pushVsOverlay: 'push', }, }; @@ -255,7 +248,7 @@ export const CollapsedPushVsOverlay: Story = () => { ); }; -export const ExpandedPushVsOverlay: Story = () => { +export const ExpandedPushMode: Story = () => { const state: State = { panels: { byId: { @@ -271,6 +264,7 @@ export const ExpandedPushVsOverlay: Story = () => { }, }, ui: { + ...initialUiState, pushVsOverlay: 'push', }, }; @@ -297,9 +291,7 @@ export const DisableTypeSelection: Story = () => { }, }, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; return ( @@ -313,3 +305,58 @@ export const DisableTypeSelection: Story = () => { ); }; + +export const ResetWidths: Story = () => { + const state: State = { + panels: { + byId: { + memory: { + right: { + id: 'right', + }, + left: { + id: 'left', + }, + preview: undefined, + }, + }, + }, + ui: initialUiState, + }; + + return ( + + + + ); +}; + +export const DisableResizeWidthSelection: Story = () => { + const state: State = { + panels: { + byId: { + memory: { + right: { + id: 'right', + }, + left: { + id: 'left', + }, + preview: undefined, + }, + }, + }, + ui: initialUiState, + }; + + return ( + + + + ); +}; diff --git a/packages/kbn-expandable-flyout/src/index.test.tsx b/packages/kbn-expandable-flyout/src/index.test.tsx index f465a16501761..8ee4ff32a9821 100644 --- a/packages/kbn-expandable-flyout/src/index.test.tsx +++ b/packages/kbn-expandable-flyout/src/index.test.tsx @@ -12,17 +12,13 @@ import { render } from '@testing-library/react'; import { Panel } from './types'; import { ExpandableFlyout } from '.'; -import { - LEFT_SECTION_TEST_ID, - PREVIEW_SECTION_TEST_ID, - SETTINGS_MENU_BUTTON_TEST_ID, - RIGHT_SECTION_TEST_ID, -} from './components/test_ids'; -import { type State } from './store/state'; +import { useWindowWidth } from './hooks/use_window_width'; import { TestProvider } from './test/provider'; import { REDUX_ID_FOR_MEMORY_STORAGE } from './constants'; +import { initialUiState } from './store/state'; + +jest.mock('./hooks/use_window_width'); -const id = REDUX_ID_FOR_MEMORY_STORAGE; const registeredPanels: Panel[] = [ { key: 'key', @@ -31,18 +27,11 @@ const registeredPanels: Panel[] = [ ]; describe('ExpandableFlyout', () => { - it(`shouldn't render flyout if no panels`, () => { - const state: State = { - panels: { - byId: {}, - }, - ui: { - pushVsOverlay: 'overlay', - }, - }; + it(`should not render flyout if window width is 0`, () => { + (useWindowWidth as jest.Mock).mockReturnValue(0); const result = render( - + ); @@ -50,122 +39,13 @@ describe('ExpandableFlyout', () => { expect(result.asFragment()).toMatchInlineSnapshot(``); }); - it('should render right section', () => { - const state = { - panels: { - byId: { - [id]: { - right: { - id: 'key', - }, - left: undefined, - preview: undefined, - }, - }, - }, - ui: { - pushVsOverlay: 'overlay' as const, - }, - }; - - const { getByTestId } = render( - - - - ); - - expect(getByTestId(RIGHT_SECTION_TEST_ID)).toBeInTheDocument(); - }); - - it('should render left section', () => { - const state = { - panels: { - byId: { - [id]: { - right: undefined, - left: { - id: 'key', - }, - preview: undefined, - }, - }, - }, - ui: { - pushVsOverlay: 'overlay' as const, - }, - }; - - const { getByTestId } = render( - - - - ); - - expect(getByTestId(LEFT_SECTION_TEST_ID)).toBeInTheDocument(); - }); - - it('should render preview section', () => { - const state = { - panels: { - byId: { - [id]: { - right: undefined, - left: undefined, - preview: [ - { - id: 'key', - }, - ], - }, - }, - }, - ui: { - pushVsOverlay: 'overlay' as const, - }, - }; - - const { getByTestId } = render( - - - - ); - - expect(getByTestId(PREVIEW_SECTION_TEST_ID)).toBeInTheDocument(); - }); + it(`should render flyout`, () => { + (useWindowWidth as jest.Mock).mockReturnValue(1000); - it('should not render flyout when right has value but does not matches registered panels', () => { const state = { panels: { byId: { - [id]: { - right: { - id: 'key1', - }, - left: undefined, - preview: undefined, - }, - }, - }, - ui: { - pushVsOverlay: 'overlay' as const, - }, - }; - - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('my-test-flyout')).toBeNull(); - expect(queryByTestId(RIGHT_SECTION_TEST_ID)).toBeNull(); - }); - - it('should render the menu to change display options', () => { - const state = { - panels: { - byId: { - [id]: { + [REDUX_ID_FOR_MEMORY_STORAGE]: { right: { id: 'key', }, @@ -174,17 +54,15 @@ describe('ExpandableFlyout', () => { }, }, }, - ui: { - pushVsOverlay: 'overlay' as const, - }, + ui: initialUiState, }; const { getByTestId } = render( - + ); - expect(getByTestId(SETTINGS_MENU_BUTTON_TEST_ID)).toBeInTheDocument(); + expect(getByTestId('TEST')).toBeInTheDocument(); }); }); diff --git a/packages/kbn-expandable-flyout/src/index.tsx b/packages/kbn-expandable-flyout/src/index.tsx index 4904661b2da88..25425a75e2ba9 100644 --- a/packages/kbn-expandable-flyout/src/index.tsx +++ b/packages/kbn-expandable-flyout/src/index.tsx @@ -10,23 +10,14 @@ import React, { useMemo } from 'react'; import type { Interpolation, Theme } from '@emotion/react'; import { EuiFlyoutProps } from '@elastic/eui'; -import { EuiFlexGroup, EuiFlyout } from '@elastic/eui'; +import { EuiFlyoutResizableProps } from '@elastic/eui/src/components/flyout/flyout_resizable'; +import { Container } from './components/container'; +import { useWindowWidth } from './hooks/use_window_width'; import { useInitializeFromLocalStorage } from './hooks/use_initialize_from_local_storage'; -import { FlyoutCustomProps, SettingsMenu } from './components/settings_menu'; -import { useSectionSizes } from './hooks/use_sections_sizes'; -import { useWindowSize } from './hooks/use_window_size'; -import { useExpandableFlyoutState } from './hooks/use_expandable_flyout_state'; -import { useExpandableFlyoutApi } from './hooks/use_expandable_flyout_api'; -import { PreviewSection } from './components/preview_section'; -import { RightSection } from './components/right_section'; -import type { FlyoutPanelProps, Panel } from './types'; -import { LeftSection } from './components/left_section'; -import { isPreviewBanner } from './components/preview_section'; -import { selectPushVsOverlay, useSelector } from './store/redux'; +import { FlyoutCustomProps } from './components/settings_menu'; +import type { Panel } from './types'; -const flyoutInnerStyles = { height: '100%' }; - -export interface ExpandableFlyoutProps extends Omit { +export interface ExpandableFlyoutProps extends Omit { /** * List of all registered panels available for render */ @@ -43,6 +34,10 @@ export interface ExpandableFlyoutProps extends Omit { * Set of properties that drive a settings menu */ flyoutCustomProps?: FlyoutCustomProps; + /** + * Optional data test subject string to be used on the EuiFlyoutResizable component + */ + 'data-test-subj'?: string; } /** @@ -52,108 +47,18 @@ export interface ExpandableFlyoutProps extends Omit { * The behavior expects that the left and preview sections should only be displayed is a right section * is already rendered. */ -export const ExpandableFlyout: React.FC = ({ - customStyles, - registeredPanels, - flyoutCustomProps, - ...flyoutProps -}) => { - const windowWidth = useWindowSize(); +export const ExpandableFlyout: React.FC = ({ ...props }) => { + const windowWidth = useWindowWidth(); useInitializeFromLocalStorage(); - // for flyout where the push vs overlay option is disable in the UI we fall back to overlay mode - const type = useSelector(selectPushVsOverlay); - const flyoutType = flyoutCustomProps?.pushVsOverlay?.disabled ? 'overlay' : type; - - const { left, right, preview } = useExpandableFlyoutState(); - const { closeFlyout } = useExpandableFlyoutApi(); - - const leftSection = useMemo( - () => registeredPanels.find((panel) => panel.key === left?.id), - [left, registeredPanels] - ); - - const rightSection = useMemo( - () => registeredPanels.find((panel) => panel.key === right?.id), - [right, registeredPanels] - ); - - // retrieve the last preview panel (most recent) - const mostRecentPreview = preview ? preview[preview.length - 1] : undefined; - const previewBanner = isPreviewBanner(mostRecentPreview?.params?.banner) - ? mostRecentPreview?.params?.banner - : undefined; + const container = useMemo(() => , [props]); - const previewSection = useMemo( - () => registeredPanels.find((panel) => panel.key === mostRecentPreview?.id), - [mostRecentPreview, registeredPanels] - ); - - const showRight = rightSection != null && right != null; - const showLeft = leftSection != null && left != null; - const showPreview = previewSection != null && preview != null; - - const { rightSectionWidth, leftSectionWidth, flyoutWidth, previewSectionLeft } = useSectionSizes({ - windowWidth, - showRight, - showLeft, - showPreview, - }); - - const hideFlyout = !(left && leftSection) && !(right && rightSection) && !preview?.length; - - if (hideFlyout) { + if (windowWidth === 0) { return null; } - return ( - { - closeFlyout(); - if (flyoutProps.onClose) { - flyoutProps.onClose(e); - } - }} - css={customStyles} - > - - {showLeft ? ( - - ) : null} - {showRight ? ( - - ) : null} - - - {showPreview ? ( - - ) : null} - - {!flyoutCustomProps?.hideSettings && } - - ); + return <>{container}; }; ExpandableFlyout.displayName = 'ExpandableFlyout'; diff --git a/packages/kbn-expandable-flyout/src/provider.test.tsx b/packages/kbn-expandable-flyout/src/provider.test.tsx index bdd4183c53276..7d7e6f8ab10c0 100644 --- a/packages/kbn-expandable-flyout/src/provider.test.tsx +++ b/packages/kbn-expandable-flyout/src/provider.test.tsx @@ -12,7 +12,7 @@ import { render } from '@testing-library/react'; import { TestProvider } from './test/provider'; import { UrlSynchronizer } from './provider'; import * as actions from './store/actions'; -import { State } from './store/state'; +import { initialUiState, State } from './store/state'; import { of } from 'rxjs'; const mockGet = jest.fn(); @@ -38,9 +38,7 @@ describe('UrlSynchronizer', () => { }, needsSync: true, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; render( @@ -64,9 +62,7 @@ describe('UrlSynchronizer', () => { byId: {}, needsSync: true, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; render( @@ -101,9 +97,7 @@ describe('UrlSynchronizer', () => { }, needsSync: true, }, - ui: { - pushVsOverlay: 'overlay', - }, + ui: initialUiState, }; render( diff --git a/packages/kbn-expandable-flyout/src/store/actions.ts b/packages/kbn-expandable-flyout/src/store/actions.ts index 2886118369b0e..49e28befa3456 100644 --- a/packages/kbn-expandable-flyout/src/store/actions.ts +++ b/packages/kbn-expandable-flyout/src/store/actions.ts @@ -23,6 +23,15 @@ export enum ActionType { urlChanged = 'urlChanged', changePushVsOverlay = 'change_push_overlay', + + setDefaultWidths = 'set_default_widths', + + changeUserCollapsedWidth = 'change_user_collapsed_width', + changeUserExpandedWidth = 'change_user_expanded_width', + + changeUserSectionWidths = 'change_user_section_widths', + + resetAllUserWidths = 'reset_all_user_widths', } export const openPanelsAction = createAction<{ @@ -134,3 +143,57 @@ export const changePushVsOverlayAction = createAction<{ */ savedToLocalStorage: boolean; }>(ActionType.changePushVsOverlay); + +export const setDefaultWidthsAction = createAction<{ + /** + * Default width for the right section + */ + right: number; + /** + * Default width for the left section + */ + left: number; + /** + * Default width for the preview section + */ + preview: number; +}>(ActionType.setDefaultWidths); + +export const changeUserCollapsedWidthAction = createAction<{ + /** + * Width of the collapsed flyout + */ + width: number; + /** + * Used in the redux middleware to decide if the value needs to be saved to local storage. + */ + savedToLocalStorage: boolean; +}>(ActionType.changeUserCollapsedWidth); + +export const changeUserExpandedWidthAction = createAction<{ + /** + * Width of the expanded flyout + */ + width: number; + /** + * Used in the redux middleware to decide if the value needs to be saved to local storage. + */ + savedToLocalStorage: boolean; +}>(ActionType.changeUserExpandedWidth); + +export const changeUserSectionWidthsAction = createAction<{ + /** + * Width of the left section + */ + left: number; + /** + * Width of the right section + */ + right: number; + /** + * Used in the redux middleware to decide if the value needs to be saved to local storage. + */ + savedToLocalStorage: boolean; +}>(ActionType.changeUserSectionWidths); + +export const resetAllUserChangedWidthsAction = createAction(ActionType.resetAllUserWidths); diff --git a/packages/kbn-expandable-flyout/src/store/middlewares.test.ts b/packages/kbn-expandable-flyout/src/store/middlewares.test.ts index ccbb5d5443db7..680a5619b0b64 100644 --- a/packages/kbn-expandable-flyout/src/store/middlewares.test.ts +++ b/packages/kbn-expandable-flyout/src/store/middlewares.test.ts @@ -8,10 +8,27 @@ */ import { localStorageMock } from '../../__mocks__'; -import { EXPANDABLE_FLYOUT_LOCAL_STORAGE, PUSH_VS_OVERLAY_LOCAL_STORAGE } from '../constants'; -import { savePushVsOverlayToLocalStorageMiddleware } from './middlewares'; -import { createAction, type MiddlewareAPI } from '@reduxjs/toolkit'; -import { changePushVsOverlayAction } from './actions'; +import { + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + PUSH_VS_OVERLAY_LOCAL_STORAGE, + USER_COLLAPSED_WIDTH_LOCAL_STORAGE, + USER_EXPANDED_WIDTH_LOCAL_STORAGE, + USER_SECTION_WIDTHS_LOCAL_STORAGE, +} from '../constants'; +import { + clearAllUserWidthsFromLocalStorageMiddleware, + savePushVsOverlayToLocalStorageMiddleware, + saveUserFlyoutWidthsToLocalStorageMiddleware, + saveUserSectionWidthsToLocalStorageMiddleware, +} from './middlewares'; +import { createAction } from '@reduxjs/toolkit'; +import { + changeUserCollapsedWidthAction, + changeUserExpandedWidthAction, + changeUserSectionWidthsAction, + changePushVsOverlayAction, + resetAllUserChangedWidthsAction, +} from './actions'; const noTypeAction = createAction<{ type: 'no_type'; @@ -20,40 +37,182 @@ const randomAction = createAction<{ type: 'random_type'; }>('random_action'); -describe('pushVsOverlayMiddleware', () => { +describe('middlewares', () => { beforeEach(() => { Object.defineProperty(window, 'localStorage', { value: localStorageMock(), }); }); - it('should ignore action without type', () => { - savePushVsOverlayToLocalStorageMiddleware({} as MiddlewareAPI)(jest.fn)(noTypeAction); + describe('savePushVsOverlayToLocalStorageMiddleware', () => { + it('should ignore action without type', () => { + savePushVsOverlayToLocalStorageMiddleware()(jest.fn)(noTypeAction); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should ignore action of types other than changePushVsOverlayAction', () => { + savePushVsOverlayToLocalStorageMiddleware()(jest.fn)(randomAction); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should save value to local storage if action is of type changePushVsOverlayAction', () => { + savePushVsOverlayToLocalStorageMiddleware()(jest.fn)( + changePushVsOverlayAction({ type: 'push', savedToLocalStorage: true }) + ); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual( + JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push' }) + ); + }); + + it('should not save value to local storage if savedToLocalStorage is false', () => { + savePushVsOverlayToLocalStorageMiddleware()(jest.fn)( + changePushVsOverlayAction({ type: 'push', savedToLocalStorage: false }) + ); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); }); - it('should ignore action of types other than changePushVsOverlayAction', () => { - savePushVsOverlayToLocalStorageMiddleware({} as MiddlewareAPI)(jest.fn)(randomAction); + describe('saveUserFlyoutWidthsToLocalStorageMiddleware', () => { + it('should ignore action without type', () => { + saveUserFlyoutWidthsToLocalStorageMiddleware()(jest.fn)(noTypeAction); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should ignore action of other types', () => { + saveUserFlyoutWidthsToLocalStorageMiddleware()(jest.fn)(randomAction); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should save collapsed value to local storage if action is of type changeUserCollapsedWidthAction', () => { + saveUserFlyoutWidthsToLocalStorageMiddleware()(jest.fn)( + changeUserCollapsedWidthAction({ width: 250, savedToLocalStorage: true }) + ); + + const expandableFlyout = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + expect(expandableFlyout).not.toBe(null); + + if (expandableFlyout) { + expect(JSON.parse(expandableFlyout)[USER_COLLAPSED_WIDTH_LOCAL_STORAGE]).toEqual(250); + } + }); + + it('should save expanded value to local storage if action is of type changeUserExpandedWidthAction', () => { + saveUserFlyoutWidthsToLocalStorageMiddleware()(jest.fn)( + changeUserExpandedWidthAction({ width: 500, savedToLocalStorage: true }) + ); + + const expandableFlyout = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + expect(expandableFlyout).not.toBe(null); + + if (expandableFlyout) { + expect(JSON.parse(expandableFlyout)[USER_EXPANDED_WIDTH_LOCAL_STORAGE]).toEqual(500); + } + }); + + it('should not save collapsed value to local storage if savedToLocalStorage is false', () => { + saveUserFlyoutWidthsToLocalStorageMiddleware()(jest.fn)( + changeUserCollapsedWidthAction({ width: 250, savedToLocalStorage: false }) + ); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should not save expanded value to local storage if savedToLocalStorage is false', () => { + saveUserFlyoutWidthsToLocalStorageMiddleware()(jest.fn)( + changeUserExpandedWidthAction({ width: 500, savedToLocalStorage: false }) + ); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); }); - it('should save value to local storage if action is of type changePushVsOverlayAction', () => { - savePushVsOverlayToLocalStorageMiddleware({} as MiddlewareAPI)(jest.fn)( - changePushVsOverlayAction({ type: 'push', savedToLocalStorage: true }) - ); + describe('saveUserSectionWidthsToLocalStorageMiddleware', () => { + it('should ignore action without type', () => { + saveUserSectionWidthsToLocalStorageMiddleware()(jest.fn)(noTypeAction); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should ignore action of other types ', () => { + saveUserSectionWidthsToLocalStorageMiddleware()(jest.fn)(randomAction); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should save section width values to local storage if action is of type changeUserSectionWidthsAction', () => { + saveUserSectionWidthsToLocalStorageMiddleware()(jest.fn)( + changeUserSectionWidthsAction({ + left: 500, + right: 500, + savedToLocalStorage: true, + }) + ); + + const expandableFlyout = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + expect(expandableFlyout).not.toBe(null); + + if (expandableFlyout) { + expect(JSON.parse(expandableFlyout)[USER_SECTION_WIDTHS_LOCAL_STORAGE]).toEqual({ + left: 500, + right: 500, + }); + } + }); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual( - JSON.stringify({ [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push' }) - ); + it('should not save section width values to local storage if savedToLocalStorage is false', () => { + saveUserSectionWidthsToLocalStorageMiddleware()(jest.fn)( + changeUserSectionWidthsAction({ + left: 500, + right: 500, + savedToLocalStorage: false, + }) + ); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); }); - it('should not save value to local storage if savedToLocalStorage is false', () => { - savePushVsOverlayToLocalStorageMiddleware({} as MiddlewareAPI)(jest.fn)( - changePushVsOverlayAction({ type: 'push', savedToLocalStorage: false }) - ); + describe('clearAllUserWidthsFromLocalStorageMiddleware', () => { + it('should ignore action without type', () => { + clearAllUserWidthsFromLocalStorageMiddleware()(jest.fn)(noTypeAction); + + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should ignore action of other types ', () => { + clearAllUserWidthsFromLocalStorageMiddleware()(jest.fn)(randomAction); - expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + expect(localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE)).toEqual(null); + }); + + it('should clear width values from local storage if action is of type resetUserCollapsedWidthAction', () => { + localStorage.setItem( + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + JSON.stringify({ + [PUSH_VS_OVERLAY_LOCAL_STORAGE]: 'push', + [USER_COLLAPSED_WIDTH_LOCAL_STORAGE]: 250, + [USER_EXPANDED_WIDTH_LOCAL_STORAGE]: 500, + [USER_SECTION_WIDTHS_LOCAL_STORAGE]: { left: 50, right: 50 }, + }) + ); + + clearAllUserWidthsFromLocalStorageMiddleware()(jest.fn)(resetAllUserChangedWidthsAction()); + + const expandableFlyout = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + expect(expandableFlyout).not.toBe(null); + + if (expandableFlyout) { + const parsed = JSON.parse(expandableFlyout); + expect(parsed[PUSH_VS_OVERLAY_LOCAL_STORAGE]).toEqual('push'); + expect(expandableFlyout).not.toHaveProperty(USER_COLLAPSED_WIDTH_LOCAL_STORAGE); + expect(expandableFlyout).not.toHaveProperty(USER_EXPANDED_WIDTH_LOCAL_STORAGE); + expect(expandableFlyout).not.toHaveProperty(USER_SECTION_WIDTHS_LOCAL_STORAGE); + } + }); }); }); diff --git a/packages/kbn-expandable-flyout/src/store/middlewares.ts b/packages/kbn-expandable-flyout/src/store/middlewares.ts index c9e04ea2846d7..4fb5354535caf 100644 --- a/packages/kbn-expandable-flyout/src/store/middlewares.ts +++ b/packages/kbn-expandable-flyout/src/store/middlewares.ts @@ -7,26 +7,112 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { Action, Dispatch, MiddlewareAPI } from '@reduxjs/toolkit'; -import { changePushVsOverlayAction } from './actions'; -import { EXPANDABLE_FLYOUT_LOCAL_STORAGE, PUSH_VS_OVERLAY_LOCAL_STORAGE } from '../constants'; +import type { Action, Dispatch } from '@reduxjs/toolkit'; +import { + changeUserCollapsedWidthAction, + changeUserExpandedWidthAction, + changeUserSectionWidthsAction, + changePushVsOverlayAction, + resetAllUserChangedWidthsAction, +} from './actions'; +import { + USER_COLLAPSED_WIDTH_LOCAL_STORAGE, + EXPANDABLE_FLYOUT_LOCAL_STORAGE, + USER_SECTION_WIDTHS_LOCAL_STORAGE, + PUSH_VS_OVERLAY_LOCAL_STORAGE, + USER_EXPANDED_WIDTH_LOCAL_STORAGE, +} from '../constants'; /** * Middleware to save the push vs overlay state to local storage */ export const savePushVsOverlayToLocalStorageMiddleware = - (store: MiddlewareAPI) => (next: Dispatch) => (action: Action) => { + () => (next: Dispatch) => (action: Action) => { if (!action.type) { return next(action); } if (changePushVsOverlayAction.match(action) && action.payload.savedToLocalStorage) { - localStorage.setItem( - EXPANDABLE_FLYOUT_LOCAL_STORAGE, - JSON.stringify({ - [PUSH_VS_OVERLAY_LOCAL_STORAGE]: action.payload.type, - }) - ); + const currentStringValue = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + const currentJsonValue = currentStringValue ? JSON.parse(currentStringValue) : {}; + + currentJsonValue[PUSH_VS_OVERLAY_LOCAL_STORAGE] = action.payload.type; + + localStorage.setItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE, JSON.stringify(currentJsonValue)); + } + + return next(action); + }; + +/** + * Middleware to save the user collapsed and expanded flyout widths to local storage + */ +export const saveUserFlyoutWidthsToLocalStorageMiddleware = + () => (next: Dispatch) => (action: Action) => { + if (!action.type) { + return next(action); + } + + const currentStringValue = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + const currentJsonValue = currentStringValue ? JSON.parse(currentStringValue) : {}; + + if (changeUserCollapsedWidthAction.match(action) && action.payload.savedToLocalStorage) { + currentJsonValue[USER_COLLAPSED_WIDTH_LOCAL_STORAGE] = action.payload.width; + + localStorage.setItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE, JSON.stringify(currentJsonValue)); + } + + if (changeUserExpandedWidthAction.match(action) && action.payload.savedToLocalStorage) { + currentJsonValue[USER_EXPANDED_WIDTH_LOCAL_STORAGE] = action.payload.width; + + localStorage.setItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE, JSON.stringify(currentJsonValue)); + } + + return next(action); + }; + +/** + * Middleware to save the user left and right section widths to local storage + */ +export const saveUserSectionWidthsToLocalStorageMiddleware = + () => (next: Dispatch) => (action: Action) => { + if (!action.type) { + return next(action); + } + + if (changeUserSectionWidthsAction.match(action) && action.payload.savedToLocalStorage) { + const currentStringValue = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + const currentJsonValue = currentStringValue ? JSON.parse(currentStringValue) : {}; + + currentJsonValue[USER_SECTION_WIDTHS_LOCAL_STORAGE] = { + left: action.payload.left, + right: action.payload.right, + }; + + localStorage.setItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE, JSON.stringify(currentJsonValue)); + } + + return next(action); + }; + +/** + * Middleware to save the user left and right section widths to local storage + */ +export const clearAllUserWidthsFromLocalStorageMiddleware = + () => (next: Dispatch) => (action: Action) => { + if (!action.type) { + return next(action); + } + + if (resetAllUserChangedWidthsAction.match(action)) { + const currentStringValue = localStorage.getItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE); + const currentJsonValue = currentStringValue ? JSON.parse(currentStringValue) : {}; + + delete currentJsonValue[USER_COLLAPSED_WIDTH_LOCAL_STORAGE]; + delete currentJsonValue[USER_EXPANDED_WIDTH_LOCAL_STORAGE]; + delete currentJsonValue[USER_SECTION_WIDTHS_LOCAL_STORAGE]; + + localStorage.setItem(EXPANDABLE_FLYOUT_LOCAL_STORAGE, JSON.stringify(currentJsonValue)); } return next(action); diff --git a/packages/kbn-expandable-flyout/src/store/reducers.test.ts b/packages/kbn-expandable-flyout/src/store/reducers.test.ts index 78caea13bd2d3..1a887333daca8 100644 --- a/packages/kbn-expandable-flyout/src/store/reducers.test.ts +++ b/packages/kbn-expandable-flyout/src/store/reducers.test.ts @@ -12,6 +12,9 @@ import { panelsReducer, uiReducer } from './reducers'; import { initialPanelsState, PanelsState, initialUiState, UiState } from './state'; import { changePushVsOverlayAction, + changeUserCollapsedWidthAction, + changeUserExpandedWidthAction, + changeUserSectionWidthsAction, closeLeftPanelAction, closePanelsAction, closePreviewPanelAction, @@ -21,6 +24,8 @@ import { openPreviewPanelAction, openRightPanelAction, previousPreviewPanelAction, + resetAllUserChangedWidthsAction, + setDefaultWidthsAction, } from './actions'; const id1 = 'id1'; @@ -794,12 +799,14 @@ describe('uiReducer', () => { const newState: UiState = uiReducer(state, action); expect(newState).toEqual({ + ...state, pushVsOverlay: 'push', }); }); it('should override value if id already exists', () => { const state: UiState = { + ...initialUiState, pushVsOverlay: 'push', }; const action = changePushVsOverlayAction({ @@ -809,8 +816,239 @@ describe('uiReducer', () => { const newState: UiState = uiReducer(state, action); expect(newState).toEqual({ + ...state, pushVsOverlay: 'overlay', }); }); }); + + describe('should handle setDefaultWidthsAction action', () => { + it('should set value state is empty', () => { + const state: UiState = initialUiState; + const action = setDefaultWidthsAction({ + right: 200, + left: 600, + preview: 200, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + defaultWidths: { + rightWidth: 200, + leftWidth: 600, + previewWidth: 200, + rightPercentage: 25, + leftPercentage: 75, + previewPercentage: 25, + }, + }); + }); + + it('should override value if state not empty', () => { + const state: UiState = { + ...initialUiState, + defaultWidths: { + rightWidth: 200, + leftWidth: 600, + previewWidth: 200, + rightPercentage: 25, + leftPercentage: 75, + previewPercentage: 25, + }, + }; + const action = setDefaultWidthsAction({ + right: 500, + left: 500, + preview: 500, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + defaultWidths: { + rightWidth: 500, + leftWidth: 500, + previewWidth: 500, + rightPercentage: 50, + leftPercentage: 50, + previewPercentage: 50, + }, + }); + }); + }); + + describe('should handle changeUserCollapsedWidthAction action', () => { + it('should set value state is empty', () => { + const state: UiState = initialUiState; + const action = changeUserCollapsedWidthAction({ + width: 200, + savedToLocalStorage: false, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userFlyoutWidths: { + collapsedWidth: 200, + }, + }); + }); + + it('should override value if state not empty', () => { + const state: UiState = { + ...initialUiState, + userFlyoutWidths: { + collapsedWidth: 200, + expandedWidth: 500, + }, + }; + const action = changeUserCollapsedWidthAction({ + width: 250, + savedToLocalStorage: false, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userFlyoutWidths: { + collapsedWidth: 250, + expandedWidth: 500, + }, + }); + }); + }); + + describe('should handle changeUserExpandedWidthAction action', () => { + it('should set value state is empty', () => { + const state: UiState = initialUiState; + const action = changeUserExpandedWidthAction({ + width: 500, + savedToLocalStorage: false, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userFlyoutWidths: { + expandedWidth: 500, + }, + }); + }); + + it('should override value if state not empty', () => { + const state: UiState = { + ...initialUiState, + userFlyoutWidths: { + collapsedWidth: 200, + expandedWidth: 500, + }, + }; + const action = changeUserExpandedWidthAction({ + width: 1000, + savedToLocalStorage: false, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userFlyoutWidths: { + collapsedWidth: 200, + expandedWidth: 1000, + }, + }); + }); + }); + + describe('should handle changeUserSectionWidthsAction action', () => { + it('should set value state is empty', () => { + const state: UiState = initialUiState; + const action = changeUserSectionWidthsAction({ + right: 50, + left: 50, + savedToLocalStorage: false, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userSectionWidths: { + leftPercentage: 50, + rightPercentage: 50, + }, + }); + }); + + it('should override value if state not empty', () => { + const state: UiState = { + ...initialUiState, + userSectionWidths: { + leftPercentage: 50, + rightPercentage: 50, + }, + }; + const action = changeUserSectionWidthsAction({ + right: 30, + left: 70, + savedToLocalStorage: false, + }); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userSectionWidths: { + leftPercentage: 70, + rightPercentage: 30, + }, + }); + }); + }); + + describe('should handle resetAllUserChangedWidthsAction action', () => { + it('should set value state is empty', () => { + const state: UiState = initialUiState; + const action = resetAllUserChangedWidthsAction(); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userSectionWidths: { + leftPercentage: undefined, + rightPercentage: undefined, + }, + userFlyoutWidths: { + collapsedWidth: undefined, + expandedWidth: undefined, + }, + }); + }); + + it('should override value if state not empty', () => { + const state: UiState = { + ...initialUiState, + userFlyoutWidths: { + collapsedWidth: 200, + expandedWidth: 500, + }, + userSectionWidths: { + leftPercentage: 50, + rightPercentage: 50, + }, + }; + const action = resetAllUserChangedWidthsAction(); + const newState: UiState = uiReducer(state, action); + + expect(newState).toEqual({ + ...state, + userSectionWidths: { + leftPercentage: undefined, + rightPercentage: undefined, + }, + userFlyoutWidths: { + collapsedWidth: undefined, + expandedWidth: undefined, + }, + }); + }); + }); }); diff --git a/packages/kbn-expandable-flyout/src/store/reducers.ts b/packages/kbn-expandable-flyout/src/store/reducers.ts index 54918f5c6d7bb..b14aa0b1b703b 100644 --- a/packages/kbn-expandable-flyout/src/store/reducers.ts +++ b/packages/kbn-expandable-flyout/src/store/reducers.ts @@ -21,6 +21,11 @@ import { openPreviewPanelAction, urlChangedAction, changePushVsOverlayAction, + setDefaultWidthsAction, + changeUserCollapsedWidthAction, + changeUserExpandedWidthAction, + changeUserSectionWidthsAction, + resetAllUserChangedWidthsAction, } from './actions'; import { initialPanelsState, initialUiState } from './state'; @@ -155,4 +160,33 @@ export const uiReducer = createReducer(initialUiState, (builder) => { builder.addCase(changePushVsOverlayAction, (state, { payload: { type } }) => { state.pushVsOverlay = type; }); + + builder.addCase(setDefaultWidthsAction, (state, { payload: { right, left, preview } }) => { + state.defaultWidths.rightWidth = right; + state.defaultWidths.leftWidth = left; + state.defaultWidths.previewWidth = preview; + state.defaultWidths.rightPercentage = (right / (right + left)) * 100; + state.defaultWidths.leftPercentage = (left / (right + left)) * 100; + state.defaultWidths.previewPercentage = (right / (right + left)) * 100; + }); + + builder.addCase(changeUserCollapsedWidthAction, (state, { payload: { width } }) => { + state.userFlyoutWidths.collapsedWidth = width; + }); + + builder.addCase(changeUserExpandedWidthAction, (state, { payload: { width } }) => { + state.userFlyoutWidths.expandedWidth = width; + }); + + builder.addCase(changeUserSectionWidthsAction, (state, { payload: { right, left } }) => { + state.userSectionWidths.leftPercentage = left; + state.userSectionWidths.rightPercentage = right; + }); + + builder.addCase(resetAllUserChangedWidthsAction, (state) => { + state.userFlyoutWidths.collapsedWidth = undefined; + state.userFlyoutWidths.expandedWidth = undefined; + state.userSectionWidths.leftPercentage = undefined; + state.userSectionWidths.rightPercentage = undefined; + }); }); diff --git a/packages/kbn-expandable-flyout/src/store/redux.ts b/packages/kbn-expandable-flyout/src/store/redux.ts index 9951334a247f3..d68b4a0295769 100644 --- a/packages/kbn-expandable-flyout/src/store/redux.ts +++ b/packages/kbn-expandable-flyout/src/store/redux.ts @@ -13,7 +13,12 @@ import { configureStore } from '@reduxjs/toolkit'; import { createSelector } from 'reselect'; import { panelsReducer, uiReducer } from './reducers'; import { initialState, State } from './state'; -import { savePushVsOverlayToLocalStorageMiddleware } from './middlewares'; +import { + savePushVsOverlayToLocalStorageMiddleware, + saveUserSectionWidthsToLocalStorageMiddleware, + saveUserFlyoutWidthsToLocalStorageMiddleware, + clearAllUserWidthsFromLocalStorageMiddleware, +} from './middlewares'; export const store = configureStore({ reducer: { @@ -21,7 +26,12 @@ export const store = configureStore({ ui: uiReducer, }, devTools: process.env.NODE_ENV !== 'production', - middleware: [savePushVsOverlayToLocalStorageMiddleware], + middleware: [ + savePushVsOverlayToLocalStorageMiddleware, + saveUserSectionWidthsToLocalStorageMiddleware, + saveUserFlyoutWidthsToLocalStorageMiddleware, + clearAllUserWidthsFromLocalStorageMiddleware, + ], }); export const Context = createContext>({ @@ -41,3 +51,9 @@ export const selectNeedsSync = () => createSelector(panelsSelector, (state) => s const uiSelector = createSelector(stateSelector, (state) => state.ui); export const selectPushVsOverlay = createSelector(uiSelector, (state) => state.pushVsOverlay); +export const selectDefaultWidths = createSelector(uiSelector, (state) => state.defaultWidths); +export const selectUserFlyoutWidths = createSelector(uiSelector, (state) => state.userFlyoutWidths); +export const selectUserSectionWidths = createSelector( + uiSelector, + (state) => state.userSectionWidths +); diff --git a/packages/kbn-expandable-flyout/src/store/state.ts b/packages/kbn-expandable-flyout/src/store/state.ts index a794d0db34d28..e158f61aaccd5 100644 --- a/packages/kbn-expandable-flyout/src/store/state.ts +++ b/packages/kbn-expandable-flyout/src/store/state.ts @@ -44,15 +44,79 @@ export const initialPanelsState: PanelsState = { needsSync: false, }; +export interface DefaultWidthsState { + /** + * Default width for the right section (calculated from the window width) + */ + rightWidth: number; + /** + * Default width for the left section (calculated from the window width) + */ + leftWidth: number; + /** + * Default width for the preview section (calculated from the window width) + */ + previewWidth: number; + /** + * Value of the right width in percentage (of the flyout total width) + */ + rightPercentage: number; + /** + * Value of the left width in percentage (of the flyout total width) + */ + leftPercentage: number; + /** + * Value of the preview width in percentage (of the flyout total width) + */ + previewPercentage: number; +} + +export interface UserFlyoutWidthsState { + /** + * Width of the collapsed flyout + */ + collapsedWidth?: number; + /** + * Width of the expanded flyout + */ + expandedWidth?: number; +} + +export interface UserSectionWidthsState { + /** + * Percentage for the left section + */ + leftPercentage: number | undefined; + /** + * Percentage for the right section + */ + rightPercentage: number | undefined; +} + export interface UiState { /** * Push vs overlay information */ pushVsOverlay: 'push' | 'overlay'; + /** + * Default widths for the flyout + */ + defaultWidths: DefaultWidthsState; + /** + * User resized widths for the flyout + */ + userFlyoutWidths: UserFlyoutWidthsState; + /** + * User resized left and right section widths for the flyout + */ + userSectionWidths: UserSectionWidthsState; } export const initialUiState: UiState = { pushVsOverlay: 'overlay', + defaultWidths: {} as DefaultWidthsState, + userFlyoutWidths: {}, + userSectionWidths: {} as UserSectionWidthsState, }; export interface State { diff --git a/packages/kbn-expandable-flyout/src/test/provider.tsx b/packages/kbn-expandable-flyout/src/test/provider.tsx index 0dc2656e15c7e..81de83720afd7 100644 --- a/packages/kbn-expandable-flyout/src/test/provider.tsx +++ b/packages/kbn-expandable-flyout/src/test/provider.tsx @@ -11,7 +11,11 @@ import { Provider as ReduxProvider } from 'react-redux'; import { configureStore } from '@reduxjs/toolkit'; import React, { FC, PropsWithChildren } from 'react'; import { I18nProvider } from '@kbn/i18n-react'; -import { savePushVsOverlayToLocalStorageMiddleware } from '../store/middlewares'; +import { + savePushVsOverlayToLocalStorageMiddleware, + saveUserSectionWidthsToLocalStorageMiddleware, + saveUserFlyoutWidthsToLocalStorageMiddleware, +} from '../store/middlewares'; import { ExpandableFlyoutContextProvider } from '../context'; import { panelsReducer, uiReducer } from '../store/reducers'; import { Context } from '../store/redux'; @@ -34,7 +38,11 @@ export const TestProvider: FC> = ({ }, devTools: false, preloadedState: state, - middleware: [savePushVsOverlayToLocalStorageMiddleware], + middleware: [ + savePushVsOverlayToLocalStorageMiddleware, + saveUserSectionWidthsToLocalStorageMiddleware, + saveUserFlyoutWidthsToLocalStorageMiddleware, + ], }); return ( diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index a7d94a423d606..116a087af89f6 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -14,14 +14,14 @@ pageLoadAssetSize: cloudChat: 19894 cloudDataMigration: 19170 cloudDefend: 18697 - cloudExperiments: 59358 + cloudExperiments: 109746 cloudFullStory: 18493 cloudLinks: 55984 cloudSecurityPosture: 19109 console: 46091 contentManagement: 16254 controls: 60000 - core: 435325 + core: 564663 crossClusterReplication: 65408 customIntegrations: 22034 dashboard: 52967 @@ -159,7 +159,7 @@ pageLoadAssetSize: spaces: 57868 stackAlerts: 58316 stackConnectors: 67227 - synthetics: 40958 + synthetics: 55971 telemetry: 51957 telemetryManagementSection: 38586 threatIntelligence: 44299 diff --git a/packages/kbn-screenshotting-server/src/paths.ts b/packages/kbn-screenshotting-server/src/paths.ts index f125ba1b74860..9e8200c0839ab 100644 --- a/packages/kbn-screenshotting-server/src/paths.ts +++ b/packages/kbn-screenshotting-server/src/paths.ts @@ -46,10 +46,10 @@ export class ChromiumArchivePaths { platform: 'darwin', architecture: 'x64', archiveFilename: 'chrome-mac.zip', - archiveChecksum: 'fa8004f3c8c5574c089c901e48429d1b01720bf3dd25e05ac56c41d0ab470c10', - binaryChecksum: '56f25cb6881e5c2b1aac0d8e87630517d1af8effdc9319d35f872add048df1ca', + archiveChecksum: '0a3d18efd00b3406f66139a673616b4b2b4b00323776678cb82295996f5a6733', + binaryChecksum: '8bcdaa973ee11110f6b70eaac2418fda3bb64446cf37f964fce331cdc8907a20', binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium', - revision: 1300317, // 1300313 is not available for Mac_x64 + revision: 1331485, // 1331488 is not available for Mac_x64 location: 'common', archivePath: 'Mac', isPreInstalled: false, @@ -58,10 +58,10 @@ export class ChromiumArchivePaths { platform: 'darwin', architecture: 'arm64', archiveFilename: 'chrome-mac.zip', - archiveChecksum: 'bea49fd3ccd6aaccd7cdc4df38306f002a2934aaa2c044f3b5a3272b31ec77ca', - binaryChecksum: '4c55d9e47deb1179c377c9785afdcdb5f3d3f351bff62b414d43e32ff195bd55', + archiveChecksum: '426eddf16acb88b9446a91de53cc4364c7d487414248f33e30f68cf488cea0c0', + binaryChecksum: '827931739bfdd2b6790a81d5ade8886c159cd051581d79b84d1ede447293e9cf', binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium', - revision: 1300314, // 1300313 is not available for Mac_Arm + revision: 1331488, location: 'common', archivePath: 'Mac_Arm', isPreInstalled: false, @@ -69,22 +69,22 @@ export class ChromiumArchivePaths { { platform: 'linux', architecture: 'x64', - archiveFilename: 'chromium-5b5d829-locales-linux_x64.zip', - archiveChecksum: '799e8fd5f47ea70b8a3972d39b2617c9cbebc7fc433a89251dae312a7c77534b', - binaryChecksum: '216b8f7ff9b41e985397342c2df54e4f8e07a01a3b8a929f39b9a10931d26ff5', + archiveFilename: 'chromium-fe621c5-locales-linux_x64.zip', + archiveChecksum: '12ce2e0eac184072dfcbc7a267328e3eb7fbe10a682997f4111c0378f2397341', + binaryChecksum: '670481cfa8db209401106cd23051009d390c03608724d0822a12c8c0a92b4c25', binaryRelativePath: 'headless_shell-linux_x64/headless_shell', - revision: 1300313, + revision: 1331488, location: 'custom', isPreInstalled: true, }, { platform: 'linux', architecture: 'arm64', - archiveFilename: 'chromium-5b5d829-locales-linux_arm64.zip', - archiveChecksum: '961e20c45c61f8e948efdc4128bb17c23217bbcb28537f270ccf5bf0826981e7', - binaryChecksum: 'fc4027fb6b1c96bef9374d5d9f791097fae2ec2ddc4e0134167075bd52d1458f', + archiveFilename: 'chromium-fe621c5-locales-linux_arm64.zip', + archiveChecksum: 'f7333eaff5235046c8775f0c1a0b7395b7ebc2e054ea638710cf511c4b6f9daf', + binaryChecksum: '8a3a3371b3d04f4b0880b137a3611c223e0d8e65a218943cb7be1ec4a91f5e35', binaryRelativePath: 'headless_shell-linux_arm64/headless_shell', - revision: 1300313, + revision: 1331488, location: 'custom', isPreInstalled: true, }, @@ -92,10 +92,10 @@ export class ChromiumArchivePaths { platform: 'win32', architecture: 'x64', archiveFilename: 'chrome-win.zip', - archiveChecksum: '27a2ed1473cefc6f48ff5665faa1fbcc69ef5be47ee21777a60e87c8379fdd93', - binaryChecksum: 'd603401a5e6f8bd734b329876e4221a4d24a1999f14df6e32eeb5e6a72520d96', + archiveChecksum: 'fa62be702f55f37e455bab4291c59ceb40e81e1922d30cf9453a4ee176b909bc', + binaryChecksum: '1345e66583bad1a1f16885f381d1173de8bf931487da9ba155e1b58bf23b2c66', binaryRelativePath: path.join('chrome-win', 'chrome.exe'), - revision: 1300320, // 1300313 is not available for win32 + revision: 1331487, // 1331488 is not available for win32 location: 'common', archivePath: 'Win', isPreInstalled: true, diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml index 463009b233af1..5925d0bd923c0 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml @@ -8,7 +8,11 @@ paths: x-labels: [serverless, ess] operationId: CreateExceptionList x-codegen-enabled: true - summary: Creates an exception list + summary: Create an exception list + description: | + An exception list groups exception items and can be associated with detection rules. You can assign detection rules with multiple exception lists. + > info + > All exception items added to the same list are evaluated using `OR` logic. That is, if any of the items in a list evaluate to `true`, the exception prevents the rule from generating an alert. Likewise, `OR` logic is used for evaluating exceptions when more than one exception list is assigned to a rule. To use the `AND` operator, you can define multiple clauses (`entries`) in a single exception item. requestBody: description: Exception list's properties required: true diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml index f7eb416f953a6..47fa2895d27c6 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml @@ -8,7 +8,11 @@ paths: x-labels: [serverless, ess] operationId: CreateExceptionListItem x-codegen-enabled: true - summary: Creates an exception list item + summary: Create an exception list item + description: | + Create an exception item and associate it with the specified exception list. + > info + > Before creating exception items, you must create an exception list. requestBody: description: Exception list item's properties required: true diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml index 0928d9e7f4e21..6162d00d78ae8 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: CreateRuleExceptionListItems x-codegen-enabled: true - summary: Creates rule exception list items + summary: Create rule exception list items + description: Create exception items that apply to a single detection rule. parameters: - name: id in: path diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml index e76ec4c50c5c8..c4cee089e5836 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml @@ -8,7 +8,11 @@ paths: x-labels: [serverless, ess] operationId: CreateSharedExceptionList x-codegen-enabled: true - summary: Creates a shared exception list + summary: Create a shared exception list + description: | + An exception list groups exception items and can be associated with detection rules. A shared exception list can apply to multiple detection rules. + > info + > All exception items added to the same list are evaluated using `OR` logic. That is, if any of the items in a list evaluate to `true`, the exception prevents the rule from generating an alert. Likewise, `OR` logic is used for evaluating exceptions when more than one exception list is assigned to a rule. To use the `AND` operator, you can define multiple clauses (`entries`) in a single exception item. requestBody: required: true content: diff --git a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml index ccc0749dd206e..92afc3232efee 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: DeleteExceptionList x-codegen-enabled: true - summary: Deletes an exception list + summary: Delete an exception list + description: Delete an exception list using the `id` or `list_id` field. parameters: - name: id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml index e9d7fa0687044..9f57afcd5ab1c 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: DeleteExceptionListItem x-codegen-enabled: true - summary: Deletes an exception list item + summary: Delete an exception list item + description: Delete an exception list item using the `id` or `item_id` field. parameters: - name: id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml index f041fcb1d1062..758171327ee4c 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: DuplicateExceptionList x-codegen-enabled: true - summary: Duplicates an exception list + summary: Duplicate an exception list + description: Duplicate an existing exception list. parameters: - name: list_id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml index 41637963d9923..3232f46c238c8 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml @@ -8,8 +8,8 @@ paths: x-labels: [serverless, ess] operationId: ExportExceptionList x-codegen-enabled: true - summary: Exports an exception list - description: Exports an exception list and its associated items to an .ndjson file + summary: Export an exception list + description: Export an exception list and its associated items to an NDJSON file. parameters: - name: id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_items/find_exception_list_items.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_items/find_exception_list_items.schema.yaml index f2b3aafdee107..e40f780af03ef 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_items/find_exception_list_items.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_items/find_exception_list_items.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: FindExceptionListItems x-codegen-enabled: true - summary: Finds exception list items + summary: Get exception list items + description: Get a list of all exception list items in the specified list. parameters: - name: list_id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/find_exception_lists/find_exception_lists.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/find_exception_lists/find_exception_lists.schema.yaml index a1df1d12a27ea..c46dacbab01d0 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/find_exception_lists/find_exception_lists.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/find_exception_lists/find_exception_lists.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: FindExceptionLists x-codegen-enabled: true - summary: Finds exception lists + summary: Get exception lists + description: Get a list of all exception lists. parameters: - name: filter in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml index dc67d1386475f..8ae3ac1aa2c0c 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml @@ -8,8 +8,8 @@ paths: x-labels: [serverless, ess] operationId: ImportExceptionList x-codegen-enabled: true - summary: Imports an exception list - description: Imports an exception list and associated items + summary: Import an exception list + description: Import an exception list and its associated items from an NDJSON file. requestBody: required: true content: diff --git a/packages/kbn-securitysolution-exceptions-common/api/quickstart_client.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/quickstart_client.gen.ts index 52e11f1ea4033..4827baab85e90 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/quickstart_client.gen.ts +++ b/packages/kbn-securitysolution-exceptions-common/api/quickstart_client.gen.ts @@ -98,6 +98,12 @@ export class Client { this.kbnClient = options.kbnClient; this.log = options.log; } + /** + * An exception list groups exception items and can be associated with detection rules. You can assign detection rules with multiple exception lists. +> info +> All exception items added to the same list are evaluated using `OR` logic. That is, if any of the items in a list evaluate to `true`, the exception prevents the rule from generating an alert. Likewise, `OR` logic is used for evaluating exceptions when more than one exception list is assigned to a rule. To use the `AND` operator, you can define multiple clauses (`entries`) in a single exception item. + + */ async createExceptionList(props: CreateExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API CreateExceptionList`); return this.kbnClient @@ -111,6 +117,12 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Create an exception item and associate it with the specified exception list. +> info +> Before creating exception items, you must create an exception list. + + */ async createExceptionListItem(props: CreateExceptionListItemProps) { this.log.info(`${new Date().toISOString()} Calling API CreateExceptionListItem`); return this.kbnClient @@ -124,6 +136,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Create exception items that apply to a single detection rule. + */ async createRuleExceptionListItems(props: CreateRuleExceptionListItemsProps) { this.log.info(`${new Date().toISOString()} Calling API CreateRuleExceptionListItems`); return this.kbnClient @@ -137,6 +152,12 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * An exception list groups exception items and can be associated with detection rules. A shared exception list can apply to multiple detection rules. +> info +> All exception items added to the same list are evaluated using `OR` logic. That is, if any of the items in a list evaluate to `true`, the exception prevents the rule from generating an alert. Likewise, `OR` logic is used for evaluating exceptions when more than one exception list is assigned to a rule. To use the `AND` operator, you can define multiple clauses (`entries`) in a single exception item. + + */ async createSharedExceptionList(props: CreateSharedExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API CreateSharedExceptionList`); return this.kbnClient @@ -150,6 +171,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Delete an exception list using the `id` or `list_id` field. + */ async deleteExceptionList(props: DeleteExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API DeleteExceptionList`); return this.kbnClient @@ -164,6 +188,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Delete an exception list item using the `id` or `item_id` field. + */ async deleteExceptionListItem(props: DeleteExceptionListItemProps) { this.log.info(`${new Date().toISOString()} Calling API DeleteExceptionListItem`); return this.kbnClient @@ -178,6 +205,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Duplicate an existing exception list. + */ async duplicateExceptionList(props: DuplicateExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API DuplicateExceptionList`); return this.kbnClient @@ -193,7 +223,7 @@ export class Client { .catch(catchAxiosErrorFormatAndThrow); } /** - * Exports an exception list and its associated items to an .ndjson file + * Export an exception list and its associated items to an NDJSON file. */ async exportExceptionList(props: ExportExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API ExportExceptionList`); @@ -209,6 +239,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get a list of all exception list items in the specified list. + */ async findExceptionListItems(props: FindExceptionListItemsProps) { this.log.info(`${new Date().toISOString()} Calling API FindExceptionListItems`); return this.kbnClient @@ -223,6 +256,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get a list of all exception lists. + */ async findExceptionLists(props: FindExceptionListsProps) { this.log.info(`${new Date().toISOString()} Calling API FindExceptionLists`); return this.kbnClient @@ -238,7 +274,7 @@ export class Client { .catch(catchAxiosErrorFormatAndThrow); } /** - * Imports an exception list and associated items + * Import an exception list and its associated items from an NDJSON file. */ async importExceptionList(props: ImportExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API ImportExceptionList`); @@ -254,6 +290,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get the details of an exception list using the `id` or `list_id` field. + */ async readExceptionList(props: ReadExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API ReadExceptionList`); return this.kbnClient @@ -268,6 +307,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get the details of an exception list item using the `id` or `item_id` field. + */ async readExceptionListItem(props: ReadExceptionListItemProps) { this.log.info(`${new Date().toISOString()} Calling API ReadExceptionListItem`); return this.kbnClient @@ -282,6 +324,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get a summary of the specified exception list. + */ async readExceptionListSummary(props: ReadExceptionListSummaryProps) { this.log.info(`${new Date().toISOString()} Calling API ReadExceptionListSummary`); return this.kbnClient @@ -296,6 +341,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Update an exception list using the `id` or `list_id` field. + */ async updateExceptionList(props: UpdateExceptionListProps) { this.log.info(`${new Date().toISOString()} Calling API UpdateExceptionList`); return this.kbnClient @@ -309,6 +357,9 @@ export class Client { }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Update an exception list item using the `id` or `item_id` field. + */ async updateExceptionListItem(props: UpdateExceptionListItemProps) { this.log.info(`${new Date().toISOString()} Calling API UpdateExceptionListItem`); return this.kbnClient diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml index 69f5b4a9a8aa2..0bf082c1713bd 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: ReadExceptionList x-codegen-enabled: true - summary: Retrieves an exception list using its `id` or `list_id` field + summary: Get exception list details + description: Get the details of an exception list using the `id` or `list_id` field. parameters: - name: id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml index 9cc6b79b91e63..c271016a87eb5 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: ReadExceptionListItem x-codegen-enabled: true - summary: Gets an exception list item + summary: Get an exception list item + description: Get the details of an exception list item using the `id` or `item_id` field. parameters: - name: id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_summary/read_exception_list_summary.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_summary/read_exception_list_summary.schema.yaml index bae534bf3260b..b0627111e877f 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_summary/read_exception_list_summary.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_summary/read_exception_list_summary.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: ReadExceptionListSummary x-codegen-enabled: true - summary: Retrieves an exception list summary + summary: Get an exception list summary + description: Get a summary of the specified exception list. parameters: - name: id in: query diff --git a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml index a58caeb465428..5e8f3dfd8b509 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: UpdateExceptionList x-codegen-enabled: true - summary: Updates an exception list + summary: Update an exception list + description: Update an exception list using the `id` or `list_id` field. requestBody: description: Exception list's properties required: true diff --git a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml index 180d4865f887b..2b8182aeb5c34 100644 --- a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml @@ -8,7 +8,8 @@ paths: x-labels: [serverless, ess] operationId: UpdateExceptionListItem x-codegen-enabled: true - summary: Updates an exception list item + summary: Update an exception list item + description: Update an exception list item using the `id` or `item_id` field. requestBody: description: Exception list item's properties required: true diff --git a/packages/kbn-securitysolution-exceptions-common/docs/openapi/ess/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml b/packages/kbn-securitysolution-exceptions-common/docs/openapi/ess/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml index 8acc028520f11..bf0c2502ae80f 100644 --- a/packages/kbn-securitysolution-exceptions-common/docs/openapi/ess/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/docs/openapi/ess/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml @@ -16,6 +16,7 @@ servers: paths: '/api/detection_engine/rules/{id}/exceptions': post: + description: Create exception items that apply to a single detection rule. operationId: CreateRuleExceptionListItems parameters: - description: Detection rule's identifier @@ -73,11 +74,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates rule exception list items + summary: Create rule exception list items tags: - Security Solution Exceptions API /api/exception_lists: delete: + description: Delete an exception list using the `id` or `list_id` field. operationId: DeleteExceptionList parameters: - description: Either `id` or `list_id` must be specified @@ -137,10 +139,11 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Deletes an exception list + summary: Delete an exception list tags: - Security Solution Exceptions API get: + description: Get the details of an exception list using the `id` or `list_id` field. operationId: ReadExceptionList parameters: - description: Either `id` or `list_id` must be specified @@ -200,10 +203,23 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Retrieves an exception list using its `id` or `list_id` field + summary: Get exception list details tags: - Security Solution Exceptions API post: + description: > + An exception list groups exception items and can be associated with + detection rules. You can assign detection rules with multiple exception + lists. + + > info + + > All exception items added to the same list are evaluated using `OR` + logic. That is, if any of the items in a list evaluate to `true`, the + exception prevents the rule from generating an alert. Likewise, `OR` + logic is used for evaluating exceptions when more than one exception + list is assigned to a rule. To use the `AND` operator, you can define + multiple clauses (`entries`) in a single exception item. operationId: CreateExceptionList requestBody: content: @@ -277,10 +293,11 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates an exception list + summary: Create an exception list tags: - Security Solution Exceptions API put: + description: Update an exception list using the `id` or `list_id` field. operationId: UpdateExceptionList requestBody: content: @@ -357,11 +374,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Updates an exception list + summary: Update an exception list tags: - Security Solution Exceptions API /api/exception_lists/_duplicate: post: + description: Duplicate an existing exception list. operationId: DuplicateExceptionList parameters: - description: Exception list's human identifier @@ -426,12 +444,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Duplicates an exception list + summary: Duplicate an exception list tags: - Security Solution Exceptions API /api/exception_lists/_export: post: - description: Exports an exception list and its associated items to an .ndjson file + description: Export an exception list and its associated items to an NDJSON file. operationId: ExportExceptionList parameters: - description: Exception list's identifier @@ -506,11 +524,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Exports an exception list + summary: Export an exception list tags: - Security Solution Exceptions API /api/exception_lists/_find: get: + description: Get a list of all exception lists. operationId: FindExceptionLists parameters: - description: > @@ -626,12 +645,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Finds exception lists + summary: Get exception lists tags: - Security Solution Exceptions API /api/exception_lists/_import: post: - description: Imports an exception list and associated items + description: Import an exception list and its associated items from an NDJSON file. operationId: ImportExceptionList parameters: - description: > @@ -742,11 +761,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Imports an exception list + summary: Import an exception list tags: - Security Solution Exceptions API /api/exception_lists/items: delete: + description: Delete an exception list item using the `id` or `item_id` field. operationId: DeleteExceptionListItem parameters: - description: Either `id` or `item_id` must be specified @@ -806,10 +826,13 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Deletes an exception list item + summary: Delete an exception list item tags: - Security Solution Exceptions API get: + description: >- + Get the details of an exception list item using the `id` or `item_id` + field. operationId: ReadExceptionListItem parameters: - description: Either `id` or `item_id` must be specified @@ -869,10 +892,17 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Gets an exception list item + summary: Get an exception list item tags: - Security Solution Exceptions API post: + description: > + Create an exception item and associate it with the specified exception + list. + + > info + + > Before creating exception items, you must create an exception list. operationId: CreateExceptionListItem requestBody: content: @@ -956,10 +986,11 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates an exception list item + summary: Create an exception list item tags: - Security Solution Exceptions API put: + description: Update an exception list item using the `id` or `item_id` field. operationId: UpdateExceptionListItem requestBody: content: @@ -1047,11 +1078,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Updates an exception list item + summary: Update an exception list item tags: - Security Solution Exceptions API /api/exception_lists/items/_find: get: + description: Get a list of all exception list items in the specified list. operationId: FindExceptionListItems parameters: - description: List's id @@ -1183,11 +1215,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Finds exception list items + summary: Get exception list items tags: - Security Solution Exceptions API /api/exception_lists/summary: get: + description: Get a summary of the specified exception list. operationId: ReadExceptionListSummary parameters: - description: Exception list's identifier generated upon creation @@ -1266,11 +1299,24 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Retrieves an exception list summary + summary: Get an exception list summary tags: - Security Solution Exceptions API /api/exceptions/shared: post: + description: > + An exception list groups exception items and can be associated with + detection rules. A shared exception list can apply to multiple detection + rules. + + > info + + > All exception items added to the same list are evaluated using `OR` + logic. That is, if any of the items in a list evaluate to `true`, the + exception prevents the rule from generating an alert. Likewise, `OR` + logic is used for evaluating exceptions when more than one exception + list is assigned to a rule. To use the `AND` operator, you can define + multiple clauses (`entries`) in a single exception item. operationId: CreateSharedExceptionList requestBody: content: @@ -1325,7 +1371,7 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates a shared exception list + summary: Create a shared exception list tags: - Security Solution Exceptions API components: diff --git a/packages/kbn-securitysolution-exceptions-common/docs/openapi/serverless/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml b/packages/kbn-securitysolution-exceptions-common/docs/openapi/serverless/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml index cd104baacda20..2a9bb3996a915 100644 --- a/packages/kbn-securitysolution-exceptions-common/docs/openapi/serverless/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml +++ b/packages/kbn-securitysolution-exceptions-common/docs/openapi/serverless/security_solution_exceptions_api_2023_10_31.bundled.schema.yaml @@ -16,6 +16,7 @@ servers: paths: '/api/detection_engine/rules/{id}/exceptions': post: + description: Create exception items that apply to a single detection rule. operationId: CreateRuleExceptionListItems parameters: - description: Detection rule's identifier @@ -73,11 +74,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates rule exception list items + summary: Create rule exception list items tags: - Security Solution Exceptions API /api/exception_lists: delete: + description: Delete an exception list using the `id` or `list_id` field. operationId: DeleteExceptionList parameters: - description: Either `id` or `list_id` must be specified @@ -137,10 +139,11 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Deletes an exception list + summary: Delete an exception list tags: - Security Solution Exceptions API get: + description: Get the details of an exception list using the `id` or `list_id` field. operationId: ReadExceptionList parameters: - description: Either `id` or `list_id` must be specified @@ -200,10 +203,23 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Retrieves an exception list using its `id` or `list_id` field + summary: Get exception list details tags: - Security Solution Exceptions API post: + description: > + An exception list groups exception items and can be associated with + detection rules. You can assign detection rules with multiple exception + lists. + + > info + + > All exception items added to the same list are evaluated using `OR` + logic. That is, if any of the items in a list evaluate to `true`, the + exception prevents the rule from generating an alert. Likewise, `OR` + logic is used for evaluating exceptions when more than one exception + list is assigned to a rule. To use the `AND` operator, you can define + multiple clauses (`entries`) in a single exception item. operationId: CreateExceptionList requestBody: content: @@ -277,10 +293,11 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates an exception list + summary: Create an exception list tags: - Security Solution Exceptions API put: + description: Update an exception list using the `id` or `list_id` field. operationId: UpdateExceptionList requestBody: content: @@ -357,11 +374,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Updates an exception list + summary: Update an exception list tags: - Security Solution Exceptions API /api/exception_lists/_duplicate: post: + description: Duplicate an existing exception list. operationId: DuplicateExceptionList parameters: - description: Exception list's human identifier @@ -426,12 +444,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Duplicates an exception list + summary: Duplicate an exception list tags: - Security Solution Exceptions API /api/exception_lists/_export: post: - description: Exports an exception list and its associated items to an .ndjson file + description: Export an exception list and its associated items to an NDJSON file. operationId: ExportExceptionList parameters: - description: Exception list's identifier @@ -506,11 +524,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Exports an exception list + summary: Export an exception list tags: - Security Solution Exceptions API /api/exception_lists/_find: get: + description: Get a list of all exception lists. operationId: FindExceptionLists parameters: - description: > @@ -626,12 +645,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Finds exception lists + summary: Get exception lists tags: - Security Solution Exceptions API /api/exception_lists/_import: post: - description: Imports an exception list and associated items + description: Import an exception list and its associated items from an NDJSON file. operationId: ImportExceptionList parameters: - description: > @@ -742,11 +761,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Imports an exception list + summary: Import an exception list tags: - Security Solution Exceptions API /api/exception_lists/items: delete: + description: Delete an exception list item using the `id` or `item_id` field. operationId: DeleteExceptionListItem parameters: - description: Either `id` or `item_id` must be specified @@ -806,10 +826,13 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Deletes an exception list item + summary: Delete an exception list item tags: - Security Solution Exceptions API get: + description: >- + Get the details of an exception list item using the `id` or `item_id` + field. operationId: ReadExceptionListItem parameters: - description: Either `id` or `item_id` must be specified @@ -869,10 +892,17 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Gets an exception list item + summary: Get an exception list item tags: - Security Solution Exceptions API post: + description: > + Create an exception item and associate it with the specified exception + list. + + > info + + > Before creating exception items, you must create an exception list. operationId: CreateExceptionListItem requestBody: content: @@ -956,10 +986,11 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates an exception list item + summary: Create an exception list item tags: - Security Solution Exceptions API put: + description: Update an exception list item using the `id` or `item_id` field. operationId: UpdateExceptionListItem requestBody: content: @@ -1047,11 +1078,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Updates an exception list item + summary: Update an exception list item tags: - Security Solution Exceptions API /api/exception_lists/items/_find: get: + description: Get a list of all exception list items in the specified list. operationId: FindExceptionListItems parameters: - description: List's id @@ -1183,11 +1215,12 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Finds exception list items + summary: Get exception list items tags: - Security Solution Exceptions API /api/exception_lists/summary: get: + description: Get a summary of the specified exception list. operationId: ReadExceptionListSummary parameters: - description: Exception list's identifier generated upon creation @@ -1266,11 +1299,24 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Retrieves an exception list summary + summary: Get an exception list summary tags: - Security Solution Exceptions API /api/exceptions/shared: post: + description: > + An exception list groups exception items and can be associated with + detection rules. A shared exception list can apply to multiple detection + rules. + + > info + + > All exception items added to the same list are evaluated using `OR` + logic. That is, if any of the items in a list evaluate to `true`, the + exception prevents the rule from generating an alert. Likewise, `OR` + logic is used for evaluating exceptions when more than one exception + list is assigned to a rule. To use the `AND` operator, you can define + multiple clauses (`entries`) in a single exception item. operationId: CreateSharedExceptionList requestBody: content: @@ -1325,7 +1371,7 @@ paths: schema: $ref: '#/components/schemas/SiemErrorResponse' description: Internal server error response - summary: Creates a shared exception list + summary: Create a shared exception list tags: - Security Solution Exceptions API components: diff --git a/packages/shared-ux/chrome/navigation/src/services.tsx b/packages/shared-ux/chrome/navigation/src/services.tsx index fec11110f8b6a..1b0102533e53e 100644 --- a/packages/shared-ux/chrome/navigation/src/services.tsx +++ b/packages/shared-ux/chrome/navigation/src/services.tsx @@ -36,7 +36,7 @@ export const NavigationKibanaProvider: FC ({ diff --git a/packages/shared-ux/chrome/navigation/src/types.ts b/packages/shared-ux/chrome/navigation/src/types.ts index c7f882c3580a6..9db808e37799a 100644 --- a/packages/shared-ux/chrome/navigation/src/types.ts +++ b/packages/shared-ux/chrome/navigation/src/types.ts @@ -53,7 +53,9 @@ export interface NavigationKibanaDependencies { navLinks: { getNavLinks$: () => Observable>; }; - getIsSideNavCollapsed$: () => Observable; + sideNav: { + getIsCollapsed$: () => Observable; + }; }; http: { basePath: BasePathService; diff --git a/renovate.json b/renovate.json index d013a49ea37bd..eeb91efd871bf 100644 --- a/renovate.json +++ b/renovate.json @@ -78,7 +78,22 @@ }, { "groupName": "LaunchDarkly", - "matchDepNames": ["launchdarkly-js-client-sdk", "@launchdarkly/node-server-sdk", "launchdarkly/find-code-references"], + "matchDepNames": [ + "launchdarkly-js-client-sdk", + "@openfeature/launchdarkly-client-provider", + "@launchdarkly/node-server-sdk", + "@launchdarkly/openfeature-node-server", + "launchdarkly/find-code-references" + ], + "reviewers": ["team:kibana-security", "team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Security", "Team:Core", "backport:prev-minor"], + "minimumReleaseAge": "7 days", + "enabled": true + }, + { + "groupName": "OpenFeature", + "matchDepNames": ["@openfeature/core", "@openfeature/server-sdk", "@openfeature/web-sdk"], "reviewers": ["team:kibana-security", "team:kibana-core"], "matchBaseBranches": ["main"], "labels": ["release_note:skip", "Team:Security", "Team:Core", "backport:prev-minor"], diff --git a/src/core/public/index.ts b/src/core/public/index.ts index 91320b8ade383..ecce03d0b5092 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -37,6 +37,11 @@ export type { FatalErrorsStart, FatalErrorInfo, } from '@kbn/core-fatal-errors-browser'; +export type { + EvaluationContext, + FeatureFlagsSetup, + FeatureFlagsStart, +} from '@kbn/core-feature-flags-browser'; export type { UiSettingsState, IUiSettingsClient, diff --git a/src/core/public/mocks.ts b/src/core/public/mocks.ts index dcd30a738d3d1..61b9f7759c50f 100644 --- a/src/core/public/mocks.ts +++ b/src/core/public/mocks.ts @@ -21,6 +21,7 @@ export { themeServiceMock } from '@kbn/core-theme-browser-mocks'; export { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; export { chromeServiceMock } from '@kbn/core-chrome-browser-mocks'; export { executionContextServiceMock } from '@kbn/core-execution-context-browser-mocks'; +export { coreFeatureFlagsMock } from '@kbn/core-feature-flags-browser-mocks'; export { fatalErrorsServiceMock } from '@kbn/core-fatal-errors-browser-mocks'; export { httpServiceMock } from '@kbn/core-http-browser-mocks'; export { i18nServiceMock } from '@kbn/core-i18n-browser-mocks'; diff --git a/src/core/server/index.ts b/src/core/server/index.ts index e684c9565d9ed..5282f2048dd06 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -71,6 +71,11 @@ export type { export type { KibanaExecutionContext } from '@kbn/core-execution-context-common'; export type { IExecutionContextContainer } from '@kbn/core-execution-context-server'; +export type { + EvaluationContext, + FeatureFlagsStart, + FeatureFlagsSetup, +} from '@kbn/core-feature-flags-server'; export type { Capabilities } from '@kbn/core-capabilities-common'; export type { CapabilitiesProvider, diff --git a/src/core/server/integration_tests/config/check_dynamic_config.test.ts b/src/core/server/integration_tests/config/check_dynamic_config.test.ts index 8cb9ac2466b62..eaffd56ed1b16 100644 --- a/src/core/server/integration_tests/config/check_dynamic_config.test.ts +++ b/src/core/server/integration_tests/config/check_dynamic_config.test.ts @@ -129,6 +129,8 @@ describe('checking all opted-in dynamic config settings', () => { */ test('detecting all the settings that have opted-in for dynamic in-memory updates', () => { expect(getListOfDynamicConfigPaths()).toStrictEqual([ + // Making testing easier by having the ability of overriding the feature flags without the need to restart + 'feature_flags.overrides', // We need this for enriching our Perf tests with more valuable data regarding the steps of the test // Also helpful in Cloud & Serverless testing because we can't control the labels in those offerings 'telemetry.labels', diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 0356d5e483103..0467b9c660db6 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -23,6 +23,7 @@ import { coreLifecycleMock, coreInternalLifecycleMock } from '@kbn/core-lifecycl import { securityServiceMock } from '@kbn/core-security-server-mocks'; import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; import type { SharedGlobalConfig, PluginInitializerContext } from '@kbn/core-plugins-server'; +import { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; export { configServiceMock, configDeprecationsMock } from '@kbn/config-mocks'; export { loggingSystemMock } from '@kbn/core-logging-server-mocks'; @@ -46,6 +47,7 @@ export { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks'; export { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; export { i18nServiceMock } from '@kbn/core-i18n-server-mocks'; export { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks'; +export { coreFeatureFlagsMock } from '@kbn/core-feature-flags-server-mocks'; export { docLinksServiceMock } from '@kbn/core-doc-links-server-mocks'; export { analyticsServiceMock } from '@kbn/core-analytics-server-mocks'; export { securityServiceMock } from '@kbn/core-security-server-mocks'; @@ -120,6 +122,7 @@ function pluginInitializerContextMock(config: T = {} as T) { function createCoreRequestHandlerContextMock() { return { + featureFlags: coreFeatureFlagsMock.createRequestHandlerContext(), savedObjects: { client: savedObjectsClientMock.create(), typeRegistry: savedObjectsTypeRegistryMock.create(), diff --git a/src/core/tsconfig.json b/src/core/tsconfig.json index 870d648d4b2e1..92647e56fad82 100644 --- a/src/core/tsconfig.json +++ b/src/core/tsconfig.json @@ -169,6 +169,10 @@ "@kbn/core-user-profile-browser", "@kbn/core-metrics-server-internal", "@kbn/zod", + "@kbn/core-feature-flags-browser", + "@kbn/core-feature-flags-browser-mocks", + "@kbn/core-feature-flags-server", + "@kbn/core-feature-flags-server-mocks", ], "exclude": [ "target/**/*", diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index 79239a1af7668..3dfdb01a88a9c 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -51,7 +51,7 @@ export async function runDockerGenerator( */ if (flags.baseImage === 'wolfi') baseImageName = - 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:d4def25f2fd3b0ff9bc68091cd1d89524e41b7d3fc0d3b3a665720eb92145f3b'; + 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:6fbf07849a440c8dca9aa7e9cb56ed3ecaa9eb40f8a4f36b39393d7b32d78ecc'; let imageFlavor = ''; if (flags.baseImage === 'ubi') imageFlavor += `-ubi`; diff --git a/src/plugins/home/kibana.jsonc b/src/plugins/home/kibana.jsonc index 33cb5c98e89db..8c0a7884ce8ee 100644 --- a/src/plugins/home/kibana.jsonc +++ b/src/plugins/home/kibana.jsonc @@ -12,8 +12,7 @@ "usageCollection", "customIntegrations", "cloud", - "guidedOnboarding", - "cloudExperiments" + "guidedOnboarding" ] } } diff --git a/test/functional/apps/dashboard/group1/url_field_formatter.ts b/test/functional/apps/dashboard/group1/url_field_formatter.ts index 50edce184a04d..f0282eff4ea13 100644 --- a/test/functional/apps/dashboard/group1/url_field_formatter.ts +++ b/test/functional/apps/dashboard/group1/url_field_formatter.ts @@ -37,7 +37,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(currentUrl).to.equal(fieldUrl); }; - describe('Changing field formatter to Url', () => { + // Fails in chrome 129+: https://github.com/elastic/kibana-operations/issues/199 + describe.skip('Changing field formatter to Url', () => { before(async function () { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader', 'animals']); await kibanaServer.savedObjects.cleanStandardList(); diff --git a/test/functional/apps/dashboard/group5/embed_mode.ts b/test/functional/apps/dashboard/group5/embed_mode.ts index 5bba11d3b574a..f2f64d76bce10 100644 --- a/test/functional/apps/dashboard/group5/embed_mode.ts +++ b/test/functional/apps/dashboard/group5/embed_mode.ts @@ -57,7 +57,7 @@ export default function ({ await browser.setWindowSize(1300, 900); }); - // Fails in with chrome 128+ https://github.com/elastic/kibana/issues/163207 + // Fails in chrome 128+ https://github.com/elastic/kibana-operations/issues/199 describe.skip('default URL params', () => { it('hides the chrome', async () => { const globalNavShown = await globalNav.exists(); @@ -92,7 +92,7 @@ export default function ({ }); }); - // Fails in with chrome 128+ https://github.com/elastic/kibana/issues/163207 + // Fails in chrome 128+ https://github.com/elastic/kibana-operations/issues/199 describe.skip('non-default URL params', () => { it('shows or hides elements based on URL params', async () => { const currentUrl = await browser.getCurrentUrl(); diff --git a/test/functional/apps/discover/group6/_time_field_column.ts b/test/functional/apps/discover/group6/_time_field_column.ts index f8279d532e6c4..7e058a71eac0b 100644 --- a/test/functional/apps/discover/group6/_time_field_column.ts +++ b/test/functional/apps/discover/group6/_time_field_column.ts @@ -308,7 +308,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - it('should render selected columns correctly', async () => { + // Fails in chrome 129+: https://github.com/elastic/kibana-operations/issues/199 + it.skip('should render selected columns correctly', async () => { await discover.selectTextBaseLang(); await checkSelectedColumns({ diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index b9d2f51cc8c16..f1922eee52380 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -235,8 +235,6 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.cloud.trial_end_date (string?)', 'xpack.cloud_integrations.chat.chatURL (string?)', 'xpack.cloud_integrations.chat.trialBuffer (number?)', - // No PII. This is an escape patch to override LaunchDarkly's flag resolution mechanism for testing or quick fix. - 'xpack.cloud_integrations.experiments.flag_overrides (record?)', // Commented because it's inside a schema conditional, and the test is not able to resolve it. But it's shared. // Added here for documentation purposes. // 'xpack.cloud_integrations.experiments.launch_darkly.client_id (string)', diff --git a/tsconfig.base.json b/tsconfig.base.json index ae8b6c2c2a95f..1dd8335471582 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -360,6 +360,18 @@ "@kbn/core-fatal-errors-browser-internal/*": ["packages/core/fatal-errors/core-fatal-errors-browser-internal/*"], "@kbn/core-fatal-errors-browser-mocks": ["packages/core/fatal-errors/core-fatal-errors-browser-mocks"], "@kbn/core-fatal-errors-browser-mocks/*": ["packages/core/fatal-errors/core-fatal-errors-browser-mocks/*"], + "@kbn/core-feature-flags-browser": ["packages/core/feature-flags/core-feature-flags-browser"], + "@kbn/core-feature-flags-browser/*": ["packages/core/feature-flags/core-feature-flags-browser/*"], + "@kbn/core-feature-flags-browser-internal": ["packages/core/feature-flags/core-feature-flags-browser-internal"], + "@kbn/core-feature-flags-browser-internal/*": ["packages/core/feature-flags/core-feature-flags-browser-internal/*"], + "@kbn/core-feature-flags-browser-mocks": ["packages/core/feature-flags/core-feature-flags-browser-mocks"], + "@kbn/core-feature-flags-browser-mocks/*": ["packages/core/feature-flags/core-feature-flags-browser-mocks/*"], + "@kbn/core-feature-flags-server": ["packages/core/feature-flags/core-feature-flags-server"], + "@kbn/core-feature-flags-server/*": ["packages/core/feature-flags/core-feature-flags-server/*"], + "@kbn/core-feature-flags-server-internal": ["packages/core/feature-flags/core-feature-flags-server-internal"], + "@kbn/core-feature-flags-server-internal/*": ["packages/core/feature-flags/core-feature-flags-server-internal/*"], + "@kbn/core-feature-flags-server-mocks": ["packages/core/feature-flags/core-feature-flags-server-mocks"], + "@kbn/core-feature-flags-server-mocks/*": ["packages/core/feature-flags/core-feature-flags-server-mocks/*"], "@kbn/core-history-block-plugin": ["test/plugin_functional/plugins/core_history_block"], "@kbn/core-history-block-plugin/*": ["test/plugin_functional/plugins/core_history_block/*"], "@kbn/core-http-browser": ["packages/core/http/core-http-browser"], @@ -900,6 +912,8 @@ "@kbn/failed-test-reporter-cli/*": ["packages/kbn-failed-test-reporter-cli/*"], "@kbn/feature-controls-examples-plugin": ["examples/feature_control_examples"], "@kbn/feature-controls-examples-plugin/*": ["examples/feature_control_examples/*"], + "@kbn/feature-flags-example-plugin": ["examples/feature_flags_example"], + "@kbn/feature-flags-example-plugin/*": ["examples/feature_flags_example/*"], "@kbn/feature-usage-test-plugin": ["x-pack/test/plugin_api_integration/plugins/feature_usage_test"], "@kbn/feature-usage-test-plugin/*": ["x-pack/test/plugin_api_integration/plugins/feature_usage_test/*"], "@kbn/features-plugin": ["x-pack/plugins/features"], diff --git a/x-pack/build_chromium/linux/args.gn b/x-pack/build_chromium/linux/args.gn index 01af3bf766f7b..a7d5713b92cd0 100644 --- a/x-pack/build_chromium/linux/args.gn +++ b/x-pack/build_chromium/linux/args.gn @@ -17,7 +17,7 @@ v8_symbol_level = 0 enable_ink = false rtc_build_examples = false angle_build_tests = false -enable_screen_ai_service = false +use_fake_screen_ai = true enable_vr = false # Please, consult @elastic/kibana-security before changing/removing this option. diff --git a/x-pack/packages/ml/anomaly_utils/types.ts b/x-pack/packages/ml/anomaly_utils/types.ts index 2d7082848b48f..457330fc4d7e0 100644 --- a/x-pack/packages/ml/anomaly_utils/types.ts +++ b/x-pack/packages/ml/anomaly_utils/types.ts @@ -343,7 +343,7 @@ export interface MlAnomaliesTableRecord { /** * Returns true if the job has the model plot enabled */ - modelPlotEnabled: boolean; + modelPlotEnabled?: boolean; } /** diff --git a/x-pack/packages/observability/observability_utils/es/client/create_observability_es_client.ts b/x-pack/packages/observability/observability_utils/es/client/create_observability_es_client.ts index 2e57653365b0b..0011e0f17c1c0 100644 --- a/x-pack/packages/observability/observability_utils/es/client/create_observability_es_client.ts +++ b/x-pack/packages/observability/observability_utils/es/client/create_observability_es_client.ts @@ -6,8 +6,9 @@ */ import type { ElasticsearchClient, Logger } from '@kbn/core/server'; -import type { ESSearchRequest, InferSearchResponseOf } from '@kbn/es-types'; +import type { ESQLSearchResponse, ESSearchRequest, InferSearchResponseOf } from '@kbn/es-types'; import { withSpan } from '@kbn/apm-utils'; +import type { EsqlQueryRequest } from '@elastic/elasticsearch/lib/api/types'; type SearchRequest = ESSearchRequest & { index: string | string[]; @@ -24,6 +25,7 @@ export interface ObservabilityElasticsearchClient { operationName: string, parameters: TSearchRequest ): Promise>; + esql(operationName: string, parameters: EsqlQueryRequest): Promise; client: ElasticsearchClient; } @@ -38,6 +40,26 @@ export function createObservabilityEsClient({ }): ObservabilityElasticsearchClient { return { client, + esql(operationName: string, parameters: EsqlQueryRequest) { + logger.trace(() => `Request (${operationName}):\n${JSON.stringify(parameters, null, 2)}`); + return withSpan({ name: operationName, labels: { plugin } }, () => { + return client.esql.query( + { ...parameters }, + { + querystring: { + drop_null_columns: true, + }, + } + ); + }) + .then((response) => { + logger.trace(() => `Response (${operationName}):\n${JSON.stringify(response, null, 2)}`); + return response as unknown as ESQLSearchResponse; + }) + .catch((error) => { + throw error; + }); + }, search( operationName: string, parameters: SearchRequest diff --git a/x-pack/packages/observability/observability_utils/es/utils/esql_result_to_plain_objects.ts b/x-pack/packages/observability/observability_utils/es/utils/esql_result_to_plain_objects.ts new file mode 100644 index 0000000000000..ad48bcb311b25 --- /dev/null +++ b/x-pack/packages/observability/observability_utils/es/utils/esql_result_to_plain_objects.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 { ESQLSearchResponse } from '@kbn/es-types'; + +export function esqlResultToPlainObjects>( + result: ESQLSearchResponse +): T[] { + return result.values.map((row) => { + return row.reduce>((acc, value, index) => { + const column = result.columns[index]; + acc[column.name] = value; + return acc; + }, {}); + }) as T[]; +} diff --git a/x-pack/packages/security-solution/navigation/src/constants.ts b/x-pack/packages/security-solution/navigation/src/constants.ts index bb433e2f9a147..249b834f929bd 100644 --- a/x-pack/packages/security-solution/navigation/src/constants.ts +++ b/x-pack/packages/security-solution/navigation/src/constants.ts @@ -54,6 +54,7 @@ export enum ExternalPageName { mlNodes = 'ml:nodes', mlFileUpload = 'ml:fileUpload', mlIndexDataVisualizer = 'ml:indexDataVisualizer', + mlESQLdataVisualizer = 'ml:esqlDataVisualizer', mlDataDrift = 'ml:dataDrift', mlExplainLogRateSpikes = 'ml:logRateAnalysis', mlLogPatternAnalysis = 'ml:logPatternAnalysis', diff --git a/x-pack/plugins/actions/common/routes/connector/response/schemas/v1.ts b/x-pack/plugins/actions/common/routes/connector/response/schemas/v1.ts index df17536ad44ee..5c9b95ca8fc7b 100644 --- a/x-pack/plugins/actions/common/routes/connector/response/schemas/v1.ts +++ b/x-pack/plugins/actions/common/routes/connector/response/schemas/v1.ts @@ -8,34 +8,93 @@ import { schema } from '@kbn/config-schema'; export const connectorResponseSchema = schema.object({ - id: schema.string(), - name: schema.string(), + id: schema.string({ + meta: { + description: 'The identifier for the connector.', + }, + }), + name: schema.string({ + meta: { + description: ' The name of the rule.', + }, + }), config: schema.maybe(schema.recordOf(schema.string(), schema.any())), - connector_type_id: schema.string(), - is_missing_secrets: schema.maybe(schema.boolean()), - is_preconfigured: schema.boolean(), - is_deprecated: schema.boolean(), - is_system_action: schema.boolean(), + connector_type_id: schema.string({ + meta: { description: 'The connector type identifier.' }, + }), + is_missing_secrets: schema.maybe( + schema.boolean({ meta: { description: 'Indicates whether the connector is missing secrets.' } }) + ), + is_preconfigured: schema.boolean({ + meta: { + description: + 'Indicates whether the connector is preconfigured. If true, the `config` and `is_missing_secrets` properties are omitted from the response. ', + }, + }), + is_deprecated: schema.boolean({ + meta: { description: 'Indicates whether the connector is deprecated.' }, + }), + is_system_action: schema.boolean({ + meta: { description: 'Indicates whether the connector is used for system actions.' }, + }), }); export const allConnectorsResponseSchema = connectorResponseSchema.extends({ - referenced_by_count: schema.number(), + referenced_by_count: schema.number({ + meta: { + description: + 'The number of saved objects that reference the connector. If is_preconfigured is true, this value is not calculated.', + }, + }), }); export const connectorTypesResponseSchema = schema.object({ - id: schema.string(), - name: schema.string(), - enabled: schema.boolean(), - enabled_in_config: schema.boolean(), - enabled_in_license: schema.boolean(), - minimum_license_required: schema.oneOf([ - schema.literal('basic'), - schema.literal('standard'), - schema.literal('gold'), - schema.literal('platinum'), - schema.literal('enterprise'), - schema.literal('trial'), - ]), - supported_feature_ids: schema.arrayOf(schema.string()), - is_system_action_type: schema.boolean(), + id: schema.string({ + meta: { + description: 'The identifier for the connector.', + }, + }), + name: schema.string({ + meta: { + description: ' The name of the rule.', + }, + }), + enabled: schema.boolean({ + meta: { + description: 'Indicates whether the connector is enabled.', + }, + }), + enabled_in_config: schema.boolean({ + meta: { + description: 'Indicates whether the connector is enabled in the Kibana configuration.', + }, + }), + enabled_in_license: schema.boolean({ + meta: { + description: 'Indicates whether the connector is enabled through the license.', + }, + }), + minimum_license_required: schema.oneOf( + [ + schema.literal('basic'), + schema.literal('standard'), + schema.literal('gold'), + schema.literal('platinum'), + schema.literal('enterprise'), + schema.literal('trial'), + ], + { + meta: { + description: 'The minimum license required to enable the connector.', + }, + } + ), + supported_feature_ids: schema.arrayOf(schema.string(), { + meta: { + description: 'The minimum license required to enable the connector.', + }, + }), + is_system_action_type: schema.boolean({ + meta: { description: 'Indicates whether the action is a system action.' }, + }), }); diff --git a/x-pack/plugins/actions/server/routes/connector/get/get.ts b/x-pack/plugins/actions/server/routes/connector/get/get.ts index 4519673a400fe..686b54655c892 100644 --- a/x-pack/plugins/actions/server/routes/connector/get/get.ts +++ b/x-pack/plugins/actions/server/routes/connector/get/get.ts @@ -10,6 +10,7 @@ import { getConnectorParamsSchemaV1, GetConnectorParamsV1, } from '../../../../common/routes/connector/apis/get'; +import { connectorResponseSchemaV1 } from '../../../../common/routes/connector/response'; import { transformGetConnectorResponseV1 } from './transforms'; import { ILicenseState } from '../../../lib'; import { BASE_ACTION_API_PATH } from '../../../../common'; @@ -34,6 +35,7 @@ export const getConnectorRoute = ( }, response: { 200: { + body: () => connectorResponseSchemaV1, description: 'Indicates a successful call.', }, }, diff --git a/x-pack/plugins/actions/server/routes/create.ts b/x-pack/plugins/actions/server/routes/create.ts index f7e8b61707d70..7c651fd67290c 100644 --- a/x-pack/plugins/actions/server/routes/create.ts +++ b/x-pack/plugins/actions/server/routes/create.ts @@ -12,6 +12,7 @@ import { ILicenseState, validateEmptyStrings } from '../lib'; import { BASE_ACTION_API_PATH, RewriteRequestCase, RewriteResponseCase } from '../../common'; import { verifyAccessAndContext } from './verify_access_and_context'; import { CreateOptions } from '../actions_client'; +import { connectorResponseSchemaV1 } from '../../common/routes/connector/response'; export const bodySchema = schema.object({ name: schema.string({ @@ -68,7 +69,9 @@ export const createActionRoute = ( request: { params: schema.maybe( schema.object({ - id: schema.maybe(schema.string()), + id: schema.maybe( + schema.string({ meta: { description: 'An identifier for the connector.' } }) + ), }) ), body: bodySchema, @@ -76,6 +79,7 @@ export const createActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/actions/server/routes/execute.ts b/x-pack/plugins/actions/server/routes/execute.ts index 6f2ad11e20588..74813a73474ac 100644 --- a/x-pack/plugins/actions/server/routes/execute.ts +++ b/x-pack/plugins/actions/server/routes/execute.ts @@ -13,6 +13,7 @@ import { ActionTypeExecutorResult, ActionsRequestHandlerContext } from '../types import { BASE_ACTION_API_PATH, RewriteResponseCase } from '../../common'; import { asHttpRequestExecutionSource } from '../lib/action_execution_source'; import { verifyAccessAndContext } from './verify_access_and_context'; +import { connectorResponseSchemaV1 } from '../../common/routes/connector/response'; const paramSchema = schema.object({ id: schema.string({ @@ -56,6 +57,7 @@ export const executeActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/actions/server/routes/legacy/create.ts b/x-pack/plugins/actions/server/routes/legacy/create.ts index d668b1fbc19d2..6da0d25c2e59c 100644 --- a/x-pack/plugins/actions/server/routes/legacy/create.ts +++ b/x-pack/plugins/actions/server/routes/legacy/create.ts @@ -13,6 +13,7 @@ import { ILicenseState } from '../../lib'; import { BASE_ACTION_API_PATH } from '../../../common'; import { verifyAccessAndContext } from '../verify_access_and_context'; import { trackLegacyRouteUsage } from '../../lib/track_legacy_route_usage'; +import { connectorResponseSchemaV1 } from '../../../common/routes/connector/response'; export const bodySchema = schema.object({ name: schema.string({ @@ -46,6 +47,7 @@ export const createActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/actions/server/routes/legacy/execute.ts b/x-pack/plugins/actions/server/routes/legacy/execute.ts index 88e75aadb627c..8083f884c1186 100644 --- a/x-pack/plugins/actions/server/routes/legacy/execute.ts +++ b/x-pack/plugins/actions/server/routes/legacy/execute.ts @@ -14,6 +14,7 @@ import { ActionTypeExecutorResult, ActionsRequestHandlerContext } from '../../ty import { BASE_ACTION_API_PATH } from '../../../common'; import { asHttpRequestExecutionSource } from '../../lib/action_execution_source'; import { trackLegacyRouteUsage } from '../../lib/track_legacy_route_usage'; +import { connectorResponseSchemaV1 } from '../../../common/routes/connector/response'; const paramSchema = schema.object({ id: schema.string({ @@ -47,6 +48,7 @@ export const executeActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/actions/server/routes/legacy/get.ts b/x-pack/plugins/actions/server/routes/legacy/get.ts index 524b3522ed541..2adf6413b9248 100644 --- a/x-pack/plugins/actions/server/routes/legacy/get.ts +++ b/x-pack/plugins/actions/server/routes/legacy/get.ts @@ -12,6 +12,7 @@ import { ILicenseState, verifyApiAccess } from '../../lib'; import { BASE_ACTION_API_PATH } from '../../../common'; import { ActionsRequestHandlerContext } from '../../types'; import { trackLegacyRouteUsage } from '../../lib/track_legacy_route_usage'; +import { connectorResponseSchemaV1 } from '../../../common/routes/connector/response'; const paramSchema = schema.object({ id: schema.string({ @@ -40,6 +41,7 @@ export const getActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/actions/server/routes/legacy/update.ts b/x-pack/plugins/actions/server/routes/legacy/update.ts index 5f234c8bf55a9..81106c2cdc73b 100644 --- a/x-pack/plugins/actions/server/routes/legacy/update.ts +++ b/x-pack/plugins/actions/server/routes/legacy/update.ts @@ -12,6 +12,7 @@ import { ILicenseState, verifyApiAccess, isErrorThatHandlesItsOwnResponse } from import { BASE_ACTION_API_PATH } from '../../../common'; import { ActionsRequestHandlerContext } from '../../types'; import { trackLegacyRouteUsage } from '../../lib/track_legacy_route_usage'; +import { connectorResponseSchemaV1 } from '../../../common/routes/connector/response'; const paramSchema = schema.object({ id: schema.string({ @@ -47,6 +48,7 @@ export const updateActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/actions/server/routes/update.ts b/x-pack/plugins/actions/server/routes/update.ts index efb4d036b1e48..8e1ffcb2b3230 100644 --- a/x-pack/plugins/actions/server/routes/update.ts +++ b/x-pack/plugins/actions/server/routes/update.ts @@ -11,6 +11,7 @@ import { ILicenseState, validateEmptyStrings } from '../lib'; import { BASE_ACTION_API_PATH, RewriteResponseCase } from '../../common'; import { ActionResult, ActionsRequestHandlerContext } from '../types'; import { verifyAccessAndContext } from './verify_access_and_context'; +import { connectorResponseSchemaV1 } from '../../common/routes/connector/response'; const paramSchema = schema.object({ id: schema.string({ @@ -67,6 +68,7 @@ export const updateActionRoute = ( response: { 200: { description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, }, }, }, diff --git a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap index c84a3565d48f6..4dc2abbc5f6a8 100644 --- a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap +++ b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap @@ -6135,6 +6135,175 @@ Object { "query": Object { "type": "string", }, + "responseActions": Object { + "items": Object { + "anyOf": Array [ + Object { + "additionalProperties": false, + "properties": Object { + "actionTypeId": Object { + "const": ".osquery", + "type": "string", + }, + "params": Object { + "additionalProperties": false, + "properties": Object { + "ecsMapping": Object { + "additionalProperties": Object { + "additionalProperties": false, + "properties": Object { + "field": Object { + "type": "string", + }, + "value": Object { + "anyOf": Array [ + Object { + "type": "string", + }, + Object { + "items": Object { + "type": "string", + }, + "type": "array", + }, + ], + }, + }, + "type": "object", + }, + "properties": Object {}, + "type": "object", + }, + "packId": Object { + "type": "string", + }, + "queries": Object { + "items": Object { + "additionalProperties": false, + "properties": Object { + "ecs_mapping": Object { + "$ref": "#/allOf/1/properties/responseActions/items/anyOf/0/properties/params/properties/ecsMapping", + }, + "id": Object { + "type": "string", + }, + "platform": Object { + "type": "string", + }, + "query": Object { + "type": "string", + }, + "removed": Object { + "type": "boolean", + }, + "snapshot": Object { + "type": "boolean", + }, + "version": Object { + "type": "string", + }, + }, + "required": Array [ + "id", + "query", + ], + "type": "object", + }, + "type": "array", + }, + "query": Object { + "type": "string", + }, + "savedQueryId": Object { + "type": "string", + }, + "timeout": Object { + "type": "number", + }, + }, + "type": "object", + }, + }, + "required": Array [ + "actionTypeId", + "params", + ], + "type": "object", + }, + Object { + "additionalProperties": false, + "properties": Object { + "actionTypeId": Object { + "const": ".endpoint", + "type": "string", + }, + "params": Object { + "anyOf": Array [ + Object { + "additionalProperties": false, + "properties": Object { + "command": Object { + "const": "isolate", + "type": "string", + }, + "comment": Object { + "type": "string", + }, + }, + "required": Array [ + "command", + ], + "type": "object", + }, + Object { + "additionalProperties": false, + "properties": Object { + "command": Object { + "enum": Array [ + "kill-process", + "suspend-process", + ], + "type": "string", + }, + "comment": Object { + "type": "string", + }, + "config": Object { + "additionalProperties": false, + "properties": Object { + "field": Object { + "type": "string", + }, + "overwrite": Object { + "default": true, + "type": "boolean", + }, + }, + "required": Array [ + "field", + ], + "type": "object", + }, + }, + "required": Array [ + "command", + "config", + ], + "type": "object", + }, + ], + }, + }, + "required": Array [ + "actionTypeId", + "params", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, "tiebreakerField": Object { "type": "string", }, @@ -7687,6 +7856,175 @@ Object { "query": Object { "type": "string", }, + "responseActions": Object { + "items": Object { + "anyOf": Array [ + Object { + "additionalProperties": false, + "properties": Object { + "actionTypeId": Object { + "const": ".osquery", + "type": "string", + }, + "params": Object { + "additionalProperties": false, + "properties": Object { + "ecsMapping": Object { + "additionalProperties": Object { + "additionalProperties": false, + "properties": Object { + "field": Object { + "type": "string", + }, + "value": Object { + "anyOf": Array [ + Object { + "type": "string", + }, + Object { + "items": Object { + "type": "string", + }, + "type": "array", + }, + ], + }, + }, + "type": "object", + }, + "properties": Object {}, + "type": "object", + }, + "packId": Object { + "type": "string", + }, + "queries": Object { + "items": Object { + "additionalProperties": false, + "properties": Object { + "ecs_mapping": Object { + "$ref": "#/allOf/1/properties/responseActions/items/anyOf/0/properties/params/properties/ecsMapping", + }, + "id": Object { + "type": "string", + }, + "platform": Object { + "type": "string", + }, + "query": Object { + "type": "string", + }, + "removed": Object { + "type": "boolean", + }, + "snapshot": Object { + "type": "boolean", + }, + "version": Object { + "type": "string", + }, + }, + "required": Array [ + "id", + "query", + ], + "type": "object", + }, + "type": "array", + }, + "query": Object { + "type": "string", + }, + "savedQueryId": Object { + "type": "string", + }, + "timeout": Object { + "type": "number", + }, + }, + "type": "object", + }, + }, + "required": Array [ + "actionTypeId", + "params", + ], + "type": "object", + }, + Object { + "additionalProperties": false, + "properties": Object { + "actionTypeId": Object { + "const": ".endpoint", + "type": "string", + }, + "params": Object { + "anyOf": Array [ + Object { + "additionalProperties": false, + "properties": Object { + "command": Object { + "const": "isolate", + "type": "string", + }, + "comment": Object { + "type": "string", + }, + }, + "required": Array [ + "command", + ], + "type": "object", + }, + Object { + "additionalProperties": false, + "properties": Object { + "command": Object { + "enum": Array [ + "kill-process", + "suspend-process", + ], + "type": "string", + }, + "comment": Object { + "type": "string", + }, + "config": Object { + "additionalProperties": false, + "properties": Object { + "field": Object { + "type": "string", + }, + "overwrite": Object { + "default": true, + "type": "boolean", + }, + }, + "required": Array [ + "field", + ], + "type": "object", + }, + }, + "required": Array [ + "command", + "config", + ], + "type": "object", + }, + ], + }, + }, + "required": Array [ + "actionTypeId", + "params", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, "type": Object { "const": "new_terms", "type": "string", diff --git a/x-pack/plugins/alerting/server/usage/alerting_usage_collector.ts b/x-pack/plugins/alerting/server/usage/alerting_usage_collector.ts index 5efd2d7a49152..46cf58d838ecc 100644 --- a/x-pack/plugins/alerting/server/usage/alerting_usage_collector.ts +++ b/x-pack/plugins/alerting/server/usage/alerting_usage_collector.ts @@ -205,6 +205,9 @@ export function createAlertingUsageCollector( count_rules_with_tags: 0, count_rules_snoozed: 0, count_rules_muted: 0, + count_mw_total: 0, + count_mw_with_repeat_toggle_on: 0, + count_mw_with_filter_alert_toggle_on: 0, count_rules_with_muted_alerts: 0, count_connector_types_by_consumers: {}, count_rules_by_execution_status_per_day: {}, @@ -289,6 +292,9 @@ export function createAlertingUsageCollector( count_rules_by_notify_when: byNotifyWhenSchema, count_rules_snoozed: { type: 'long' }, count_rules_muted: { type: 'long' }, + count_mw_total: { type: 'long' }, + count_mw_with_repeat_toggle_on: { type: 'long' }, + count_mw_with_filter_alert_toggle_on: { type: 'long' }, count_rules_with_muted_alerts: { type: 'long' }, count_connector_types_by_consumers: { DYNAMIC_KEY: { DYNAMIC_KEY: { type: 'long' } } }, count_rules_by_execution_status_per_day: byStatusPerDaySchema, diff --git a/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.test.ts b/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.test.ts index f29602458fd50..7c06e9867dae3 100644 --- a/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.test.ts +++ b/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.test.ts @@ -6,11 +6,97 @@ */ import { elasticsearchServiceMock, loggingSystemMock } from '@kbn/core/server/mocks'; -import { getTotalCountAggregations, getTotalCountInUse } from './get_telemetry_from_kibana'; +import { + getTotalCountAggregations, + getTotalCountInUse, + getMWTelemetry, +} from './get_telemetry_from_kibana'; +import { savedObjectsClientMock } from '@kbn/core/server/mocks'; +import { MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE } from '../../../common'; +import { ISavedObjectsRepository } from '@kbn/core/server'; const elasticsearch = elasticsearchServiceMock.createStart(); const esClient = elasticsearch.client.asInternalUser; const logger: ReturnType = loggingSystemMock.createLogger(); +const savedObjectsClient = savedObjectsClientMock.create() as unknown as ISavedObjectsRepository; +const thrownError = new Error('Fail'); + +const mockedResponse = { + saved_objects: [ + { + id: '1', + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + attributes: { + title: 'test_rule_1', + enabled: true, + duration: 1800000, + expirationDate: '2025-09-09T13:13:07.824Z', + events: [], + rRule: { + dtstart: '2024-09-09T13:13:02.054Z', + tzid: 'Europe/Stockholm', + freq: 0, + count: 1, + }, + createdBy: null, + updatedBy: null, + createdAt: '2024-09-09T13:13:07.825Z', + updatedAt: '2024-09-09T13:13:07.825Z', + scopedQuery: null, + }, + }, + { + id: '2', + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + attributes: { + title: 'test_rule_2', + enabled: true, + duration: 1800000, + expirationDate: '2025-09-09T13:13:07.824Z', + events: [], + rRule: { + dtstart: '2024-09-09T13:13:02.054Z', + tzid: 'Europe/Stockholm', + freq: 3, + interval: 1, + byweekday: ['SU'], + }, + createdBy: null, + updatedBy: null, + createdAt: '2024-09-09T13:13:07.825Z', + updatedAt: '2024-09-09T13:13:07.825Z', + scopedQuery: { + filters: [], + kql: 'kibana.alert.job_errors_results.job_id : * ', + dsl: '{"bool":{"must":[],"filter":[{"bool":{"should":[{"exists":{"field":"kibana.alert.job_errors_results.job_id"}}],"minimum_should_match":1}}],"should":[],"must_not":[]}}', + }, + }, + }, + { + id: '3', + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + attributes: { + title: 'test_rule_3', + enabled: true, + duration: 1800000, + expirationDate: '2025-09-09T13:13:07.824Z', + events: [], + rRule: { + dtstart: '2024-09-09T13:13:02.054Z', + tzid: 'Europe/Stockholm', + freq: 3, + interval: 1, + byweekday: ['TU'], + }, + createdBy: null, + updatedBy: null, + createdAt: '2024-09-09T13:13:07.825Z', + updatedAt: '2024-09-09T13:13:07.825Z', + scopedQuery: null, + }, + }, + ], +}; describe('kibana index telemetry', () => { beforeEach(() => { @@ -420,4 +506,94 @@ describe('kibana index telemetry', () => { }); }); }); + + describe('getMWTelemetry', () => { + test('should return MW telemetry', async () => { + savedObjectsClient.createPointInTimeFinder = jest.fn().mockReturnValue({ + close: jest.fn(), + find: jest.fn().mockImplementation(async function* () { + yield mockedResponse; + }), + }); + const telemetry = await getMWTelemetry({ + savedObjectsClient, + logger, + }); + + expect(savedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + namespaces: ['*'], + perPage: 100, + fields: ['rRule', 'scopedQuery'], + }); + expect(telemetry).toStrictEqual({ + count_mw_total: 3, + count_mw_with_repeat_toggle_on: 2, + count_mw_with_filter_alert_toggle_on: 1, + hasErrors: false, + }); + }); + }); + + test('should throw the error', async () => { + savedObjectsClient.createPointInTimeFinder = jest.fn().mockReturnValue({ + close: jest.fn(), + find: jest.fn().mockImplementation(async function* () { + throw thrownError; + }), + }); + + const telemetry = await getMWTelemetry({ + savedObjectsClient, + logger, + }); + + expect(savedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + namespaces: ['*'], + perPage: 100, + fields: ['rRule', 'scopedQuery'], + }); + + expect(telemetry).toStrictEqual({ + count_mw_total: 0, + count_mw_with_repeat_toggle_on: 0, + count_mw_with_filter_alert_toggle_on: 0, + hasErrors: true, + errorMessage: 'Fail', + }); + expect(logger.warn).toHaveBeenCalled(); + const loggerCall = logger.warn.mock.calls[0][0]; + const loggerMeta = logger.warn.mock.calls[0][1]; + expect(loggerCall).toBe('Error executing alerting telemetry task: getTotalMWCount - {}'); + expect(loggerMeta?.tags).toEqual(['alerting', 'telemetry-failed']); + expect(loggerMeta?.error?.stack_trace).toBeDefined(); + }); + + test('should stop on MW max limit count', async () => { + savedObjectsClient.createPointInTimeFinder = jest.fn().mockReturnValue({ + close: jest.fn(), + find: jest.fn().mockImplementation(async function* () { + yield mockedResponse; + }), + }); + const telemetry = await getMWTelemetry({ + savedObjectsClient, + logger, + maxDocuments: 1, + }); + + expect(savedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + namespaces: ['*'], + perPage: 100, + fields: ['rRule', 'scopedQuery'], + }); + expect(telemetry).toStrictEqual({ + count_mw_total: 2, + count_mw_with_repeat_toggle_on: 1, + count_mw_with_filter_alert_toggle_on: 1, + hasErrors: false, + }); + }); }); diff --git a/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.ts b/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.ts index fdfdbf1dbcfe6..756512815d901 100644 --- a/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.ts +++ b/x-pack/plugins/alerting/server/usage/lib/get_telemetry_from_kibana.ts @@ -11,7 +11,7 @@ import type { AggregationsTermsAggregateBase, AggregationsStringTermsBucketKeys, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { ElasticsearchClient, Logger } from '@kbn/core/server'; +import { ElasticsearchClient, Logger, ISavedObjectsRepository } from '@kbn/core/server'; import { ConnectorsByConsumersBucket, @@ -23,6 +23,8 @@ import { AlertingUsage } from '../types'; import { NUM_ALERTING_RULE_TYPES } from '../alerting_usage_collector'; import { parseSimpleRuleTypeBucket } from './parse_simple_rule_type_bucket'; import { groupRulesBySearchType } from './group_rules_by_search_type'; +import { MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE } from '../../../common'; +import { MaintenanceWindowAttributes } from '../../data/maintenance_window/types'; interface Opts { esClient: ElasticsearchClient; @@ -30,6 +32,12 @@ interface Opts { logger: Logger; } +interface MWOpts { + savedObjectsClient: ISavedObjectsRepository; + logger: Logger; + maxDocuments?: number; +} + type GetTotalCountsResults = Pick< AlertingUsage, | 'count_total' @@ -48,6 +56,14 @@ type GetTotalCountsResults = Pick< | 'connectors_per_alert' > & { errorMessage?: string; hasErrors: boolean }; +type GetMWTelemetryResults = Pick< + AlertingUsage, + 'count_mw_total' | 'count_mw_with_repeat_toggle_on' | 'count_mw_with_filter_alert_toggle_on' +> & { + errorMessage?: string; + hasErrors: boolean; +}; + interface GetTotalCountInUseResults { countTotal: number; countByType: Record; @@ -56,6 +72,8 @@ interface GetTotalCountInUseResults { hasErrors: boolean; } +const TELEMETRY_MW_COUNT_LIMIT = 10000; + export async function getTotalCountAggregations({ esClient, alertIndex, @@ -490,3 +508,60 @@ export async function getTotalCountInUse({ }; } } + +export async function getMWTelemetry({ + savedObjectsClient, + logger, + maxDocuments = TELEMETRY_MW_COUNT_LIMIT, +}: MWOpts): Promise { + try { + const mwFinder = savedObjectsClient.createPointInTimeFinder({ + type: MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + namespaces: ['*'], + perPage: 100, + fields: ['rRule', 'scopedQuery'], + }); + + let countMWTotal = 0; + let countMWWithRepeatToggleON = 0; + let countMWWithFilterAlertToggleON = 0; + mwLoop: for await (const response of mwFinder.find()) { + for (const mwSavedObject of response.saved_objects) { + if (countMWTotal > maxDocuments) break mwLoop; + countMWTotal = countMWTotal + 1; + // scopedQuery property will be null if "Filter alerts" toggle will be off + if (mwSavedObject.attributes.scopedQuery) { + countMWWithFilterAlertToggleON = countMWWithFilterAlertToggleON + 1; + } + // interval property will be not in place if "Repeat" toggle will be off + if (Object.hasOwn(mwSavedObject.attributes.rRule, 'interval')) { + countMWWithRepeatToggleON = countMWWithRepeatToggleON + 1; + } + } + } + await mwFinder.close(); + + return { + hasErrors: false, + count_mw_total: countMWTotal, + count_mw_with_repeat_toggle_on: countMWWithRepeatToggleON, + count_mw_with_filter_alert_toggle_on: countMWWithFilterAlertToggleON, + }; + } catch (err) { + const errorMessage = err?.message ? err.message : err.toString(); + logger.warn( + `Error executing alerting telemetry task: getTotalMWCount - ${JSON.stringify(err)}`, + { + tags: ['alerting', 'telemetry-failed'], + error: { stack_trace: err?.stack }, + } + ); + return { + hasErrors: true, + errorMessage, + count_mw_total: 0, + count_mw_with_repeat_toggle_on: 0, + count_mw_with_filter_alert_toggle_on: 0, + }; + } +} diff --git a/x-pack/plugins/alerting/server/usage/task.ts b/x-pack/plugins/alerting/server/usage/task.ts index 0cc08db911226..41db75032ef4d 100644 --- a/x-pack/plugins/alerting/server/usage/task.ts +++ b/x-pack/plugins/alerting/server/usage/task.ts @@ -12,15 +12,19 @@ import { TaskManagerStartContract, IntervalSchedule, } from '@kbn/task-manager-plugin/server'; - import { getFailedAndUnrecognizedTasksPerDay } from './lib/get_telemetry_from_task_manager'; -import { getTotalCountAggregations, getTotalCountInUse } from './lib/get_telemetry_from_kibana'; +import { + getTotalCountAggregations, + getTotalCountInUse, + getMWTelemetry, +} from './lib/get_telemetry_from_kibana'; import { getExecutionsPerDayCount, getExecutionTimeoutsPerDayCount, } from './lib/get_telemetry_from_event_log'; import { stateSchemaByVersion, emptyState, type LatestTaskStateSchema } from './task_state'; import { RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE } from '../../common'; export const TELEMETRY_TASK_TYPE = 'alerting_telemetry'; @@ -36,12 +40,6 @@ export function initializeAlertingTelemetry( registerAlertingTelemetryTask(logger, core, taskManager, eventLogIndex); } -export function scheduleAlertingTelemetry(logger: Logger, taskManager?: TaskManagerStartContract) { - if (taskManager) { - scheduleTasks(logger, taskManager).catch(() => {}); // it shouldn't reject, but just in case - } -} - function registerAlertingTelemetryTask( logger: Logger, core: CoreSetup, @@ -58,6 +56,12 @@ function registerAlertingTelemetryTask( }); } +export function scheduleAlertingTelemetry(logger: Logger, taskManager?: TaskManagerStartContract) { + if (taskManager) { + scheduleTasks(logger, taskManager).catch(() => {}); // it shouldn't reject, but just in case + } +} + async function scheduleTasks(logger: Logger, taskManager: TaskManagerStartContract) { try { await taskManager.ensureScheduled({ @@ -93,16 +97,26 @@ export function telemetryTaskRunner( .getStartServices() .then(([coreStart]) => coreStart.savedObjects.getIndexForType(RULE_SAVED_OBJECT_TYPE)); + const getSavedObjectClient = () => + core + .getStartServices() + .then(([coreStart]) => + coreStart.savedObjects.createInternalRepository([MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE]) + ); + return { async run() { const esClient = await getEsClient(); const alertIndex = await getAlertIndex(); + const savedObjectsClient = await getSavedObjectClient(); + return Promise.all([ getTotalCountAggregations({ esClient, alertIndex, logger }), getTotalCountInUse({ esClient, alertIndex, logger }), getExecutionsPerDayCount({ esClient, eventLogIndex, logger }), getExecutionTimeoutsPerDayCount({ esClient, eventLogIndex, logger }), getFailedAndUnrecognizedTasksPerDay({ esClient, taskManagerIndex, logger }), + getMWTelemetry({ logger, savedObjectsClient }), ]) .then( ([ @@ -111,13 +125,15 @@ export function telemetryTaskRunner( dailyExecutionCounts, dailyExecutionTimeoutCounts, dailyFailedAndUnrecognizedTasks, + MWTelemetry, ]) => { const hasErrors = totalCountAggregations.hasErrors || totalInUse.hasErrors || dailyExecutionCounts.hasErrors || dailyExecutionTimeoutCounts.hasErrors || - dailyFailedAndUnrecognizedTasks.hasErrors; + dailyFailedAndUnrecognizedTasks.hasErrors || + MWTelemetry.hasErrors; const errorMessages = [ totalCountAggregations.errorMessage, @@ -125,6 +141,7 @@ export function telemetryTaskRunner( dailyExecutionCounts.errorMessage, dailyExecutionTimeoutCounts.errorMessage, dailyFailedAndUnrecognizedTasks.errorMessage, + MWTelemetry.errorMessage, ].filter((message) => message !== undefined); const updatedState: LatestTaskStateSchema = { @@ -147,6 +164,10 @@ export function telemetryTaskRunner( count_rules_by_notify_when: totalCountAggregations.count_rules_by_notify_when, count_rules_snoozed: totalCountAggregations.count_rules_snoozed, count_rules_muted: totalCountAggregations.count_rules_muted, + count_mw_total: MWTelemetry.count_mw_total, + count_mw_with_repeat_toggle_on: MWTelemetry.count_mw_with_repeat_toggle_on, + count_mw_with_filter_alert_toggle_on: + MWTelemetry.count_mw_with_filter_alert_toggle_on, count_rules_with_muted_alerts: totalCountAggregations.count_rules_with_muted_alerts, count_connector_types_by_consumers: totalCountAggregations.count_connector_types_by_consumers, diff --git a/x-pack/plugins/alerting/server/usage/task_state.ts b/x-pack/plugins/alerting/server/usage/task_state.ts index cbcabeb490b84..a9652ee8200a1 100644 --- a/x-pack/plugins/alerting/server/usage/task_state.ts +++ b/x-pack/plugins/alerting/server/usage/task_state.ts @@ -146,6 +146,9 @@ export const stateSchemaByVersion = { }), count_rules_snoozed: schema.number(), count_rules_muted: schema.number(), + count_mw_total: schema.number(), + count_mw_with_repeat_toggle_on: schema.number(), + count_mw_with_filter_alert_toggle_on: schema.number(), count_rules_with_muted_alerts: schema.number(), count_connector_types_by_consumers: schema.recordOf( schema.string(), @@ -248,6 +251,9 @@ export const emptyState: LatestTaskStateSchema = { }, count_rules_snoozed: 0, count_rules_muted: 0, + count_mw_total: 0, + count_mw_with_repeat_toggle_on: 0, + count_mw_with_filter_alert_toggle_on: 0, count_rules_with_muted_alerts: 0, count_connector_types_by_consumers: {}, count_rules_namespaces: 0, diff --git a/x-pack/plugins/alerting/server/usage/types.ts b/x-pack/plugins/alerting/server/usage/types.ts index 15c0f0a962710..ece69ace7ba5d 100644 --- a/x-pack/plugins/alerting/server/usage/types.ts +++ b/x-pack/plugins/alerting/server/usage/types.ts @@ -41,6 +41,9 @@ export interface AlertingUsage { count_connector_types_by_consumers: Record>; count_rules_snoozed: number; count_rules_muted: number; + count_mw_total: number; + count_mw_with_repeat_toggle_on: number; + count_mw_with_filter_alert_toggle_on: number; count_rules_with_muted_alerts: number; count_rules_by_execution_status_per_day: Record; percentile_num_generated_actions_per_day: { diff --git a/x-pack/plugins/cloud/server/mocks.ts b/x-pack/plugins/cloud/server/mocks.ts index e77f58902bf3e..b54b21f5ce827 100644 --- a/x-pack/plugins/cloud/server/mocks.ts +++ b/x-pack/plugins/cloud/server/mocks.ts @@ -18,6 +18,7 @@ function createSetupMock(): jest.Mocked { instanceSizeMb: 1234, isCloudEnabled: true, isElasticStaffOwned: true, + organizationId: 'organization-id', trialEndDate: new Date('2020-10-01T14:13:12Z'), projectsUrl: 'projects-url', baseUrl: 'base-url', @@ -31,6 +32,7 @@ function createSetupMock(): jest.Mocked { projectId: undefined, projectName: undefined, projectType: undefined, + orchestratorTarget: undefined, }, }; } diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc index 293d5f0baf3d7..6394ccc7b53f1 100644 --- a/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc @@ -18,7 +18,6 @@ "requiredBundles": [ ], "optionalPlugins": [ - "cloudExperiments" ] } } diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts b/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts index a708dd81cf532..a2762b89e124a 100755 --- a/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts +++ b/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts @@ -8,20 +8,14 @@ import { PluginInitializerContext, CoreSetup, Plugin } from '@kbn/core/server'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; -import type { CloudExperimentsPluginStart } from '@kbn/cloud-experiments-plugin/common'; import { registerChatRoute } from './routes'; import type { CloudChatConfigType } from './config'; -import type { ChatVariant } from '../common/types'; interface CloudChatSetupDeps { cloud: CloudSetup; } -interface CloudChatStartDeps { - cloudExperiments?: CloudExperimentsPluginStart; -} - -export class CloudChatPlugin implements Plugin { +export class CloudChatPlugin implements Plugin { private readonly config: CloudChatConfigType; private readonly isDev: boolean; @@ -30,7 +24,7 @@ export class CloudChatPlugin implements Plugin, { cloud }: CloudChatSetupDeps) { + public setup(core: CoreSetup, { cloud }: CloudChatSetupDeps) { const { chatIdentitySecret, trialBuffer } = this.config; const { isCloudEnabled, trialEndDate } = cloud; @@ -41,27 +35,6 @@ export class CloudChatPlugin implements Plugin - core.getStartServices().then(([_, { cloudExperiments }]) => { - if (!cloudExperiments) { - return 'header'; - } else { - return cloudExperiments - .getVariation('cloud-chat.chat-variant', 'header') - .catch(() => 'header'); - } - }), - getChatDisabledThroughExperiments: () => - core.getStartServices().then(([_, { cloudExperiments }]) => { - if (!cloudExperiments) { - return false; - } else { - return cloudExperiments - .getVariation('cloud-chat.enabled', true) - .then((enabled) => !enabled) - .catch(() => false); - } - }), }); } } diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts b/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts index 94a55b2274a99..ea25ff9801af3 100644 --- a/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts @@ -16,20 +16,22 @@ import { httpServerMock, coreMock, securityServiceMock, + coreFeatureFlagsMock, } from '@kbn/core/server/mocks'; import { kibanaResponseFactory } from '@kbn/core/server'; import { type MetaWithSaml, registerChatRoute } from './chat'; -import { ChatVariant } from '../../common/types'; describe('chat route', () => { - const getChatVariant = async (): Promise => 'header'; - const getChatDisabledThroughExperiments = async (): Promise => false; let security: ReturnType; let requestHandlerContextMock: ReturnType; + let featureFlags: ReturnType; beforeEach(() => { const core = coreMock.createRequestHandlerContext(); security = core.security; + featureFlags = core.featureFlags; + featureFlags.getStringValue.mockResolvedValue('header'); + featureFlags.getBooleanValue.mockResolvedValue(true); requestHandlerContextMock = coreMock.createCustomRequestHandlerContext({ core }); }); @@ -43,8 +45,6 @@ describe('chat route', () => { chatIdentitySecret: 'secret', trialBuffer: 60, trialEndDate: new Date(), - getChatVariant, - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; @@ -78,8 +78,6 @@ describe('chat route', () => { chatIdentitySecret: 'secret', trialBuffer: 60, trialEndDate: new Date(), - getChatVariant, - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; @@ -120,8 +118,6 @@ describe('chat route', () => { isDev: false, chatIdentitySecret: 'secret', trialBuffer: 2, - getChatVariant, - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; @@ -165,8 +161,6 @@ describe('chat route', () => { chatIdentitySecret: 'secret', trialBuffer: 2, trialEndDate, - getChatVariant, - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; @@ -202,14 +196,13 @@ describe('chat route', () => { ); const router = httpServiceMock.createRouter(); + featureFlags.getBooleanValue.mockResolvedValueOnce(false); registerChatRoute({ router, isDev: false, chatIdentitySecret: 'secret', trialBuffer: 60, trialEndDate: new Date(), - getChatVariant, - getChatDisabledThroughExperiments: async () => true, }); const [_config, handler] = router.get.mock.calls[0]; await expect( @@ -249,8 +242,6 @@ describe('chat route', () => { chatIdentitySecret: 'secret', trialBuffer: 60, trialEndDate: new Date(), - getChatVariant, - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; await expect( @@ -297,8 +288,6 @@ describe('chat route', () => { chatIdentitySecret: 'secret', trialBuffer: 60, trialEndDate: new Date(), - getChatVariant, - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; await expect( @@ -342,14 +331,13 @@ describe('chat route', () => { ); const router = httpServiceMock.createRouter(); + featureFlags.getStringValue.mockResolvedValueOnce('bubble'); registerChatRoute({ router, isDev: false, chatIdentitySecret: 'secret', trialBuffer: 60, trialEndDate: new Date(), - getChatVariant: async () => 'bubble', - getChatDisabledThroughExperiments, }); const [_config, handler] = router.get.mock.calls[0]; await expect( diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.ts b/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.ts index 735a5db9298c4..e37ed1e935c49 100644 --- a/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.ts +++ b/x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.ts @@ -24,20 +24,12 @@ export const registerChatRoute = ({ trialEndDate, trialBuffer, isDev, - getChatVariant, - getChatDisabledThroughExperiments, }: { router: IRouter; chatIdentitySecret: string; trialEndDate?: Date; trialBuffer: number; isDev: boolean; - getChatVariant: () => Promise; - /** - * Returns true if chat is disabled in LaunchDarkly - * Meant to be used as a runtime kill switch - */ - getChatDisabledThroughExperiments: () => Promise; }) => { router.get( { @@ -45,7 +37,7 @@ export const registerChatRoute = ({ validate: {}, }, async (context, request, response) => { - const { security } = await context.core; + const { security, featureFlags } = await context.core; const user = security.authc.getCurrentUser(); if (!user) { @@ -85,7 +77,8 @@ export const registerChatRoute = ({ }); } - if (await getChatDisabledThroughExperiments()) { + // Meant to be used as a runtime kill switch via LaunchDarkly + if (!(await featureFlags.getBooleanValue('cloud-chat.enabled', true).catch(() => false))) { return response.badRequest({ body: 'Chat is disabled through experiments', }); @@ -96,7 +89,10 @@ export const registerChatRoute = ({ token, email: userEmail, id: userId, - chatVariant: await getChatVariant(), + chatVariant: await featureFlags.getStringValue( + 'cloud-chat.chat-variant', + 'header' + ), }; return response.ok({ body }); } diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/tsconfig.json b/x-pack/plugins/cloud_integrations/cloud_chat/tsconfig.json index ffa21f10a6b44..0dcc15f22cee5 100644 --- a/x-pack/plugins/cloud_integrations/cloud_chat/tsconfig.json +++ b/x-pack/plugins/cloud_integrations/cloud_chat/tsconfig.json @@ -18,7 +18,6 @@ "@kbn/i18n", "@kbn/config-schema", "@kbn/ui-theme", - "@kbn/cloud-experiments-plugin", "@kbn/react-kibana-context-render", "@kbn/logging", "@kbn/logging-mocks", diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx b/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx index 2dc4eb566210a..6ef38ba1614af 100755 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx @@ -9,174 +9,39 @@ tags: ['kibana', 'dev', 'contributor', 'api docs', 'cloud', 'a/b testing', 'expe # Kibana Cloud Experiments Service -> [!WARNING] -> These APIs are deprecated and should not be used as we're working on a replacement Core Feature Flags Service that will arrive _soon_. +> [!NOTE] +> This plugin no-longer exposes any evaluation APIs. Refer to for more information about how to interact with feature flags. -The Cloud Experiments Service provides the necessary APIs to implement A/B testing scenarios, fetching the variations in configuration and reporting back metrics to track conversion rates of the experiments. +This plugin takes care of instrumenting the LaunchDarkly feature flags provider, and registering it in the . +It also instantiates the most basic evaluation context that our segmentation rules can rely on. The `cloudExperiments` plugin is disabled by default and only enabled on Elastic Cloud deployments. -## Public API +## Evaluation Context -If you are developing a feature that needs to use a feature flag, or you are implementing an A/B-testing scenario, this is how you should fetch the value of your feature flags (for either server and browser side code): +The fields populated by this plugin in the evaluation context are shown in the JSON snippet below. +It reports the context split in 2 levels: `kibana` and `organization`. This should help providing a consistent behavior +for all users in a deployment/project, or for all the deployments in an organization. -First, you should declare the optional dependency on this plugin. Do not list it in your `requiredPlugins`, as this plugin is disabled by default and only enabled in Cloud deployments. Adding it to your `requiredPlugins` will cause Kibana to refuse to start by default. - -```json -// plugin/kibana.json +```JSON { - "id": "myPlugin", - "optionalPlugins": ["cloudExperiments"] -} -``` - -Please, be aware that your plugin will run even when the `cloudExperiment` plugin is disabled. Make sure to declare it as an optional dependency in your plugin's TypeScript contract to remind you that it might not always be available. - -### Fetching the value of the feature flags - -First, make sure that your feature flag is listed in [`FEATURE_FLAG_NAMES`](./common/constants.ts). -Then, you can fetch the value of your feature flag by using the API `cloudExperiments.getVariation` as follows: - -```ts -import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/(public|server)'; -import type { - CloudExperimentsPluginSetup, - CloudExperimentsPluginStart -} from '@kbn/cloud-experiments-plugin/common'; - -interface SetupDeps { - cloudExperiments?: CloudExperimentsPluginSetup; -} - -interface StartDeps { - cloudExperiments?: CloudExperimentsPluginStart; -} - -export class MyPlugin implements Plugin { - public setup(core: CoreSetup, deps: SetupDeps) { - this.doSomethingBasedOnFeatureFlag(deps.cloudExperiments); + "kind": "multi", + "kibana": { + "key": "deployment/project ID", + "offering": "traditional/serverless", + "version": "8.16.0", + "build_num": 1234, + "build_sha": "cdadaasdasdjsljhl", + "build_sha_short": "cdada", + "project_type": "Serverless project type", + "orchestrator_target": "canary/non-canary", + "has_data": true + }, + "organization": { + "key": "Cloud Organization ID", + "is_elastic_staff": false, + "in_trial": false, + "trial_end_date": "2024-01-01T01:00:00.000Z" } - - public start(core: CoreStart, deps: StartDeps) { - this.doSomethingBasedOnFeatureFlag(deps.cloudExperiments); - } - - private async doSomethingBasedOnFeatureFlag(cloudExperiments?: CloudExperimentsPluginStart) { - let myConfig = 'default config'; - if (cloudExperiments) { - myConfig = await cloudExperiments.getVariation( - 'my-plugin.my-feature-flag', // The key 'my-plugin.my-feature-flag' should exist in FEATURE_FLAG_NAMES - 'default config' - ); - } - // do something with the final value of myConfig... - } -} -``` - -Since the `getVariation` API returns a promise, when using it in a React component, you may want to use the hook `useEffect`. - -```tsx -import React, { useEffect, useState } from 'react'; -import type { - CloudExperimentsFeatureFlagNames, - CloudExperimentsPluginStart -} from '@kbn/cloud-experiments-plugin/common'; - -interface Props { - cloudExperiments?: CloudExperimentsPluginStart; -} - -const useVariation = ( - cloudExperiments: CloudExperimentsPluginStart | undefined, - featureFlagName: CloudExperimentsFeatureFlagNames, - defaultValue: Data, - setter: (value: Data) => void -) => { - useEffect(() => { - (async function loadVariation() { - const variationUrl = await cloudExperiments?.getVariation(featureFlagName, defaultValue); - if (variationUrl) { - setter(variationUrl); - } - })(); - }, [cloudExperiments, featureFlagName, defaultValue, setter]); -}; - -export const MyReactComponent: React.FC = ({ cloudExperiments }: Props) => { - const [myConfig, setMyConfig] = useState('default config'); - useVariation( - cloudExperiments, - 'my-plugin.my-feature-flag', // The key 'my-plugin.my-feature-flag' should exist in FEATURE_FLAG_NAMES - 'default config', - setMyConfig - ); - - // use myConfig in the component... } ``` - -### Reporting metrics - -Experiments require feedback to analyze which variation to the feature flag is the most successful. For this reason, we need to report some metrics defined in the success criteria of the experiment (check back with your PM if they are unclear). - -Our A/B testing provider allows some high-level analysis of the experiment based on the metrics. It also has some limitations about how it handles some type of metrics like number of objects or size of indices. For this reason, you might want to consider shipping the metrics via our usual telemetry channels (`core.analytics` for event-based metrics, or ). - -However, if our A/B testing provider's analysis tool is good enough for your use case, you can use the api `reportMetric` as follows. - -First, make sure to add the metric name in [`METRIC_NAMES`](./common/constants.ts). Then you can use it like below: - -```ts -import type { CoreStart, Plugin } from '@kbn/core/(public|server)'; -import type { - CloudExperimentsPluginSetup, - CloudExperimentsPluginStart -} from '@kbn/cloud-experiments-plugin/common'; - -interface SetupDeps { - cloudExperiments?: CloudExperimentsPluginSetup; -} - -interface StartDeps { - cloudExperiments?: CloudExperimentsPluginStart; -} - -export class MyPlugin implements Plugin { - public start(core: CoreStart, deps: StartDeps) { - // whenever we need to report any metrics: - // the user performed some action, - // or a metric hit a threshold we want to communicate about - deps.cloudExperiments?.reportMetric({ - name: 'Something happened', // The key 'Something happened' should exist in METRIC_NAMES - value: 22, // (optional) in case the metric requires a numeric metric - meta: { // Optional metadata. - hadSomething: true, - userType: 'type 1', - otherNumericField: 1, - } - }) - } -} -``` - -### Testing - -To test your code locally when developing the A/B scenarios, this plugin accepts a custom config to skip the A/B provider calls and return the values. Use the following `kibana.dev.yml` configuration as an example: - -```yml -xpack.cloud_integrations.experiments.enabled: true -xpack.cloud_integrations.experiments.flag_overrides: - "my-plugin.my-feature-flag": "my custom value" -``` - -### How is my user identified? - -The user is automatically identified during the `setup` phase. It currently uses the ESS deployment ID, meaning all users accessing the same deployment will get the same values for the `getVariation` requests unless the A/B provider is explicitly configured to randomize it. - -If you are curious of the data provided to the `identify` call, you can see that in the [`cloud` plugin](../../cloud). - ---- - -## Development - -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.test.ts deleted file mode 100644 index 8ff277b4abe59..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.test.ts +++ /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 { FEATURE_FLAG_NAMES, METRIC_NAMES } from './constants'; - -function removeDuplicates(obj: Record) { - return [...new Set(Object.values(obj))]; -} - -describe('constants', () => { - describe('FEATURE_FLAG_NAMES', () => { - test('the values should not include duplicates', () => { - expect(Object.values(FEATURE_FLAG_NAMES)).toStrictEqual(removeDuplicates(FEATURE_FLAG_NAMES)); - }); - }); - describe('METRIC_NAMES', () => { - test('the values should not include duplicates', () => { - expect(Object.values(METRIC_NAMES)).toStrictEqual(removeDuplicates(METRIC_NAMES)); - }); - }); -}); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.ts deleted file mode 100644 index 4efbca83ce2cc..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/constants.ts +++ /dev/null @@ -1,51 +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. - */ - -/** - * List of feature flag names used in Kibana. - * - * Feel free to add/remove entries if needed. - * - * As a convention, the key and the value have the same string. - * - * @remarks Kept centralized in this place to serve as a repository - * to help devs understand if there is someone else already using it. - */ -export enum FEATURE_FLAG_NAMES { - /** - * Used in the Security Solutions onboarding page. - * It resolves the URL that the button "Add Integrations" will point to. - */ - 'security-solutions.add-integrations-url' = 'security-solutions.add-integrations-url', - /** - * Used in cloud chat plugin to enable/disable the chat. - * The expectation that the chat is enabled by default and the flag is used as a runtime kill switch. - */ - 'cloud-chat.enabled' = 'cloud-chat.enabled', - /** - * Used in cloud chat plugin to switch between the chat variants. - * Options are: 'header' (the chat button appears as part of the kibana header) and 'bubble' (floating chat button at the bottom of the screen). - */ - 'cloud-chat.chat-variant' = 'cloud-chat.chat-variant', - /** - * Used in observability onboarding plugin to enable/disable the experimental onboarding flow. - * Options are: `true` and `false`. - */ - 'observability_onboarding.experimental_onboarding_flow_enabled' = 'observability_onboarding.experimental_onboarding_flow_enabled', -} - -/** - * List of LaunchDarkly metric names used in Kibana. - * - * Feel free to add/remove entries if needed. - * - * As a convention, the key and the value have the same string. - * - * @remarks Kept centralized in this place to serve as a repository - * to help devs understand if there is someone else already using it. - */ -export enum METRIC_NAMES {} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/index.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/index.ts deleted file mode 100755 index 78874d5e7dda0..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/index.ts +++ /dev/null @@ -1,13 +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. - */ - -export type { - CloudExperimentsMetric, - CloudExperimentsMetricNames, - CloudExperimentsPluginStart, - CloudExperimentsFeatureFlagNames, -} from './types'; diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/index.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/index.ts index 74e2655e8302f..b62a96ea3613f 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/index.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/index.ts @@ -6,3 +6,4 @@ */ export { MetadataService } from './metadata_service'; +export { initializeMetadata } from './initialize_metadata'; diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/initialize_metadata.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/initialize_metadata.ts new file mode 100644 index 0000000000000..ff9d8b9715ce1 --- /dev/null +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/initialize_metadata.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { concatMap } from 'rxjs'; +import type { CloudSetup as CloudSetupBrowser } from '@kbn/cloud-plugin/public'; +import type { CloudSetup as CloudSetupServer } from '@kbn/cloud-plugin/server'; +import type { PluginInitializerContext as PluginInitializerContextBrowser } from '@kbn/core-plugins-browser'; +import type { PluginInitializerContext as PluginInitializerContextServer } from '@kbn/core-plugins-server'; +import type { FeatureFlagsSetup as FeatureFlagsSetupBrowser } from '@kbn/core-feature-flags-browser'; +import type { FeatureFlagsSetup as FeatureFlagsSetupServer } from '@kbn/core-feature-flags-server'; +import type { Logger } from '@kbn/logging'; +import type { MetadataService } from './metadata_service'; + +/** + * @private + */ +export function initializeMetadata({ + metadataService, + initializerContext, + featureFlags, + cloud, + logger, +}: { + metadataService: MetadataService; + initializerContext: PluginInitializerContextBrowser | PluginInitializerContextServer; + featureFlags: FeatureFlagsSetupBrowser | FeatureFlagsSetupServer; + cloud: CloudSetupBrowser | CloudSetupServer; + logger: Logger; +}) { + const offering = initializerContext.env.packageInfo.buildFlavor; + + metadataService.setup({ + instanceKey: cloud.serverless?.projectId || cloud.deploymentId, + offering, + version: initializerContext.env.packageInfo.version, + build_num: initializerContext.env.packageInfo.buildNum, + build_sha: initializerContext.env.packageInfo.buildSha, + build_sha_short: initializerContext.env.packageInfo.buildShaShort, + project_type: cloud.serverless.projectType, + orchestrator_target: cloud.serverless.orchestratorTarget, + organizationKey: cloud.organizationId, + trial_end_date: cloud.trialEndDate, + is_elastic_staff: cloud.isElasticStaffOwned, + }); + + // Update the client's contexts when we get any updates in the metadata. + metadataService.userMetadata$ + .pipe( + // Using concatMap to ensure we call the promised update in an orderly manner to avoid concurrency issues + concatMap(async (userMetadata) => { + try { + await featureFlags.appendContext(userMetadata); + } catch (err) { + logger.warn(`Failed to set the feature flags context ${err}`); + } + }) + ) + .subscribe(); // This subscription will stop when the metadataService stops because it completes the Observable +} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.test.ts index 0c0f5f5127f0f..92798581c8507 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.test.ts @@ -8,8 +8,8 @@ import moment from 'moment'; import { fakeSchedulers } from 'rxjs-marbles/jest'; import { firstValueFrom } from 'rxjs'; -import { MetadataService } from './metadata_service'; import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; +import { type FlatMetadata, MetadataService } from './metadata_service'; jest.mock('rxjs', () => { const RxJs = jest.requireActual('rxjs'); @@ -22,7 +22,6 @@ jest.mock('rxjs', () => { describe('MetadataService', () => { jest.useFakeTimers({ legacyFakeTimers: true }); - let metadataService: MetadataService; let logger: MockedLogger; @@ -39,43 +38,73 @@ describe('MetadataService', () => { jest.clearAllMocks(); }); + const initialMetadata: FlatMetadata = { + instanceKey: 'project-id', + offering: 'serverless', + version: '1.2.3', + build_num: 123, + build_sha: 'abcdefghijklmnopqrstux', + build_sha_short: 'abcde', + project_type: 'project-type', + organizationKey: 'organization-id', + is_elastic_staff: true, + }; + + const multiContextFormat = { + kind: 'multi', + kibana: { + key: 'project-id', + offering: 'serverless', + version: '1.2.3', + build_num: 123, + build_sha: 'abcdefghijklmnopqrstux', + build_sha_short: 'abcde', + project_type: 'project-type', + }, + organization: { + key: 'organization-id', + is_elastic_staff: true, + }, + }; + describe('setup', () => { test('emits the initial metadata', async () => { - const initialMetadata = { userId: 'fake-user-id', kibanaVersion: 'version' }; metadataService.setup(initialMetadata); await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual( - initialMetadata + multiContextFormat ); }); test( 'emits inTrial when trialEndDate is provided', fakeSchedulers(async (advance) => { - const initialMetadata = { - userId: 'fake-user-id', - kibanaVersion: 'version', - trialEndDate: new Date(0).toISOString(), - }; - metadataService.setup(initialMetadata); + metadataService.setup({ ...initialMetadata, trial_end_date: new Date(0) }); // Still equals initialMetadata - await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual( - initialMetadata - ); + await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual({ + ...multiContextFormat, + organization: { + ...multiContextFormat.organization, + trial_end_date: new Date(0), + }, + }); // After scheduler kicks in... advance(1); // The timer kicks in first on 0 (but let's give us 1ms so the trial is expired) await new Promise((resolve) => process.nextTick(resolve)); // The timer triggers a promise, so we need to skip to the next tick await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual({ - ...initialMetadata, - inTrial: false, + ...multiContextFormat, + organization: { + ...multiContextFormat.organization, + trial_end_date: new Date(0), + in_trial: false, + }, }); }) ); }); describe('start', () => { - const initialMetadata = { userId: 'fake-user-id', kibanaVersion: 'version' }; beforeEach(() => { metadataService.setup(initialMetadata); }); @@ -83,19 +112,22 @@ describe('MetadataService', () => { test( 'emits hasData after resolving the `hasUserDataView`', fakeSchedulers(async (advance) => { - metadataService.start({ hasDataFetcher: async () => ({ hasData: true }) }); + metadataService.start({ hasDataFetcher: async () => ({ has_data: true }) }); // Still equals initialMetadata await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual( - initialMetadata + multiContextFormat ); // After scheduler kicks in... advance(1); // The timer kicks in first on 0 (but let's give us 1ms so the trial is expired) await new Promise((resolve) => process.nextTick(resolve)); // The timer triggers a promise, so we need to skip to the next tick await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual({ - ...initialMetadata, - hasData: true, + ...multiContextFormat, + kibana: { + ...multiContextFormat.kibana, + has_data: true, + }, }); }) ); @@ -107,7 +139,7 @@ describe('MetadataService', () => { metadataService.start({ hasDataFetcher: async () => { if (count++ > 0) { - return { hasData: true }; + return { has_data: true }; } else { throw new Error('Something went wrong'); } @@ -116,7 +148,7 @@ describe('MetadataService', () => { // Still equals initialMetadata await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual( - initialMetadata + multiContextFormat ); // After scheduler kicks in... @@ -125,7 +157,7 @@ describe('MetadataService', () => { // Still equals initialMetadata await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual( - initialMetadata + multiContextFormat ); expect(logger.warn).toHaveBeenCalledTimes(1); expect(logger.warn.mock.calls[0][0]).toMatchInlineSnapshot( @@ -136,8 +168,11 @@ describe('MetadataService', () => { advance(1_001); await new Promise((resolve) => process.nextTick(resolve)); // The timer triggers a promise, so we need to skip to the next tick await expect(firstValueFrom(metadataService.userMetadata$)).resolves.toStrictEqual({ - ...initialMetadata, - hasData: true, + ...multiContextFormat, + kibana: { + ...multiContextFormat.kibana, + has_data: true, + }, }); }) ); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.ts index ddb2bc86d7dca..06c28a16c8032 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/metadata_service.ts @@ -17,23 +17,87 @@ import { takeUntil, takeWhile, timer, + map, } from 'rxjs'; import { type Duration } from 'moment'; import type { Logger } from '@kbn/logging'; +import type { BuildFlavor } from '@kbn/config'; +import type { EvaluationContext } from '@kbn/core-feature-flags-browser'; +import { removeUndefined } from './remove_undefined'; export interface MetadataServiceStartContract { - hasDataFetcher: () => Promise<{ hasData: boolean }>; + hasDataFetcher: () => Promise<{ has_data: boolean }>; } -export interface UserMetadata extends Record { +export interface FlatMetadata { // Static values - userId: string; - kibanaVersion: string; - trialEndDate?: string; - isElasticStaff?: boolean; + /** + * The deployment/project ID + * @group Kibana Static Values + */ + instanceKey?: string; + /** + * The offering (serverless/traditional) + * @group Kibana Static Values + */ + offering: BuildFlavor; + /** + * The Kibana version + * @group Kibana Static Values + */ + version: string; + /** + * The Kibana build number + * @group Kibana Static Values + */ + build_num: number; + /** + * The Kibana build sha + * @group Kibana Static Values + */ + build_sha: string; + /** + * The Kibana build sha (short format) + * @group Kibana Static Values + */ + build_sha_short: string; + /** + * The Serverless project type (only available on serverless) + * @group Kibana Static Values + */ + project_type?: string; + /** + * Whether this is a canary or non-canary project/deployment + * @group Kibana Static Values + */ + orchestrator_target?: string; + /** + * The Elastic Cloud Organization's ID + * @group Organization Static Values + */ + organizationKey?: string; + /** + * The Elastic Cloud Organization's trial end date. + * @group Organization Static Values + */ + trial_end_date?: Date; + /** + * Is the Elastic Cloud Organization owned by an Elastician. + * @group Organization Static Values + */ + is_elastic_staff?: boolean; + // Dynamic/calculated values - inTrial?: boolean; - hasData?: boolean; + /** + * Is the Elastic Cloud Organization in trial. + * @group Organization Dynamic Values + */ + in_trial?: boolean; + /** + * Does the deployment/project have any data ingested? + * @group Kibana Dynamic Values + */ + has_data?: boolean; } export interface MetadataServiceConfig { @@ -41,31 +105,58 @@ export interface MetadataServiceConfig { } export class MetadataService { - private readonly _userMetadata$ = new BehaviorSubject(undefined); + private readonly _userMetadata$ = new BehaviorSubject(undefined); private readonly stop$ = new Subject(); constructor(private readonly config: MetadataServiceConfig, private readonly logger: Logger) {} - public setup(initialUserMetadata: UserMetadata) { + public setup(initialUserMetadata: FlatMetadata) { this._userMetadata$.next(initialUserMetadata); // Calculate `inTrial` based on the `trialEndDate`. // Elastic Cloud allows customers to end their trials earlier or even extend it in some cases, but this is a good compromise for now. - const trialEndDate = initialUserMetadata.trialEndDate; + const trialEndDate = initialUserMetadata.trial_end_date; if (trialEndDate) { this.scheduleUntil( - () => ({ inTrial: Date.now() <= new Date(trialEndDate).getTime() }), + () => ({ in_trial: Date.now() <= new Date(trialEndDate).getTime() }), // Stop recalculating inTrial when the user is no-longer in trial - (metadata) => metadata.inTrial === false + (metadata) => metadata.in_trial === false ); } } - public get userMetadata$(): Observable { + public get userMetadata$(): Observable { return this._userMetadata$.pipe( filter(Boolean), // Ensure we don't return undefined debounceTime(100), // Swallows multiple emissions that may occur during bootstrap - distinct((meta) => [meta.inTrial, meta.hasData].join('-')), // Checks if any of the dynamic fields have changed + distinct((meta) => [meta.in_trial, meta.has_data].join('-')), // Checks if any of the dynamic fields have changed + map((metadata) => { + const context: EvaluationContext = { + kind: 'multi', + ...(metadata.instanceKey && { + kibana: removeUndefined({ + key: metadata.instanceKey, + offering: metadata.offering, + version: metadata.version, + build_num: metadata.build_num, + build_sha: metadata.build_sha, + build_sha_short: metadata.build_sha_short, + project_type: metadata.project_type, + orchestrator_target: metadata.orchestrator_target, + has_data: metadata.has_data, + }), + }), + ...(metadata.organizationKey && { + organization: removeUndefined({ + key: metadata.organizationKey, + is_elastic_staff: metadata.is_elastic_staff, + in_trial: metadata.in_trial, + trial_end_date: metadata.trial_end_date, + }), + }), + }; + return context; + }), shareReplay(1) ); } @@ -77,7 +168,7 @@ export class MetadataService { this.scheduleUntil( async () => hasDataFetcher(), // Stop checking the moment the user has any data - (metadata) => metadata.hasData === true + (metadata) => metadata.has_data === true ); } @@ -87,14 +178,14 @@ export class MetadataService { } /** - * Schedules a timer that calls `fn` to update the {@link UserMetadata} until `untilFn` returns true. + * Schedules a timer that calls `fn` to update the {@link FlatMetadata} until `untilFn` returns true. * @param fn Method to calculate the dynamic metadata. * @param untilFn Method that returns true when the scheduler should stop calling fn (potentially because the dynamic value is not expected to change anymore). * @private */ private scheduleUntil( - fn: () => Partial | Promise>, - untilFn: (value: UserMetadata) => boolean + fn: () => Partial | Promise>, + untilFn: (value: FlatMetadata) => boolean ) { timer(0, this.config.metadata_refresh_interval.asMilliseconds()) .pipe( diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/remove_undefined.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/remove_undefined.ts new file mode 100644 index 0000000000000..437335a0f4096 --- /dev/null +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/common/metadata_service/remove_undefined.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 type NonUndefinedProps = { [P in keyof T]-?: NonNullable }; + +export function removeUndefined>( + record: T +): NonUndefinedProps { + return Object.fromEntries( + Object.entries(record).filter(([, val]) => typeof val !== 'undefined') + ) as NonUndefinedProps; +} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/mocks.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/mocks.ts deleted file mode 100644 index fd18c3ee2420d..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/mocks.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { CloudExperimentsPluginStart } from './types'; - -function createStartMock(): jest.Mocked { - return { - getVariation: jest.fn(), - reportMetric: jest.fn(), - }; -} - -export const cloudExperimentsMock = { - createStartMock, -}; diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts deleted file mode 100755 index e7b87eee12fc9..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FEATURE_FLAG_NAMES, METRIC_NAMES } from './constants'; - -/** - * The names of the feature flags declared in Kibana. - * Valid keys are defined in {@link FEATURE_FLAG_NAMES}. When using a new feature flag, add the name to the list. - * - * @public - */ -export type CloudExperimentsFeatureFlagNames = keyof typeof FEATURE_FLAG_NAMES; - -/** - * The contract of the start lifecycle method - * - * @public - * @deprecated in favor of the upcoming Core Feature Flags Service. - */ -export interface CloudExperimentsPluginStart { - /** - * Fetch the configuration assigned to variation `configKey`. If nothing is found, fallback to `defaultValue`. - * @param featureFlagName The name of the key to find the config variation. {@link CloudExperimentsFeatureFlagNames}. - * @param defaultValue The fallback value in case no variation is found. - * - * @public - * @deprecated in favor of the upcoming Core Feature Flags Service. - */ - getVariation: ( - featureFlagName: CloudExperimentsFeatureFlagNames, - defaultValue: Data - ) => Promise; - /** - * Report metrics back to the A/B testing service to measure the conversion rate for each variation in the experiment. - * @param metric {@link CloudExperimentsMetric} - * - * @public - * @deprecated in favor of the upcoming Core Feature Flags Service. - */ - reportMetric: (metric: CloudExperimentsMetric) => void; -} - -/** - * The names of the metrics declared in Kibana. - * Valid keys are defined in {@link METRIC_NAMES}. When reporting a new metric, add the name to the list. - * - * @public - */ -export type CloudExperimentsMetricNames = keyof typeof METRIC_NAMES; - -/** - * Definition of the metric to report back to the A/B testing service to measure the conversions. - * - * @public - */ -export interface CloudExperimentsMetric { - /** - * The name of the metric {@link CloudExperimentsMetricNames} - */ - name: CloudExperimentsMetricNames; - /** - * Any optional data to enrich the context of the metric. Or if the conversion is based on a non-numeric value. - */ - meta?: Data; - /** - * The numeric value of the metric. Bear in mind that they are averaged by the underlying solution. - * Typical values to report here are time-to-action, number of panels in a loaded dashboard, and page load time. - */ - value?: number; -} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc index 743bf70001dd6..3c6b9f8279f01 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc @@ -14,9 +14,7 @@ ], "requiredPlugins": [ "cloud", - "dataViews" - ], - "optionalPlugins": [ + "dataViews", "usageCollection" ] } diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/index.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/index.ts deleted file mode 100644 index ac961286b7043..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/index.ts +++ /dev/null @@ -1,12 +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. - */ - -export { - LaunchDarklyClient, - type LaunchDarklyUserMetadata, - type LaunchDarklyClientConfig, -} from './launch_darkly_client'; diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.mock.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.mock.ts deleted file mode 100644 index b6a43a7d0715b..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.mock.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 type { LDClient } from 'launchdarkly-js-client-sdk'; - -export function createLaunchDarklyClientMock(): jest.Mocked { - return { - identify: jest.fn(), - waitForInitialization: jest.fn(), - variation: jest.fn(), - track: jest.fn(), - flush: jest.fn(), - } as unknown as jest.Mocked; // Using casting because we only use these APIs. No need to declare everything. -} - -export const ldClientMock = createLaunchDarklyClientMock(); - -export const launchDarklyLibraryMock = { - initialize: jest.fn(), - basicLogger: jest.fn(), -}; - -jest.doMock('launchdarkly-js-client-sdk', () => launchDarklyLibraryMock); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.ts deleted file mode 100644 index 998733707f0c0..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.test.ts +++ /dev/null @@ -1,195 +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 { coreMock } from '@kbn/core/public/mocks'; -import { ldClientMock, launchDarklyLibraryMock } from './launch_darkly_client.test.mock'; -import { LaunchDarklyClient, type LaunchDarklyClientConfig } from './launch_darkly_client'; - -describe('LaunchDarklyClient - browser', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - const config: LaunchDarklyClientConfig = { - client_id: 'fake-client-id', - client_log_level: 'debug', - }; - - describe('Public APIs', () => { - let client: LaunchDarklyClient; - const testUserMetadata = { userId: 'fake-user-id', kibanaVersion: 'version' }; - const loggerWarnSpy = jest.fn(); - beforeEach(() => { - const initializerContext = coreMock.createPluginInitializerContext(); - const logger = initializerContext.logger.get(); - logger.warn = loggerWarnSpy; - client = new LaunchDarklyClient(config, 'version', logger); - }); - - describe('updateUserMetadata', () => { - test("calls the client's initialize method with all the possible values", async () => { - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - - const topFields = { - name: 'First Last', - firstName: 'First', - lastName: 'Last', - email: 'first.last@boring.co', - avatar: 'fake-blue-avatar', - ip: 'my-weird-ip', - country: 'distributed', - // intentionally adding this to make sure the code is overriding appropriately - kind: 'other kind', - key: 'other user', - }; - - const extraFields = { - other_field: 'my other custom field', - kibanaVersion: 'version', - }; - - await client.updateUserMetadata({ userId: 'fake-user-id', ...topFields, ...extraFields }); - - expect(launchDarklyLibraryMock.initialize).toHaveBeenCalledWith( - 'fake-client-id', - { - ...topFields, - ...extraFields, - kind: 'user', - key: 'fake-user-id', - }, - { - application: { id: 'kibana-browser', version: 'version' }, - logger: undefined, - } - ); - }); - - test('sets a minimum amount of info', async () => { - await client.updateUserMetadata({ userId: 'fake-user-id', kibanaVersion: 'version' }); - - expect(launchDarklyLibraryMock.initialize).toHaveBeenCalledWith( - 'fake-client-id', - { - kind: 'user', - key: 'fake-user-id', - kibanaVersion: 'version', - }, - { - application: { id: 'kibana-browser', version: 'version' }, - logger: undefined, - } - ); - }); - - test('calls identify if an update comes after initializing the client', async () => { - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - await client.updateUserMetadata({ userId: 'fake-user-id', kibanaVersion: 'version' }); - - expect(launchDarklyLibraryMock.initialize).toHaveBeenCalledWith( - 'fake-client-id', - { - kind: 'user', - key: 'fake-user-id', - kibanaVersion: 'version', - }, - { - application: { id: 'kibana-browser', version: 'version' }, - logger: undefined, - } - ); - expect(ldClientMock.identify).not.toHaveBeenCalled(); - - // Update user metadata a 2nd time - launchDarklyLibraryMock.initialize.mockReset(); - await client.updateUserMetadata({ userId: 'fake-user-id', kibanaVersion: 'version' }); - expect(ldClientMock.identify).toHaveBeenCalledWith({ - kind: 'user', - key: 'fake-user-id', - kibanaVersion: 'version', - }); - expect(launchDarklyLibraryMock.initialize).not.toHaveBeenCalled(); - }); - }); - - describe('getVariation', () => { - test('waits for the user to been defined and does NOT return default value', async () => { - ldClientMock.variation.mockResolvedValue(1234); // Expected is 1234 - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - const promise = client.getVariation('my-feature-flag', 123); // Default value is 123 - - await client.updateUserMetadata(testUserMetadata); - await expect(promise).resolves.toStrictEqual(1234); - expect(ldClientMock.variation).toHaveBeenCalledTimes(1); - }); - - test('return default value if canceled', async () => { - ldClientMock.variation.mockResolvedValue(1234); - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - const promise = client.getVariation('my-feature-flag', 123); // Default value is 123 - - client.cancel(); - - await client.updateUserMetadata(testUserMetadata); - await expect(promise).resolves.toStrictEqual(123); // default value - expect(ldClientMock.variation).toHaveBeenCalledTimes(0); - expect(launchDarklyLibraryMock.initialize).not.toHaveBeenCalled(); - }); - - test('calls the LaunchDarkly client when the user has been defined', async () => { - ldClientMock.variation.mockResolvedValue(1234); - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - await client.updateUserMetadata(testUserMetadata); - await expect(client.getVariation('my-feature-flag', 123)).resolves.toStrictEqual(1234); - expect(ldClientMock.variation).toHaveBeenCalledTimes(1); - expect(ldClientMock.variation).toHaveBeenCalledWith('my-feature-flag', 123); - }); - }); - - describe('reportMetric', () => { - test('does not call track if the user has not been defined', () => { - client.reportMetric('my-feature-flag', {}, 123); - expect(ldClientMock.track).toHaveBeenCalledTimes(0); - }); - - test('calls the LaunchDarkly client when the user has been defined', async () => { - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - await client.updateUserMetadata(testUserMetadata); - client.reportMetric('my-feature-flag', {}, 123); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the client to be available - expect(ldClientMock.track).toHaveBeenCalledTimes(1); - expect(ldClientMock.track).toHaveBeenCalledWith('my-feature-flag', {}, 123); - }); - }); - - describe('stop', () => { - test('flushes the events', async () => { - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - await client.updateUserMetadata(testUserMetadata); - - ldClientMock.flush.mockResolvedValue(); - expect(() => client.stop()).not.toThrow(); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the client to be available - expect(ldClientMock.flush).toHaveBeenCalledTimes(1); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the flush resolution - }); - - test('handles errors when flushing events', async () => { - launchDarklyLibraryMock.initialize.mockReturnValue(ldClientMock); - await client.updateUserMetadata(testUserMetadata); - - const err = new Error('Something went terribly wrong'); - ldClientMock.flush.mockRejectedValue(err); - expect(() => client.stop()).not.toThrow(); - await new Promise((resolve) => process.nextTick(resolve)); - expect(ldClientMock.flush).toHaveBeenCalledTimes(1); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the flush resolution - expect(loggerWarnSpy).toHaveBeenCalledWith(err); - }); - }); - }); -}); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.ts deleted file mode 100644 index bc2064ec6bcf0..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/public/launch_darkly_client/launch_darkly_client.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - type LDClient, - type LDSingleKindContext, - type LDLogLevel, -} from 'launchdarkly-js-client-sdk'; -import { BehaviorSubject, filter, firstValueFrom, switchMap } from 'rxjs'; -import type { Logger } from '@kbn/logging'; - -export interface LaunchDarklyClientConfig { - client_id: string; - client_log_level: LDLogLevel; -} - -export interface LaunchDarklyUserMetadata - extends Record { - userId: string; -} - -export class LaunchDarklyClient { - private initialized = false; - private canceled = false; - private launchDarklyClientSub$ = new BehaviorSubject(null); - private loadingClient$ = new BehaviorSubject(true); - private launchDarklyClient$ = this.loadingClient$.pipe( - // To avoid a racing condition when trying to get a variation before the client is ready - // we use the `switchMap` operator to ensure we only return the client when it has been initialized. - filter((loading) => !loading), - switchMap(() => this.launchDarklyClientSub$) - ); - - constructor( - private readonly ldConfig: LaunchDarklyClientConfig, - private readonly kibanaVersion: string, - private readonly logger: Logger - ) {} - - public async updateUserMetadata(userMetadata: LaunchDarklyUserMetadata) { - if (this.canceled) return; - - const { userId, ...userMetadataWithoutUserId } = userMetadata; - const launchDarklyUser: LDSingleKindContext = { - ...userMetadataWithoutUserId, - kind: 'user', - key: userId, - }; - - let launchDarklyClient: LDClient | null = null; - if (this.initialized) { - launchDarklyClient = await this.getClient(); - } - - if (launchDarklyClient) { - await launchDarklyClient.identify(launchDarklyUser); - } else { - this.initialized = true; - const { initialize, basicLogger } = await import('launchdarkly-js-client-sdk'); - launchDarklyClient = initialize(this.ldConfig.client_id, launchDarklyUser, { - application: { id: 'kibana-browser', version: this.kibanaVersion }, - logger: basicLogger({ level: this.ldConfig.client_log_level }), - }); - this.launchDarklyClientSub$.next(launchDarklyClient); - this.loadingClient$.next(false); - } - } - - public async getVariation(configKey: string, defaultValue: Data): Promise { - const launchDarklyClient = await this.getClient(); - if (!launchDarklyClient) return defaultValue; // Skip any action if no LD User is defined - await launchDarklyClient.waitForInitialization(); - return await launchDarklyClient.variation(configKey, defaultValue); - } - - public reportMetric(metricName: string, meta?: unknown, value?: number): void { - this.getClient().then((launchDarklyClient) => { - if (!launchDarklyClient) return; // Skip any action if no LD User is defined - launchDarklyClient.track(metricName, meta, value); - }); - } - - public stop() { - this.getClient().then((launchDarklyClient) => { - launchDarklyClient?.flush().catch((err) => { - this.logger.warn(err); - }); - }); - } - - public cancel() { - this.initialized = true; - this.canceled = true; - this.loadingClient$.next(false); - } - - private getClient(): Promise { - return firstValueFrom(this.launchDarklyClient$, { defaultValue: null }); - } -} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.test.ts index 7c945afcf53f3..59a20b198e70b 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.test.ts @@ -9,20 +9,8 @@ import { duration } from 'moment'; import { coreMock } from '@kbn/core/public/mocks'; import { cloudMock } from '@kbn/cloud-plugin/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; -import { CloudExperimentsPluginStart } from '../common'; -import { FEATURE_FLAG_NAMES } from '../common/constants'; import { CloudExperimentsPlugin } from './plugin'; -import { LaunchDarklyClient } from './launch_darkly_client'; import { MetadataService } from '../common/metadata_service'; -jest.mock('./launch_darkly_client'); - -function getLaunchDarklyClientInstanceMock() { - const launchDarklyClientInstanceMock = ( - LaunchDarklyClient as jest.MockedClass - ).mock.instances[0] as jest.Mocked; - - return launchDarklyClientInstanceMock; -} describe('Cloud Experiments public plugin', () => { jest.spyOn(console, 'debug').mockImplementation(); // silence console.debug logs @@ -34,59 +22,40 @@ describe('Cloud Experiments public plugin', () => { describe('constructor', () => { test('successfully creates a new plugin if provided an empty configuration', () => { const initializerContext = coreMock.createPluginInitializerContext(); - // @ts-expect-error it's defined as readonly but the mock is not. - initializerContext.env.mode.dev = true; // ensure it's true + initializerContext.env.mode = { + name: 'development', + dev: true, // ensure it's true + prod: false, + }; const plugin = new CloudExperimentsPlugin(initializerContext); expect(plugin).toHaveProperty('setup'); expect(plugin).toHaveProperty('start'); expect(plugin).toHaveProperty('stop'); - expect(plugin).toHaveProperty('flagOverrides', undefined); - expect(plugin).toHaveProperty('launchDarklyClient', undefined); expect(plugin).toHaveProperty('metadataService', expect.any(MetadataService)); }); test('fails if launch_darkly is not provided in the config and it is a non-dev environment', () => { const initializerContext = coreMock.createPluginInitializerContext(); - // @ts-expect-error it's defined as readonly but the mock is not. - initializerContext.env.mode.dev = false; + initializerContext.env.mode = { + name: 'production', + dev: false, + prod: true, // ensure it's true + }; expect(() => new CloudExperimentsPlugin(initializerContext)).toThrowError( 'xpack.cloud_integrations.experiments.launch_darkly configuration should exist' ); }); - - test('it initializes the flagOverrides property', () => { - const initializerContext = coreMock.createPluginInitializerContext({ - flag_overrides: { my_flag: '1234' }, - }); - // @ts-expect-error it's defined as readonly but the mock is not. - initializerContext.env.mode.dev = true; // ensure it's true - const plugin = new CloudExperimentsPlugin(initializerContext); - expect(plugin).toHaveProperty('flagOverrides', { my_flag: '1234' }); - }); - - test('it initializes the LaunchDarkly client', () => { - const initializerContext = coreMock.createPluginInitializerContext({ - launch_darkly: { client_id: 'sdk-1234' }, - }); - const plugin = new CloudExperimentsPlugin(initializerContext); - expect(LaunchDarklyClient).toHaveBeenCalledTimes(1); - expect(plugin).toHaveProperty('launchDarklyClient', expect.any(LaunchDarklyClient)); - }); }); describe('setup', () => { let plugin: CloudExperimentsPlugin; - let metadataServiceSetupSpy: jest.SpyInstance; beforeEach(() => { const initializerContext = coreMock.createPluginInitializerContext({ launch_darkly: { client_id: '1234' }, - flag_overrides: { my_flag: '1234' }, metadata_refresh_interval: duration(1, 'h'), }); plugin = new CloudExperimentsPlugin(initializerContext); - // eslint-disable-next-line dot-notation - metadataServiceSetupSpy = jest.spyOn(plugin['metadataService'], 'setup'); }); afterEach(() => { @@ -100,60 +69,16 @@ describe('Cloud Experiments public plugin', () => { }) ).toBeUndefined(); }); - - describe('identifyUser', () => { - test('it skips creating the client if no client id provided in the config', () => { - const initializerContext = coreMock.createPluginInitializerContext({ - flag_overrides: { my_flag: '1234' }, - metadata_refresh_interval: duration(1, 'h'), - }); - const customPlugin = new CloudExperimentsPlugin(initializerContext); - customPlugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - expect(customPlugin).toHaveProperty('launchDarklyClient', undefined); - }); - - test('it skips identifying the user if cloud is not enabled and cancels loading the LDclient', () => { - const ldClientCancelSpy = jest.spyOn(LaunchDarklyClient.prototype, 'cancel'); - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: false }, - }); - - expect(metadataServiceSetupSpy).not.toHaveBeenCalled(); - expect(ldClientCancelSpy).toHaveBeenCalled(); // Cancel loading the client - }); - - test('it initializes the LaunchDarkly client', async () => { - const ldClientCancelSpy = jest.spyOn(LaunchDarklyClient.prototype, 'cancel'); - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - - expect(metadataServiceSetupSpy).toHaveBeenCalledWith({ - isElasticStaff: true, - kibanaVersion: 'version', - trialEndDate: '2020-10-01T14:13:12.000Z', - userId: 'mock-deployment-id', - }); - expect(ldClientCancelSpy).not.toHaveBeenCalled(); - }); - }); }); describe('start', () => { let plugin: CloudExperimentsPlugin; - let launchDarklyInstanceMock: jest.Mocked; - - const firstKnownFlag = Object.keys(FEATURE_FLAG_NAMES)[0] as keyof typeof FEATURE_FLAG_NAMES; beforeEach(() => { const initializerContext = coreMock.createPluginInitializerContext({ launch_darkly: { client_id: '1234' }, - flag_overrides: { [firstKnownFlag]: '1234' }, }); plugin = new CloudExperimentsPlugin(initializerContext); - launchDarklyInstanceMock = getLaunchDarklyClientInstanceMock(); }); afterEach(() => { @@ -163,168 +88,35 @@ describe('Cloud Experiments public plugin', () => { test('returns the contract', () => { plugin.setup(coreMock.createSetup(), { cloud: cloudMock.createSetup() }); const startContract = plugin.start(coreMock.createStart(), { - cloud: cloudMock.createStart(), dataViews: dataViewPluginMocks.createStartContract(), }); - expect(startContract).toStrictEqual( - expect.objectContaining({ - getVariation: expect.any(Function), - reportMetric: expect.any(Function), - }) - ); + expect(startContract).toBeUndefined(); }); - test('triggers a userMetadataUpdate for `hasData`', async () => { - plugin.setup(coreMock.createSetup(), { + test('updates the context with `has_data`', async () => { + const coreSetup = coreMock.createSetup(); + plugin.setup(coreSetup, { cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, }); const dataViews = dataViewPluginMocks.createStartContract(); - plugin.start(coreMock.createStart(), { cloud: cloudMock.createStart(), dataViews }); + plugin.start(coreMock.createStart(), { dataViews }); // After scheduler kicks in... await new Promise((resolve) => setTimeout(resolve, 200)); - // Using a timeout of 0ms to let the `timer` kick in. - // For some reason, fakeSchedulers is not working on browser-side tests :shrug: - expect(launchDarklyInstanceMock.updateUserMetadata).toHaveBeenCalledWith( + expect(coreSetup.featureFlags.appendContext).toHaveBeenCalledWith( expect.objectContaining({ - hasData: true, + kind: 'multi', + kibana: expect.objectContaining({ + has_data: true, + }), }) ); }); - - describe('getVariation', () => { - let startContract: CloudExperimentsPluginStart; - describe('with the client created', () => { - beforeEach(() => { - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - startContract = plugin.start(coreMock.createStart(), { - cloud: cloudMock.createStart(), - dataViews: dataViewPluginMocks.createStartContract(), - }); - }); - - test('uses the flag overrides to respond early', async () => { - await expect(startContract.getVariation(firstKnownFlag, 123)).resolves.toStrictEqual( - '1234' - ); - }); - - test('calls the client', async () => { - launchDarklyInstanceMock.getVariation.mockResolvedValue('12345'); - await expect( - startContract.getVariation( - // @ts-expect-error We only allow existing flags in FEATURE_FLAG_NAMES - 'some-random-flag', - 123 - ) - ).resolves.toStrictEqual('12345'); - expect(launchDarklyInstanceMock.getVariation).toHaveBeenCalledWith( - undefined, // it couldn't find it in FEATURE_FLAG_NAMES - 123 - ); - }); - }); - - describe('with the client not created', () => { - beforeEach(() => { - const initializerContext = coreMock.createPluginInitializerContext({ - flag_overrides: { [firstKnownFlag]: '1234' }, - metadata_refresh_interval: duration(1, 'h'), - }); - const customPlugin = new CloudExperimentsPlugin(initializerContext); - customPlugin.setup(coreMock.createSetup(), { - cloud: cloudMock.createSetup(), - }); - expect(customPlugin).toHaveProperty('launchDarklyClient', undefined); - startContract = customPlugin.start(coreMock.createStart(), { - cloud: cloudMock.createStart(), - dataViews: dataViewPluginMocks.createStartContract(), - }); - }); - - test('uses the flag overrides to respond early', async () => { - await expect(startContract.getVariation(firstKnownFlag, 123)).resolves.toStrictEqual( - '1234' - ); - }); - - test('returns the default value without calling the client', async () => { - await expect( - startContract.getVariation( - // @ts-expect-error We only allow existing flags in FEATURE_FLAG_NAMES - 'some-random-flag', - 123 - ) - ).resolves.toStrictEqual(123); - expect(launchDarklyInstanceMock.getVariation).not.toHaveBeenCalled(); - }); - }); - }); - - describe('reportMetric', () => { - let startContract: CloudExperimentsPluginStart; - describe('with the client created', () => { - beforeEach(() => { - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - startContract = plugin.start(coreMock.createStart(), { - cloud: cloudMock.createStart(), - dataViews: dataViewPluginMocks.createStartContract(), - }); - }); - - test('calls the track API', () => { - startContract.reportMetric({ - // @ts-expect-error We only allow existing flags in METRIC_NAMES - name: 'my-flag', - meta: {}, - value: 1, - }); - expect(launchDarklyInstanceMock.reportMetric).toHaveBeenCalledWith( - undefined, // it couldn't find it in METRIC_NAMES - {}, - 1 - ); - }); - }); - - describe('with the client not created', () => { - beforeEach(() => { - const initializerContext = coreMock.createPluginInitializerContext({ - flag_overrides: { [firstKnownFlag]: '1234' }, - metadata_refresh_interval: duration(1, 'h'), - }); - const customPlugin = new CloudExperimentsPlugin(initializerContext); - customPlugin.setup(coreMock.createSetup(), { - cloud: cloudMock.createSetup(), - }); - expect(customPlugin).toHaveProperty('launchDarklyClient', undefined); - startContract = customPlugin.start(coreMock.createStart(), { - cloud: cloudMock.createStart(), - dataViews: dataViewPluginMocks.createStartContract(), - }); - }); - - test('calls the track API', () => { - startContract.reportMetric({ - // @ts-expect-error We only allow existing flags in METRIC_NAMES - name: 'my-flag', - meta: {}, - value: 1, - }); - expect(launchDarklyInstanceMock.reportMetric).not.toHaveBeenCalled(); - }); - }); - }); }); describe('stop', () => { let plugin: CloudExperimentsPlugin; - let launchDarklyInstanceMock: jest.Mocked; beforeEach(() => { const initializerContext = coreMock.createPluginInitializerContext({ @@ -333,19 +125,19 @@ describe('Cloud Experiments public plugin', () => { metadata_refresh_interval: duration(1, 'h'), }); plugin = new CloudExperimentsPlugin(initializerContext); - launchDarklyInstanceMock = getLaunchDarklyClientInstanceMock(); plugin.setup(coreMock.createSetup(), { cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, }); plugin.start(coreMock.createStart(), { - cloud: cloudMock.createStart(), dataViews: dataViewPluginMocks.createStartContract(), }); }); test('flushes the events on stop', () => { + // eslint-disable-next-line dot-notation + const metadataServiceStopSpy = jest.spyOn(plugin['metadataService'], 'stop'); expect(() => plugin.stop()).not.toThrow(); - expect(launchDarklyInstanceMock.stop).toHaveBeenCalledTimes(1); + expect(metadataServiceStopSpy).toHaveBeenCalledTimes(1); }); }); }); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.ts index a201c98df1ea3..ee95019e6fa17 100755 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/public/plugin.ts @@ -5,53 +5,42 @@ * 2.0. */ -import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; -import { get, has } from 'lodash'; import { duration } from 'moment'; -import { concatMap } from 'rxjs'; -import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public'; -import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { Logger } from '@kbn/logging'; - -import { LaunchDarklyClient, type LaunchDarklyClientConfig } from './launch_darkly_client'; -import type { - CloudExperimentsFeatureFlagNames, - CloudExperimentsMetric, - CloudExperimentsPluginStart, -} from '../common'; -import { MetadataService } from '../common/metadata_service'; -import { FEATURE_FLAG_NAMES, METRIC_NAMES } from '../common/constants'; +import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; +import type { CloudSetup } from '@kbn/cloud-plugin/public'; +import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { LaunchDarklyClientProvider } from '@openfeature/launchdarkly-client-provider'; +import { type LDLogLevel, basicLogger } from 'launchdarkly-js-client-sdk'; +import { initializeMetadata, MetadataService } from '../common/metadata_service'; interface CloudExperimentsPluginSetupDeps { cloud: CloudSetup; } interface CloudExperimentsPluginStartDeps { - cloud: CloudStart; dataViews: DataViewsPublicPluginStart; } +interface LaunchDarklyClientConfig { + client_id: string; + client_log_level: LDLogLevel; +} + /** * Browser-side implementation of the Cloud Experiments plugin */ export class CloudExperimentsPlugin - implements Plugin + implements Plugin { private readonly logger: Logger; private readonly metadataService: MetadataService; - private readonly launchDarklyClient?: LaunchDarklyClient; - private readonly kibanaVersion: string; - private readonly flagOverrides?: Record; - private readonly isDev: boolean; /** Constructor of the plugin **/ - constructor(initializerContext: PluginInitializerContext) { + constructor(private readonly initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); - this.isDev = initializerContext.env.mode.dev; - this.kibanaVersion = initializerContext.env.packageInfo.version; const config = initializerContext.config.get<{ launch_darkly?: LaunchDarklyClientConfig; - flag_overrides?: Record; metadata_refresh_interval: string; }>(); @@ -60,9 +49,6 @@ export class CloudExperimentsPlugin this.logger.get('metadata') ); - if (config.flag_overrides) { - this.flagOverrides = config.flag_overrides; - } const ldConfig = config.launch_darkly; if (!ldConfig?.client_id && !initializerContext.env.mode.dev) { // If the plugin is enabled, and it's in prod mode, launch_darkly must exist @@ -71,9 +57,6 @@ export class CloudExperimentsPlugin 'xpack.cloud_integrations.experiments.launch_darkly configuration should exist' ); } - if (ldConfig?.client_id) { - this.launchDarklyClient = new LaunchDarklyClient(ldConfig, this.kibanaVersion, this.logger); - } } /** @@ -82,83 +65,61 @@ export class CloudExperimentsPlugin * @param deps {@link CloudExperimentsPluginSetupDeps} */ public setup(core: CoreSetup, deps: CloudExperimentsPluginSetupDeps) { - if (deps.cloud.isCloudEnabled && deps.cloud.deploymentId && this.launchDarklyClient) { - this.metadataService.setup({ - userId: deps.cloud.deploymentId, - kibanaVersion: this.kibanaVersion, - trialEndDate: deps.cloud.trialEndDate?.toISOString(), - isElasticStaff: deps.cloud.isElasticStaffOwned, - }); - } else { - this.launchDarklyClient?.cancel(); + initializeMetadata({ + metadataService: this.metadataService, + initializerContext: this.initializerContext, + cloud: deps.cloud, + featureFlags: core.featureFlags, + logger: this.logger, + }); + + const launchDarklyOpenFeatureProvider = this.createOpenFeatureProvider(); + if (launchDarklyOpenFeatureProvider) { + core.featureFlags.setProvider(launchDarklyOpenFeatureProvider); } } /** - * Returns the contract {@link CloudExperimentsPluginStart} + * Sets the metadata service update hooks * @param core {@link CoreStart} + * @param deps {@link CloudExperimentsPluginStartDeps} */ - public start( - core: CoreStart, - { cloud, dataViews }: CloudExperimentsPluginStartDeps - ): CloudExperimentsPluginStart { - if (cloud.isCloudEnabled) { - this.metadataService.start({ - hasDataFetcher: async () => ({ hasData: await dataViews.hasData.hasUserDataView() }), - }); - - // We only subscribe to the user metadata updates if Cloud is enabled. - // This way, since the user is not identified, it cannot retrieve Feature Flags from LaunchDarkly when not running on Cloud. - this.metadataService.userMetadata$ - .pipe( - // Using concatMap to ensure we call the promised update in an orderly manner to avoid concurrency issues - concatMap( - async (userMetadata) => await this.launchDarklyClient?.updateUserMetadata(userMetadata) - ) - ) - .subscribe(); // This subscription will stop on when the metadataService stops because it completes the Observable - } - return { - getVariation: this.getVariation, - reportMetric: this.reportMetric, - }; + public start(core: CoreStart, { dataViews }: CloudExperimentsPluginStartDeps) { + this.metadataService.start({ + hasDataFetcher: async () => ({ has_data: await dataViews.hasData.hasUserDataView() }), + }); } /** * Cleans up and flush the sending queues. */ public stop() { - this.launchDarklyClient?.stop(); this.metadataService.stop(); } - private getVariation = async ( - featureFlagName: CloudExperimentsFeatureFlagNames, - defaultValue: Data - ): Promise => { - const configKey = FEATURE_FLAG_NAMES[featureFlagName]; - - // Apply overrides if they exist without asking LaunchDarkly. - if (this.flagOverrides && has(this.flagOverrides, configKey)) { - return get(this.flagOverrides, configKey, defaultValue) as Data; - } - - // Skip any action if no LD Client is defined - if (!this.launchDarklyClient) { - return defaultValue; - } - - return await this.launchDarklyClient.getVariation(configKey, defaultValue); - }; + /** + * Sets up the OpenFeature LaunchDarkly provider + * @private + */ + private createOpenFeatureProvider() { + const { launch_darkly: ldConfig } = this.initializerContext.config.get<{ + launch_darkly?: LaunchDarklyClientConfig; + }>(); - private reportMetric = ({ name, meta, value }: CloudExperimentsMetric): void => { - const metricName = METRIC_NAMES[name]; - this.launchDarklyClient?.reportMetric(metricName, meta, value); - if (this.isDev) { - // eslint-disable-next-line no-console - console.debug(`Reported experimentation metric ${metricName}`, { - experimentationMetric: { name, meta, value }, - }); - } - }; + if (!ldConfig) return; + + return new LaunchDarklyClientProvider(ldConfig.client_id, { + // logger: this.logger.get('launch-darkly'), + // Using basicLogger for now because we can't limit the level for now if we're using core's logger. + logger: basicLogger({ level: ldConfig.client_log_level }), + streaming: true, // Necessary to react to flag changes + application: { + id: 'kibana-browser', + version: + this.initializerContext.env.packageInfo.buildFlavor === 'serverless' + ? this.initializerContext.env.packageInfo.buildSha + : this.initializerContext.env.packageInfo.version, + }, + }); + } } diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.test.ts index 146de2c3ddc9a..1d8d46e5cbf3f 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.test.ts @@ -26,9 +26,6 @@ describe('cloudExperiments config', () => { client_id: '1234', client_log_level: 'none', }, - flag_overrides: { - 'my-plugin.my-feature-flag': 1234, - }, }; expect(config.schema.validate(cfg, ctx)).toStrictEqual({ ...cfg, @@ -37,31 +34,14 @@ describe('cloudExperiments config', () => { }); }); - test('it should allow any additional config (missing flag_overrides)', () => { - const cfg = { - enabled: false, - launch_darkly: { - sdk_key: 'sdk-1234', - client_id: '1234', - client_log_level: 'none', - }, - }; - expect(config.schema.validate(cfg, ctx)).toStrictEqual({ - ...cfg, - metadata_refresh_interval: moment.duration(1, 'h'), - }); - }); - test('it should allow any additional config (missing launch_darkly)', () => { const cfg = { enabled: false, - flag_overrides: { - 'my-plugin.my-feature-flag': 1234, - }, + metadata_refresh_interval: '1s', }; expect(config.schema.validate(cfg, ctx)).toStrictEqual({ ...cfg, - metadata_refresh_interval: moment.duration(1, 'h'), + metadata_refresh_interval: moment.duration(1, 's'), }); }); }); @@ -70,11 +50,8 @@ describe('cloudExperiments config', () => { describe('in dev mode', () => { const ctx = { dev: true }; test('in dev mode, it allows `launch_darkly` to be empty', () => { - expect( - config.schema.validate({ enabled: true, flag_overrides: { my_flag: 1 } }, ctx) - ).toStrictEqual({ + expect(config.schema.validate({ enabled: true }, ctx)).toStrictEqual({ enabled: true, - flag_overrides: { my_flag: 1 }, metadata_refresh_interval: moment.duration(1, 'h'), }); }); @@ -96,58 +73,6 @@ describe('cloudExperiments config', () => { `"[launch_darkly.sdk_key]: expected value of type [string] but got [undefined]"` ); }); - - test('in prod mode, it allows `flag_overrides` to be empty', () => { - expect( - config.schema.validate( - { - enabled: true, - launch_darkly: { - sdk_key: 'sdk-1234', - client_id: '1234', - }, - }, - ctx - ) - ).toStrictEqual({ - enabled: true, - launch_darkly: { - sdk_key: 'sdk-1234', - client_id: '1234', - client_log_level: 'none', - }, - metadata_refresh_interval: moment.duration(1, 'h'), - }); - }); - - test('in prod mode, it allows `flag_overrides` to be provided', () => { - expect( - config.schema.validate( - { - enabled: true, - launch_darkly: { - sdk_key: 'sdk-1234', - client_id: '1234', - }, - flag_overrides: { - my_flag: 123, - }, - }, - ctx - ) - ).toStrictEqual({ - enabled: true, - launch_darkly: { - sdk_key: 'sdk-1234', - client_id: '1234', - client_log_level: 'none', - }, - flag_overrides: { - my_flag: 123, - }, - metadata_refresh_interval: moment.duration(1, 'h'), - }); - }); }); }); }); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.ts index a5b5eeb88c2dd..a1bcb5d53fd72 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/server/config.ts @@ -36,7 +36,6 @@ const configSchema = schema.object({ ), schema.maybe(launchDarklySchema) ), - flag_overrides: schema.maybe(schema.recordOf(schema.string(), schema.any())), metadata_refresh_interval: schema.duration({ defaultValue: '1h' }), }); @@ -48,7 +47,6 @@ export const config: PluginConfigDescriptor = { client_id: true, client_log_level: true, }, - flag_overrides: true, metadata_refresh_interval: true, }, schema: configSchema, diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/index.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/index.ts deleted file mode 100644 index d298aad1ad6c1..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/index.ts +++ /dev/null @@ -1,8 +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. - */ - -export { LaunchDarklyClient, type LaunchDarklyUserMetadata } from './launch_darkly_client'; diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.mock.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.mock.ts deleted file mode 100644 index c8759ab59f6a9..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.mock.ts +++ /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 type { LDClient } from '@launchdarkly/node-server-sdk'; - -export function createLaunchDarklyClientMock(): jest.Mocked { - return { - waitForInitialization: jest.fn(), - variation: jest.fn(), - allFlagsState: jest.fn(), - track: jest.fn(), - flush: jest.fn(), - } as unknown as jest.Mocked; // Using casting because we only use these APIs. No need to declare everything. -} - -export const ldClientMock = createLaunchDarklyClientMock(); - -jest.doMock('@launchdarkly/node-server-sdk', () => ({ - init: () => ldClientMock, - basicLogger: jest.fn(), -})); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.ts deleted file mode 100644 index 0b928b7496397..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.test.ts +++ /dev/null @@ -1,217 +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 { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; -import { ldClientMock } from './launch_darkly_client.test.mock'; -import LaunchDarkly from '@launchdarkly/node-server-sdk'; -import { LaunchDarklyClient, type LaunchDarklyClientConfig } from './launch_darkly_client'; - -describe('LaunchDarklyClient - server', () => { - beforeEach(() => { - jest.resetAllMocks(); - }); - - const config: LaunchDarklyClientConfig = { - sdk_key: 'fake-sdk-key', - client_id: 'fake-client-id', - client_log_level: 'debug', - kibana_version: 'version', - }; - - describe('constructor', () => { - let launchDarklyInitSpy: jest.SpyInstance; - - beforeEach(() => { - launchDarklyInitSpy = jest.spyOn(LaunchDarkly, 'init'); - }); - - afterEach(() => { - launchDarklyInitSpy.mockRestore(); - }); - - test('it initializes the LaunchDarkly client', async () => { - const logger = loggerMock.create(); - ldClientMock.waitForInitialization.mockResolvedValue(ldClientMock); - - const client = new LaunchDarklyClient(config, logger); - expect(launchDarklyInitSpy).toHaveBeenCalledWith('fake-sdk-key', { - application: { id: 'kibana-server', version: 'version' }, - logger: undefined, // The method basicLogger is mocked without a return value - stream: false, - }); - expect(client).toHaveProperty('launchDarklyClient', ldClientMock); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the waitForInitialization resolution - expect(logger.debug).toHaveBeenCalledWith('LaunchDarkly is initialized!'); - }); - - test('it initializes the LaunchDarkly client... and handles failure', async () => { - const logger = loggerMock.create(); - ldClientMock.waitForInitialization.mockRejectedValue( - new Error('Something went terribly wrong') - ); - - const client = new LaunchDarklyClient(config, logger); - expect(launchDarklyInitSpy).toHaveBeenCalledWith('fake-sdk-key', { - application: { id: 'kibana-server', version: 'version' }, - logger: undefined, // The method basicLogger is mocked without a return value - stream: false, - }); - expect(client).toHaveProperty('launchDarklyClient', ldClientMock); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the waitForInitialization resolution - expect(logger.warn).toHaveBeenCalledWith( - 'Error initializing LaunchDarkly: Error: Something went terribly wrong' - ); - }); - }); - - describe('Public APIs', () => { - let client: LaunchDarklyClient; - let logger: MockedLogger; - const testUserMetadata = { userId: 'fake-user-id', kibanaVersion: 'version' }; - - beforeEach(() => { - logger = loggerMock.create(); - ldClientMock.waitForInitialization.mockResolvedValue(ldClientMock); - client = new LaunchDarklyClient(config, logger); - }); - - describe('updateUserMetadata', () => { - test('sets all properties at the root level, renaming userId to key (no nesting into custom)', () => { - expect(client).toHaveProperty('launchDarklyUser', undefined); - - const topFields = { - name: 'First Last', - firstName: 'First', - lastName: 'Last', - email: 'first.last@boring.co', - avatar: 'fake-blue-avatar', - ip: 'my-weird-ip', - country: 'distributed', - // intentionally adding this to make sure the code is overriding appropriately - kind: 'other kind', - key: 'other user', - }; - - const extraFields = { - other_field: 'my other custom field', - kibanaVersion: 'version', - }; - - client.updateUserMetadata({ userId: 'fake-user-id', ...topFields, ...extraFields }); - - expect(client).toHaveProperty('launchDarklyUser', { - ...topFields, - ...extraFields, - kind: 'user', - key: 'fake-user-id', - }); - }); - - test('sets a minimum amount of info', () => { - expect(client).toHaveProperty('launchDarklyUser', undefined); - - client.updateUserMetadata({ userId: 'fake-user-id', kibanaVersion: 'version' }); - - expect(client).toHaveProperty('launchDarklyUser', { - kind: 'user', - key: 'fake-user-id', - kibanaVersion: 'version', - }); - }); - }); - - describe('getVariation', () => { - test('returns the default value if the user has not been defined', async () => { - await expect(client.getVariation('my-feature-flag', 123)).resolves.toStrictEqual(123); - expect(ldClientMock.variation).toHaveBeenCalledTimes(0); - }); - - test('calls the LaunchDarkly client when the user has been defined', async () => { - ldClientMock.variation.mockResolvedValue(1234); - client.updateUserMetadata(testUserMetadata); - await expect(client.getVariation('my-feature-flag', 123)).resolves.toStrictEqual(1234); - expect(ldClientMock.variation).toHaveBeenCalledTimes(1); - expect(ldClientMock.variation).toHaveBeenCalledWith( - 'my-feature-flag', - { kind: 'user', key: 'fake-user-id', kibanaVersion: 'version' }, - 123 - ); - }); - }); - - describe('reportMetric', () => { - test('does not call track if the user has not been defined', () => { - client.reportMetric('my-feature-flag', {}, 123); - expect(ldClientMock.track).toHaveBeenCalledTimes(0); - }); - - test('calls the LaunchDarkly client when the user has been defined', () => { - client.updateUserMetadata(testUserMetadata); - client.reportMetric('my-feature-flag', {}, 123); - expect(ldClientMock.track).toHaveBeenCalledTimes(1); - expect(ldClientMock.track).toHaveBeenCalledWith( - 'my-feature-flag', - { kind: 'user', key: 'fake-user-id', kibanaVersion: 'version' }, - {}, - 123 - ); - }); - }); - - describe('getAllFlags', () => { - test('returns the non-initialized state if the user has not been defined', async () => { - await expect(client.getAllFlags()).resolves.toStrictEqual({ - initialized: false, - flagNames: [], - flags: {}, - }); - expect(ldClientMock.allFlagsState).toHaveBeenCalledTimes(0); - }); - - test('calls the LaunchDarkly client when the user has been defined', async () => { - ldClientMock.allFlagsState.mockResolvedValue({ - valid: true, - allValues: jest.fn().mockReturnValue({ my_flag: '1234' }), - getFlagValue: jest.fn(), - getFlagReason: jest.fn(), - toJSON: jest.fn(), - }); - client.updateUserMetadata(testUserMetadata); - await expect(client.getAllFlags()).resolves.toStrictEqual({ - initialized: true, - flagNames: ['my_flag'], - flags: { my_flag: '1234' }, - }); - expect(ldClientMock.allFlagsState).toHaveBeenCalledTimes(1); - expect(ldClientMock.allFlagsState).toHaveBeenCalledWith({ - kind: 'user', - key: 'fake-user-id', - kibanaVersion: 'version', - }); - }); - }); - - describe('stop', () => { - test('flushes the events', async () => { - ldClientMock.flush.mockResolvedValue(); - expect(() => client.stop()).not.toThrow(); - expect(ldClientMock.flush).toHaveBeenCalledTimes(1); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the flush resolution - expect(logger.error).not.toHaveBeenCalled(); - }); - - test('handles errors when flushing events', async () => { - const err = new Error('Something went terribly wrong'); - ldClientMock.flush.mockRejectedValue(err); - expect(() => client.stop()).not.toThrow(); - expect(ldClientMock.flush).toHaveBeenCalledTimes(1); - await new Promise((resolve) => process.nextTick(resolve)); // wait for the flush resolution - expect(logger.error).toHaveBeenCalledWith(err); - }); - }); - }); -}); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.ts deleted file mode 100644 index c6511302eb7b1..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/launch_darkly_client.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - type LDClient, - type LDFlagSet, - type LDLogLevel, - type LDSingleKindContext, -} from '@launchdarkly/node-server-sdk'; -import { init, basicLogger } from '@launchdarkly/node-server-sdk'; -import type { Logger } from '@kbn/core/server'; - -export interface LaunchDarklyClientConfig { - sdk_key: string; - client_id: string; - client_log_level: LDLogLevel; - kibana_version: string; -} - -export interface LaunchDarklyUserMetadata - extends Record { - userId: string; - // We are not collecting any of the above, but this is to match the LDUser first-level definition - name?: string; - firstName?: string; - lastName?: string; - email?: string; - avatar?: string; - ip?: string; - country?: string; -} - -export interface LaunchDarklyGetAllFlags { - initialized: boolean; - flags: LDFlagSet; - flagNames: string[]; -} - -export class LaunchDarklyClient { - private readonly launchDarklyClient: LDClient; - private launchDarklyUser?: LDSingleKindContext; - - constructor(ldConfig: LaunchDarklyClientConfig, private readonly logger: Logger) { - this.launchDarklyClient = init(ldConfig.sdk_key, { - application: { id: `kibana-server`, version: ldConfig.kibana_version }, - logger: basicLogger({ level: ldConfig.client_log_level }), - // For some reason, the stream API does not work in Kibana. `.waitForInitialization()` hangs forever (doesn't throw, neither logs any errors). - // Using polling for now until we resolve that issue. - // Relevant issue: https://github.com/launchdarkly/node-server-sdk/issues/132 - stream: false, - }); - this.launchDarklyClient.waitForInitialization().then( - () => this.logger.debug('LaunchDarkly is initialized!'), - (err) => this.logger.warn(`Error initializing LaunchDarkly: ${err}`) - ); - } - - public updateUserMetadata(userMetadata: LaunchDarklyUserMetadata) { - const { userId, ...userMetadataWithoutUserId } = userMetadata; - this.launchDarklyUser = { - ...userMetadataWithoutUserId, - kind: 'user', - key: userId, - }; - } - - public async getVariation(configKey: string, defaultValue: Data): Promise { - if (!this.launchDarklyUser) return defaultValue; // Skip any action if no LD User is defined - await this.launchDarklyClient.waitForInitialization(); - return await this.launchDarklyClient.variation(configKey, this.launchDarklyUser, defaultValue); - } - - public reportMetric(metricName: string, meta?: unknown, value?: number): void { - if (!this.launchDarklyUser) return; // Skip any action if no LD User is defined - this.launchDarklyClient.track(metricName, this.launchDarklyUser, meta, value); - } - - public async getAllFlags(): Promise { - if (!this.launchDarklyUser) return { initialized: false, flagNames: [], flags: {} }; - // According to the docs, this method does not send analytics back to LaunchDarkly, so it does not provide false results - const flagsState = await this.launchDarklyClient.allFlagsState(this.launchDarklyUser); - const flags = flagsState.allValues(); - return { - initialized: flagsState.valid, - flags, - flagNames: Object.keys(flags), - }; - } - - public stop() { - this.launchDarklyClient?.flush().catch((err) => this.logger.error(err)); - } -} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/mocks.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/mocks.ts deleted file mode 100644 index 3fe1838815b27..0000000000000 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/launch_darkly_client/mocks.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { PublicMethodsOf } from '@kbn/utility-types'; -import { LaunchDarklyClient } from './launch_darkly_client'; - -function createLaunchDarklyClientMock(): jest.Mocked { - const launchDarklyClientMock: jest.Mocked> = { - updateUserMetadata: jest.fn(), - getVariation: jest.fn(), - getAllFlags: jest.fn(), - reportMetric: jest.fn(), - stop: jest.fn(), - }; - - return launchDarklyClientMock as jest.Mocked; -} - -export const launchDarklyClientMocks = { - launchDarklyClientMock: createLaunchDarklyClientMock(), - createLaunchDarklyClient: createLaunchDarklyClientMock, -}; diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.test.ts index 37989482dc31c..0b52f8686bbc9 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.test.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { fakeSchedulers } from 'rxjs-marbles/jest'; import { coreMock } from '@kbn/core/server/mocks'; import { cloudMock } from '@kbn/cloud-plugin/server/mocks'; import { usageCollectionPluginMock } from '@kbn/usage-collection-plugin/server/mocks'; @@ -16,9 +15,6 @@ import { import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { config } from './config'; import { CloudExperimentsPlugin } from './plugin'; -import { FEATURE_FLAG_NAMES } from '../common/constants'; -import { LaunchDarklyClient } from './launch_darkly_client'; -jest.mock('./launch_darkly_client'); describe('Cloud Experiments server plugin', () => { jest.useFakeTimers(); @@ -29,15 +25,13 @@ describe('Cloud Experiments server plugin', () => { }); describe('constructor', () => { - test('successfully creates a new plugin if provided an empty configuration', () => { + test('successfully creates a new when in dev mode plugin if provided an empty configuration', () => { const initializerContext = coreMock.createPluginInitializerContext(); initializerContext.env.mode.dev = true; // ensure it's true const plugin = new CloudExperimentsPlugin(initializerContext); expect(plugin).toHaveProperty('setup'); expect(plugin).toHaveProperty('start'); expect(plugin).toHaveProperty('stop'); - expect(plugin).toHaveProperty('flagOverrides', undefined); - expect(plugin).toHaveProperty('launchDarklyClient', undefined); }); test('fails if launch_darkly is not provided in the config and it is a non-dev environment', () => { @@ -47,24 +41,6 @@ describe('Cloud Experiments server plugin', () => { 'xpack.cloud_integrations.experiments.launch_darkly configuration should exist' ); }); - - test('it initializes the LaunchDarkly client', () => { - const initializerContext = coreMock.createPluginInitializerContext({ - launch_darkly: { sdk_key: 'sdk-1234' }, - }); - const plugin = new CloudExperimentsPlugin(initializerContext); - expect(LaunchDarklyClient).toHaveBeenCalledTimes(1); - expect(plugin).toHaveProperty('launchDarklyClient', expect.any(LaunchDarklyClient)); - }); - - test('it initializes the flagOverrides property', () => { - const initializerContext = coreMock.createPluginInitializerContext({ - flag_overrides: { my_flag: '1234' }, - }); - initializerContext.env.mode.dev = true; // ensure it's true - const plugin = new CloudExperimentsPlugin(initializerContext); - expect(plugin).toHaveProperty('flagOverrides', { my_flag: '1234' }); - }); }); describe('setup', () => { @@ -75,7 +51,6 @@ describe('Cloud Experiments server plugin', () => { config.schema.validate( { launch_darkly: { sdk_key: 'sdk-1234', client_id: 'fake-client-id' }, - flag_overrides: { my_flag: '1234' }, }, { dev: true } ) @@ -87,221 +62,98 @@ describe('Cloud Experiments server plugin', () => { plugin.stop(); }); - test('returns the contract', () => { + test('registers the usage collector when available', () => { + const usageCollection = usageCollectionPluginMock.createSetupContract(); expect( plugin.setup(coreMock.createSetup(), { cloud: cloudMock.createSetup(), + usageCollection, }) ).toBeUndefined(); - }); - - test('registers the usage collector when available', () => { - const usageCollection = usageCollectionPluginMock.createSetupContract(); - plugin.setup(coreMock.createSetup(), { - cloud: cloudMock.createSetup(), - usageCollection, - }); expect(usageCollection.makeUsageCollector).toHaveBeenCalledTimes(1); expect(usageCollection.registerCollector).toHaveBeenCalledTimes(1); }); - test( - 'updates the user metadata on setup', - fakeSchedulers((advance) => { - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - const launchDarklyInstanceMock = ( - LaunchDarklyClient as jest.MockedClass - ).mock.instances[0]; - advance(100); // Remove the debounceTime effect - expect(launchDarklyInstanceMock.updateUserMetadata).toHaveBeenCalledWith({ - userId: 'deployment-id', - kibanaVersion: coreMock.createPluginInitializerContext().env.packageInfo.version, - isElasticStaff: true, - trialEndDate: expect.any(String), - }); - }) - ); + test('updates the user metadata on setup', async () => { + const coreSetupMock = coreMock.createSetup(); + plugin.setup(coreSetupMock, { + cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, + usageCollection: usageCollectionPluginMock.createSetupContract(), + }); + + const initializerContext = coreMock.createPluginInitializerContext(); + + await jest.advanceTimersByTimeAsync(100); // Remove the debounceTime effect + expect(coreSetupMock.featureFlags.appendContext).toHaveBeenCalledWith({ + kind: 'multi', + kibana: { + key: 'deployment-id', + offering: 'traditional', + version: initializerContext.env.packageInfo.version, + build_num: initializerContext.env.packageInfo.buildNum, + build_sha: initializerContext.env.packageInfo.buildSha, + build_sha_short: initializerContext.env.packageInfo.buildShaShort, + }, + organization: { + key: 'organization-id', + trial_end_date: expect.any(Date), + in_trial: false, + is_elastic_staff: true, + }, + }); + }); }); describe('start', () => { let plugin: CloudExperimentsPlugin; let dataViews: jest.Mocked; - let launchDarklyInstanceMock: jest.Mocked; - - const firstKnownFlag = Object.keys(FEATURE_FLAG_NAMES)[0] as keyof typeof FEATURE_FLAG_NAMES; beforeEach(() => { - jest.useRealTimers(); const initializerContext = coreMock.createPluginInitializerContext( config.schema.validate( { launch_darkly: { sdk_key: 'sdk-1234', client_id: 'fake-client-id' }, - flag_overrides: { [firstKnownFlag]: '1234' }, }, { dev: true } ) ); plugin = new CloudExperimentsPlugin(initializerContext); dataViews = createIndexPatternsStartMock(); - launchDarklyInstanceMock = (LaunchDarklyClient as jest.MockedClass) - .mock.instances[0] as jest.Mocked; }); afterEach(() => { plugin.stop(); - jest.useFakeTimers(); }); test('returns the contract', () => { - plugin.setup(coreMock.createSetup(), { cloud: cloudMock.createSetup() }); - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - expect(startContract).toStrictEqual( - expect.objectContaining({ - getVariation: expect.any(Function), - reportMetric: expect.any(Function), - }) - ); + plugin.setup(coreMock.createSetup(), { + cloud: cloudMock.createSetup(), + usageCollection: usageCollectionPluginMock.createSetupContract(), + }); + expect(plugin.start(coreMock.createStart(), { dataViews })).toBeUndefined(); }); test('triggers a userMetadataUpdate for `hasData`', async () => { - plugin.setup(coreMock.createSetup(), { + const coreSetup = coreMock.createSetup(); + plugin.setup(coreSetup, { cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, + usageCollection: usageCollectionPluginMock.createSetupContract(), }); dataViews.dataViewsServiceFactory.mockResolvedValue(dataViewsService); dataViewsService.hasUserDataView.mockResolvedValue(true); plugin.start(coreMock.createStart(), { dataViews }); // After scheduler kicks in... - await new Promise((resolve) => setTimeout(resolve, 200)); // Waiting for scheduler and debounceTime to complete (don't know why fakeScheduler didn't work here). - expect(launchDarklyInstanceMock.updateUserMetadata).toHaveBeenCalledWith( + await jest.advanceTimersByTimeAsync(100); + expect(coreSetup.featureFlags.appendContext).toHaveBeenCalledWith( expect.objectContaining({ - hasData: true, + kind: 'multi', + kibana: expect.objectContaining({ + has_data: true, + }), }) ); }); - - describe('getVariation', () => { - describe('with the client created', () => { - beforeEach(() => { - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - }); - - test('uses the flag overrides to respond early', async () => { - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - await expect(startContract.getVariation(firstKnownFlag, 123)).resolves.toStrictEqual( - '1234' - ); - }); - - test('calls the client', async () => { - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - launchDarklyInstanceMock.getVariation.mockResolvedValue('12345'); - await expect( - startContract.getVariation( - // @ts-expect-error We only allow existing flags in FEATURE_FLAG_NAMES - 'some-random-flag', - 123 - ) - ).resolves.toStrictEqual('12345'); - expect(launchDarklyInstanceMock.getVariation).toHaveBeenCalledWith( - undefined, // it couldn't find it in FEATURE_FLAG_NAMES - 123 - ); - }); - }); - - describe('with the client not created (missing LD settings)', () => { - beforeEach(() => { - const initializerContext = coreMock.createPluginInitializerContext( - config.schema.validate( - { - flag_overrides: { [firstKnownFlag]: '1234' }, - }, - { dev: true } - ) - ); - plugin = new CloudExperimentsPlugin(initializerContext); - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: false }, - }); - }); - - test('uses the flag overrides to respond early', async () => { - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - await expect(startContract.getVariation(firstKnownFlag, 123)).resolves.toStrictEqual( - '1234' - ); - }); - - test('returns the default value without calling the client', async () => { - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - await expect( - startContract.getVariation( - // @ts-expect-error We only allow existing flags in FEATURE_FLAG_NAMES - 'some-random-flag', - 123 - ) - ).resolves.toStrictEqual(123); - }); - }); - }); - - describe('reportMetric', () => { - describe('with the client created', () => { - beforeEach(() => { - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, - }); - }); - - test('calls LaunchDarklyClient.reportMetric', () => { - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - startContract.reportMetric({ - // @ts-expect-error We only allow existing flags in METRIC_NAMES - name: 'my-flag', - meta: {}, - value: 1, - }); - expect(launchDarklyInstanceMock.reportMetric).toHaveBeenCalledWith( - undefined, // it couldn't find it in METRIC_NAMES - {}, - 1 - ); - }); - }); - - describe('with the client not created (missing LD settings)', () => { - beforeEach(() => { - const initializerContext = coreMock.createPluginInitializerContext( - config.schema.validate( - { - flag_overrides: { [firstKnownFlag]: '1234' }, - }, - { dev: true } - ) - ); - plugin = new CloudExperimentsPlugin(initializerContext); - plugin.setup(coreMock.createSetup(), { - cloud: { ...cloudMock.createSetup(), isCloudEnabled: false }, - }); - }); - - test('does not call LaunchDarklyClient.reportMetric because the client is not there', () => { - const startContract = plugin.start(coreMock.createStart(), { dataViews }); - startContract.reportMetric({ - // @ts-expect-error We only allow existing flags in METRIC_NAMES - name: 'my-flag', - meta: {}, - value: 1, - }); - expect(plugin).toHaveProperty('launchDarklyClient', undefined); - }); - }); - }); }); describe('stop', () => { @@ -312,7 +164,6 @@ describe('Cloud Experiments server plugin', () => { config.schema.validate( { launch_darkly: { sdk_key: 'sdk-1234', client_id: 'fake-client-id' }, - flag_overrides: { my_flag: '1234' }, }, { dev: true } ) @@ -321,18 +172,11 @@ describe('Cloud Experiments server plugin', () => { const dataViews = createIndexPatternsStartMock(); plugin.setup(coreMock.createSetup(), { cloud: { ...cloudMock.createSetup(), isCloudEnabled: true }, + usageCollection: usageCollectionPluginMock.createSetupContract(), }); plugin.start(coreMock.createStart(), { dataViews }); }); - test('stops the LaunchDarkly client', () => { - plugin.stop(); - const launchDarklyInstanceMock = ( - LaunchDarklyClient as jest.MockedClass - ).mock.instances[0] as jest.Mocked; - expect(launchDarklyInstanceMock.stop).toHaveBeenCalledTimes(1); - }); - test('stops the Metadata Service', () => { // eslint-disable-next-line dot-notation const metadataServiceStopSpy = jest.spyOn(plugin['metadataService'], 'stop'); diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.ts index 834784a11f2c5..fa9de11b0dfc9 100755 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/server/plugin.ts @@ -12,26 +12,20 @@ import type { Plugin, Logger, } from '@kbn/core/server'; -import { get, has } from 'lodash'; -import type { LogMeta } from '@kbn/logging'; +import { map } from 'rxjs'; +import { OpenFeature } from '@openfeature/server-sdk'; +import { LaunchDarklyProvider } from '@launchdarkly/openfeature-node-server'; +import type { LogLevelId } from '@kbn/logging'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; import type { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server/types'; -import { filter, map } from 'rxjs'; -import { MetadataService } from '../common/metadata_service'; -import { LaunchDarklyClient } from './launch_darkly_client'; +import { initializeMetadata, MetadataService } from '../common/metadata_service'; import { registerUsageCollector } from './usage'; import type { CloudExperimentsConfigType } from './config'; -import type { - CloudExperimentsFeatureFlagNames, - CloudExperimentsMetric, - CloudExperimentsPluginStart, -} from '../common'; -import { FEATURE_FLAG_NAMES, METRIC_NAMES } from '../common/constants'; interface CloudExperimentsPluginSetupDeps { cloud: CloudSetup; - usageCollection?: UsageCollectionSetup; + usageCollection: UsageCollectionSetup; } interface CloudExperimentsPluginStartDeps { @@ -39,11 +33,9 @@ interface CloudExperimentsPluginStartDeps { } export class CloudExperimentsPlugin - implements Plugin + implements Plugin { private readonly logger: Logger; - private readonly launchDarklyClient?: LaunchDarklyClient; - private readonly flagOverrides?: Record; private readonly metadataService: MetadataService; constructor(private readonly initializerContext: PluginInitializerContext) { @@ -55,9 +47,6 @@ export class CloudExperimentsPlugin this.logger.get('metadata') ); - if (config.flag_overrides) { - this.flagOverrides = config.flag_overrides; - } const ldConfig = config.launch_darkly; // If the plugin is enabled and no flag_overrides are provided (dev mode only), launch_darkly must exist if (!ldConfig && !initializerContext.env.mode.dev) { // If the plugin is enabled, and it's in prod mode, launch_darkly must exist @@ -66,87 +55,70 @@ export class CloudExperimentsPlugin 'xpack.cloud_integrations.experiments.launch_darkly configuration should exist' ); } - if (ldConfig) { - this.launchDarklyClient = new LaunchDarklyClient( - { - ...ldConfig, - kibana_version: initializerContext.env.packageInfo.version, - }, - this.logger.get('launch_darkly') - ); - } } public setup(core: CoreSetup, deps: CloudExperimentsPluginSetupDeps) { - if (deps.usageCollection) { - registerUsageCollector(deps.usageCollection, () => ({ - launchDarklyClient: this.launchDarklyClient, - })); - } + // Ideally we should have something like this for the browser as well. + core.logging.configure( + this.initializerContext.config.create().pipe( + map(({ launch_darkly: { client_log_level: clientLogLevel = 'none' } = {} }) => { + const logLevel = clientLogLevel.replace('none', 'off') as LogLevelId; + return { loggers: [{ name: 'launch-darkly', level: logLevel, appenders: [] }] }; + }) + ) + ); + + initializeMetadata({ + metadataService: this.metadataService, + initializerContext: this.initializerContext, + cloud: deps.cloud, + featureFlags: core.featureFlags, + logger: this.logger, + }); - if (deps.cloud.isCloudEnabled && deps.cloud.deploymentId) { - this.metadataService.setup({ - // We use the Cloud Deployment ID as the userId in the Cloud Experiments - userId: deps.cloud.deploymentId, - kibanaVersion: this.initializerContext.env.packageInfo.version, - trialEndDate: deps.cloud.trialEndDate?.toISOString(), - isElasticStaff: deps.cloud.isElasticStaffOwned, - }); - - // We only subscribe to the user metadata updates if Cloud is enabled. - // This way, since the user is not identified, it cannot retrieve Feature Flags from LaunchDarkly when not running on Cloud. - this.metadataService.userMetadata$ - .pipe( - filter(Boolean), // Filter out undefined - map((userMetadata) => this.launchDarklyClient?.updateUserMetadata(userMetadata)) - ) - .subscribe(); // This subscription will stop on when the metadataService stops because it completes the Observable + const launchDarklyOpenFeatureProvider = this.createOpenFeatureProvider(); + if (launchDarklyOpenFeatureProvider) { + core.featureFlags.setProvider(launchDarklyOpenFeatureProvider); } + + registerUsageCollector(deps.usageCollection, () => ({ + launchDarklyClient: launchDarklyOpenFeatureProvider?.getClient(), + currentContext: OpenFeature.getContext(), + })); } public start(core: CoreStart, deps: CloudExperimentsPluginStartDeps) { this.metadataService.start({ hasDataFetcher: async () => await this.addHasDataMetadata(core, deps.dataViews), }); - return { - getVariation: this.getVariation, - reportMetric: this.reportMetric, - }; } public stop() { - this.launchDarklyClient?.stop(); this.metadataService.stop(); } - private getVariation = async ( - featureFlagName: CloudExperimentsFeatureFlagNames, - defaultValue: Data - ): Promise => { - const configKey = FEATURE_FLAG_NAMES[featureFlagName]; - // Apply overrides if they exist without asking LaunchDarkly. - if (this.flagOverrides && has(this.flagOverrides, configKey)) { - return get(this.flagOverrides, configKey, defaultValue) as Data; - } - if (!this.launchDarklyClient) return defaultValue; - return await this.launchDarklyClient.getVariation(configKey, defaultValue); - }; - - private reportMetric = ({ name, meta, value }: CloudExperimentsMetric): void => { - const metricName = METRIC_NAMES[name]; - this.launchDarklyClient?.reportMetric(metricName, meta, value); - this.logger.debug<{ experimentationMetric: CloudExperimentsMetric } & LogMeta>( - `Reported experimentation metric ${metricName}`, - { - experimentationMetric: { name, meta, value }, - } - ); - }; + private createOpenFeatureProvider() { + const { launch_darkly: ldConfig } = + this.initializerContext.config.get(); + + if (!ldConfig) return; + + return new LaunchDarklyProvider(ldConfig.sdk_key, { + logger: this.logger.get('launch-darkly'), + application: { + id: 'kibana-server', + version: + this.initializerContext.env.packageInfo.buildFlavor === 'serverless' + ? this.initializerContext.env.packageInfo.buildSha + : this.initializerContext.env.packageInfo.version, + }, + }); + } private async addHasDataMetadata( core: CoreStart, dataViews: DataViewsServerPluginStart - ): Promise<{ hasData: boolean }> { + ): Promise<{ has_data: boolean }> { const dataViewsService = await dataViews.dataViewsServiceFactory( core.savedObjects.createInternalRepository(), core.elasticsearch.client.asInternalUser, @@ -154,7 +126,7 @@ export class CloudExperimentsPlugin true // Ignore capabilities checks ); return { - hasData: await dataViewsService.hasUserDataView(), + has_data: await dataViewsService.hasUserDataView(), }; } } diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.test.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.test.ts index ab18c2dbed613..0236ce9e95692 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.test.ts @@ -15,7 +15,7 @@ import { type LaunchDarklyEntitiesGetter, type Usage, } from './register_usage_collector'; -import { launchDarklyClientMocks } from '../launch_darkly_client/mocks'; +import type { LDClient } from '@launchdarkly/node-server-sdk'; describe('cloudExperiments usage collector', () => { let collector: Collector; @@ -43,17 +43,21 @@ describe('cloudExperiments usage collector', () => { }); test('should return all the flags returned by the client', async () => { - const launchDarklyClient = launchDarklyClientMocks.createLaunchDarklyClient(); - getLaunchDarklyEntitiesMock.mockReturnValueOnce({ launchDarklyClient }); - - launchDarklyClient.getAllFlags.mockResolvedValueOnce({ - initialized: true, - flags: { + const allFlagStateImplementation: jest.Mocked = async () => ({ + valid: true, + allValues: jest.fn().mockReturnValue({ 'my-plugin.my-feature-flag': true, 'my-plugin.my-other-feature-flag': 22, - }, - flagNames: ['my-plugin.my-feature-flag', 'my-plugin.my-other-feature-flag'], + }), + getFlagReason: jest.fn(), + getFlagValue: jest.fn(), + toJSON: jest.fn(), }); + const launchDarklyClient: jest.Mocked = { + allFlagsState: jest.fn().mockImplementation(allFlagStateImplementation), + } as unknown as jest.Mocked; // Force-casting here because we don't need to mock the entire client + + getLaunchDarklyEntitiesMock.mockReturnValueOnce({ launchDarklyClient, currentContext: {} }); await expect(collector.fetch(createCollectorFetchContextMock())).resolves.toStrictEqual({ flagNames: ['my-plugin.my-feature-flag', 'my-plugin.my-other-feature-flag'], diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.ts index 8522a44a962e0..599ba431b4a3d 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/server/usage/register_usage_collector.ts @@ -5,8 +5,9 @@ * 2.0. */ +import type { EvaluationContext } from '@kbn/core-feature-flags-server'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; -import type { LaunchDarklyClient } from '../launch_darkly_client'; +import type { LDClient, LDMultiKindContext } from '@launchdarkly/node-server-sdk'; export interface Usage { initialized: boolean; @@ -15,7 +16,8 @@ export interface Usage { } export type LaunchDarklyEntitiesGetter = () => { - launchDarklyClient?: LaunchDarklyClient; + launchDarklyClient?: LDClient; + currentContext: EvaluationContext; }; export function registerUsageCollector( @@ -50,10 +52,23 @@ export function registerUsageCollector( }, }, fetch: async () => { - const { launchDarklyClient } = getLaunchDarklyEntities(); + const { launchDarklyClient, currentContext } = getLaunchDarklyEntities(); if (!launchDarklyClient) return { initialized: false, flagNames: [], flags: {} }; - return await launchDarklyClient.getAllFlags(); + return await getAllFlags(launchDarklyClient, currentContext); }, }) ); } + +async function getAllFlags( + launchDarklyClient: LDClient, + currentContext: EvaluationContext +): Promise { + const flagsState = await launchDarklyClient.allFlagsState(currentContext as LDMultiKindContext); + const flags = flagsState.allValues(); + return { + initialized: flagsState.valid, + flags, + flagNames: Object.keys(flags), + }; +} diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/tsconfig.json b/x-pack/plugins/cloud_integrations/cloud_experiments/tsconfig.json index e1c6ed7b04539..d47131016228d 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/tsconfig.json +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/tsconfig.json @@ -18,7 +18,11 @@ "@kbn/config-schema", "@kbn/logging", "@kbn/logging-mocks", - "@kbn/utility-types", + "@kbn/core-plugins-browser", + "@kbn/core-plugins-server", + "@kbn/core-feature-flags-browser", + "@kbn/core-feature-flags-server", + "@kbn/config", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/elastic_assistant/kibana.jsonc b/x-pack/plugins/elastic_assistant/kibana.jsonc index 9879ba274d209..8a3e0725c782a 100644 --- a/x-pack/plugins/elastic_assistant/kibana.jsonc +++ b/x-pack/plugins/elastic_assistant/kibana.jsonc @@ -13,6 +13,7 @@ "ml", "taskManager", "licensing", + "inference", "spaces", "security" ] diff --git a/x-pack/plugins/elastic_assistant/server/__mocks__/request_context.ts b/x-pack/plugins/elastic_assistant/server/__mocks__/request_context.ts index adface75dbced..6ae7ec9e4469b 100644 --- a/x-pack/plugins/elastic_assistant/server/__mocks__/request_context.ts +++ b/x-pack/plugins/elastic_assistant/server/__mocks__/request_context.ts @@ -45,6 +45,7 @@ export const createMockClients = () => { getAIAssistantAnonymizationFieldsDataClient: dataClientMock.create(), getSpaceId: jest.fn(), getCurrentUser: jest.fn(), + inference: jest.fn(), }, savedObjectsClient: core.savedObjects.client, @@ -130,6 +131,7 @@ const createElasticAssistantRequestContextMock = ( getCurrentUser: jest.fn(), getServerBasePath: jest.fn(), getSpaceId: jest.fn(), + inference: { getClient: jest.fn() }, core: clients.core, telemetry: clients.elasticAssistant.telemetry, }; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts index 060616d280efe..2395221ea14b3 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts @@ -14,6 +14,7 @@ import type { LangChainTracer } from '@langchain/core/tracers/tracer_langchain'; import { ExecuteConnectorRequestBody, Message, Replacements } from '@kbn/elastic-assistant-common'; import { StreamResponseWithHeaders } from '@kbn/ml-response-stream/server'; import { PublicMethodsOf } from '@kbn/utility-types'; +import type { InferenceServerStart } from '@kbn/inference-plugin/server'; import { ResponseBody } from '../types'; import type { AssistantTool } from '../../../types'; import { ElasticsearchStore } from '../elasticsearch_store/elasticsearch_store'; @@ -47,6 +48,7 @@ export interface AgentExecutorParams { langChainMessages: BaseMessage[]; llmType?: string; logger: Logger; + inference: InferenceServerStart; onNewReplacements?: (newReplacements: Replacements) => void; replacements: Replacements; isStream?: T; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts index 0222720d95e37..8cc676cd851a7 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts @@ -38,6 +38,7 @@ export const callAssistantGraph: AgentExecutor = async ({ dataClients, esClient, esStore, + inference, langChainMessages, llmType, logger: parentLogger, @@ -107,7 +108,9 @@ export const callAssistantGraph: AgentExecutor = async ({ alertsIndexPattern, anonymizationFields, chain, + connectorId, esClient, + inference, isEnabledKnowledgeBase, kbDataClient: dataClients?.kbDataClient, logger, diff --git a/x-pack/plugins/elastic_assistant/server/plugin.ts b/x-pack/plugins/elastic_assistant/server/plugin.ts index a8fc3a7de570c..4386b95c3fa7a 100755 --- a/x-pack/plugins/elastic_assistant/server/plugin.ts +++ b/x-pack/plugins/elastic_assistant/server/plugin.ts @@ -112,6 +112,7 @@ export class ElasticAssistantPlugin return { actions: plugins.actions, + inference: plugins.inference, getRegisteredFeatures: (pluginName: string) => { return appContextService.getRegisteredFeatures(pluginName); }, diff --git a/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts b/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts index 1de3b86e74deb..cccf37aff48e0 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts @@ -149,7 +149,7 @@ const formatAssistantToolParams = ({ ExecuteConnectorRequestBody | AttackDiscoveryPostRequestBody >; size: number; -}): AssistantToolParams => ({ +}): Omit => ({ alertsIndexPattern, anonymizationFields: [...(anonymizationFields ?? []), ...REQUIRED_FOR_ATTACK_DISCOVERY], isEnabledKnowledgeBase: false, // not required for attack discovery diff --git a/x-pack/plugins/elastic_assistant/server/routes/chat/chat_complete_route.ts b/x-pack/plugins/elastic_assistant/server/routes/chat/chat_complete_route.ts index b8f75e2376863..dd90241809015 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/chat/chat_complete_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/chat/chat_complete_route.ts @@ -66,6 +66,7 @@ export const chatCompleteRoute = ( const ctx = await context.resolve(['core', 'elasticAssistant', 'licensing']); const logger: Logger = ctx.elasticAssistant.logger; telemetry = ctx.elasticAssistant.telemetry; + const inference = ctx.elasticAssistant.inference; // Perform license and authenticated user checks const checkResponse = performChecks({ @@ -195,6 +196,7 @@ export const chatCompleteRoute = ( context: ctx, getElser, logger, + inference, messages: messages ?? [], onLlmResponse, onNewReplacements, diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts index 6cc8853d119dd..27ea4eea46d45 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts @@ -150,6 +150,8 @@ export const postEvaluateRoute = ( // Default ELSER model const elserId = await getElser(); + const inference = ctx.elasticAssistant.inference; + // Data clients const anonymizationFieldsDataClient = (await assistantContext.getAIAssistantAnonymizationFieldsDataClient()) ?? undefined; @@ -260,6 +262,8 @@ export const postEvaluateRoute = ( alertsIndexPattern, // onNewReplacements, replacements, + inference, + connectorId: connector.id, size, }; diff --git a/x-pack/plugins/elastic_assistant/server/routes/helpers.ts b/x-pack/plugins/elastic_assistant/server/routes/helpers.ts index d457f9c88bf69..1e8acf4bee885 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/helpers.ts @@ -28,6 +28,7 @@ import { AwaitedProperties, PublicMethodsOf } from '@kbn/utility-types'; import { ActionsClient } from '@kbn/actions-plugin/server'; import { AssistantFeatureKey } from '@kbn/elastic-assistant-common/impl/capabilities'; import { getLangSmithTracer } from '@kbn/langchain/server/tracers/langsmith'; +import type { InferenceServerStart } from '@kbn/inference-plugin/server'; import { AIAssistantKnowledgeBaseDataClient } from '../ai_assistant_data_clients/knowledge_base'; import { FindResponse } from '../ai_assistant_data_clients/find'; import { EsPromptsSchema } from '../ai_assistant_data_clients/prompts/types'; @@ -321,6 +322,7 @@ export interface LangChainExecuteParams { telemetry: AnalyticsServiceSetup; actionTypeId: string; connectorId: string; + inference: InferenceServerStart; conversationId?: string; context: AwaitedProperties< Pick @@ -349,6 +351,7 @@ export const langChainExecute = async ({ connectorId, context, actionsClient, + inference, request, logger, conversationId, @@ -418,6 +421,7 @@ export const langChainExecute = async ({ connectorId, esClient, esStore, + inference, isStream, llmType: getLlmType(actionTypeId), langChainMessages, diff --git a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts index 0988d9e5f8973..97ff073ecd5cc 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts @@ -92,6 +92,7 @@ export const postActionsConnectorExecuteRoute = ( // get the actions plugin start contract from the request context: const actions = ctx.elasticAssistant.actions; + const inference = ctx.elasticAssistant.inference; const actionsClient = await actions.getActionsClientWithRequest(request); const conversationsDataClient = @@ -132,6 +133,7 @@ export const postActionsConnectorExecuteRoute = ( context: ctx, getElser, logger, + inference, messages: (newMessage ? [newMessage] : messages) ?? [], onLlmResponse, onNewReplacements, 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 3d004994b3236..e861fa6ffe279 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 @@ -79,6 +79,8 @@ export class RequestContextFactory implements IRequestContextFactory { return appContextService.getRegisteredFeatures(pluginName); }, + inference: startPlugins.inference, + telemetry: core.analytics, // Note: Due to plugin lifecycle and feature flag registration timing, we need to pass in the feature flag here diff --git a/x-pack/plugins/elastic_assistant/server/types.ts b/x-pack/plugins/elastic_assistant/server/types.ts index 6885b07a42c30..ca0010ae1e6b8 100755 --- a/x-pack/plugins/elastic_assistant/server/types.ts +++ b/x-pack/plugins/elastic_assistant/server/types.ts @@ -45,6 +45,7 @@ import { ActionsClientSimpleChatModel, } from '@kbn/langchain/server'; +import type { InferenceServerStart } from '@kbn/inference-plugin/server'; import { AttackDiscoveryDataClient } from './ai_assistant_data_clients/attack_discovery'; import { AIAssistantConversationsDataClient } from './ai_assistant_data_clients/conversations'; import type { GetRegisteredFeatures, GetRegisteredTools } from './services/app_context'; @@ -64,6 +65,10 @@ export interface ElasticAssistantPluginStart { * Actions plugin start contract. */ actions: ActionsPluginStart; + /** + * Inference plugin start contract. + */ + inference: InferenceServerStart; /** * Register features to be used by the elastic assistant. * @@ -104,6 +109,7 @@ export interface ElasticAssistantPluginSetupDependencies { } export interface ElasticAssistantPluginStartDependencies { actions: ActionsPluginStart; + inference: InferenceServerStart; spaces?: SpacesPluginStart; security: SecurityServiceStart; licensing: LicensingPluginStart; @@ -125,6 +131,7 @@ export interface ElasticAssistantApiRequestHandlerContext { getAttackDiscoveryDataClient: () => Promise; getAIAssistantPromptsDataClient: () => Promise; getAIAssistantAnonymizationFieldsDataClient: () => Promise; + inference: InferenceServerStart; telemetry: AnalyticsServiceSetup; } /** @@ -228,7 +235,9 @@ export type AssistantToolLlm = export interface AssistantToolParams { alertsIndexPattern?: string; anonymizationFields?: AnonymizationFieldResponse[]; + inference?: InferenceServerStart; isEnabledKnowledgeBase: boolean; + connectorId?: string; chain?: RetrievalQAChain; esClient: ElasticsearchClient; kbDataClient?: AIAssistantKnowledgeBaseDataClient; diff --git a/x-pack/plugins/elastic_assistant/tsconfig.json b/x-pack/plugins/elastic_assistant/tsconfig.json index c210253af04a4..747a58ed930d3 100644 --- a/x-pack/plugins/elastic_assistant/tsconfig.json +++ b/x-pack/plugins/elastic_assistant/tsconfig.json @@ -48,6 +48,7 @@ "@kbn/apm-utils", "@kbn/std", "@kbn/zod", + "@kbn/inference-plugin" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/fleet/.storybook/context/index.tsx b/x-pack/plugins/fleet/.storybook/context/index.tsx index 3b2d23e59291a..67ed1c8aa6845 100644 --- a/x-pack/plugins/fleet/.storybook/context/index.tsx +++ b/x-pack/plugins/fleet/.storybook/context/index.tsx @@ -19,6 +19,7 @@ import type { UserProfileServiceStart, } from '@kbn/core/public'; import { CoreScopedHistory } from '@kbn/core/public'; +import { coreFeatureFlagsMock } from '@kbn/core/public/mocks'; import { getStorybookContextProvider } from '@kbn/custom-integrations-plugin/storybook'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; @@ -73,6 +74,7 @@ export const StorybookContext: React.FC<{ }, application: getApplication(), executionContext: getExecutionContext(), + featureFlags: coreFeatureFlagsMock.createStart(), chrome: getChrome(), cloud: { ...getCloud({ isCloudEnabled }), diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx index dec31faad794a..5448c932d65e0 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx @@ -129,6 +129,18 @@ export const schemas: Record = { type: VALIDATION_TYPES.ARRAY_ITEM, isBlocking: false, }, + { + validator: startsWithField({ + char: '.', + message: i18n.translate( + 'xpack.idxMgmt.templateValidation.indexPatternDotPrefixedError', + { + defaultMessage: 'Index patterns cannot match dot-prefixed indices.', + } + ), + }), + type: VALIDATION_TYPES.ARRAY_ITEM, + }, ], }, doCreateDataStream: { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx index dcb234b548903..90bba1b4ed14a 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx @@ -395,4 +395,39 @@ describe('Pipeline Editor', () => { assertTestProcessor({ description: processorDescriptions.none, descriptionVisible: false }); }); }); + + describe('object values', () => { + const mockData: Pick = { + processors: [ + { + set: { + field: 'test', + value: { test: 'test' }, + }, + }, + { + append: { + field: 'test', + value: { test: 'test' }, + }, + }, + ], + }; + it('editor works when value is an object', async () => { + onUpdate = jest.fn(); + testBed = await setup({ + value: { + ...mockData, + }, + onFlyoutOpen: jest.fn(), + onUpdate, + }); + expect(testBed.find(`processors>0.inlineTextInputNonEditableText`).text()).toBe( + 'Sets value of "test" to "{"test":"test"}"' + ); + expect(testBed.find(`processors>1.inlineTextInputNonEditableText`).text()).toBe( + 'Appends "{"test":"test"}" to the "test" field' + ); + }); + }); }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx index a4a838f92d1ab..5d672deb739d3 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx @@ -10,6 +10,7 @@ import React, { ReactNode } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiCode, EuiLink } from '@elastic/eui'; +import { stringifyValueDescription } from './stringify_value_description'; import { LicenseType } from '../../../../../types'; import { @@ -127,7 +128,7 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { defaultMessage: 'Appends "{value}" to the "{field}" field', values: { field, - value, + value: stringifyValueDescription(value), }, }), }, @@ -810,7 +811,7 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { defaultMessage: 'Sets value of "{field}" to "{value}"', values: { field, - value, + value: stringifyValueDescription(value), }, }); }, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.test.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.test.ts new file mode 100644 index 0000000000000..62389782a601d --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.test.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 { stringifyValueDescription } from './stringify_value_description'; + +describe('StringifyValueDescription', () => { + it('works for a json object', () => { + expect(stringifyValueDescription({ test: 'test' })).toEqual('{"test":"test"}'); + }); + it('works for an array', () => { + expect(stringifyValueDescription(['a', 'b'])).toEqual('["a","b"]'); + }); + it('works for a string', () => { + expect(stringifyValueDescription('test')).toEqual('test'); + }); + it('works for a number', () => { + expect(stringifyValueDescription(123)).toEqual('123'); + }); + it('empty string for undefined', () => { + expect(stringifyValueDescription(undefined)).toEqual(''); + }); + it('empty string for null', () => { + expect(stringifyValueDescription(null)).toEqual(''); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.ts new file mode 100644 index 0000000000000..d2ad726aed64e --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/stringify_value_description.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. + */ + +export const stringifyValueDescription = (value: unknown): string => { + if (!value) { + return ''; + } + if (typeof value === 'object') { + try { + // if the value is a json object, it will be stringified as json + return JSON.stringify(value); + } catch (e) { + // ignore any errors + } + } + // otherwise just return a stringified value + return String(value); +}; diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx index c00263698d3f0..d12ac172b72cd 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx @@ -125,11 +125,11 @@ const datasourceMap = mockDatasourceMap(); const visualizationMap = mockVisualizationMap(); describe('LensEditConfigurationFlyout', () => { - function renderConfigFlyout( + async function renderConfigFlyout( propsOverrides: Partial = {}, query?: Query | AggregateQuery ) { - return renderWithReduxStore( + const { container, ...rest } = renderWithReduxStore( { }, } ); + await waitFor(() => container.querySelector('lnsEditFlyoutBody')); + return { container, ...rest }; } it('should display the header and the link to editor if necessary props are given', async () => { const navigateToLensEditorSpy = jest.fn(); - - renderConfigFlyout({ + await renderConfigFlyout({ displayFlyoutHeader: true, navigateToLensEditor: navigateToLensEditorSpy, }); @@ -170,7 +171,7 @@ describe('LensEditConfigurationFlyout', () => { }); it('should display the header title correctly for a newly created panel', async () => { - renderConfigFlyout({ + await renderConfigFlyout({ displayFlyoutHeader: true, isNewPanel: true, }); @@ -182,7 +183,7 @@ describe('LensEditConfigurationFlyout', () => { it('should call the closeFlyout callback if cancel button is clicked', async () => { const closeFlyoutSpy = jest.fn(); - renderConfigFlyout({ + await renderConfigFlyout({ closeFlyout: closeFlyoutSpy, }); expect(screen.getByTestId('lns-layerPanel-0')).toBeInTheDocument(); @@ -192,7 +193,7 @@ describe('LensEditConfigurationFlyout', () => { it('should call the updatePanelState callback if cancel button is clicked', async () => { const updatePanelStateSpy = jest.fn(); - renderConfigFlyout({ + await renderConfigFlyout({ updatePanelState: updatePanelStateSpy, }); expect(screen.getByTestId('lns-layerPanel-0')).toBeInTheDocument(); @@ -203,7 +204,7 @@ describe('LensEditConfigurationFlyout', () => { it('should call the updateByRefInput callback if cancel button is clicked and savedObjectId exists', async () => { const updateByRefInputSpy = jest.fn(); - renderConfigFlyout({ + await renderConfigFlyout({ closeFlyout: jest.fn(), updateByRefInput: updateByRefInputSpy, savedObjectId: 'id', @@ -216,7 +217,7 @@ describe('LensEditConfigurationFlyout', () => { const updateByRefInputSpy = jest.fn(); const saveByRefSpy = jest.fn(); - renderConfigFlyout({ + await renderConfigFlyout({ closeFlyout: jest.fn(), updateByRefInput: updateByRefInputSpy, savedObjectId: 'id', @@ -230,7 +231,7 @@ describe('LensEditConfigurationFlyout', () => { it('should call the onApplyCb callback if apply button is clicked', async () => { const onApplyCbSpy = jest.fn(); - renderConfigFlyout( + await renderConfigFlyout( { closeFlyout: jest.fn(), onApplyCb: onApplyCbSpy, @@ -254,14 +255,14 @@ describe('LensEditConfigurationFlyout', () => { }); it('should not display the editor if canEditTextBasedQuery prop is false', async () => { - renderConfigFlyout({ + await renderConfigFlyout({ canEditTextBasedQuery: false, }); expect(screen.queryByTestId('TextBasedLangEditor')).toBeNull(); }); it('should not display the editor if canEditTextBasedQuery prop is true but the query is not text based', async () => { - renderConfigFlyout({ + await renderConfigFlyout({ canEditTextBasedQuery: true, attributes: { ...lensAttributes, @@ -278,14 +279,14 @@ describe('LensEditConfigurationFlyout', () => { }); it('should not display the suggestions if hidesSuggestions prop is true', async () => { - renderConfigFlyout({ + await renderConfigFlyout({ hidesSuggestions: true, }); expect(screen.queryByTestId('InlineEditingSuggestions')).toBeNull(); }); it('should display the suggestions if canEditTextBasedQuery prop is true', async () => { - renderConfigFlyout( + await renderConfigFlyout( { canEditTextBasedQuery: true, }, @@ -298,7 +299,7 @@ describe('LensEditConfigurationFlyout', () => { }); it('should display the ES|QL results table if canEditTextBasedQuery prop is true', async () => { - renderConfigFlyout({ + await renderConfigFlyout({ canEditTextBasedQuery: true, }); await waitFor(() => expect(screen.getByTestId('ESQLQueryResults')).toBeInTheDocument()); @@ -317,7 +318,7 @@ describe('LensEditConfigurationFlyout', () => { // todo: replace testDatasource with formBased or textBased as it's the only ones accepted // @ts-ignore newProps.attributes.state.datasourceStates.testDatasource = 'state'; - renderConfigFlyout(newProps); + await renderConfigFlyout(newProps); expect(screen.getByRole('button', { name: /apply changes/i })).toBeDisabled(); }); it('save button should be disabled if expression cannot be generated', async () => { @@ -337,7 +338,7 @@ describe('LensEditConfigurationFlyout', () => { }, }; - renderConfigFlyout(newProps); + await renderConfigFlyout(newProps); expect(screen.getByRole('button', { name: /apply changes/i })).toBeDisabled(); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx index aab6b57840f65..c8fec4184190d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx @@ -6,37 +6,57 @@ */ import React from 'react'; -import ReactDOM from 'react-dom'; +import { DataView } from '@kbn/data-views-plugin/public'; +import { UI_SETTINGS } from '@kbn/data-plugin/public'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; -import { - dataViewPluginMocks, - Start as DataViewPublicStart, -} from '@kbn/data-views-plugin/public/mocks'; -import { InnerFormBasedDataPanel, FormBasedDataPanel } from './datapanel'; -import { FieldListGrouped } from '@kbn/unified-field-list'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { render, screen, within } from '@testing-library/react'; +import { I18nProvider } from '@kbn/i18n-react'; +import userEvent from '@testing-library/user-event'; +import { FormBasedDataPanel, FormBasedDataPanelProps } from './datapanel'; import * as UseExistingFieldsApi from '@kbn/unified-field-list/src/hooks/use_existing_fields'; import * as ExistingFieldsServiceApi from '@kbn/unified-field-list/src/services/field_existing/load_field_existing'; -import { FieldItem } from '../common/field_item'; import { act } from 'react-dom/test-utils'; import { coreMock } from '@kbn/core/public/mocks'; import { FormBasedPrivateState } from './types'; -import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { EuiCallOut, EuiLoadingSpinner, EuiProgress } from '@elastic/eui'; import { documentField } from './document_field'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks'; import { indexPatternFieldEditorPluginMock } from '@kbn/data-view-field-editor-plugin/public/mocks'; import { getFieldByNameFactory } from './pure_helpers'; import { uiActionsPluginMock } from '@kbn/ui-actions-plugin/public/mocks'; -import { TermsIndexPatternColumn } from './operations'; -import { DOCUMENT_FIELD_NAME } from '../../../common/constants'; import { createIndexPatternServiceMock } from '../../mocks/data_views_service_mock'; import { createMockFramePublicAPI } from '../../mocks'; import { DataViewsState } from '../../state_management'; -import { DataView } from '@kbn/data-views-plugin/public'; -import { UI_SETTINGS } from '@kbn/data-plugin/public'; -import { ReactWrapper } from 'enzyme'; -import { IndexPatternField } from '../../types'; + +const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); + +jest.spyOn(UseExistingFieldsApi, 'useExistingFieldsFetcher'); +jest.spyOn(UseExistingFieldsApi, 'useExistingFieldsReader'); + +const loadFieldExistingMock = jest.spyOn(ExistingFieldsServiceApi, 'loadFieldExisting'); +loadFieldExistingMock.mockResolvedValue({ + indexPatternTitle: 'idx1', + existingFieldNames: [], +}); + +function getFrameAPIMock({ + indexPatterns, + ...rest +}: Partial & { indexPatterns: DataViewsState['indexPatterns'] }) { + const frameAPI = createMockFramePublicAPI(); + + return { + ...frameAPI, + dataViews: { + ...frameAPI.dataViews, + indexPatterns, + ...rest, + }, + }; +} + +const dslQuery = { bool: { must: [], filter: [], should: [], must_not: [] } }; const fieldsOne = [ { @@ -137,407 +157,222 @@ const fieldsTwo = [ documentField, ]; -const fieldsThree = [ - { - name: 'timestamp', - displayName: 'timestampLabel', - type: 'date', - aggregatable: true, - searchable: true, - }, - { - name: 'bytes', - displayName: 'bytes', - type: 'number', - aggregatable: true, - searchable: true, +const indexPatterns = { + '1': { + id: '1', + title: 'idx1', + timeFieldName: 'timestamp', + hasRestrictions: false, + fields: fieldsOne, + getFieldByName: getFieldByNameFactory(fieldsOne), + isPersisted: true, + spec: {}, }, - { - name: 'source', - displayName: 'source', - type: 'string', - aggregatable: true, - searchable: true, + '2': { + id: '2', + title: 'idx2', + timeFieldName: 'timestamp', + hasRestrictions: true, + fields: fieldsTwo, + getFieldByName: getFieldByNameFactory(fieldsTwo), + isPersisted: true, + spec: {}, }, - documentField, -]; +}; -jest.spyOn(UseExistingFieldsApi, 'useExistingFieldsFetcher'); -jest.spyOn(UseExistingFieldsApi, 'useExistingFieldsReader'); -jest.spyOn(ExistingFieldsServiceApi, 'loadFieldExisting').mockImplementation(async () => ({ - indexPatternTitle: 'test', - existingFieldNames: [], -})); +const core = coreMock.createStart(); +const dataViews = dataViewPluginMocks.createStartContract(); -const initialState: FormBasedPrivateState = { - currentIndexPatternId: '1', +const constructState = (currentIndexPatternId: string): FormBasedPrivateState => ({ + currentIndexPatternId, layers: { - first: { - indexPatternId: '1', - columnOrder: ['col1', 'col2'], - columns: { - col1: { - label: 'My Op', - dataType: 'string', - isBucketed: true, - operationType: 'terms', - sourceField: 'source', - params: { - size: 5, - orderDirection: 'asc', - orderBy: { - type: 'alphabetical', - }, - }, - } as TermsIndexPatternColumn, - col2: { - label: 'My Op', - dataType: 'number', - isBucketed: false, - operationType: 'average', - sourceField: 'memory', - }, - }, - }, - second: { - indexPatternId: '1', - columnOrder: ['col1', 'col2'], - columns: { - col1: { - label: 'My Op', - dataType: 'string', - isBucketed: true, - operationType: 'terms', - sourceField: 'source', - params: { - size: 5, - orderDirection: 'asc', - orderBy: { - type: 'alphabetical', - }, - }, - } as TermsIndexPatternColumn, - col2: { - label: 'My Op', - dataType: 'number', - isBucketed: false, - operationType: 'average', - sourceField: 'bytes', - }, - }, + 1: { + indexPatternId: currentIndexPatternId, + columnOrder: [], + columns: {}, }, }, +}); + +const frame = getFrameAPIMock({ indexPatterns }); +const defaultProps = { + data: dataPluginMock.createStartContract(), + dataViews, + fieldFormats: fieldFormatsServiceMock.createStartContract(), + indexPatternFieldEditor: indexPatternFieldEditorPluginMock.createStartContract(), + indexPatternService: createIndexPatternServiceMock({ + updateIndexPatterns: jest.fn(), + core, + dataViews, + }), + onIndexPatternRefresh: jest.fn(), + core, + dateRange: { fromDate: '2019-01-01', toDate: '2020-01-01' }, + charts: chartPluginMock.createSetupContract(), + query: { query: '', language: 'lucene' }, + filters: [], + showNoDataPopover: jest.fn(), + dropOntoWorkspace: jest.fn(), + hasSuggestionForField: jest.fn(() => false), + uiActions: uiActionsPluginMock.createStartContract(), + frame, + activeIndexPatterns: [frame.dataViews.indexPatterns['1']], + setState: jest.fn(), + state: constructState('1'), }; -function getFrameAPIMock({ - indexPatterns, - ...rest -}: Partial & { indexPatterns: DataViewsState['indexPatterns'] }) { - const frameAPI = createMockFramePublicAPI(); +core.uiSettings.get.mockImplementation((key: string) => { + if (key === UI_SETTINGS.META_FIELDS) { + return []; + } +}); + +dataViews.get.mockImplementation(async (id: string) => { + const dataView = [indexPatterns['1'], indexPatterns['2']].find( + (indexPattern) => indexPattern.id === id + ) as unknown as DataView; + dataView.metaFields = ['_id']; + return dataView; +}); + +const waitToLoad = async () => + await act(async () => new Promise((resolve) => setTimeout(resolve, 0))); +const renderFormBasedDataPanel = async (propsOverrides?: Partial) => { + const { rerender, ...rest } = render( + , + { + wrapper: ({ children }) => {children}, + } + ); + await waitToLoad(); return { - ...frameAPI, - dataViews: { - ...frameAPI.dataViews, - indexPatterns, - ...rest, + ...rest, + rerender: async (overrides?: Partial) => { + rerender(); + await waitToLoad(); }, }; -} - -const dslQuery = { bool: { must: [], filter: [], should: [], must_not: [] } }; - -// @ts-expect-error Portal mocks are notoriously difficult to type -ReactDOM.createPortal = jest.fn((element) => element); - -async function mountAndWaitForLazyModules(component: React.ReactElement): Promise { - let inst: ReactWrapper; - await act(async () => { - inst = await mountWithIntl(component); - // wait for lazy modules - await new Promise((resolve) => setTimeout(resolve, 0)); - await inst.update(); - }); +}; - return inst!; -} +const getAriaDescription = () => screen.getByTestId('lnsIndexPattern__ariaDescription').textContent; -// TODO: After the i18n upgrade it seem that some underlying error in these tests surfaced: -// | TypeError: Cannot read properties of null (reading 'tag') -// Does not seem related to the i18n upgrade -describe.skip('FormBased Data Panel', () => { - const indexPatterns = { - a: { - id: 'a', - title: 'aaa', - timeFieldName: 'atime', - fields: fieldsOne, - getFieldByName: getFieldByNameFactory(fieldsOne), - hasRestrictions: false, - isPersisted: true, - spec: {}, - }, - b: { - id: 'b', - title: 'bbb', - timeFieldName: 'btime', - fields: fieldsTwo, - getFieldByName: getFieldByNameFactory(fieldsTwo), - hasRestrictions: false, - isPersisted: true, - spec: {}, - }, - }; +const getFieldNames = (container = 'fieldList') => { + return [...within(screen.getByTestId(container)).queryAllByTestId('lnsFieldListPanelField')].map( + (el) => el.querySelector('.kbnFieldButton__nameInner')?.textContent + ); +}; - const defaultIndexPatterns = { - '1': { - id: '1', - title: 'idx1', - timeFieldName: 'timestamp', - hasRestrictions: false, - fields: fieldsOne, - getFieldByName: getFieldByNameFactory(fieldsOne), - isPersisted: true, - spec: {}, - }, - '2': { - id: '2', - title: 'idx2', - timeFieldName: 'timestamp', - hasRestrictions: true, - fields: fieldsTwo, - getFieldByName: getFieldByNameFactory(fieldsTwo), - isPersisted: true, - spec: {}, - }, - '3': { - id: '3', - title: 'idx3', - timeFieldName: 'timestamp', - hasRestrictions: false, - fields: fieldsThree, - getFieldByName: getFieldByNameFactory(fieldsThree), - isPersisted: true, - spec: {}, - }, - }; +const getSelectedFieldsNames = () => getFieldNames('lnsIndexPatternSelectedFields'); +const getAvailableFieldsNames = () => getFieldNames('lnsIndexPatternAvailableFields'); +const getEmptyFieldsNames = () => getFieldNames('lnsIndexPatternEmptyFields'); +const getMetaFieldsNames = () => getFieldNames('lnsIndexPatternMetaFields'); - let defaultProps: Parameters[0] & { - showNoDataPopover: () => void; - }; - let core: ReturnType<(typeof coreMock)['createStart']>; - let dataViews: DataViewPublicStart; +const searchForPhrase = async (phrase: string) => { + jest.useFakeTimers(); + await user.type(screen.getByRole('searchbox', { name: 'Search field names' }), phrase); + act(() => jest.advanceTimersByTime(256)); + jest.useRealTimers(); +}; +describe('FormBased Data Panel', () => { beforeEach(() => { - core = coreMock.createStart(); - dataViews = dataViewPluginMocks.createStartContract(); - const frame = getFrameAPIMock({ indexPatterns: defaultIndexPatterns }); - defaultProps = { - data: dataPluginMock.createStartContract(), - dataViews, - fieldFormats: fieldFormatsServiceMock.createStartContract(), - indexPatternFieldEditor: indexPatternFieldEditorPluginMock.createStartContract(), - onIndexPatternRefresh: jest.fn(), - currentIndexPatternId: '1', - core, - dateRange: { - fromDate: 'now-7d', - toDate: 'now', - }, - charts: chartPluginMock.createSetupContract(), - query: { query: '', language: 'lucene' }, - filters: [], - showNoDataPopover: jest.fn(), - dropOntoWorkspace: jest.fn(), - hasSuggestionForField: jest.fn(() => false), - uiActions: uiActionsPluginMock.createStartContract(), - indexPatternService: createIndexPatternServiceMock({ core, dataViews }), - frame, - activeIndexPatterns: [frame.dataViews.indexPatterns['1']], - }; - - core.uiSettings.get.mockImplementation((key: string) => { - if (key === UI_SETTINGS.META_FIELDS) { - return []; - } - }); - dataViews.get.mockImplementation(async (id: string) => { - const dataView = [ - indexPatterns.a, - indexPatterns.b, - defaultIndexPatterns['1'], - defaultIndexPatterns['2'], - defaultIndexPatterns['3'], - ].find((indexPattern) => indexPattern.id === id) as unknown as DataView; - dataView.metaFields = ['_id']; - return dataView; - }); - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockClear(); - (UseExistingFieldsApi.useExistingFieldsReader as jest.Mock).mockClear(); - (UseExistingFieldsApi.useExistingFieldsFetcher as jest.Mock).mockClear(); + jest.clearAllMocks(); UseExistingFieldsApi.resetExistingFieldsCache(); window.localStorage.removeItem('lens.unifiedFieldList.initiallyOpenSections'); }); it('should render a warning if there are no index patterns', async () => { - const wrapper = await mountAndWaitForLazyModules( - - ); - expect(wrapper.find('[data-test-subj="indexPattern-no-indexpatterns"]').exists()).toBeTruthy(); + await renderFormBasedDataPanel({ + state: { + layers: {}, + currentIndexPatternId: '', + }, + frame: createMockFramePublicAPI(), + }); + + expect(screen.getByTestId('indexPattern-no-indexpatterns')).toBeInTheDocument(); }); describe('loading existence data', () => { - function testProps({ - currentIndexPatternId, - otherProps, - }: { - currentIndexPatternId: keyof typeof indexPatterns; - otherProps?: object; - }) { - return { - ...defaultProps, - indexPatternService: createIndexPatternServiceMock({ - updateIndexPatterns: jest.fn(), - core, - dataViews, - }), - setState: jest.fn(), - dateRange: { fromDate: '2019-01-01', toDate: '2020-01-01' }, - frame: getFrameAPIMock({ - indexPatterns: indexPatterns as unknown as DataViewsState['indexPatterns'], - }), - state: { - currentIndexPatternId, - layers: { - 1: { - indexPatternId: currentIndexPatternId, - columnOrder: [], - columns: {}, - }, - }, - } as FormBasedPrivateState, - ...(otherProps || {}), - }; - } - it('loads existence data', async () => { - const props = testProps({ - currentIndexPatternId: 'a', - }); - - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [indexPatterns.a.fields[0].name, indexPatterns.a.fields[1].name], - }; + loadFieldExistingMock.mockResolvedValue({ + indexPatternTitle: 'idx1', + existingFieldNames: [indexPatterns['1'].fields[0].name, indexPatterns['1'].fields[1].name], }); - const inst = await mountAndWaitForLazyModules(); + await renderFormBasedDataPanel(); expect(UseExistingFieldsApi.useExistingFieldsFetcher).toHaveBeenCalledWith( expect.objectContaining({ - dataViews: [indexPatterns.a], - query: props.query, - filters: props.filters, - fromDate: props.dateRange.fromDate, - toDate: props.dateRange.toDate, + dataViews: [indexPatterns['1']], + query: defaultProps.query, + filters: defaultProps.filters, + fromDate: defaultProps.dateRange.fromDate, + toDate: defaultProps.dateRange.toDate, }) ); expect(UseExistingFieldsApi.useExistingFieldsReader).toHaveBeenCalled(); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '2 available fields. 3 empty fields. 0 meta fields.' - ); + expect(getAriaDescription()).toBe('2 available fields. 3 empty fields. 0 meta fields.'); }); it('loads existence data for current index pattern id', async () => { - const props = testProps({ - currentIndexPatternId: 'b', + loadFieldExistingMock.mockResolvedValue({ + indexPatternTitle: 'idx1', + existingFieldNames: [indexPatterns['2'].fields[0].name], }); - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [indexPatterns.b.fields[0].name], - }; + await renderFormBasedDataPanel({ + state: constructState('2'), }); - const inst = await mountAndWaitForLazyModules(); - expect(UseExistingFieldsApi.useExistingFieldsFetcher).toHaveBeenCalledWith( expect.objectContaining({ - dataViews: [indexPatterns.b], - query: props.query, - filters: props.filters, - fromDate: props.dateRange.fromDate, - toDate: props.dateRange.toDate, + dataViews: [indexPatterns['2']], + query: defaultProps.query, + filters: defaultProps.filters, + fromDate: defaultProps.dateRange.fromDate, + toDate: defaultProps.dateRange.toDate, }) ); expect(UseExistingFieldsApi.useExistingFieldsReader).toHaveBeenCalled(); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '1 available field. 2 empty fields. 0 meta fields.' - ); + expect(getAriaDescription()).toBe('1 available field. 2 empty fields. 0 meta fields.'); }); it('does not load existence data if date and index pattern ids are unchanged', async () => { - const props = testProps({ - currentIndexPatternId: 'a', - otherProps: { - dateRange: { fromDate: '2019-01-01', toDate: '2020-01-01' }, - }, + loadFieldExistingMock.mockResolvedValue({ + indexPatternTitle: 'idx1', + existingFieldNames: [indexPatterns['1'].fields[0].name, indexPatterns['1'].fields[1].name], }); - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [indexPatterns.a.fields[0].name, indexPatterns.a.fields[1].name], - }; - }); - - const inst = await mountAndWaitForLazyModules(); + const { rerender } = await renderFormBasedDataPanel(); expect(UseExistingFieldsApi.useExistingFieldsFetcher).toHaveBeenCalledWith( expect.objectContaining({ - dataViews: [indexPatterns.a], - fromDate: props.dateRange.fromDate, - toDate: props.dateRange.toDate, + dataViews: [indexPatterns['1']], + fromDate: defaultProps.dateRange.fromDate, + toDate: defaultProps.dateRange.toDate, }) ); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(1); - await act(async () => { - await inst.setProps({ dateRange: { fromDate: '2019-01-01', toDate: '2020-01-01' } }); - await inst.update(); - }); - + await rerender(); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(1); }); it('loads existence data if date range changes', async () => { - const props = testProps({ - currentIndexPatternId: 'a', - otherProps: { - dateRange: { fromDate: '2019-01-01', toDate: '2020-01-01' }, - }, - }); - - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [indexPatterns.a.fields[0].name, indexPatterns.a.fields[1].name], - }; + loadFieldExistingMock.mockResolvedValue({ + indexPatternTitle: 'idx1', + existingFieldNames: [indexPatterns['1'].fields[0].name, indexPatterns['1'].fields[1].name], }); - const inst = await mountAndWaitForLazyModules(); + const { rerender } = await renderFormBasedDataPanel(); expect(UseExistingFieldsApi.useExistingFieldsFetcher).toHaveBeenCalledWith( expect.objectContaining({ - dataViews: [indexPatterns.a], - fromDate: props.dateRange.fromDate, - toDate: props.dateRange.toDate, + dataViews: [indexPatterns['1']], + fromDate: defaultProps.dateRange.fromDate, + toDate: defaultProps.dateRange.toDate, }) ); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(1); @@ -546,15 +381,11 @@ describe.skip('FormBased Data Panel', () => { fromDate: '2019-01-01', toDate: '2020-01-01', dslQuery, - dataView: indexPatterns.a, - timeFieldName: indexPatterns.a.timeFieldName, + dataView: indexPatterns['1'], + timeFieldName: indexPatterns['1'].timeFieldName, }) ); - - await act(async () => { - await inst.setProps({ dateRange: { fromDate: '2019-01-01', toDate: '2020-01-02' } }); - await inst.update(); - }); + await rerender({ dateRange: { fromDate: '2019-01-01', toDate: '2020-01-02' } }); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(2); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( @@ -562,38 +393,30 @@ describe.skip('FormBased Data Panel', () => { fromDate: '2019-01-01', toDate: '2020-01-02', dslQuery, - dataView: indexPatterns.a, - timeFieldName: indexPatterns.a.timeFieldName, + dataView: indexPatterns['1'], + timeFieldName: indexPatterns['1'].timeFieldName, }) ); }); it('loads existence data if layer index pattern changes', async () => { - const props = testProps({ - currentIndexPatternId: 'a', - otherProps: { - dateRange: { fromDate: '2019-01-01', toDate: '2020-01-01' }, - }, - }); - - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation( - async ({ dataView }) => { - return { - existingFieldNames: - dataView === indexPatterns.a - ? [indexPatterns.a.fields[0].name, indexPatterns.a.fields[1].name] - : [indexPatterns.b.fields[0].name], - }; - } - ); - - const inst = await mountAndWaitForLazyModules(); + jest + .spyOn(ExistingFieldsServiceApi, 'loadFieldExisting') + .mockImplementation(async ({ dataView }) => ({ + indexPatternTitle: 'idx1', + existingFieldNames: + dataView.id === indexPatterns['1'].id + ? [indexPatterns['1'].fields[0].name, indexPatterns['1'].fields[1].name] + : [indexPatterns['2'].fields[0].name], + })); + + const { rerender } = await renderFormBasedDataPanel(); expect(UseExistingFieldsApi.useExistingFieldsFetcher).toHaveBeenCalledWith( expect.objectContaining({ - dataViews: [indexPatterns.a], - fromDate: props.dateRange.fromDate, - toDate: props.dateRange.toDate, + dataViews: [indexPatterns['1']], + fromDate: defaultProps.dateRange.fromDate, + toDate: defaultProps.dateRange.toDate, }) ); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(1); @@ -602,31 +425,14 @@ describe.skip('FormBased Data Panel', () => { fromDate: '2019-01-01', toDate: '2020-01-01', dslQuery, - dataView: indexPatterns.a, - timeFieldName: indexPatterns.a.timeFieldName, + dataView: indexPatterns['1'], + timeFieldName: indexPatterns['1'].timeFieldName, }) ); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '2 available fields. 3 empty fields. 0 meta fields.' - ); + expect(getAriaDescription()).toBe('2 available fields. 3 empty fields. 0 meta fields.'); - await act(async () => { - await inst.setProps({ - currentIndexPatternId: 'b', - state: { - currentIndexPatternId: 'b', - layers: { - 1: { - indexPatternId: 'b', - columnOrder: [], - columns: {}, - }, - }, - } as FormBasedPrivateState, - }); - await inst.update(); - }); + await rerender({ state: constructState('2') }); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(2); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( @@ -634,409 +440,243 @@ describe.skip('FormBased Data Panel', () => { fromDate: '2019-01-01', toDate: '2020-01-01', dslQuery, - dataView: indexPatterns.b, - timeFieldName: indexPatterns.b.timeFieldName, + dataView: indexPatterns['2'], + timeFieldName: indexPatterns['2'].timeFieldName, }) ); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '1 available field. 2 empty fields. 0 meta fields.' - ); + expect(getAriaDescription()).toBe('1 available field. 2 empty fields. 0 meta fields.'); }); it('shows a loading indicator when loading', async () => { - const props = testProps({ - currentIndexPatternId: 'b', - }); - - let resolveFunction: (arg: unknown) => void; - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockReset(); - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(() => { - return new Promise((resolve) => { + let resolveFunction: (arg: { + existingFieldNames: string[]; + indexPatternTitle: string; + }) => void; + loadFieldExistingMock.mockResolvedValue( + new Promise((resolve) => { resolveFunction = resolve; - }); - }); - const inst = await mountAndWaitForLazyModules(); - - expect(inst.find(EuiProgress).length).toEqual(1); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '' + }) ); - await act(async () => { - resolveFunction!({ - existingFieldNames: [indexPatterns.b.fields[0].name], - }); - await inst.update(); - }); + await renderFormBasedDataPanel({ state: constructState('2') }); + expect(getAriaDescription()).toBe(''); + expect(screen.getByTestId('fieldListLoading')).toBeInTheDocument(); - await act(async () => { - await inst.update(); + await resolveFunction!({ + existingFieldNames: [indexPatterns['2'].fields[0].name], + indexPatternTitle: 'idx1', }); - expect(inst.find(EuiProgress).length).toEqual(0); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '1 available field. 2 empty fields. 0 meta fields.' - ); + await waitToLoad(); + + expect(getAriaDescription()).toBe('1 available field. 2 empty fields. 0 meta fields.'); + expect(screen.queryByTestId('fieldListLoading')).not.toBeInTheDocument(); }); it("should trigger showNoDataPopover if fields don't have data", async () => { - const props = testProps({ - currentIndexPatternId: 'a', - }); - - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [], - }; + loadFieldExistingMock.mockResolvedValue({ + existingFieldNames: [], + indexPatternTitle: 'idx1', }); - const inst = await mountAndWaitForLazyModules(); + await renderFormBasedDataPanel(); expect(defaultProps.showNoDataPopover).toHaveBeenCalled(); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '0 available fields. 5 empty fields. 0 meta fields.' - ); + expect(getAriaDescription()).toBe('0 available fields. 5 empty fields. 0 meta fields.'); }); it("should default to empty dsl if query can't be parsed", async () => { - const props = testProps({ - currentIndexPatternId: 'a', - otherProps: { - query: { - language: 'kuery', - query: '@timestamp : NOT *', - }, - }, + loadFieldExistingMock.mockResolvedValue({ + indexPatternTitle: 'idx1', + existingFieldNames: [indexPatterns['1'].fields[0].name, indexPatterns['1'].fields[1].name], }); - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [indexPatterns.a.fields[0].name, indexPatterns.a.fields[1].name], - }; + await renderFormBasedDataPanel({ + query: { language: 'kuery', query: '@timestamp : NOT *' }, }); - const inst = await mountAndWaitForLazyModules(); - expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( - expect.objectContaining({ - dslQuery: { - bool: { - must_not: { - match_all: {}, - }, - }, - }, - }) + expect.objectContaining({ dslQuery: { bool: { must_not: { match_all: {} } } } }) ); - expect(inst.find('[data-test-subj="lnsIndexPattern__ariaDescription"]').first().text()).toBe( - '2 available fields. 3 empty fields. 0 meta fields.' - ); + expect(getAriaDescription()).toBe('2 available fields. 3 empty fields. 0 meta fields.'); }); }); describe('displaying field list', () => { - let props: Parameters[0]; beforeEach(() => { - props = { - ...defaultProps, - }; - - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: ['bytes', 'memory'], - }; + loadFieldExistingMock.mockResolvedValue({ + existingFieldNames: ['bytes', 'memory'], + indexPatternTitle: 'idx1', }); }); it('should list all selected fields if exist', async () => { - const newProps = { - ...props, - layerFields: ['bytes'], - }; - - const wrapper = await mountAndWaitForLazyModules(); - - expect( - wrapper - .find('[data-test-subj="lnsIndexPatternSelectedFields"]') - .find(FieldItem) - .map((fieldItem) => fieldItem.prop('field').name) - ).toEqual(['bytes']); + await renderFormBasedDataPanel({ layerFields: ['bytes'] }); + expect(getSelectedFieldsNames()).toEqual(['bytes']); }); it('should not list the selected fields accordion if no fields given', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - expect( - wrapper! - .find('[data-test-subj="lnsIndexPatternSelectedFields"]') - .find(FieldItem) - .map((fieldItem) => fieldItem.prop('field').name) - ).toEqual([]); + await renderFormBasedDataPanel(); + expect(screen.queryByTestId('lnsIndexPatternSelectedFields')).not.toBeInTheDocument(); }); it('should list all supported fields in the pattern sorted alphabetically in groups', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - expect(wrapper.find(FieldItem).first().prop('field')).toEqual( - expect.objectContaining({ - displayName: 'Records', - }) - ); - const availableAccordion = wrapper.find('[data-test-subj="lnsIndexPatternAvailableFields"]'); - expect( - availableAccordion.find(FieldItem).map((fieldItem) => fieldItem.prop('field').name) - ).toEqual(['memory', 'bytes']); - expect(availableAccordion.find(FieldItem).at(0).prop('exists')).toEqual(true); - wrapper - .find('[data-test-subj="lnsIndexPatternEmptyFields"]') - .find('button') - .first() - .simulate('click'); - const emptyAccordion = wrapper.find('[data-test-subj="lnsIndexPatternEmptyFields"]'); - expect( - emptyAccordion.find(FieldItem).map((fieldItem) => fieldItem.prop('field').name) - ).toEqual(['client', 'source', 'timestamp']); - expect( - emptyAccordion - .find(FieldItem) - .map((fieldItem) => (fieldItem.prop('field') as IndexPatternField).displayName) - ).toEqual(['client', 'source', 'timestampLabel']); - expect(emptyAccordion.find(FieldItem).at(1).prop('exists')).toEqual(false); + const { container } = await renderFormBasedDataPanel(); + expect(container.querySelector('.kbnFieldButton__nameInner')).toHaveTextContent('Records'); + expect(getAvailableFieldsNames()).toEqual(['amemory', 'bytes']); + await userEvent.click(screen.getByText('Empty fields')); + expect(getEmptyFieldsNames()).toEqual(['client', 'source', 'timestampLabel']); }); it('should show meta fields accordion', async () => { - const wrapper = await mountAndWaitForLazyModules( - - ); - - wrapper - .find('[data-test-subj="lnsIndexPatternMetaFields"]') - .find('button') - .first() - .simulate('click'); - expect( - wrapper - .find('[data-test-subj="lnsIndexPatternMetaFields"]') - .find(FieldItem) - .first() - .prop('field').name - ).toEqual('_id'); + }, + }), + }); + await userEvent.click(screen.getByText('Meta fields')); + expect(getMetaFieldsNames()).toEqual(['_id']); }); it('should display NoFieldsCallout when all fields are empty', async () => { - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - return { - existingFieldNames: [], - }; + loadFieldExistingMock.mockResolvedValueOnce({ + existingFieldNames: [], + indexPatternTitle: 'idx1', }); + await renderFormBasedDataPanel(); + expect(getAvailableFieldsNames()).toEqual([]); + expect( + screen.getByTestId('lnsIndexPatternAvailableFieldsNoFieldsCallout-noFieldsMatch') + ).toBeInTheDocument(); - const wrapper = await mountAndWaitForLazyModules(); + await userEvent.click(screen.getByText('Empty fields')); - expect(wrapper.find(EuiCallOut).length).toEqual(2); - expect( - wrapper - .find('[data-test-subj="lnsIndexPatternAvailableFields"]') - .find(FieldItem) - .map((fieldItem) => fieldItem.prop('field').name) - ).toEqual([]); - wrapper - .find('[data-test-subj="lnsIndexPatternEmptyFields"]') - .find('button') - .first() - .simulate('click'); - expect( - wrapper - .find('[data-test-subj="lnsIndexPatternEmptyFields"]') - .find(FieldItem) - .map((fieldItem) => (fieldItem.prop('field') as IndexPatternField).displayName) - ).toEqual(['amemory', 'bytes', 'client', 'source', 'timestampLabel']); + expect(getEmptyFieldsNames()).toEqual([ + 'amemory', + 'bytes', + 'client', + 'source', + 'timestampLabel', + ]); }); it('should display spinner for available fields accordion if existing fields are not loaded yet', async () => { - let resolveFunction: (arg: unknown) => void; - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockReset(); - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(() => { - return new Promise((resolve) => { + let resolveFunction: (arg: { + existingFieldNames: string[]; + indexPatternTitle: string; + }) => void; + loadFieldExistingMock.mockResolvedValueOnce( + new Promise((resolve) => { resolveFunction = resolve; - }); - }); - const wrapper = await mountAndWaitForLazyModules(); - + }) + ); + await renderFormBasedDataPanel(); + expect(screen.getByTestId('fieldListLoading')).toBeInTheDocument(); expect( - wrapper.find('[data-test-subj="lnsIndexPatternAvailableFields"]').find(EuiLoadingSpinner) - .length - ).toEqual(1); - expect(wrapper.find(EuiCallOut).length).toEqual(0); + screen.queryByTestId('lnsIndexPatternMetaFieldsNoFieldsCallout-noFieldsMatch') + ).not.toBeInTheDocument(); await act(async () => { resolveFunction!({ existingFieldNames: [], + indexPatternTitle: 'idx1', }); }); - await act(async () => { - await wrapper.update(); - }); - + expect(screen.queryByTestId('fieldListLoading')).not.toBeInTheDocument(); expect( - wrapper.find('[data-test-subj="lnsIndexPatternAvailableFields"]').find(EuiLoadingSpinner) - .length - ).toEqual(0); - expect(wrapper.find(EuiCallOut).length).toEqual(2); + screen.getByTestId('lnsIndexPatternMetaFieldsNoFieldsCallout-noFieldsMatch') + ).toBeInTheDocument(); }); - it('should not allow field details when error', async () => { - (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => { - throw new Error('test'); + it('should show error when loading fails', async () => { + loadFieldExistingMock.mockImplementation(() => { + throw new Error('idx1'); }); - const wrapper = await mountAndWaitForLazyModules(); - - expect(wrapper.find(FieldListGrouped).prop('fieldGroups')).toEqual( - expect.objectContaining({ - AvailableFields: expect.objectContaining({ hideDetails: true }), - }) - ); + await renderFormBasedDataPanel(); + expect(screen.getByTestId('lnsIndexPatternAvailableFields-fetchWarning')).toBeInTheDocument(); }); it('should filter down by name', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - act(() => { - wrapper.find('[data-test-subj="lnsIndexPatternFieldSearch"] input').simulate('change', { - target: { value: 'me' }, - }); - }); - - wrapper - .find('[data-test-subj="lnsIndexPatternEmptyFields"] button') - .first() - .simulate('click'); - - expect(wrapper.find(FieldItem).map((fieldItem) => fieldItem.prop('field').name)).toEqual([ - 'memory', - 'timestamp', - ]); + await renderFormBasedDataPanel(); + await searchForPhrase('me'); + await userEvent.click(screen.getByText('Empty fields')); + expect(getFieldNames()).toEqual(['amemory', 'timestampLabel']); }); it('should announce filter in live region', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - act(() => { - wrapper.find('[data-test-subj="lnsIndexPatternFieldSearch"] input').simulate('change', { - target: { value: 'me' }, - }); - }); - - wrapper - .find('[data-test-subj="lnsIndexPatternEmptyFields"]') - .find('button') - .first() - .simulate('click'); - - expect(wrapper.find('[aria-live="polite"]').at(1).text()).toEqual( - '1 available field. 1 empty field. 0 meta fields.' + await renderFormBasedDataPanel(); + await searchForPhrase('me'); + expect(getFieldNames()).toEqual(['amemory']); + expect(getAriaDescription()).toBe('1 available field. 1 empty field. 0 meta fields.'); + await userEvent.click(screen.getByTestId('lnsIndexPatternEmptyFields')); + + expect(screen.getByTestId('lnsIndexPattern__ariaDescription').getAttribute('aria-live')).toBe( + 'polite' ); }); it('should filter down by type', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - wrapper - .find('[data-test-subj="lnsIndexPatternFieldTypeFilterToggle"]') - .last() - .simulate('click'); + await renderFormBasedDataPanel(); - wrapper.find('[data-test-subj="typeFilter-number"]').first().simulate('click'); + await userEvent.click(screen.getByTestId('lnsIndexPatternFieldTypeFilterToggle')); + await userEvent.click(screen.getByTestId('typeFilter-document')); - expect( - wrapper - .find(FieldItem) - .map((fieldItem) => (fieldItem.prop('field') as IndexPatternField).displayName) - ).toEqual(['amemory', 'bytes']); + expect(getFieldNames()).toEqual(['Records']); }); it('should display no fields in groups when filtered by type Record', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - wrapper - .find('[data-test-subj="lnsIndexPatternFieldTypeFilterToggle"]') - .last() - .simulate('click'); - - wrapper.find('[data-test-subj="typeFilter-document"]').first().simulate('click'); - - expect(wrapper.find(FieldItem).map((fieldItem) => fieldItem.prop('field').name)).toEqual([ - DOCUMENT_FIELD_NAME, - ]); - expect(wrapper.find(EuiCallOut).length).toEqual(2); + await renderFormBasedDataPanel(); + await userEvent.click(screen.getByTestId('lnsIndexPatternFieldTypeFilterToggle')); + await userEvent.click(screen.getByTestId('typeFilter-document')); + expect(screen.getAllByTestId('lnsFieldListPanelField').length).toEqual(1); + expect(getFieldNames()).toEqual(['Records']); + expect( + screen.getByTestId('lnsIndexPatternAvailableFieldsNoFieldsCallout-noFieldsMatch') + ).toBeInTheDocument(); + expect( + screen.getByTestId('lnsIndexPatternMetaFieldsNoFieldsCallout-noFieldsMatch') + ).toBeInTheDocument(); }); it('should toggle type if clicked again', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - wrapper - .find('[data-test-subj="lnsIndexPatternFieldTypeFilterToggle"]') - .last() - .simulate('click'); - - wrapper.find('[data-test-subj="typeFilter-number"]').first().simulate('click'); - wrapper.find('[data-test-subj="typeFilter-number"]').first().simulate('click'); - wrapper - .find('[data-test-subj="lnsIndexPatternEmptyFields"]') - .find('button') - .first() - .simulate('click'); - expect( - wrapper - .find(FieldItem) - .map((fieldItem) => (fieldItem.prop('field') as IndexPatternField).displayName) - ).toEqual(['Records', 'amemory', 'bytes', 'client', 'source', 'timestampLabel']); + await renderFormBasedDataPanel(); + await userEvent.click(screen.getByTestId('lnsIndexPatternFieldTypeFilterToggle')); + await userEvent.click(screen.getByTestId('typeFilter-number')); + expect(getFieldNames()).toEqual(['amemory', 'bytes']); + await userEvent.click(screen.getByTestId('typeFilter-number')); + expect(getFieldNames()).toEqual(['Records', 'amemory', 'bytes']); }); - it('should filter down by type and by name', async () => { - const wrapper = await mountAndWaitForLazyModules(); - - act(() => { - wrapper.find('[data-test-subj="lnsIndexPatternFieldSearch"] input').simulate('change', { - target: { value: 'me' }, - }); - }); - - wrapper - .find('[data-test-subj="lnsIndexPatternFieldTypeFilterToggle"]') - .last() - .simulate('click'); - - wrapper.find('[data-test-subj="typeFilter-number"]').first().simulate('click'); - - expect(wrapper.find(FieldItem).map((fieldItem) => fieldItem.prop('field').name)).toEqual([ - 'memory', - ]); + it('should filter down by names', async () => { + await renderFormBasedDataPanel(); + await searchForPhrase('me'); + expect(getFieldNames()).toEqual(['amemory']); + }); + it('should filter down by types', async () => { + await renderFormBasedDataPanel(); + await userEvent.click(screen.getByTestId('lnsIndexPatternFieldTypeFilterToggle')); + await userEvent.click(screen.getByTestId('typeFilter-number')); + expect(getFieldNames()).toEqual(['amemory', 'bytes']); }); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/datapanel.tsx b/x-pack/plugins/lens/public/datasources/form_based/datapanel.tsx index c666c23d667c3..e356a59956f06 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/datapanel.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/datapanel.tsx @@ -41,7 +41,7 @@ import type { FormBasedPrivateState } from './types'; import { IndexPatternServiceAPI } from '../../data_views_service/service'; import { FieldItem } from '../common/field_item'; -export type Props = Omit< +export type FormBasedDataPanelProps = Omit< DatasourceDataPanelProps, 'core' | 'onChangeIndexPattern' > & { @@ -97,7 +97,7 @@ export function FormBasedDataPanel({ onIndexPatternRefresh, usedIndexPatterns, layerFields, -}: Props) { +}: FormBasedDataPanelProps) { const { indexPatterns, indexPatternRefs } = frame.dataViews; const { currentIndexPatternId } = state; diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_panel.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_panel.test.tsx index 4bd00983a212a..a354b54fb37e9 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_panel.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_panel.test.tsx @@ -187,8 +187,7 @@ function mountWithServices(component: React.ReactElement): ReactWrapper { * - Dimension trigger: Not tested here * - Dimension editor component: First half of the tests */ -// Failing: See https://github.com/elastic/kibana/issues/192476 -describe.skip('FormBasedDimensionEditor', () => { +describe('FormBasedDimensionEditor', () => { let state: FormBasedPrivateState; let setState: jest.Mock; let defaultProps: FormBasedDimensionEditorProps; @@ -353,8 +352,7 @@ describe.skip('FormBasedDimensionEditor', () => { await userEvent.click(screen.getByRole('button', { name: /open list of options/i })); expect(screen.getByText(/There aren't any options available/)).toBeInTheDocument(); }); - - it('should list all field names and document as a whole in prioritized order', async () => { + test('should list all field names and document as a whole in prioritized order', async () => { const { getVisibleFieldSelectOptions } = renderDimensionPanel(); const comboBoxButton = screen.getAllByRole('button', { name: /open list of options/i })[0]; @@ -372,14 +370,9 @@ describe.skip('FormBasedDimensionEditor', () => { ]; expect(allOptions.slice(0, 7)).toEqual(getVisibleFieldSelectOptions()); - // keep hitting arrow down to scroll to the next options (react-window only renders visible options) - await userEvent.type(comboBoxInput, '{ArrowDown}'.repeat(12)); - - expect(getVisibleFieldSelectOptions()).toEqual(allOptions.slice(5, 16)); - - // press again to go back to the beginning - await userEvent.type(comboBoxInput, '{ArrowDown}'); - expect(getVisibleFieldSelectOptions()).toEqual(allOptions.slice(0, 9)); + // // press arrow up to go back to the beginning + await userEvent.type(comboBoxInput, '{ArrowUp}{ArrowUp}'); + expect(getVisibleFieldSelectOptions()).toEqual(allOptions.slice(8)); }); it('should hide fields that have no data', () => { diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_input.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_input.test.tsx index 322c1ab855152..619d02f0bf28f 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_input.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_input.test.tsx @@ -7,9 +7,10 @@ import React from 'react'; import { mount } from 'enzyme'; -import { fireEvent, render, screen } from '@testing-library/react'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { act } from 'react-dom/test-utils'; import { EuiComboBox } from '@elastic/eui'; +import userEvent from '@testing-library/user-event'; import { GenericOperationDefinition } from '../operations'; import { averageOperation, @@ -28,38 +29,8 @@ import { GenericIndexPatternColumn, FormBasedLayer, FormBasedPrivateState } from import { ReferenceBasedIndexPatternColumn } from '../operations/definitions/column_types'; import { FieldSelect } from './field_select'; import { IndexPattern, VisualizationDimensionGroupConfig } from '../../../types'; -import userEvent from '@testing-library/user-event'; - -jest.mock('../operations/layer_helpers', () => { - const original = jest.requireActual('../operations/layer_helpers'); - return { - ...original, - insertOrReplaceColumn: () => { - return {} as FormBasedLayer; - }, - }; -}); - -const defaultProps = { - indexPattern: createMockedIndexPattern(), - currentFieldIsInvalid: false, - incompleteField: null, - incompleteOperation: undefined, - incompleteParams: {}, - dimensionGroups: [] as VisualizationDimensionGroupConfig[], - groupId: 'any', - operationDefinitionMap: { - terms: termsOperation, - average: averageOperation, - count: countOperation, - differences: derivativeOperation, - staticValue: staticValueOperation, - min: minOperation, - } as unknown as Record, -}; - -function getStringBasedOperationColumn(field = 'source'): FieldBasedIndexPatternColumn { +function getStringBasedOperationColumn(field = 'source') { return { label: `Top value of ${field}`, dataType: 'string', @@ -109,12 +80,32 @@ function getCountOperationColumn(): GenericIndexPatternColumn { operationType: 'count', }; } -function getLayer( - col1: GenericIndexPatternColumn = getStringBasedOperationColumn(), - indexPattern?: IndexPattern -) { +const defaultDataView = createMockedIndexPattern(); +const defaultProps = { + columnId: 'col1', + layer: getLayer(), + operationSupportMatrix: getDefaultOperationSupportMatrix(getLayer(), 'col1'), + indexPattern: defaultDataView, + currentFieldIsInvalid: false, + incompleteField: null, + incompleteOperation: undefined, + incompleteParams: {}, + dimensionGroups: [] as VisualizationDimensionGroupConfig[], + groupId: 'any', + updateLayer: jest.fn(), + operationDefinitionMap: { + terms: termsOperation, + average: averageOperation, + count: countOperation, + differences: derivativeOperation, + staticValue: staticValueOperation, + min: minOperation, + } as unknown as Record, +}; + +function getLayer(col1: GenericIndexPatternColumn = getStringBasedOperationColumn()) { return { - indexPatternId: defaultProps.indexPattern.id, + indexPatternId: defaultDataView.id, columnOrder: ['col1', 'col2'], columns: { col1, @@ -135,53 +126,28 @@ function getDefaultOperationSupportMatrix( filterOperations: () => true, columnId, indexPatterns: { - [defaultProps.indexPattern.id]: indexPattern ?? defaultProps.indexPattern, + [defaultDataView.id]: indexPattern ?? defaultDataView, }, }); } -const mockedReader = { - hasFieldData: (dataViewId: string, fieldName: string) => { - if (defaultProps.indexPattern.id !== dataViewId) { - return false; - } - - const map: Record = {}; - for (const field of defaultProps.indexPattern.fields) { - map[field.name] = true; - } - - return map[fieldName]; - }, -}; - -jest.mock('@kbn/unified-field-list/src/hooks/use_existing_fields', () => ({ - useExistingFieldsReader: jest.fn(() => mockedReader), -})); - const renderFieldInput = ( overrideProps?: Partial> ) => { - const updateLayerSpy = jest.fn(); - const layer = getLayer(); - const operationSupportMatrix = getDefaultOperationSupportMatrix(layer, 'col1'); - return render( - - ); + return render(); }; +const waitForComboboxToClose = async () => + await waitFor(() => expect(screen.queryByRole('listbox')).toBeNull()); + const getErrorElement = (container: HTMLElement) => container.querySelector('.euiFormErrorText'); const getLabelElement = () => screen.getByTestId('indexPattern-field-selection-row').querySelector('label'); describe('FieldInput', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); it('should render a field select box', () => { renderFieldInput(); expect(screen.getByTestId('indexPattern-dimension-field')).toBeInTheDocument(); @@ -248,6 +214,14 @@ describe('FieldInput', () => { ); }); + it('should update the layer on field selection', async () => { + renderFieldInput({ selectedColumn: getStringBasedOperationColumn() }); + await userEvent.click(screen.getByRole('combobox')); + fireEvent.click(screen.getByTestId('lns-fieldOption-bytes')); + expect(defaultProps.updateLayer).toHaveBeenCalled(); + await waitForComboboxToClose(); + }); + it('should prioritize errors over help messages', () => { const helpMessage = 'My help message'; renderFieldInput({ helpMessage, currentFieldIsInvalid: true }); @@ -256,32 +230,16 @@ describe('FieldInput', () => { ); }); - it('should update the layer on field selection', async () => { - const updateLayerSpy = jest.fn(); - renderFieldInput({ - selectedColumn: getStringBasedOperationColumn(), - updateLayer: updateLayerSpy, - }); - await userEvent.click(screen.getByRole('combobox')); - fireEvent.click(screen.getByTestId('lns-fieldOption-bytes')); - expect(updateLayerSpy).toHaveBeenCalled(); - }); - it('should not trigger when the same selected field is selected again', async () => { - const updateLayerSpy = jest.fn(); - renderFieldInput({ - selectedColumn: getStringBasedOperationColumn(), - updateLayer: updateLayerSpy, - }); - + renderFieldInput({ selectedColumn: getStringBasedOperationColumn() }); await userEvent.click(screen.getByRole('combobox')); fireEvent.click(screen.getByTestId('lns-fieldOption-source')); - expect(updateLayerSpy).not.toHaveBeenCalled(); + await waitForComboboxToClose(); + expect(defaultProps.updateLayer).not.toHaveBeenCalled(); }); it('should prioritize incomplete fields over selected column field to display', () => { - const updateLayerSpy = jest.fn(); const layer = getLayer(); const operationSupportMatrix = getDefaultOperationSupportMatrix(layer, 'col1'); const instance = mount( @@ -289,7 +247,7 @@ describe('FieldInput', () => { {...defaultProps} layer={layer} columnId={'col1'} - updateLayer={updateLayerSpy} + updateLayer={defaultProps.updateLayer} operationSupportMatrix={operationSupportMatrix} incompleteField={'dest'} selectedColumn={getStringBasedOperationColumn()} @@ -305,7 +263,6 @@ describe('FieldInput', () => { }); it('should forward the onDeleteColumn function', () => { - const updateLayerSpy = jest.fn(); const onDeleteColumn = jest.fn(); const layer = getLayer(); const operationSupportMatrix = getDefaultOperationSupportMatrix(layer, 'col1'); @@ -314,7 +271,7 @@ describe('FieldInput', () => { {...defaultProps} layer={layer} columnId={'col1'} - updateLayer={updateLayerSpy} + updateLayer={defaultProps.updateLayer} operationSupportMatrix={operationSupportMatrix} onDeleteColumn={onDeleteColumn} /> @@ -325,7 +282,7 @@ describe('FieldInput', () => { }); expect(onDeleteColumn).toHaveBeenCalled(); - expect(updateLayerSpy).not.toHaveBeenCalled(); + expect(defaultProps.updateLayer).not.toHaveBeenCalled(); }); describe('time series group', () => { @@ -341,7 +298,6 @@ describe('FieldInput', () => { return layer; } it('should not render the time dimension category if it has tsdb metric column but the group is not a breakdown', () => { - const updateLayerSpy = jest.fn(); const layer = getLayerWithTSDBMetric(); const operationSupportMatrix = getDefaultOperationSupportMatrix(layer, 'col1'); const instance = mount( @@ -359,7 +315,7 @@ describe('FieldInput', () => { ])} layer={layer} columnId={'col1'} - updateLayer={updateLayerSpy} + updateLayer={defaultProps.updateLayer} operationSupportMatrix={operationSupportMatrix} /> ); @@ -368,7 +324,6 @@ describe('FieldInput', () => { }); it('should render the time dimension category if it has tsdb metric column and the group is a breakdown one', () => { - const updateLayerSpy = jest.fn(); const layer = getLayerWithTSDBMetric(); const operationSupportMatrix = getDefaultOperationSupportMatrix(layer, 'col1'); const instance = mount( @@ -393,7 +348,7 @@ describe('FieldInput', () => { groupId="breakdown" layer={layer} columnId={'col1'} - updateLayer={updateLayerSpy} + updateLayer={defaultProps.updateLayer} operationSupportMatrix={operationSupportMatrix} /> ); diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.test.tsx index 3e44070ad5152..c8875bfece64e 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.test.tsx @@ -63,7 +63,7 @@ const renderFormatSelector = (propsOverrides?: Partial) => // see for example the first two tests, they run the same code but expect // different results. With the updated userEvent code the tests no longer work // with this setup and should be refactored. -describe.skip('FormatSelector', () => { +describe('FormatSelector', () => { let user: UserEvent; beforeEach(() => { @@ -83,7 +83,7 @@ describe.skip('FormatSelector', () => { }); it('updates the format decimals to upper range when input exceeds the range', async () => { renderFormatSelector(); - await user.type(screen.getByLabelText('Decimals'), '{backspace}10'); + await user.type(screen.getByLabelText('Decimals'), '{backspace}20'); expect(props.onChange).toBeCalledWith({ id: 'bytes', params: { decimals: 15 } }); }); it('updates the format decimals to lower range when input is smaller than range', async () => { diff --git a/x-pack/plugins/lens/public/datasources/form_based/layerpanel.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/layerpanel.test.tsx index a944513acf4e4..bbcecf15d2bd1 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/layerpanel.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/layerpanel.test.tsx @@ -13,6 +13,9 @@ import { getFieldByNameFactory } from './pure_helpers'; import { TermsIndexPatternColumn } from './operations'; import userEvent from '@testing-library/user-event'; +Object.defineProperty(HTMLElement.prototype, 'scrollWidth', { value: 400 }); +Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { value: 200 }); + jest.mock('@kbn/unified-search-plugin/public', () => { const actual = jest.requireActual('@kbn/unified-search-plugin/public'); return { @@ -219,9 +222,7 @@ describe('Layer Data Panel', () => { }; }); - const renderLayerPanel = () => { - return render(); - }; + const renderLayerPanel = () => render(); it('should list all index patterns', async () => { renderLayerPanel(); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.test.tsx index e8267dd388520..6795cd8caaa83 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/chart_switch/chart_switch.test.tsx @@ -264,8 +264,8 @@ describe('chart_switch', () => { fireEvent.click(getMenuItem(subType)); }; - const waitForChartSwitchClosed = () => { - waitFor(() => { + const waitForChartSwitchClosed = async () => { + await waitFor(() => { expect(screen.queryByTestId('lnsChartSwitchList')).not.toBeInTheDocument(); }); }; @@ -448,14 +448,13 @@ describe('chart_switch', () => { await openChartSwitch(); switchToVis('testVis2'); - // expect(datasourceMap.testDatasource.publicAPIMock.getTableSpec).toHaveBeenCalled(); expect(visualizationMap.testVis2.getSuggestions).toHaveBeenCalled(); expect(visualizationMap.testVis2.initialize).toHaveBeenCalledWith( expect.any(Function), // generated layerId undefined, undefined ); - waitForChartSwitchClosed(); + await waitForChartSwitchClosed(); }); it('should use initial state if there is no suggestion from the target visualization', async () => { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx index 75cddd85b5803..7d41e326372e5 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx @@ -444,52 +444,6 @@ describe('editor_frame', () => { instance.unmount(); }); - // this test doesn't test anything, it's buggy and should be rewritten when we find a way to user test drag and drop - it.skip('should switch to best suggested visualization on field drop', async () => { - const suggestionVisState = {}; - - visualizationMap = { - testVis: { - ...mockVisualization, - getSuggestions: () => [ - { - score: 0.2, - state: {}, - title: 'Suggestion1', - previewIcon: 'empty', - }, - { - score: 0.8, - state: suggestionVisState, - title: 'Suggestion2', - previewIcon: 'empty', - }, - ], - }, - testVis2: mockVisualization2, - }; - datasourceMap = { - testDatasource: { - ...mockDatasource, - getDatasourceSuggestionsForField: () => [generateSuggestion()], - getDatasourceSuggestionsFromCurrentState: () => [generateSuggestion()], - getDatasourceSuggestionsForVisualizeField: () => [generateSuggestion()], - }, - }; - renderEditorFrame(); - - mockVisualization.getConfiguration.mockClear(); - act(() => { - instance.find('[data-test-subj="lnsWorkspace"]').last().simulate('drop'); - }); - - expect(mockVisualization.getConfiguration).toHaveBeenCalledWith( - expect.objectContaining({ - state: {}, - }) - ); - }); - it('should use the currently selected visualization if possible on field drop', async () => { mockDatasource.getLayers.mockReturnValue(['first', 'second', 'third']); const suggestionVisState = {}; diff --git a/x-pack/plugins/lens/public/shared_components/dataview_picker/dataview_picker.tsx b/x-pack/plugins/lens/public/shared_components/dataview_picker/dataview_picker.tsx index c4efd626d4772..e1de5e9b6527d 100644 --- a/x-pack/plugins/lens/public/shared_components/dataview_picker/dataview_picker.tsx +++ b/x-pack/plugins/lens/public/shared_components/dataview_picker/dataview_picker.tsx @@ -14,6 +14,9 @@ import { css } from '@emotion/react'; import { type IndexPatternRef } from '../../types'; import { type ChangeIndexPatternTriggerProps, TriggerButton } from './trigger'; +const MAX_WIDTH = 600; +const MIN_WIDTH = 320; + export function ChangeIndexPattern({ indexPatternRefs, isMissingCurrent, @@ -52,8 +55,8 @@ export function ChangeIndexPattern({
diff --git a/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.test.tsx b/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.test.tsx index 98a040ab04bb5..8538dcece585e 100644 --- a/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.test.tsx +++ b/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.test.tsx @@ -142,12 +142,14 @@ describe('Legend Settings', () => { toolTipContent: 'Shows the average value', }, ], + legendStats: [LegendValue.Average], onLegendStatsChange, }); - expect(screen.queryByRole('button', { name: 'Layout' })).toBeNull(); fireEvent.click(screen.getByRole('combobox', { name: 'Statistics' })); fireEvent.click(screen.getByRole('option', { name: 'Current and last value' })); - // expect(screen.getByRole('group', { name: 'Layout' })).toBeInTheDocument(); - expect(onLegendStatsChange).toBeCalledWith([LegendValue.CurrentAndLastValue], false); + expect(onLegendStatsChange).toBeCalledWith( + [LegendValue.Average, LegendValue.CurrentAndLastValue], + false + ); }); }); diff --git a/x-pack/plugins/lens/public/visualization_container.test.tsx b/x-pack/plugins/lens/public/visualization_container.test.tsx index 9ffaebe1f14e9..498a44c2760f7 100644 --- a/x-pack/plugins/lens/public/visualization_container.test.tsx +++ b/x-pack/plugins/lens/public/visualization_container.test.tsx @@ -6,31 +6,25 @@ */ import React from 'react'; -import { mount } from 'enzyme'; import { VisualizationContainer } from './visualization_container'; +import { render, screen } from '@testing-library/react'; describe('VisualizationContainer', () => { + const renderVisContainer = (props?: React.HTMLAttributes) => { + return render(Hello!); + }; test('renders child content', () => { - const component = mount(Hello!); - - expect(component.text()).toEqual('Hello!'); + renderVisContainer(); + expect(screen.getByText('Hello!')).toBeInTheDocument(); }); test('renders style', () => { - const component = mount( - Hello! - ); - const el = component.find('.lnsVisualizationContainer').first(); - - expect(el.prop('style')).toEqual({ color: 'blue' }); + renderVisContainer({ style: { color: 'blue' } }); + expect(screen.getByText('Hello!')).toHaveStyle({ color: 'blue' }); }); test('combines class names with container class', () => { - const component = mount( - Hello! - ); - const el = component.find('.lnsVisualizationContainer').first(); - - expect(el.prop('className')).toEqual('myClass lnsVisualizationContainer'); + renderVisContainer({ className: 'myClass' }); + expect(screen.getByText('Hello!')).toHaveClass('myClass lnsVisualizationContainer'); }); }); 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 8cf548255023a..09c7d95b309e7 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 @@ -24,6 +24,7 @@ import { createMockDatasource, createMockFramePublicAPI } from '../../../mocks'; import { TableDimensionEditor } from './dimension_editor'; import { ColumnState } from '../../../../common/expressions'; import { capitalize } from 'lodash'; +import { I18nProvider } from '@kbn/i18n-react'; describe('data table dimension editor', () => { let user: UserEvent; @@ -60,7 +61,6 @@ describe('data table dimension editor', () => { }); beforeEach(() => { - // Workaround for timeout via https://github.com/testing-library/user-event/issues/833#issuecomment-1171452841 user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); btnGroups = { colorMode: new EuiButtonGroupTestHarness('lnsDatatable_dynamicColoring_groups'), @@ -123,10 +123,10 @@ describe('data table dimension editor', () => { ) => { return render(, { wrapper: ({ children }) => ( - <> +
{children} - + ), }); }; @@ -243,6 +243,7 @@ describe('data table dimension editor', () => { renderTableDimensionEditor(); await user.click(screen.getByLabelText('Edit colors')); + act(() => jest.advanceTimersByTime(256)); expect(screen.getByTestId(`lns-palettePanel-${flyout}`)).toBeInTheDocument(); } diff --git a/x-pack/plugins/lens/public/visualizations/xy/types.ts b/x-pack/plugins/lens/public/visualizations/xy/types.ts index 2ac9b3df7fdd2..694799b94638e 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/types.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/types.ts @@ -193,6 +193,18 @@ const areaShared = { }), }; +const lineShared = { + id: 'line', + icon: IconChartLine, + label: i18n.translate('xpack.lens.xyVisualization.lineLabel', { + defaultMessage: 'Line', + }), + sortPriority: 2, + description: i18n.translate('xpack.lens.line.visualizationDescription', { + defaultMessage: 'Reveal variations in data over time.', + }), +}; + export const visualizationSubtypes: VisualizationType[] = [ { id: 'bar', @@ -278,17 +290,7 @@ export const visualizationSubtypes: VisualizationType[] = [ }), ...areaShared, }, - { - id: 'line', - icon: IconChartLine, - label: i18n.translate('xpack.lens.xyVisualization.lineLabel', { - defaultMessage: 'Line', - }), - sortPriority: 2, - description: i18n.translate('xpack.lens.line.visualizationDescription', { - defaultMessage: 'Reveal variations in data over time.', - }), - }, + lineShared, ]; export const visualizationTypes: VisualizationType[] = [ @@ -306,10 +308,7 @@ export const visualizationTypes: VisualizationType[] = [ label: i18n.translate('xpack.lens.xyVisualization.barLabel', { defaultMessage: 'Bar', }), - sortPriority: 1, - description: i18n.translate('xpack.lens.bar.visualizationDescription', { - defaultMessage: 'Compare categories or groups of data via bars.', - }), + ...barShared, getCompatibleSubtype: (seriesType?: string) => { if (seriesType === 'area') { return 'bar'; @@ -342,15 +341,7 @@ export const visualizationTypes: VisualizationType[] = [ }, }, { - id: 'line', - icon: IconChartLine, - label: i18n.translate('xpack.lens.xyVisualization.lineLabel', { - defaultMessage: 'Line', - }), - sortPriority: 2, - description: i18n.translate('xpack.lens.line.visualizationDescription', { - defaultMessage: 'Reveal variations in data over time or categorically.', - }), + ...lineShared, subtypes: ['line'], }, ]; diff --git a/x-pack/plugins/ml/public/application/explorer/__mocks__/mock_anomalies_table_data.json b/x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data.json similarity index 97% rename from x-pack/plugins/ml/public/application/explorer/__mocks__/mock_anomalies_table_data.json rename to x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data.json index 2827e87a05d1e..12cd80644efcf 100644 --- a/x-pack/plugins/ml/public/application/explorer/__mocks__/mock_anomalies_table_data.json +++ b/x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data.json @@ -1,4 +1,5 @@ -{ "default": { +{ + "default": { "anomalies": [ { "time": 1486018800000, @@ -44,9 +45,11 @@ "metricDescriptionSort": 82.83851409101328, "detector": "count by mlcategory", "isTimeSeriesViewDetector": false, - "influencers": [ - "mockInfluencer" - ] + "influencers": [ + { + "mockInfluencerField": "mockInfluencerValue" + } + ] }, { "time": 1486018800000, @@ -92,12 +95,16 @@ "metricDescriptionSort": 38.82201810127708, "detector": "count by mlcategory", "isTimeSeriesViewDetector": false, - "influencers": [ - "mockInfluencer" - ] + "influencers": [ + { + "mockInfluencerField": "mockInfluencerValue" + } + ] } ], - "jobIds": ["it-ops-count-by-mlcategory-one"], + "jobIds": [ + "it-ops-count-by-mlcategory-one" + ], "interval": "day", "examplesByJobId": { "it-ops-count-by-mlcategory-one": { @@ -161,7 +168,9 @@ "detector": "count by mlcategory", "isTimeSeriesViewDetector": false, "influencers": [ - "mockInfluencer" + { + "mockInfluencerField": "mockInfluencerValue" + } ] }, { @@ -208,7 +217,9 @@ "detector": "count by mlcategory", "isTimeSeriesViewDetector": false, "influencers": [ - "mockInfluencer" + { + "mockInfluencerField": "mockInfluencerValue" + } ] } ], @@ -496,7 +507,9 @@ "detector": "count by mlcategory", "isTimeSeriesViewDetector": false, "influencers": [ - "mockInfluencer" + { + "mockInfluencerField": "mockInfluencerValue" + } ] }, { @@ -541,7 +554,9 @@ "detector": "count by mlcategory", "isTimeSeriesViewDetector": false, "influencers": [ - "mockInfluencer" + { + "mockInfluencerField": "mockInfluencerValue" + } ] } ], diff --git a/x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data_multiple_detectors.json b/x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data_multiple_detectors.json new file mode 100644 index 0000000000000..bd886f4745af3 --- /dev/null +++ b/x-pack/plugins/ml/common/__mocks__/mock_anomalies_table_data_multiple_detectors.json @@ -0,0 +1,975 @@ +{ + "default": { + "anomalies": [ + { + "time": 1725840000000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.00011921600143273021, + "multi_bucket_impact": -5, + "record_score": 94.31236, + "initial_record_score": 91.59429607036628, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1725862500000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing", + "function": "mean", + "function_description": "mean", + "typical": [ + 15.851794819088305 + ], + "actual": [ + 350 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "SA" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 8, + "lower_confidence_bound": 5.733288153284621, + "typical_value": 15.851794819088305, + "upper_confidence_bound": 41.175974376816086 + }, + "category.keyword": [ + "Men's Clothing" + ], + "geoip.country_iso_code": [ + "SA" + ] + }, + "rowId": "1726503845974_0", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 94.31236, + "entityName": "category.keyword", + "entityValue": "Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Clothing" + }, + { + "geoip.country_iso_code": "SA" + } + ], + "actual": [ + 350 + ], + "actualSort": 350, + "typical": [ + 15.851794819088305 + ], + "typicalSort": 15.851794819088305, + "metricDescriptionSort": 22.079518691381207, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1725840000000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.03461785745665291, + "multi_bucket_impact": -5, + "record_score": 10.620156126608986, + "initial_record_score": 10.620156126608986, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1725862500000, + "partition_field_name": "category.keyword", + "partition_field_value": "Women's Clothing", + "function": "mean", + "function_description": "mean", + "typical": [ + 17.553578210957593 + ], + "actual": [ + 45 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Women's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "SA" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 7.606026510878394, + "typical_value": 17.553578210957593, + "upper_confidence_bound": 37.852824407923066 + }, + "category.keyword": [ + "Women's Clothing" + ], + "geoip.country_iso_code": [ + "SA" + ] + }, + "rowId": "1726503845974_1", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 10.620156126608986, + "entityName": "category.keyword", + "entityValue": "Women's Clothing", + "influencers": [ + { + "category.keyword": "Women's Clothing" + }, + { + "geoip.country_iso_code": "SA" + } + ], + "actual": [ + 45 + ], + "actualSort": 45, + "typical": [ + 17.553578210957593 + ], + "typicalSort": 17.553578210957593, + "metricDescriptionSort": 2.5635798843514044, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1725926400000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.01787543314280476, + "multi_bucket_impact": -5, + "record_score": 0.6916846762237938, + "initial_record_score": 0.6916846762237938, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1725990300000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing", + "function": "mean", + "function_description": "mean", + "typical": [ + 15.779865757388727 + ], + "actual": [ + 65 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "US" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 3, + "lower_confidence_bound": 5.889827882876367, + "typical_value": 15.779865757388727, + "upper_confidence_bound": 39.8666079359938 + }, + "category.keyword": [ + "Men's Clothing" + ], + "geoip.country_iso_code": [ + "US" + ] + }, + "rowId": "1726503845974_2", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 0.6916846762237938, + "entityName": "category.keyword", + "entityValue": "Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Clothing" + }, + { + "geoip.country_iso_code": "US" + } + ], + "actual": [ + 65 + ], + "actualSort": 65, + "typical": [ + 15.779865757388727 + ], + "typicalSort": 15.779865757388727, + "metricDescriptionSort": 4.1191731919243075, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726012800000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.013914839080385263, + "multi_bucket_impact": -5, + "record_score": 24.552541318692445, + "initial_record_score": 24.552541318692445, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1726056000000, + "partition_field_name": "category.keyword", + "partition_field_value": "Women's Accessories,Women's Clothing", + "function": "mean", + "function_description": "mean", + "typical": [ + 16.072466356993818 + ], + "actual": [ + 42 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Women's Accessories,Women's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "AE" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 7.901062666669044, + "typical_value": 16.072466356993818, + "upper_confidence_bound": 31.621998523165693 + }, + "category.keyword": [ + "Women's Accessories,Women's Clothing" + ], + "geoip.country_iso_code": [ + "AE" + ] + }, + "rowId": "1726503845974_3", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 24.552541318692445, + "entityName": "category.keyword", + "entityValue": "Women's Accessories,Women's Clothing", + "influencers": [ + { + "category.keyword": "Women's Accessories,Women's Clothing" + }, + { + "geoip.country_iso_code": "AE" + } + ], + "actual": [ + 42 + ], + "actualSort": 42, + "typical": [ + 16.072466356993818 + ], + "typicalSort": 16.072466356993818, + "metricDescriptionSort": 2.613164592609273, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726012800000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.013569993829022374, + "multi_bucket_impact": -5, + "record_score": 1.08840456688412, + "initial_record_score": 1.08840456688412, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1726083900000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing", + "function": "mean", + "function_description": "mean", + "typical": [ + 15.91745643577788 + ], + "actual": [ + 75 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "AE" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 3, + "lower_confidence_bound": 5.831067931970601, + "typical_value": 15.91745643577788, + "upper_confidence_bound": 40.89686519101566 + }, + "category.keyword": [ + "Men's Clothing" + ], + "geoip.country_iso_code": [ + "AE" + ] + }, + "rowId": "1726503845974_4", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 1.08840456688412, + "entityName": "category.keyword", + "entityValue": "Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Clothing" + }, + { + "geoip.country_iso_code": "AE" + } + ], + "actual": [ + 75 + ], + "actualSort": 75, + "typical": [ + 15.91745643577788 + ], + "typicalSort": 15.91745643577788, + "metricDescriptionSort": 4.711808089602902, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726012800000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.012483410285350998, + "multi_bucket_impact": -5, + "record_score": 26.21197793819939, + "initial_record_score": 26.21197793819939, + "bucket_span": 900, + "detector_index": 1, + "is_interim": false, + "timestamp": 1726065000000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing", + "function": "distinct_count", + "function_description": "distinct_count", + "typical": [ + 1 + ], + "actual": [ + 2 + ], + "field_name": "total_unique_products", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "FR", + "MA", + "TR" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 3, + "lower_confidence_bound": 0, + "typical_value": 0, + "upper_confidence_bound": 0 + }, + "category.keyword": [ + "Men's Clothing" + ], + "geoip.country_iso_code": [ + "FR", + "MA", + "TR" + ] + }, + "rowId": "1726503845974_5", + "jobId": "ecom_dect_01", + "detectorIndex": 1, + "severity": 26.21197793819939, + "entityName": "category.keyword", + "entityValue": "Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Clothing" + }, + { + "geoip.country_iso_code": "FR" + }, + { + "geoip.country_iso_code": "MA" + }, + { + "geoip.country_iso_code": "TR" + } + ], + "actual": [ + 2 + ], + "actualSort": 2, + "typical": [ + 1 + ], + "typicalSort": 1, + "metricDescriptionSort": 2, + "detector": "distinct_count(total_unique_products) partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726012800000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.029221215176833293, + "multi_bucket_impact": -5, + "record_score": 13.210841360998488, + "initial_record_score": 13.210841360998488, + "bucket_span": 900, + "detector_index": 1, + "is_interim": false, + "timestamp": 1726065000000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing,Men's Shoes", + "function": "distinct_count", + "function_description": "distinct_count", + "typical": [ + 1 + ], + "actual": [ + 2 + ], + "field_name": "total_unique_products", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing,Men's Shoes" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "EG", + "US" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 0, + "typical_value": 0, + "upper_confidence_bound": 0 + }, + "category.keyword": [ + "Men's Clothing,Men's Shoes" + ], + "geoip.country_iso_code": [ + "EG", + "US" + ] + }, + "rowId": "1726503845974_6", + "jobId": "ecom_dect_01", + "detectorIndex": 1, + "severity": 13.210841360998488, + "entityName": "category.keyword", + "entityValue": "Men's Clothing,Men's Shoes", + "influencers": [ + { + "category.keyword": "Men's Clothing,Men's Shoes" + }, + { + "geoip.country_iso_code": "EG" + }, + { + "geoip.country_iso_code": "US" + } + ], + "actual": [ + 2 + ], + "actualSort": 2, + "typical": [ + 1 + ], + "typicalSort": 1, + "metricDescriptionSort": 2, + "detector": "distinct_count(total_unique_products) partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726099200000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.01614665640555698, + "multi_bucket_impact": -5, + "record_score": 22.27855551555865, + "initial_record_score": 22.27855551555865, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1726133400000, + "partition_field_name": "category.keyword", + "partition_field_value": "Women's Accessories,Women's Shoes", + "function": "mean", + "function_description": "mean", + "typical": [ + 17.70351589303024 + ], + "actual": [ + 65 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Women's Accessories,Women's Shoes" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "US" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 6.522434202795708, + "typical_value": 17.70351589303024, + "upper_confidence_bound": 44.79010478599095 + }, + "category.keyword": [ + "Women's Accessories,Women's Shoes" + ], + "geoip.country_iso_code": [ + "US" + ] + }, + "rowId": "1726503845974_7", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 22.27855551555865, + "entityName": "category.keyword", + "entityValue": "Women's Accessories,Women's Shoes", + "influencers": [ + { + "category.keyword": "Women's Accessories,Women's Shoes" + }, + { + "geoip.country_iso_code": "US" + } + ], + "actual": [ + 65 + ], + "actualSort": 65, + "typical": [ + 17.70351589303024 + ], + "typicalSort": 17.70351589303024, + "metricDescriptionSort": 3.6715870673796545, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726099200000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.01894227723384407, + "multi_bucket_impact": -5, + "record_score": 19.837546336871547, + "initial_record_score": 19.837546336871547, + "bucket_span": 900, + "detector_index": 1, + "is_interim": false, + "timestamp": 1726121700000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing", + "function": "distinct_count", + "function_description": "distinct_count", + "typical": [ + 1 + ], + "actual": [ + 2 + ], + "field_name": "total_unique_products", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "AE", + "US" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 0, + "typical_value": 0, + "upper_confidence_bound": 0 + }, + "category.keyword": [ + "Men's Clothing" + ], + "geoip.country_iso_code": [ + "AE", + "US" + ] + }, + "rowId": "1726503845974_8", + "jobId": "ecom_dect_01", + "detectorIndex": 1, + "severity": 19.837546336871547, + "entityName": "category.keyword", + "entityValue": "Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Clothing" + }, + { + "geoip.country_iso_code": "AE" + }, + { + "geoip.country_iso_code": "US" + } + ], + "actual": [ + 2 + ], + "actualSort": 2, + "typical": [ + 1 + ], + "typicalSort": 1, + "metricDescriptionSort": 2, + "detector": "distinct_count(total_unique_products) partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726185600000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.005452151333957955, + "multi_bucket_impact": -5, + "record_score": 38.875218910067446, + "initial_record_score": 38.875218910067446, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1726186500000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Accessories,Men's Clothing", + "function": "mean", + "function_description": "mean", + "typical": [ + 15.943152908258694 + ], + "actual": [ + 60 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Accessories,Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "AE" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 3, + "lower_confidence_bound": 6.39588429144841, + "typical_value": 15.943152908258694, + "upper_confidence_bound": 37.04143942410928 + }, + "category.keyword": [ + "Men's Accessories,Men's Clothing" + ], + "geoip.country_iso_code": [ + "AE" + ] + }, + "rowId": "1726503845974_9", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 38.875218910067446, + "entityName": "category.keyword", + "entityValue": "Men's Accessories,Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Accessories,Men's Clothing" + }, + { + "geoip.country_iso_code": "AE" + } + ], + "actual": [ + 60 + ], + "actualSort": 60, + "typical": [ + 15.943152908258694 + ], + "typicalSort": 15.943152908258694, + "metricDescriptionSort": 3.763371043686062, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726185600000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.030245620963532376, + "multi_bucket_impact": -5, + "record_score": 12.684121118422576, + "initial_record_score": 12.684121118422576, + "bucket_span": 900, + "detector_index": 0, + "is_interim": false, + "timestamp": 1726225200000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing,Men's Shoes", + "function": "mean", + "function_description": "mean", + "typical": [ + 19.693271090135916 + ], + "actual": [ + 75 + ], + "field_name": "products.price", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing,Men's Shoes" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "AE" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 6.850458655008051, + "typical_value": 19.693271090135916, + "upper_confidence_bound": 53.49007700314821 + }, + "category.keyword": [ + "Men's Clothing,Men's Shoes" + ], + "geoip.country_iso_code": [ + "AE" + ] + }, + "rowId": "1726503845974_10", + "jobId": "ecom_dect_01", + "detectorIndex": 0, + "severity": 12.684121118422576, + "entityName": "category.keyword", + "entityValue": "Men's Clothing,Men's Shoes", + "influencers": [ + { + "category.keyword": "Men's Clothing,Men's Shoes" + }, + { + "geoip.country_iso_code": "AE" + } + ], + "actual": [ + 75 + ], + "actualSort": 75, + "typical": [ + 19.693271090135916 + ], + "typicalSort": 19.693271090135916, + "metricDescriptionSort": 3.808407433012307, + "detector": "mean(\"products.price\") partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + }, + { + "time": 1726185600000, + "source": { + "job_id": "ecom_dect_01", + "result_type": "record", + "probability": 0.024450443154858347, + "multi_bucket_impact": -5, + "record_score": 15.93562008623777, + "initial_record_score": 15.93562008623777, + "bucket_span": 900, + "detector_index": 1, + "is_interim": false, + "timestamp": 1726194600000, + "partition_field_name": "category.keyword", + "partition_field_value": "Men's Clothing", + "function": "distinct_count", + "function_description": "distinct_count", + "typical": [ + 1 + ], + "actual": [ + 2 + ], + "field_name": "total_unique_products", + "influencers": [ + { + "influencer_field_name": "category.keyword", + "influencer_field_values": [ + "Men's Clothing" + ] + }, + { + "influencer_field_name": "geoip.country_iso_code", + "influencer_field_values": [ + "TR", + "US" + ] + } + ], + "anomaly_score_explanation": { + "single_bucket_impact": 2, + "lower_confidence_bound": 0, + "typical_value": 0, + "upper_confidence_bound": 0 + }, + "category.keyword": [ + "Men's Clothing" + ], + "geoip.country_iso_code": [ + "TR", + "US" + ] + }, + "rowId": "1726503845974_11", + "jobId": "ecom_dect_01", + "detectorIndex": 1, + "severity": 15.93562008623777, + "entityName": "category.keyword", + "entityValue": "Men's Clothing", + "influencers": [ + { + "category.keyword": "Men's Clothing" + }, + { + "geoip.country_iso_code": "TR" + }, + { + "geoip.country_iso_code": "US" + } + ], + "actual": [ + 2 + ], + "actualSort": 2, + "typical": [ + 1 + ], + "typicalSort": 1, + "metricDescriptionSort": 2, + "detector": "distinct_count(total_unique_products) partitionfield=\"category.keyword\"", + "isTimeSeriesViewRecord": true, + "isGeoRecord": false + } + ], + "jobIds": [ + "ecommerce-multiple-detectors" + ], + "interval": "day", + "examplesByJobId": { + "ecommerce-multiple-detectors": {} + }, + "showViewSeriesLink": true + } +} diff --git a/x-pack/plugins/ml/common/util/anomalies_table_utils.test.ts b/x-pack/plugins/ml/common/util/anomalies_table_utils.test.ts new file mode 100644 index 0000000000000..e64c0daf983eb --- /dev/null +++ b/x-pack/plugins/ml/common/util/anomalies_table_utils.test.ts @@ -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 { cloneDeep } from 'lodash'; + +import type { MlAnomaliesTableRecord } from '@kbn/ml-anomaly-utils'; + +import { getTableItemClosestToTimestamp } from './anomalies_table_utils'; + +import mockAnomaliesTableData from '../__mocks__/mock_anomalies_table_data.json'; +import mockAnomaliesTableDataMultipleDetectors from '../__mocks__/mock_anomalies_table_data_multiple_detectors.json'; + +describe('getTableItemClosestToTimestamp without entities filter', () => { + const anomalies: MlAnomaliesTableRecord[] = mockAnomaliesTableData.default.anomalies; + anomalies.push(cloneDeep(anomalies[0])); + anomalies[0].source.timestamp = 1000; + anomalies[1].source.timestamp = 2000; + anomalies[2].source.timestamp = 3000; + + it('should return the first item if it is the closest', () => { + const anomalyTime = 1400; + const closestItem = getTableItemClosestToTimestamp(anomalies, anomalyTime); + expect(closestItem && closestItem.source.timestamp).toBe(1000); + }); + + it('should return the last item if it is the closest', () => { + const anomalyTime = 5000; + const closestItem = getTableItemClosestToTimestamp(anomalies, anomalyTime); + expect(closestItem && closestItem.source.timestamp).toBe(3000); + }); + + it('should return the second item if it is the closest', () => { + const anomalyTime = 2600; + const closestItem = getTableItemClosestToTimestamp(anomalies, anomalyTime); + expect(closestItem && closestItem.source.timestamp).toBe(3000); + }); + + it('should handle an empty anomalies array', () => { + const anomalyTime = 2000; + const closestItem = getTableItemClosestToTimestamp([], anomalyTime); + expect(closestItem).toBeUndefined(); + }); +}); + +// These tests test for the case when there's multiple anomalies with the same +// timestamp but different entity values. +describe('getTableItemClosestToTimestamp with entities filter', () => { + const anomalies: MlAnomaliesTableRecord[] = + mockAnomaliesTableDataMultipleDetectors.default.anomalies; + + it("should return the closest item matching the filter for Men's Clothing", () => { + const anomalyTime = 1725862500000; + const entityFields = [{ fieldName: 'category.keyword', fieldValue: "Men's Clothing" }]; + + const closestItem = getTableItemClosestToTimestamp(anomalies, anomalyTime, entityFields); + + expect(closestItem).toBeDefined(); + + // This is just to satisfy TypeScript. + if (!closestItem) throw new Error('closestItem is undefined'); + + expect(closestItem.source.timestamp).toBe(1725862500000); + expect(closestItem.entityName).toBe('category.keyword'); + expect(closestItem.entityValue).toBe("Men's Clothing"); + }); + + it("should return the closest item matching the filter for Women's Clothing", () => { + const anomalyTime = 1725862500000; + const entityFields = [{ fieldName: 'category.keyword', fieldValue: "Women's Clothing" }]; + + const closestItem = getTableItemClosestToTimestamp(anomalies, anomalyTime, entityFields); + + expect(closestItem).toBeDefined(); + + // This is just to satisfy TypeScript. + if (!closestItem) throw new Error('closestItem is undefined'); + + expect(closestItem.source.timestamp).toBe(1725862500000); + expect(closestItem.entityName).toBe('category.keyword'); + expect(closestItem.entityValue).toBe("Women's Clothing"); + }); +}); diff --git a/x-pack/plugins/ml/common/util/anomalies_table_utils.ts b/x-pack/plugins/ml/common/util/anomalies_table_utils.ts new file mode 100644 index 0000000000000..1964ccfd85ca6 --- /dev/null +++ b/x-pack/plugins/ml/common/util/anomalies_table_utils.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { MlAnomaliesTableRecord, MlEntityField } from '@kbn/ml-anomaly-utils'; + +// The table items could be aggregated, so we have to find the item +// that has the closest timestamp to the selected anomaly from the chart. +export function getTableItemClosestToTimestamp( + anomalies: MlAnomaliesTableRecord[], + anomalyTime: number, + entityFields?: MlEntityField[] +) { + const filteredAnomalies = entityFields + ? anomalies.filter((anomaly) => { + const currentEntity = { + entityName: anomaly.entityName, + entityValue: anomaly.entityValue, + }; + + return entityFields.some( + (field) => + field.fieldName === currentEntity.entityName && + field.fieldValue === currentEntity.entityValue + ); + }) + : anomalies; + + return filteredAnomalies.reduce( + (closestItem, currentItem) => { + // If the closest item is not defined, return the current item. + // This is the case when we start the reducer. For the case of an empty + // array the reducer will not be called and the value will stay undefined. + if (!closestItem) return currentItem; + + const closestItemDelta = Math.abs(anomalyTime - closestItem.source.timestamp); + const currentItemDelta = Math.abs(anomalyTime - currentItem.source.timestamp); + return currentItemDelta < closestItemDelta ? currentItem : closestItem; + }, + undefined + ); +} diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.test.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.test.js index d8f00b92992c6..59b4fcb042186 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.test.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.test.js @@ -6,7 +6,7 @@ */ import React from 'react'; -import mockAnomaliesTableData from '../../explorer/__mocks__/mock_anomalies_table_data.json'; +import mockAnomaliesTableData from '../../../../common/__mocks__/mock_anomalies_table_data.json'; import { getColumns } from './anomalies_table_columns'; jest.mock('../../capabilities/check_capabilities', () => ({ diff --git a/x-pack/plugins/ml/public/application/explorer/explorer.tsx b/x-pack/plugins/ml/public/application/explorer/explorer.tsx index 2b6971077a086..ab503c11d7955 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer.tsx @@ -622,6 +622,7 @@ export const Explorer: FC = ({ {...{ ...chartsData, severity, + tableData, timefilter, mlLocator, timeBuckets, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_anomalies_container.tsx b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_anomalies_container.tsx index e769537a19779..6198044753687 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_anomalies_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_anomalies_container.tsx @@ -19,6 +19,7 @@ import type { TableSeverity } from '../../components/controls/select_severity/se import { SelectSeverityUI } from '../../components/controls/select_severity/select_severity'; import type { ExplorerChartsData } from './explorer_charts_container_service'; import type { MlLocator } from '../../../../common/types/locator'; +import type { AnomaliesTableData } from '../explorer_utils'; interface ExplorerAnomaliesContainerProps { id: string; @@ -27,6 +28,7 @@ interface ExplorerAnomaliesContainerProps { severity: TableSeverity; setSeverity: (severity: TableSeverity) => void; mlLocator: MlLocator; + tableData: AnomaliesTableData; timeBuckets: TimeBuckets; timefilter: TimefilterContract; onSelectEntity: ( @@ -54,6 +56,7 @@ export const ExplorerAnomaliesContainer: FC = ( severity, setSeverity, mlLocator, + tableData, timeBuckets, timefilter, onSelectEntity, @@ -89,6 +92,7 @@ export const ExplorerAnomaliesContainer: FC = ( ...chartsData, severity: severity.val, mlLocator, + tableData, timeBuckets, timefilter, timeRange, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js index 79e8bd449876e..c7fcddbe4c515 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js @@ -16,6 +16,8 @@ import React from 'react'; import d3 from 'd3'; import moment from 'moment'; +import { EuiPopover } from '@elastic/eui'; + import { i18n } from '@kbn/i18n'; import { getFormattedSeverityScore, @@ -25,6 +27,10 @@ import { import { formatHumanReadableDateTime } from '@kbn/ml-date-utils'; import { context } from '@kbn/kibana-react-plugin/public'; +import { getTableItemClosestToTimestamp } from '../../../../common/util/anomalies_table_utils'; + +import { LinksMenuUI } from '../../components/anomalies_table/links_menu'; +import { RuleEditorFlyout } from '../../components/rule_editor'; import { formatValue } from '../../formatters/format_value'; import { getChartType, @@ -42,6 +48,7 @@ import { filter } from 'rxjs'; import { drawCursor } from './utils/draw_anomaly_explorer_charts_cursor'; import { SCHEDULE_EVENT_MARKER_ENTITY } from '../../../../common/constants/charts'; +const popoverMenuOffset = 0; const CONTENT_WRAPPER_HEIGHT = 215; const SCHEDULED_EVENT_MARKER_HEIGHT = 5; @@ -58,6 +65,7 @@ export class ExplorerChartDistribution extends React.Component { static propTypes = { seriesConfig: PropTypes.object, severity: PropTypes.number, + tableData: PropTypes.object, tooltipService: PropTypes.object.isRequired, cursor$: PropTypes.object, }; @@ -66,7 +74,9 @@ export class ExplorerChartDistribution extends React.Component { super(props); this.chartScales = undefined; this.cursorStateSubscription = undefined; + this.state = { popoverData: null, popoverCoords: [0, 0], showRuleEditorFlyout: () => {} }; } + componentDidMount() { this.renderChart(); this.cursorStateSubscription = this.props.cursor$ @@ -447,6 +457,8 @@ export class ExplorerChartDistribution extends React.Component { dots.exit().remove(); } + const that = this; + function drawRareChartHighlightedSpan() { if (showSelectedInterval === false) return; // Draws a rectangle which highlights the time span that has been selected for view. @@ -484,6 +496,11 @@ export class ExplorerChartDistribution extends React.Component { .enter() .append('circle') .attr('r', LINE_CHART_ANOMALY_RADIUS) + .on('click', function (d) { + d3.event.preventDefault(); + if (d.anomalyScore === undefined) return; + showAnomalyPopover(d, this); + }) // Don't use an arrow function since we need access to `this`. .on('mouseover', function (d) { showLineChartTooltip(d, this); @@ -530,6 +547,35 @@ export class ExplorerChartDistribution extends React.Component { ); } + function showAnomalyPopover(marker, circle) { + const anomalyTime = marker.date; + + const tableItem = getTableItemClosestToTimestamp( + that.props.tableData.anomalies, + anomalyTime, + that.props.seriesConfig.entityFields + ); + + if (tableItem) { + // Overwrite the timestamp of the possibly aggregated table item with the + // timestamp of the anomaly clicked in the chart so we're able to pick + // the right baseline and deviation time ranges for Log Rate Analysis. + tableItem.source.timestamp = anomalyTime; + + // Calculate the relative coordinates of the clicked anomaly marker + // so we're able to position the popover actions menu above it. + const dotRect = circle.getBoundingClientRect(); + const rootRect = that.rootNode.getBoundingClientRect(); + const x = Math.round(dotRect.x + dotRect.width / 2 - rootRect.x); + const y = Math.round(dotRect.y + dotRect.height / 2 - rootRect.y) - popoverMenuOffset; + + // Hide any active tooltip + that.props.tooltipService.hide(); + // Set the popover state to enable the actions menu + that.setState({ popoverData: tableItem, popoverCoords: [x, y] }); + } + } + function showLineChartTooltip(marker, circle) { // Show the time and metric values in the tooltip. // Uses date, value, upper, lower and anomalyScore (optional) marker properties. @@ -666,6 +712,22 @@ export class ExplorerChartDistribution extends React.Component { this.rootNode = componentNode; } + closePopover() { + this.setState({ popoverData: null, popoverCoords: [0, 0] }); + } + + setShowRuleEditorFlyoutFunction = (func) => { + this.setState({ + showRuleEditorFlyout: func, + }); + }; + + unsetShowRuleEditorFlyoutFunction = () => { + this.setState({ + showRuleEditorFlyout: () => {}, + }); + }; + render() { const { seriesConfig } = this.props; @@ -678,10 +740,47 @@ export class ExplorerChartDistribution extends React.Component { const isLoading = seriesConfig.loading; return ( -
- {isLoading && } - {!isLoading &&
} -
+ <> + + {this.state.popoverData !== null && ( +
+ this.closePopover()} + panelPaddingSize="none" + anchorPosition="upLeft" + > + this.closePopover()} + sourceIndicesWithGeoFields={this.props.sourceIndicesWithGeoFields} + /> + +
+ )} +
+ {isLoading && } + {!isLoading &&
} +
+ ); } } diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js index 77118b376e97a..e358c381288d3 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js @@ -16,6 +16,8 @@ import React from 'react'; import d3 from 'd3'; import moment from 'moment'; +import { EuiPopover } from '@elastic/eui'; + import { i18n } from '@kbn/i18n'; import { getFormattedSeverityScore, @@ -25,6 +27,10 @@ import { import { formatHumanReadableDateTime } from '@kbn/ml-date-utils'; import { context } from '@kbn/kibana-react-plugin/public'; +import { getTableItemClosestToTimestamp } from '../../../../common/util/anomalies_table_utils'; + +import { LinksMenuUI } from '../../components/anomalies_table/links_menu'; +import { RuleEditorFlyout } from '../../components/rule_editor'; import { formatValue } from '../../formatters/format_value'; import { LINE_CHART_ANOMALY_RADIUS, @@ -43,6 +49,7 @@ import { CHART_HEIGHT, TRANSPARENT_BACKGROUND } from './constants'; import { filter } from 'rxjs'; import { drawCursor } from './utils/draw_anomaly_explorer_charts_cursor'; +const popoverMenuOffset = 0; const CONTENT_WRAPPER_HEIGHT = 215; const CONTENT_WRAPPER_CLASS = 'ml-explorer-chart-content-wrapper'; @@ -52,6 +59,7 @@ export class ExplorerChartSingleMetric extends React.Component { tooManyBuckets: PropTypes.bool, seriesConfig: PropTypes.object, severity: PropTypes.number.isRequired, + tableData: PropTypes.object, tooltipService: PropTypes.object.isRequired, timeBuckets: PropTypes.object.isRequired, onPointerUpdate: PropTypes.func.isRequired, @@ -63,7 +71,9 @@ export class ExplorerChartSingleMetric extends React.Component { constructor(props) { super(props); this.chartScales = undefined; + this.state = { popoverData: null, popoverCoords: [0, 0], showRuleEditorFlyout: () => {} }; } + componentDidMount() { this.renderChart(); @@ -351,6 +361,8 @@ export class ExplorerChartSingleMetric extends React.Component { .attr('d', lineChartValuesLine(data)); } + const that = this; + function drawLineChartMarkers(data) { // Render circle markers for the points. // These are used for displaying tooltips on mouseover. @@ -375,9 +387,17 @@ export class ExplorerChartSingleMetric extends React.Component { .enter() .append('circle') .attr('r', LINE_CHART_ANOMALY_RADIUS) + .on('click', function (d) { + d3.event.preventDefault(); + if (d.anomalyScore === undefined) return; + showAnomalyPopover(d, this); + }) // Don't use an arrow function since we need access to `this`. .on('mouseover', function (d) { - showLineChartTooltip(d, this); + // Show the tooltip only if the actions menu isn't active + if (that.state.popoverData === null) { + showLineChartTooltip(d, this); + } }) .on('mouseout', () => tooltipService.hide()); @@ -418,6 +438,11 @@ export class ExplorerChartSingleMetric extends React.Component { 'class', (d) => `anomaly-marker multi-bucket ${getSeverityWithLow(d.anomalyScore).id}` ) + .on('click', function (d) { + d3.event.preventDefault(); + if (d.anomalyScore === undefined) return; + showAnomalyPopover(d, this); + }) // Don't use an arrow function since we need access to `this`. .on('mouseover', function (d) { showLineChartTooltip(d, this); @@ -448,6 +473,35 @@ export class ExplorerChartSingleMetric extends React.Component { .attr('y', (d) => lineChartYScale(d.value) - SCHEDULED_EVENT_SYMBOL_HEIGHT / 2); } + function showAnomalyPopover(marker, circle) { + const anomalyTime = marker.date; + + const tableItem = getTableItemClosestToTimestamp( + that.props.tableData.anomalies, + anomalyTime, + that.props.seriesConfig.entityFields + ); + + if (tableItem) { + // Overwrite the timestamp of the possibly aggregated table item with the + // timestamp of the anomaly clicked in the chart so we're able to pick + // the right baseline and deviation time ranges for Log Rate Analysis. + tableItem.source.timestamp = anomalyTime; + + // Calculate the relative coordinates of the clicked anomaly marker + // so we're able to position the popover actions menu above it. + const dotRect = circle.getBoundingClientRect(); + const rootRect = that.rootNode.getBoundingClientRect(); + const x = Math.round(dotRect.x + dotRect.width / 2 - rootRect.x); + const y = Math.round(dotRect.y + dotRect.height / 2 - rootRect.y) - popoverMenuOffset; + + // Hide any active tooltip + that.props.tooltipService.hide(); + // Set the popover state to enable the actions menu + that.setState({ popoverData: tableItem, popoverCoords: [x, y] }); + } + } + function showLineChartTooltip(marker, circle) { // Show the time and metric values in the tooltip. // Uses date, value, upper, lower and anomalyScore (optional) marker properties. @@ -589,6 +643,22 @@ export class ExplorerChartSingleMetric extends React.Component { this.rootNode = componentNode; } + closePopover() { + this.setState({ popoverData: null, popoverCoords: [0, 0] }); + } + + setShowRuleEditorFlyoutFunction = (func) => { + this.setState({ + showRuleEditorFlyout: func, + }); + }; + + unsetShowRuleEditorFlyoutFunction = () => { + this.setState({ + showRuleEditorFlyout: () => {}, + }); + }; + render() { const { seriesConfig } = this.props; @@ -601,10 +671,47 @@ export class ExplorerChartSingleMetric extends React.Component { const isLoading = seriesConfig.loading; return ( -
- {isLoading && } - {!isLoading &&
} -
+ <> + + {this.state.popoverData !== null && ( +
+ this.closePopover()} + panelPaddingSize="none" + anchorPosition="upLeft" + > + this.closePopover()} + sourceIndicesWithGeoFields={this.props.sourceIndicesWithGeoFields} + /> + +
+ )} +
+ {isLoading && } + {!isLoading &&
} +
+ ); } } diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js index f6dd68c15a675..e7efbed4f1ff7 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js @@ -91,6 +91,7 @@ function ExplorerChartContainer({ tooManyBuckets, wrapLabel, mlLocator, + tableData, timeBuckets, timefilter, timeRange, @@ -331,6 +332,7 @@ function ExplorerChartContainer({ {(tooltipService) => ( ( { const jobIds = getSelectionJobIds(selectedCells, selectedJobs); const influencers = getSelectionInfluencers(selectedCells, fieldName); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 20d94aaabc3bb..51abbf77dbeba 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -24,6 +24,8 @@ import { getFormattedSeverityScore, getSeverityWithLow } from '@kbn/ml-anomaly-u import { formatHumanReadableDateTimeSeconds } from '@kbn/ml-date-utils'; import { context } from '@kbn/kibana-react-plugin/public'; +import { getTableItemClosestToTimestamp } from '../../../../../common/util/anomalies_table_utils'; + import { formatValue } from '../../../formatters/format_value'; import { LINE_CHART_ANOMALY_RADIUS, @@ -1582,13 +1584,7 @@ class TimeseriesChartIntl extends Component { showAnomalyPopover(marker, circle) { const anomalyTime = marker.date.getTime(); - // The table items could be aggregated, so we have to find the item - // that has the closest timestamp to the selected anomaly from the chart. - const tableItem = this.props.tableData.anomalies.reduce((closestItem, currentItem) => { - const closestItemDelta = Math.abs(anomalyTime - closestItem.source.timestamp); - const currentItemDelta = Math.abs(anomalyTime - currentItem.source.timestamp); - return currentItemDelta < closestItemDelta ? currentItem : closestItem; - }, this.props.tableData.anomalies[0]); + const tableItem = getTableItemClosestToTimestamp(this.props.tableData.anomalies, anomalyTime); if (tableItem) { // Overwrite the timestamp of the possibly aggregated table item with the diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js index 3839c9831c86b..90b0e76167517 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js @@ -65,6 +65,7 @@ import { TimeseriesExplorerCheckbox } from './timeseriesexplorer_checkbox'; import { timeBucketsServiceFactory } from '../../util/time_buckets_service'; import { timeSeriesExplorerServiceFactory } from '../../util/time_series_explorer_service'; import { getTimeseriesexplorerDefaultState } from '../timeseriesexplorer_utils'; +import { mlJobServiceFactory } from '../../services/job_service'; import { forecastServiceFactory } from '../../services/forecast_service'; // Used to indicate the chart is being plotted across @@ -736,6 +737,10 @@ export class TimeSeriesExplorerEmbeddableChart extends React.Component { ]); } + // Populate mlJobService to work with LinksMenuUI. + this.mlJobService = mlJobServiceFactory(undefined, this.context.services.mlServices.mlApi); + await this.mlJobService.loadJobsWrapper(); + this.componentDidUpdate(); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_react_container.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_react_container.tsx index d31ee17ef0780..aefdac533f859 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_react_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_react_container.tsx @@ -7,6 +7,8 @@ import type { FC } from 'react'; import React, { useCallback, useState, useMemo, useEffect, useRef } from 'react'; +import moment from 'moment-timezone'; +import useMountedState from 'react-use/lib/useMountedState'; import { EuiCallOut, EuiLoadingChart, EuiResizeObserver, EuiText } from '@elastic/eui'; import type { Observable } from 'rxjs'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -27,12 +29,15 @@ import type { AnomalyChartsAttachmentApi, } from '..'; +import type { AnomaliesTableData, ExplorerJob } from '../../application/explorer/explorer_utils'; import { ExplorerAnomaliesContainer } from '../../application/explorer/explorer_charts/explorer_anomalies_container'; import { ML_APP_LOCATOR } from '../../../common/constants/locator'; import { optionValueToThreshold } from '../../application/components/controls/select_severity/select_severity'; import { EXPLORER_ENTITY_FIELD_SELECTION_TRIGGER } from '../../ui_actions/triggers'; import type { MlLocatorParams } from '../../../common/types/locator'; import { useAnomalyChartsData } from './use_anomaly_charts_data'; +import { useDateFormatTz, loadAnomaliesTableData } from '../../application/explorer/explorer_utils'; +import { useMlJobService } from '../../application/services/job_service'; const RESIZE_THROTTLE_TIME_MS = 500; @@ -58,6 +63,16 @@ const AnomalyChartsContainer: FC = ({ onLoading, api, }) => { + const isMounted = useMountedState(); + + const [tableData, setTableData] = useState({ + anomalies: [], + examplesByJobId: [''], + interval: 0, + jobIds: [], + showViewSeriesLink: false, + }); + const [chartWidth, setChartWidth] = useState(0); const [severity, setSeverity] = useState( optionValueToThreshold( @@ -65,8 +80,14 @@ const AnomalyChartsContainer: FC = ({ ) ); const [selectedEntities, setSelectedEntities] = useState(); - const [{ uiSettings }, { data: dataServices, share, uiActions, charts: chartsService }] = - services; + const [ + { uiSettings }, + { data: dataServices, share, uiActions, charts: chartsService }, + { mlApi }, + ] = services; + + const mlJobService = useMlJobService(); + const { timefilter } = dataServices.query.timefilter; const timeRange = useObservable(timeRange$); @@ -108,6 +129,55 @@ const AnomalyChartsContainer: FC = ({ error, } = useAnomalyChartsData(api, services, chartWidth, severity.val, renderCallbacks); + const dateFormatTz = useDateFormatTz(); + + useEffect(() => { + // async IFEE + (async () => { + if (chartsData === undefined) { + return; + } + + try { + await mlJobService.loadJobsWrapper(); + + const explorerJobs: ExplorerJob[] = + chartsData.seriesToPlot.map(({ jobId, bucketSpanSeconds }) => { + return { + id: jobId, + selected: true, + bucketSpanSeconds, + modelPlotEnabled: false, + }; + }) ?? []; + + const timeRangeBounds = { + min: moment(chartsData.seriesToPlot[0].plotEarliest), + max: moment(chartsData.seriesToPlot[0].plotLatest), + }; + + const newTableData = await loadAnomaliesTableData( + mlApi, + mlJobService, + undefined, + explorerJobs, + dateFormatTz, + timeRangeBounds, + 'job ID', + 'auto', + 0 + ); + + if (isMounted()) { + setTableData(newTableData); + } + } catch (err) { + console.log(err); // eslint-disable-line no-console + } + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [chartsData]); + // Holds the container height for previously fetched data const containerHeightRef = useRef(); @@ -207,6 +277,7 @@ const AnomalyChartsContainer: FC = ({ severity={severity} setSeverity={setSeverity} mlLocator={mlLocator} + tableData={tableData} timeBuckets={timeBuckets} timefilter={timefilter} onSelectEntity={addEntityFieldFilter} diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts b/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts index 078db5b83f506..0a3d1b9ea0ca6 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts @@ -22,6 +22,7 @@ export const getAnomalyChartsServiceDependencies = async ( { mlApiProvider }, { mlJobServiceFactory }, { mlResultsServiceProvider }, + { MlCapabilitiesService }, ] = await Promise.all([ await import('../../application/services/anomaly_detector_service'), await import('../../application/services/field_format_service_factory'), @@ -29,12 +30,14 @@ export const getAnomalyChartsServiceDependencies = async ( await import('../../application/services/ml_api_service'), await import('../../application/services/job_service'), await import('../../application/services/results_service'), + await import('../../application/capabilities/check_capabilities'), ]); const httpService = new HttpService(coreStart.http); const anomalyDetectorService = new AnomalyDetectorService(httpService); const mlApi = mlApiProvider(httpService); const mlJobService = mlJobServiceFactory(mlApi); const mlResultsService = mlResultsServiceProvider(mlApi); + const mlCapabilities = new MlCapabilitiesService(mlApi); const anomalyExplorerService = new AnomalyExplorerChartsService( pluginsStart.data.query.timefilter.timefilter, mlApi, @@ -59,8 +62,10 @@ export const getAnomalyChartsServiceDependencies = async ( { anomalyDetectorService, anomalyExplorerService, + mlCapabilities, mlFieldFormatService, mlResultsService, + mlApi, }, ]; return anomalyChartsEmbeddableServices; diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts index 62afd5e251b6a..de6867b213e18 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts @@ -26,24 +26,24 @@ export const getMlServices = async ( { indexServiceFactory }, { timeSeriesExplorerServiceFactory }, { mlApiProvider }, - { mlJobServiceFactory }, { mlResultsServiceProvider }, { MlCapabilitiesService }, { timeSeriesSearchServiceFactory }, { toastNotificationServiceProvider }, + { mlJobServiceFactory }, ] = await Promise.all([ await import('../../application/services/anomaly_detector_service'), await import('../../application/services/field_format_service_factory'), await import('../../application/util/index_service'), await import('../../application/util/time_series_explorer_service'), await import('../../application/services/ml_api_service'), - await import('../../application/services/job_service'), await import('../../application/services/results_service'), await import('../../application/capabilities/check_capabilities'), await import( '../../application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service' ), await import('../../application/services/toast_notification_service'), + await import('../../application/services/job_service'), ]); const httpService = new HttpService(coreStart.http); @@ -81,7 +81,6 @@ export const getMlServices = async ( mlApi, mlCapabilities, mlFieldFormatService, - mlJobService, mlResultsService, mlTimeSeriesSearchService, mlTimeSeriesExplorerService, diff --git a/x-pack/plugins/ml/public/embeddables/types.ts b/x-pack/plugins/ml/public/embeddables/types.ts index b7d7dea505f0b..1bcb0f9ae3579 100644 --- a/x-pack/plugins/ml/public/embeddables/types.ts +++ b/x-pack/plugins/ml/public/embeddables/types.ts @@ -32,7 +32,6 @@ import type { AnomalyDetectorService } from '../application/services/anomaly_det import type { AnomalyExplorerChartsService } from '../application/services/anomaly_explorer_charts_service'; import type { AnomalyTimelineService } from '../application/services/anomaly_timeline_service'; import type { MlFieldFormatService } from '../application/services/field_format_service'; -import type { MlJobService } from '../application/services/job_service'; import type { MlApi } from '../application/services/ml_api_service'; import type { MlResultsService } from '../application/services/results_service'; import type { MlTimeSeriesSearchService } from '../application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service'; @@ -233,9 +232,10 @@ export interface SingleMetricViewerComponentApi { export interface AnomalyChartsServices { anomalyDetectorService: AnomalyDetectorService; anomalyExplorerService: AnomalyExplorerChartsService; + mlCapabilities: MlCapabilitiesService; mlFieldFormatService: MlFieldFormatService; mlResultsService: MlResultsService; - mlApi?: MlApi; + mlApi: MlApi; } export interface SingleMetricViewerServices { @@ -244,7 +244,6 @@ export interface SingleMetricViewerServices { mlApi: MlApi; mlCapabilities: MlCapabilitiesService; mlFieldFormatService: MlFieldFormatService; - mlJobService: MlJobService; mlResultsService: MlResultsService; mlTimeSeriesSearchService?: MlTimeSeriesSearchService; mlTimeSeriesExplorerService?: TimeSeriesExplorerService; diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index 8353c023f1955..2f980378de923 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -11,6 +11,7 @@ "__mocks__/**/*", "../../../typings/**/*", // have to declare *.json explicitly due to https://github.com/microsoft/TypeScript/issues/25636 + "common/**/*.json", "public/**/*.json", "server/**/*.json" ], @@ -19,7 +20,9 @@ ], "kbn_references": [ "@kbn/core", - { "path": "../../../src/setup_node_env/tsconfig.json" }, + { + "path": "../../../src/setup_node_env/tsconfig.json" + }, // add references to other TypeScript projects the plugin depends on "@kbn/ace", "@kbn/actions-plugin", diff --git a/x-pack/plugins/observability_solution/inventory/common/entities.ts b/x-pack/plugins/observability_solution/inventory/common/entities.ts index d72fa46969b8a..d8353cf3a97f0 100644 --- a/x-pack/plugins/observability_solution/inventory/common/entities.ts +++ b/x-pack/plugins/observability_solution/inventory/common/entities.ts @@ -4,23 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import * as t from 'io-ts'; -export interface LatestEntity { - agent: { - name: string[]; - }; - data_stream: { - type: string[]; - }; - cloud: { - availability_zone: string[]; - }; - entity: { - firstSeenTimestamp: string; - lastSeenTimestamp: string; - type: string; - displayName: string; - id: string; - identityFields: string[]; - }; -} +export const entityTypeRt = t.union([ + t.literal('service'), + t.literal('host'), + t.literal('container'), +]); + +export type EntityType = t.TypeOf; + +export const MAX_NUMBER_OF_ENTITIES = 500; diff --git a/x-pack/plugins/observability_solution/inventory/common/es_fields/entities.ts b/x-pack/plugins/observability_solution/inventory/common/es_fields/entities.ts new file mode 100644 index 0000000000000..9b619dddbb2df --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/common/es_fields/entities.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 const ENTITY_LAST_SEEN = 'entity.lastSeenTimestamp'; +export const ENTITY_ID = 'entity.id'; +export const ENTITY_TYPE = 'entity.type'; +export const ENTITY_DISPLAY_NAME = 'entity.displayName'; +export const ENTITY_DEFINITION_ID = 'entity.definitionId'; diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx new file mode 100644 index 0000000000000..b0e6c2fcc5ee4 --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.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 { EuiDataGridSorting } from '@elastic/eui'; +import { Meta, Story } from '@storybook/react'; +import React, { useMemo, useState } from 'react'; +import { orderBy } from 'lodash'; +import { EntitiesGrid } from '.'; +import { ENTITY_LAST_SEEN } from '../../../common/es_fields/entities'; +import { entitiesMock } from './mock/entities_mock'; + +const stories: Meta<{}> = { + title: 'app/inventory/entities_grid', + component: EntitiesGrid, +}; +export default stories; + +export const Example: Story<{}> = () => { + const [pageIndex, setPageIndex] = useState(0); + const [sort, setSort] = useState({ + id: ENTITY_LAST_SEEN, + direction: 'desc', + }); + + const sortedItems = useMemo( + () => orderBy(entitiesMock, sort.id, sort.direction), + [sort.direction, sort.id] + ); + + return ( + + ); +}; + +export const EmptyGridExample: Story<{}> = () => { + const [pageIndex, setPageIndex] = useState(0); + const [sort, setSort] = useState({ + id: ENTITY_LAST_SEEN, + direction: 'desc', + }); + + return ( + + ); +}; diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx index e689063882c40..c9b91f165fedd 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx @@ -5,53 +5,186 @@ * 2.0. */ import { + EuiBadge, + EuiButtonIcon, EuiDataGrid, EuiDataGridCellValueElementProps, EuiDataGridColumn, + EuiDataGridSorting, + EuiLink, EuiLoadingSpinner, + EuiText, + EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useAbortableAsync } from '@kbn/observability-utils/hooks/use_abortable_async'; -import React, { useState } from 'react'; -import { useKibana } from '../../hooks/use_kibana'; +import { FormattedDate, FormattedMessage, FormattedTime } from '@kbn/i18n-react'; +import { last } from 'lodash'; +import React, { useCallback, useState } from 'react'; +import { + ENTITY_DISPLAY_NAME, + ENTITY_LAST_SEEN, + ENTITY_TYPE, +} from '../../../common/es_fields/entities'; +import { APIReturnType } from '../../api'; + +type InventoryEntitiesAPIReturnType = APIReturnType<'GET /internal/inventory/entities'>; + +type EntityColumnIds = typeof ENTITY_DISPLAY_NAME | typeof ENTITY_LAST_SEEN | typeof ENTITY_TYPE; + +const CustomHeaderCell = ({ title, tooltipContent }: { title: string; tooltipContent: string }) => ( + <> + {title} + + + + +); + +const entityNameLabel = i18n.translate('xpack.inventory.entitiesGrid.euiDataGrid.entityNameLabel', { + defaultMessage: 'Entity name', +}); +const entityTypeLabel = i18n.translate('xpack.inventory.entitiesGrid.euiDataGrid.typeLabel', { + defaultMessage: 'Type', +}); +const entityLastSeenLabel = i18n.translate( + 'xpack.inventory.entitiesGrid.euiDataGrid.lastSeenLabel', + { + defaultMessage: 'Last seen', + } +); const columns: EuiDataGridColumn[] = [ { - id: 'entityName', - displayAsText: 'Entity name', + id: ENTITY_DISPLAY_NAME, + // keep it for accessibility purposes + displayAsText: entityNameLabel, + display: ( + + ), + isSortable: true, }, { - id: 'entityType', - displayAsText: 'Type', + id: ENTITY_TYPE, + // keep it for accessibility purposes + displayAsText: entityTypeLabel, + display: ( + + ), + isSortable: true, + }, + { + id: ENTITY_LAST_SEEN, + // keep it for accessibility purposes + displayAsText: entityLastSeenLabel, + display: ( + + ), + defaultSortDirection: 'desc', + isSortable: true, + schema: 'datetime', }, ]; -export function EntitiesGrid() { - const { - services: { inventoryAPIClient }, - } = useKibana(); +interface Props { + loading: boolean; + entities: InventoryEntitiesAPIReturnType['entities']; + sortDirection: 'asc' | 'desc'; + sortField: string; + pageIndex: number; + onChangeSort: (sorting: EuiDataGridSorting['columns'][0]) => void; + onChangePage: (nextPage: number) => void; +} + +const PAGE_SIZE = 20; + +export function EntitiesGrid({ + entities, + loading, + sortDirection, + sortField, + pageIndex, + onChangePage, + onChangeSort, +}: Props) { const [visibleColumns, setVisibleColumns] = useState(columns.map(({ id }) => id)); - const { value = { entities: [] }, loading } = useAbortableAsync( - ({ signal }) => { - return inventoryAPIClient.fetch('GET /internal/inventory/entities', { - signal, - }); + + const onSort: EuiDataGridSorting['onSort'] = useCallback( + (newSortingColumns) => { + const lastItem = last(newSortingColumns); + if (lastItem) { + onChangeSort(lastItem); + } }, - [inventoryAPIClient] + [onChangeSort] + ); + + const renderCellValue = useCallback( + ({ rowIndex, columnId }: EuiDataGridCellValueElementProps) => { + const entity = entities[rowIndex]; + if (entity === undefined) { + return null; + } + + const columnEntityTableId = columnId as EntityColumnIds; + switch (columnEntityTableId) { + case ENTITY_TYPE: + return {entity[columnEntityTableId]}; + case ENTITY_LAST_SEEN: + return ( + + ), + time: ( + + ), + }} + /> + ); + case ENTITY_DISPLAY_NAME: + return ( + // TODO: link to the appropriate page based on entity type https://github.com/elastic/kibana/issues/192676 + + {entity[columnEntityTableId]} + + ); + default: + return entity[columnId as EntityColumnIds] || ''; + } + }, + [entities] ); if (loading) { return ; } - function CellValue({ rowIndex, columnId, setCellProps }: EuiDataGridCellValueElementProps) { - const data = value.entities[rowIndex]; - if (data === undefined) { - return null; - } - - return <>{data.entity.displayName}; - } + const currentPage = pageIndex + 1; return ( + + {Math.min(entities.length, pageIndex * PAGE_SIZE + 1)}- + {Math.min(entities.length, PAGE_SIZE * currentPage)} + + ), + total: entities.length, + boldEntites: ( + + {i18n.translate( + 'xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entites', + { defaultMessage: 'Entities' } + )} + + ), + }} + /> + + ), + }, + }, + }} + sorting={{ columns: [{ id: sortField, direction: sortDirection }], onSort }} + pagination={{ + pageIndex, + pageSize: PAGE_SIZE, + onChangeItemsPerPage: () => {}, + onChangePage, + pageSizeOptions: [], + }} /> ); } diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/mock/entities_mock.ts b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/mock/entities_mock.ts new file mode 100644 index 0000000000000..16fb73be75534 --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/mock/entities_mock.ts @@ -0,0 +1,3014 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { APIReturnType } from '../../../api'; + +type InventoryEntitiesAPIReturnType = APIReturnType<'GET /internal/inventory/entities'>; + +export const entitiesMock: InventoryEntitiesAPIReturnType['entities'] = [ + { + 'entity.lastSeenTimestamp': '2023-08-20T10:50:06.384Z', + 'entity.type': 'host', + 'entity.displayName': 'Spider-Man', + 'entity.id': '0', + }, + { + 'entity.lastSeenTimestamp': '2024-06-16T21:48:16.259Z', + 'entity.type': 'service', + 'entity.displayName': 'Iron Man', + 'entity.id': '1', + }, + { + 'entity.lastSeenTimestamp': '2024-04-28T03:31:57.528Z', + 'entity.type': 'host', + 'entity.displayName': 'Captain America', + 'entity.id': '2', + }, + { + 'entity.lastSeenTimestamp': '2024-05-14T11:32:04.275Z', + 'entity.type': 'host', + 'entity.displayName': 'Hulk', + 'entity.id': '3', + }, + { + 'entity.lastSeenTimestamp': '2023-12-05T13:33:54.028Z', + 'entity.type': 'container', + 'entity.displayName': 'Thor', + 'entity.id': '4', + }, + { + 'entity.lastSeenTimestamp': '2023-11-27T06:18:52.650Z', + 'entity.type': 'service', + 'entity.displayName': 'Black Widow', + 'entity.id': '5', + }, + { + 'entity.lastSeenTimestamp': '2023-06-23T21:20:41.460Z', + 'entity.type': 'container', + 'entity.displayName': 'Batman', + 'entity.id': '6', + }, + { + 'entity.lastSeenTimestamp': '2023-12-08T03:23:09.317Z', + 'entity.type': 'service', + 'entity.displayName': 'Superman', + 'entity.id': '7', + }, + { + 'entity.lastSeenTimestamp': '2024-08-07T19:06:52.169Z', + 'entity.type': 'service', + 'entity.displayName': 'Wonder Woman', + 'entity.id': '8', + }, + { + 'entity.lastSeenTimestamp': '2024-08-15T01:15:23.589Z', + 'entity.type': 'container', + 'entity.displayName': 'Aquaman', + 'entity.id': '9', + }, + { + 'entity.lastSeenTimestamp': '2024-05-18T09:44:35.799Z', + 'entity.type': 'service', + 'entity.displayName': 'Flash', + 'entity.id': '10', + }, + { + 'entity.lastSeenTimestamp': '2023-12-20T19:12:29.251Z', + 'entity.type': 'container', + 'entity.displayName': 'Cyborg', + 'entity.id': '11', + }, + { + 'entity.lastSeenTimestamp': '2024-04-04T02:52:28.431Z', + 'entity.type': 'container', + 'entity.displayName': 'Wolverine', + 'entity.id': '12', + }, + { + 'entity.lastSeenTimestamp': '2023-07-14T05:13:12.906Z', + 'entity.type': 'host', + 'entity.displayName': 'Deadpool', + 'entity.id': '13', + }, + { + 'entity.lastSeenTimestamp': '2023-07-21T07:30:55.389Z', + 'entity.type': 'service', + 'entity.displayName': 'Green Lantern', + 'entity.id': '14', + }, + { + 'entity.lastSeenTimestamp': '2024-06-16T09:30:32.331Z', + 'entity.type': 'service', + 'entity.displayName': 'Doctor Strange', + 'entity.id': '15', + }, + { + 'entity.lastSeenTimestamp': '2023-08-24T08:05:46.687Z', + 'entity.type': 'container', + 'entity.displayName': 'Ant-Man', + 'entity.id': '16', + }, + { + 'entity.lastSeenTimestamp': '2024-03-23T09:37:36.874Z', + 'entity.type': 'service', + 'entity.displayName': 'Scarlet Witch', + 'entity.id': '17', + }, + { + 'entity.lastSeenTimestamp': '2023-05-12T02:34:46.188Z', + 'entity.type': 'host', + 'entity.displayName': 'Black Panther', + 'entity.id': '18', + }, + { + 'entity.lastSeenTimestamp': '2023-01-05T07:16:17.213Z', + 'entity.type': 'container', + 'entity.displayName': 'Captain Marvel', + 'entity.id': '19', + }, + { + 'entity.lastSeenTimestamp': '2024-05-28T04:08:43.047Z', + 'entity.type': 'host', + 'entity.displayName': 'Hawkeye', + 'entity.id': '20', + }, + { + 'entity.lastSeenTimestamp': '2024-04-23T02:01:01.149Z', + 'entity.type': 'service', + 'entity.displayName': 'Vision', + 'entity.id': '21', + }, + { + 'entity.lastSeenTimestamp': '2023-04-08T10:40:14.658Z', + 'entity.type': 'host', + 'entity.displayName': 'Shazam', + 'entity.id': '22', + }, + { + 'entity.lastSeenTimestamp': '2024-01-11T09:03:11.465Z', + 'entity.type': 'service', + 'entity.displayName': 'Nightwing', + 'entity.id': '23', + }, + { + 'entity.lastSeenTimestamp': '2024-04-27T22:35:18.822Z', + 'entity.type': 'container', + 'entity.displayName': 'Robin', + 'entity.id': '24', + }, + { + 'entity.lastSeenTimestamp': '2023-03-09T22:05:08.071Z', + 'entity.type': 'container', + 'entity.displayName': 'Starfire', + 'entity.id': '25', + }, + { + 'entity.lastSeenTimestamp': '2024-08-09T13:20:31.960Z', + 'entity.type': 'service', + 'entity.displayName': 'Beast Boy', + 'entity.id': '26', + }, + { + 'entity.lastSeenTimestamp': '2024-07-12T01:44:33.204Z', + 'entity.type': 'service', + 'entity.displayName': 'Raven', + 'entity.id': '27', + }, + { + 'entity.lastSeenTimestamp': '2023-01-31T00:08:53.817Z', + 'entity.type': 'service', + 'entity.displayName': 'Daredevil', + 'entity.id': '28', + }, + { + 'entity.lastSeenTimestamp': '2024-03-26T08:37:11.019Z', + 'entity.type': 'container', + 'entity.displayName': 'Luke Cage', + 'entity.id': '29', + }, + { + 'entity.lastSeenTimestamp': '2023-05-17T08:49:09.112Z', + 'entity.type': 'service', + 'entity.displayName': 'Jessica Jones', + 'entity.id': '30', + }, + { + 'entity.lastSeenTimestamp': '2024-06-15T20:05:12.395Z', + 'entity.type': 'service', + 'entity.displayName': 'Punisher', + 'entity.id': '31', + }, + { + 'entity.lastSeenTimestamp': '2024-07-30T06:53:16.477Z', + 'entity.type': 'service', + 'entity.displayName': 'Groot', + 'entity.id': '32', + }, + { + 'entity.lastSeenTimestamp': '2024-06-01T13:22:53.973Z', + 'entity.type': 'host', + 'entity.displayName': 'Rocket Raccoon', + 'entity.id': '33', + }, + { + 'entity.lastSeenTimestamp': '2024-09-12T17:44:12.492Z', + 'entity.type': 'container', + 'entity.displayName': 'Gamora', + 'entity.id': '34', + }, + { + 'entity.lastSeenTimestamp': '2024-03-28T13:44:52.732Z', + 'entity.type': 'service', + 'entity.displayName': 'Drax', + 'entity.id': '35', + }, + { + 'entity.lastSeenTimestamp': '2023-09-19T01:20:23.901Z', + 'entity.type': 'container', + 'entity.displayName': 'Mantis', + 'entity.id': '36', + }, + { + 'entity.lastSeenTimestamp': '2023-01-17T07:04:52.387Z', + 'entity.type': 'service', + 'entity.displayName': 'Winter Soldier', + 'entity.id': '37', + }, + { + 'entity.lastSeenTimestamp': '2023-10-07T15:08:39.776Z', + 'entity.type': 'host', + 'entity.displayName': 'Falcon', + 'entity.id': '38', + }, + { + 'entity.lastSeenTimestamp': '2024-05-01T17:45:43.595Z', + 'entity.type': 'host', + 'entity.displayName': 'Silver Surfer', + 'entity.id': '39', + }, + { + 'entity.lastSeenTimestamp': '2023-01-12T19:33:15.526Z', + 'entity.type': 'host', + 'entity.displayName': 'Moon Knight', + 'entity.id': '40', + }, + { + 'entity.lastSeenTimestamp': '2023-03-28T23:24:20.896Z', + 'entity.type': 'container', + 'entity.displayName': 'She-Hulk', + 'entity.id': '41', + }, + { + 'entity.lastSeenTimestamp': '2023-03-15T09:52:58.134Z', + 'entity.type': 'container', + 'entity.displayName': 'Blade', + 'entity.id': '42', + }, + { + 'entity.lastSeenTimestamp': '2023-04-18T07:38:32.158Z', + 'entity.type': 'container', + 'entity.displayName': 'Ghost Rider', + 'entity.id': '43', + }, + { + 'entity.lastSeenTimestamp': '2024-03-16T16:36:47.704Z', + 'entity.type': 'host', + 'entity.displayName': 'Cyclops', + 'entity.id': '44', + }, + { + 'entity.lastSeenTimestamp': '2023-06-11T13:40:02.951Z', + 'entity.type': 'service', + 'entity.displayName': 'Jean Grey', + 'entity.id': '45', + }, + { + 'entity.lastSeenTimestamp': '2024-09-11T23:54:53.129Z', + 'entity.type': 'container', + 'entity.displayName': 'Storm', + 'entity.id': '46', + }, + { + 'entity.lastSeenTimestamp': '2024-03-31T15:26:58.694Z', + 'entity.type': 'host', + 'entity.displayName': 'Iceman', + 'entity.id': '47', + }, + { + 'entity.lastSeenTimestamp': '2023-01-15T05:36:56.655Z', + 'entity.type': 'host', + 'entity.displayName': 'Colossus', + 'entity.id': '48', + }, + { + 'entity.lastSeenTimestamp': '2024-06-01T22:59:08.883Z', + 'entity.type': 'service', + 'entity.displayName': 'Kitty Pryde', + 'entity.id': '49', + }, + { + 'entity.lastSeenTimestamp': '2024-04-16T21:38:10.398Z', + 'entity.type': 'container', + 'entity.displayName': 'Psylocke', + 'entity.id': '50', + }, + { + 'entity.lastSeenTimestamp': '2023-02-13T07:41:37.539Z', + 'entity.type': 'container', + 'entity.displayName': 'Rogue', + 'entity.id': '51', + }, + { + 'entity.lastSeenTimestamp': '2023-12-11T14:40:29.422Z', + 'entity.type': 'service', + 'entity.displayName': 'Professor X', + 'entity.id': '52', + }, + { + 'entity.lastSeenTimestamp': '2023-03-06T09:50:33.183Z', + 'entity.type': 'host', + 'entity.displayName': 'Magneto', + 'entity.id': '53', + }, + { + 'entity.lastSeenTimestamp': '2024-06-30T14:52:19.840Z', + 'entity.type': 'host', + 'entity.displayName': 'Quicksilver', + 'entity.id': '54', + }, + { + 'entity.lastSeenTimestamp': '2023-08-16T01:03:06.855Z', + 'entity.type': 'container', + 'entity.displayName': 'Scarlet Witch', + 'entity.id': '55', + }, + { + 'entity.lastSeenTimestamp': '2023-12-19T23:23:08.821Z', + 'entity.type': 'host', + 'entity.displayName': 'Black Bolt', + 'entity.id': '56', + }, + { + 'entity.lastSeenTimestamp': '2024-01-04T06:04:23.837Z', + 'entity.type': 'service', + 'entity.displayName': 'Medusa', + 'entity.id': '57', + }, + { + 'entity.lastSeenTimestamp': '2024-01-02T11:03:36.265Z', + 'entity.type': 'container', + 'entity.displayName': 'Crystal', + 'entity.id': '58', + }, + { + 'entity.lastSeenTimestamp': '2023-01-14T04:12:51.710Z', + 'entity.type': 'service', + 'entity.displayName': 'Karnak', + 'entity.id': '59', + }, + { + 'entity.lastSeenTimestamp': '2023-09-16T15:31:25.215Z', + 'entity.type': 'container', + 'entity.displayName': 'Gorgon', + 'entity.id': '60', + }, + { + 'entity.lastSeenTimestamp': '2023-03-19T23:21:32.571Z', + 'entity.type': 'container', + 'entity.displayName': 'Triton', + 'entity.id': '61', + }, + { + 'entity.lastSeenTimestamp': '2024-02-08T21:57:35.600Z', + 'entity.type': 'host', + 'entity.displayName': 'Lockjaw', + 'entity.id': '62', + }, + { + 'entity.lastSeenTimestamp': '2024-02-26T03:18:43.161Z', + 'entity.type': 'container', + 'entity.displayName': 'Namor', + 'entity.id': '63', + }, + { + 'entity.lastSeenTimestamp': '2024-03-13T13:39:54.430Z', + 'entity.type': 'host', + 'entity.displayName': 'Hercules', + 'entity.id': '64', + }, + { + 'entity.lastSeenTimestamp': '2024-06-15T15:57:15.557Z', + 'entity.type': 'host', + 'entity.displayName': 'Valkyrie', + 'entity.id': '65', + }, + { + 'entity.lastSeenTimestamp': '2023-09-14T15:29:09.268Z', + 'entity.type': 'host', + 'entity.displayName': 'Sif', + 'entity.id': '66', + }, + { + 'entity.lastSeenTimestamp': '2023-06-06T11:32:45.998Z', + 'entity.type': 'service', + 'entity.displayName': 'Heimdall', + 'entity.id': '67', + }, + { + 'entity.lastSeenTimestamp': '2023-06-23T20:19:29.918Z', + 'entity.type': 'container', + 'entity.displayName': 'Loki', + 'entity.id': '68', + }, + { + 'entity.lastSeenTimestamp': '2024-02-15T19:08:56.703Z', + 'entity.type': 'service', + 'entity.displayName': 'Odin', + 'entity.id': '69', + }, + { + 'entity.lastSeenTimestamp': '2024-05-05T21:13:36.761Z', + 'entity.type': 'host', + 'entity.displayName': 'Enchantress', + 'entity.id': '70', + }, + { + 'entity.lastSeenTimestamp': '2023-07-29T20:51:41.023Z', + 'entity.type': 'container', + 'entity.displayName': 'Executioner', + 'entity.id': '71', + }, + { + 'entity.lastSeenTimestamp': '2023-08-06T17:17:53.101Z', + 'entity.type': 'container', + 'entity.displayName': 'Balder', + 'entity.id': '72', + }, + { + 'entity.lastSeenTimestamp': '2023-07-03T05:18:36.705Z', + 'entity.type': 'container', + 'entity.displayName': 'Beta Ray Bill', + 'entity.id': '73', + }, + { + 'entity.lastSeenTimestamp': '2023-05-26T14:32:39.569Z', + 'entity.type': 'container', + 'entity.displayName': 'Adam Warlock', + 'entity.id': '74', + }, + { + 'entity.lastSeenTimestamp': '2023-04-22T20:19:48.018Z', + 'entity.type': 'host', + 'entity.displayName': 'Ego the Living Planet', + 'entity.id': '75', + }, + { + 'entity.lastSeenTimestamp': '2024-09-01T05:03:37.465Z', + 'entity.type': 'container', + 'entity.displayName': 'Ronan the Accuser', + 'entity.id': '76', + }, + { + 'entity.lastSeenTimestamp': '2024-03-30T18:51:01.608Z', + 'entity.type': 'service', + 'entity.displayName': 'Nebula', + 'entity.id': '77', + }, + { + 'entity.lastSeenTimestamp': '2023-08-03T00:46:22.909Z', + 'entity.type': 'container', + 'entity.displayName': 'Yondu', + 'entity.id': '78', + }, + { + 'entity.lastSeenTimestamp': '2024-03-22T19:27:42.105Z', + 'entity.type': 'container', + 'entity.displayName': 'Star-Lord', + 'entity.id': '79', + }, + { + 'entity.lastSeenTimestamp': '2023-03-01T12:52:43.009Z', + 'entity.type': 'service', + 'entity.displayName': 'Elektra', + 'entity.id': '80', + }, + { + 'entity.lastSeenTimestamp': '2024-03-01T03:35:49.365Z', + 'entity.type': 'container', + 'entity.displayName': 'Bullseye', + 'entity.id': '81', + }, + { + 'entity.lastSeenTimestamp': '2023-04-23T03:29:05.951Z', + 'entity.type': 'service', + 'entity.displayName': 'Kingpin', + 'entity.id': '82', + }, + { + 'entity.lastSeenTimestamp': '2023-08-19T14:56:49.093Z', + 'entity.type': 'container', + 'entity.displayName': 'Iron Fist', + 'entity.id': '83', + }, + { + 'entity.lastSeenTimestamp': '2023-04-17T09:03:32.311Z', + 'entity.type': 'service', + 'entity.displayName': 'Misty Knight', + 'entity.id': '84', + }, + { + 'entity.lastSeenTimestamp': '2024-06-23T06:42:12.471Z', + 'entity.type': 'service', + 'entity.displayName': 'Colleen Wing', + 'entity.id': '85', + }, + { + 'entity.lastSeenTimestamp': '2023-10-20T10:59:37.573Z', + 'entity.type': 'host', + 'entity.displayName': 'Shang-Chi', + 'entity.id': '86', + }, + { + 'entity.lastSeenTimestamp': '2024-01-18T10:07:55.134Z', + 'entity.type': 'host', + 'entity.displayName': 'Black Cat', + 'entity.id': '87', + }, + { + 'entity.lastSeenTimestamp': '2024-09-04T14:02:31.795Z', + 'entity.type': 'container', + 'entity.displayName': 'Silver Sable', + 'entity.id': '88', + }, + { + 'entity.lastSeenTimestamp': '2023-09-21T16:08:59.195Z', + 'entity.type': 'container', + 'entity.displayName': 'Spider-Woman', + 'entity.id': '89', + }, + { + 'entity.lastSeenTimestamp': '2024-07-12T00:22:45.521Z', + 'entity.type': 'container', + 'entity.displayName': 'Dr. Nick', + 'entity.id': '90', + }, + { + 'entity.lastSeenTimestamp': '2023-06-27T20:43:47.331Z', + 'entity.type': 'container', + 'entity.displayName': 'Miles Morales', + 'entity.id': '91', + }, + { + 'entity.lastSeenTimestamp': '2023-11-15T05:35:28.421Z', + 'entity.type': 'host', + 'entity.displayName': 'Spider-Girl', + 'entity.id': '92', + }, + { + 'entity.lastSeenTimestamp': '2023-07-17T13:28:37.477Z', + 'entity.type': 'container', + 'entity.displayName': 'Nova', + 'entity.id': '93', + }, + { + 'entity.lastSeenTimestamp': '2024-05-13T09:58:21.185Z', + 'entity.type': 'container', + 'entity.displayName': 'Quasar', + 'entity.id': '94', + }, + { + 'entity.lastSeenTimestamp': '2023-09-22T18:29:20.589Z', + 'entity.type': 'container', + 'entity.displayName': 'Mar-Vell', + 'entity.id': '95', + }, + { + 'entity.lastSeenTimestamp': '2024-04-29T21:33:36.318Z', + 'entity.type': 'container', + 'entity.displayName': 'Monica Rambeau', + 'entity.id': '96', + }, + { + 'entity.lastSeenTimestamp': '2024-01-10T17:12:02.785Z', + 'entity.type': 'host', + 'entity.displayName': 'Photon', + 'entity.id': '97', + }, + { + 'entity.lastSeenTimestamp': '2024-08-03T04:59:46.730Z', + 'entity.type': 'container', + 'entity.displayName': 'Blue Marvel', + 'entity.id': '98', + }, + { + 'entity.lastSeenTimestamp': '2023-04-22T05:48:54.665Z', + 'entity.type': 'host', + 'entity.displayName': 'Sentry', + 'entity.id': '99', + }, + { + 'entity.lastSeenTimestamp': '2024-05-08T05:53:56.652Z', + 'entity.type': 'host', + 'entity.displayName': 'Hyperion', + 'entity.id': '100', + }, + { + 'entity.lastSeenTimestamp': '2024-08-21T08:45:38.667Z', + 'entity.type': 'service', + 'entity.displayName': 'Nighthawk', + 'entity.id': '101', + }, + { + 'entity.lastSeenTimestamp': '2024-08-15T14:03:39.798Z', + 'entity.type': 'host', + 'entity.displayName': 'Power Princess', + 'entity.id': '102', + }, + { + 'entity.lastSeenTimestamp': '2024-05-01T13:28:15.225Z', + 'entity.type': 'service', + 'entity.displayName': 'Doctor Spectrum', + 'entity.id': '103', + }, + { + 'entity.lastSeenTimestamp': '2023-01-21T21:03:45.309Z', + 'entity.type': 'container', + 'entity.displayName': 'Speed Demon', + 'entity.id': '104', + }, + { + 'entity.lastSeenTimestamp': '2023-03-29T06:15:14.140Z', + 'entity.type': 'container', + 'entity.displayName': 'Whizzer', + 'entity.id': '105', + }, + { + 'entity.lastSeenTimestamp': '2024-01-25T09:23:14.336Z', + 'entity.type': 'container', + 'entity.displayName': 'Scarlet Spider', + 'entity.id': '106', + }, + { + 'entity.lastSeenTimestamp': '2023-08-07T16:59:31.739Z', + 'entity.type': 'host', + 'entity.displayName': 'Kaine', + 'entity.id': '107', + }, + { + 'entity.lastSeenTimestamp': '2024-03-11T20:29:44.832Z', + 'entity.type': 'host', + 'entity.displayName': 'Ben Reilly', + 'entity.id': '108', + }, + { + 'entity.lastSeenTimestamp': '2023-05-08T00:40:17.226Z', + 'entity.type': 'service', + 'entity.displayName': 'Spider-Man 2099', + 'entity.id': '109', + }, + { + 'entity.lastSeenTimestamp': '2023-01-13T19:15:54.781Z', + 'entity.type': 'service', + 'entity.displayName': 'Spider-Ham', + 'entity.id': '110', + }, + { + 'entity.lastSeenTimestamp': '2024-09-02T15:35:26.309Z', + 'entity.type': 'container', + 'entity.displayName': 'Ultimate Spider-Man', + 'entity.id': '111', + }, + { + 'entity.lastSeenTimestamp': '2023-06-04T16:08:36.902Z', + 'entity.type': 'container', + 'entity.displayName': 'Spider-Man Noir', + 'entity.id': '112', + }, + { + 'entity.lastSeenTimestamp': '2023-02-12T13:28:29.732Z', + 'entity.type': 'service', + 'entity.displayName': 'Superior Spider-Man', + 'entity.id': '113', + }, + { + 'entity.lastSeenTimestamp': '2023-08-16T08:54:36.219Z', + 'entity.type': 'service', + 'entity.displayName': 'Agent Venom', + 'entity.id': '114', + }, + { + 'entity.lastSeenTimestamp': '2023-02-23T12:58:57.715Z', + 'entity.type': 'container', + 'entity.displayName': 'Venom', + 'entity.id': '115', + }, + { + 'entity.lastSeenTimestamp': '2023-06-19T18:17:35.424Z', + 'entity.type': 'container', + 'entity.displayName': 'Carnage', + 'entity.id': '116', + }, + { + 'entity.lastSeenTimestamp': '2024-05-02T11:58:44.239Z', + 'entity.type': 'service', + 'entity.displayName': 'Toxin', + 'entity.id': '117', + }, + { + 'entity.lastSeenTimestamp': '2023-12-27T14:15:59.641Z', + 'entity.type': 'host', + 'entity.displayName': 'Anti-Venom', + 'entity.id': '118', + }, + { + 'entity.lastSeenTimestamp': '2024-01-10T15:23:44.536Z', + 'entity.type': 'container', + 'entity.displayName': 'Morbius', + 'entity.id': '119', + }, + { + 'entity.lastSeenTimestamp': '2023-11-26T01:04:11.090Z', + 'entity.type': 'service', + 'entity.displayName': 'Kraven the Hunter', + 'entity.id': '120', + }, + { + 'entity.lastSeenTimestamp': '2024-02-21T04:11:13.221Z', + 'entity.type': 'container', + 'entity.displayName': 'The Lizard', + 'entity.id': '121', + }, + { + 'entity.lastSeenTimestamp': '2023-12-31T07:29:14.344Z', + 'entity.type': 'service', + 'entity.displayName': 'Sandman', + 'entity.id': '122', + }, + { + 'entity.lastSeenTimestamp': '2024-06-02T11:20:40.793Z', + 'entity.type': 'host', + 'entity.displayName': 'Rhino', + 'entity.id': '123', + }, + { + 'entity.lastSeenTimestamp': '2023-04-02T14:31:44.296Z', + 'entity.type': 'host', + 'entity.displayName': 'Shocker', + 'entity.id': '124', + }, + { + 'entity.lastSeenTimestamp': '2024-06-10T12:26:05.411Z', + 'entity.type': 'container', + 'entity.displayName': 'Vulture', + 'entity.id': '125', + }, + { + 'entity.lastSeenTimestamp': '2023-06-27T16:17:19.611Z', + 'entity.type': 'container', + 'entity.displayName': 'Mysterio', + 'entity.id': '126', + }, + { + 'entity.lastSeenTimestamp': '2023-08-29T04:54:25.898Z', + 'entity.type': 'service', + 'entity.displayName': 'Scorpion', + 'entity.id': '127', + }, + { + 'entity.lastSeenTimestamp': '2023-01-17T21:39:41.265Z', + 'entity.type': 'host', + 'entity.displayName': 'Chameleon', + 'entity.id': '128', + }, + { + 'entity.lastSeenTimestamp': '2023-06-07T03:03:11.032Z', + 'entity.type': 'host', + 'entity.displayName': 'Green Goblin', + 'entity.id': '129', + }, + { + 'entity.lastSeenTimestamp': '2023-05-19T19:18:21.005Z', + 'entity.type': 'service', + 'entity.displayName': 'Hobgoblin', + 'entity.id': '130', + }, + { + 'entity.lastSeenTimestamp': '2023-08-03T20:45:51.404Z', + 'entity.type': 'host', + 'entity.displayName': 'Demogoblin', + 'entity.id': '131', + }, + { + 'entity.lastSeenTimestamp': '2024-01-11T06:14:51.570Z', + 'entity.type': 'service', + 'entity.displayName': 'Red Goblin', + 'entity.id': '132', + }, + { + 'entity.lastSeenTimestamp': '2024-03-27T11:07:02.657Z', + 'entity.type': 'host', + 'entity.displayName': 'Doctor Octopus', + 'entity.id': '133', + }, + { + 'entity.lastSeenTimestamp': '2023-08-17T08:42:02.024Z', + 'entity.type': 'container', + 'entity.displayName': 'Electro', + 'entity.id': '134', + }, + { + 'entity.lastSeenTimestamp': '2023-07-02T16:02:17.438Z', + 'entity.type': 'container', + 'entity.displayName': 'Kingpin', + 'entity.id': '135', + }, + { + 'entity.lastSeenTimestamp': '2024-05-17T22:14:53.375Z', + 'entity.type': 'host', + 'entity.displayName': 'Tombstone', + 'entity.id': '136', + }, + { + 'entity.lastSeenTimestamp': '2023-05-30T09:26:45.647Z', + 'entity.type': 'service', + 'entity.displayName': 'Hammerhead', + 'entity.id': '137', + }, + { + 'entity.lastSeenTimestamp': '2024-09-08T03:21:22.494Z', + 'entity.type': 'host', + 'entity.displayName': 'Silvermane', + 'entity.id': '138', + }, + { + 'entity.lastSeenTimestamp': '2023-06-26T06:23:45.305Z', + 'entity.type': 'host', + 'entity.displayName': 'Hydro-Man', + 'entity.id': '139', + }, + { + 'entity.lastSeenTimestamp': '2024-08-15T13:29:01.603Z', + 'entity.type': 'host', + 'entity.displayName': 'Molten Man', + 'entity.id': '140', + }, + { + 'entity.lastSeenTimestamp': '2023-06-21T04:25:12.371Z', + 'entity.type': 'container', + 'entity.displayName': 'Morlun', + 'entity.id': '141', + }, + { + 'entity.lastSeenTimestamp': '2023-11-01T02:59:06.998Z', + 'entity.type': 'host', + 'entity.displayName': 'The Jackal', + 'entity.id': '142', + }, + { + 'entity.lastSeenTimestamp': '2023-06-25T15:27:39.801Z', + 'entity.type': 'service', + 'entity.displayName': 'Alistair Smythe', + 'entity.id': '143', + }, + { + 'entity.lastSeenTimestamp': '2023-12-07T19:13:02.711Z', + 'entity.type': 'service', + 'entity.displayName': 'The Beetle', + 'entity.id': '144', + }, + { + 'entity.lastSeenTimestamp': '2024-04-13T14:16:24.875Z', + 'entity.type': 'host', + 'entity.displayName': 'The Prowler', + 'entity.id': '145', + }, + { + 'entity.lastSeenTimestamp': '2023-11-02T20:25:05.117Z', + 'entity.type': 'host', + 'entity.displayName': 'Tarantula', + 'entity.id': '146', + }, + { + 'entity.lastSeenTimestamp': '2023-04-12T19:09:48.881Z', + 'entity.type': 'service', + 'entity.displayName': 'Black Tarantula', + 'entity.id': '147', + }, + { + 'entity.lastSeenTimestamp': '2024-01-25T01:37:16.115Z', + 'entity.type': 'host', + 'entity.displayName': 'White Tiger', + 'entity.id': '148', + }, + { + 'entity.lastSeenTimestamp': '2023-12-20T12:27:21.819Z', + 'entity.type': 'service', + 'entity.displayName': 'Nightcrawler', + 'entity.id': '149', + }, + { + 'entity.lastSeenTimestamp': '2024-06-11T05:30:01.226Z', + 'entity.type': 'container', + 'entity.displayName': 'Bishop', + 'entity.id': '150', + }, + { + 'entity.lastSeenTimestamp': '2023-09-24T00:18:40.137Z', + 'entity.type': 'service', + 'entity.displayName': 'Cable', + 'entity.id': '151', + }, + { + 'entity.lastSeenTimestamp': '2024-04-24T03:28:16.162Z', + 'entity.type': 'host', + 'entity.displayName': 'Domino', + 'entity.id': '152', + }, + { + 'entity.lastSeenTimestamp': '2023-04-08T07:23:33.921Z', + 'entity.type': 'host', + 'entity.displayName': 'Warpath', + 'entity.id': '153', + }, + { + 'entity.lastSeenTimestamp': '2023-04-12T23:26:45.533Z', + 'entity.type': 'service', + 'entity.displayName': 'Sunspot', + 'entity.id': '154', + }, + { + 'entity.lastSeenTimestamp': '2024-05-18T14:28:01.751Z', + 'entity.type': 'container', + 'entity.displayName': 'Cannonball', + 'entity.id': '155', + }, + { + 'entity.lastSeenTimestamp': '2023-03-14T17:08:06.243Z', + 'entity.type': 'container', + 'entity.displayName': 'Wolfsbane', + 'entity.id': '156', + }, + { + 'entity.lastSeenTimestamp': '2024-02-25T23:18:49.867Z', + 'entity.type': 'service', + 'entity.displayName': 'Magik', + 'entity.id': '157', + }, + { + 'entity.lastSeenTimestamp': '2024-07-14T14:31:58.080Z', + 'entity.type': 'container', + 'entity.displayName': 'Colossus', + 'entity.id': '158', + }, + { + 'entity.lastSeenTimestamp': '2023-05-09T22:32:41.723Z', + 'entity.type': 'container', + 'entity.displayName': 'Omega Red', + 'entity.id': '159', + }, + { + 'entity.lastSeenTimestamp': '2023-05-21T10:33:50.732Z', + 'entity.type': 'host', + 'entity.displayName': 'Juggernaut', + 'entity.id': '160', + }, + { + 'entity.lastSeenTimestamp': '2024-05-01T07:27:51.647Z', + 'entity.type': 'host', + 'entity.displayName': 'Sebastian Shaw', + 'entity.id': '161', + }, + { + 'entity.lastSeenTimestamp': '2024-01-25T09:47:54.565Z', + 'entity.type': 'service', + 'entity.displayName': 'Emma Frost', + 'entity.id': '162', + }, + { + 'entity.lastSeenTimestamp': '2023-10-25T15:51:18.513Z', + 'entity.type': 'host', + 'entity.displayName': 'Mystique', + 'entity.id': '163', + }, + { + 'entity.lastSeenTimestamp': '2023-03-27T07:26:04.804Z', + 'entity.type': 'service', + 'entity.displayName': 'Sabretooth', + 'entity.id': '164', + }, + { + 'entity.lastSeenTimestamp': '2024-07-22T15:29:51.446Z', + 'entity.type': 'host', + 'entity.displayName': 'Pyro', + 'entity.id': '165', + }, + { + 'entity.lastSeenTimestamp': '2024-06-26T09:09:57.169Z', + 'entity.type': 'host', + 'entity.displayName': 'Avalanche', + 'entity.id': '166', + }, + { + 'entity.lastSeenTimestamp': '2023-10-27T05:14:15.279Z', + 'entity.type': 'container', + 'entity.displayName': 'Destiny', + 'entity.id': '167', + }, + { + 'entity.lastSeenTimestamp': '2023-03-08T00:40:52.990Z', + 'entity.type': 'service', + 'entity.displayName': 'Forge', + 'entity.id': '168', + }, + { + 'entity.lastSeenTimestamp': '2023-11-05T16:40:30.510Z', + 'entity.type': 'host', + 'entity.displayName': 'Polaris', + 'entity.id': '169', + }, + { + 'entity.lastSeenTimestamp': '2024-08-12T05:04:27.632Z', + 'entity.type': 'service', + 'entity.displayName': 'Havok', + 'entity.id': '170', + }, + { + 'entity.lastSeenTimestamp': '2023-01-29T18:30:34.000Z', + 'entity.type': 'service', + 'entity.displayName': 'Multiple Man', + 'entity.id': '171', + }, + { + 'entity.lastSeenTimestamp': '2023-12-18T13:11:26.940Z', + 'entity.type': 'service', + 'entity.displayName': 'Strong Guy', + 'entity.id': '172', + }, + { + 'entity.lastSeenTimestamp': '2024-01-07T16:44:23.323Z', + 'entity.type': 'container', + 'entity.displayName': 'Feral', + 'entity.id': '173', + }, + { + 'entity.lastSeenTimestamp': '2023-03-19T22:38:34.493Z', + 'entity.type': 'container', + 'entity.displayName': 'Boom Boom', + 'entity.id': '174', + }, + { + 'entity.lastSeenTimestamp': '2023-05-31T07:23:57.500Z', + 'entity.type': 'container', + 'entity.displayName': 'Warlock', + 'entity.id': '175', + }, + { + 'entity.lastSeenTimestamp': '2024-07-11T01:57:10.851Z', + 'entity.type': 'host', + 'entity.displayName': 'Magus', + 'entity.id': '176', + }, + { + 'entity.lastSeenTimestamp': '2024-05-22T12:50:09.849Z', + 'entity.type': 'container', + 'entity.displayName': 'Blink', + 'entity.id': '177', + }, + { + 'entity.lastSeenTimestamp': '2023-10-20T11:56:09.004Z', + 'entity.type': 'service', + 'entity.displayName': 'Nocturne', + 'entity.id': '178', + }, + { + 'entity.lastSeenTimestamp': '2023-02-08T06:47:37.958Z', + 'entity.type': 'host', + 'entity.displayName': 'Morph', + 'entity.id': '179', + }, + { + 'entity.lastSeenTimestamp': '2023-09-16T01:14:58.701Z', + 'entity.type': 'host', + 'entity.displayName': 'Sunfire', + 'entity.id': '180', + }, + { + 'entity.lastSeenTimestamp': '2023-12-05T19:56:38.483Z', + 'entity.type': 'service', + 'entity.displayName': 'Thunderbird', + 'entity.id': '181', + }, + { + 'entity.lastSeenTimestamp': '2024-01-21T04:49:41.995Z', + 'entity.type': 'host', + 'entity.displayName': 'Banshee', + 'entity.id': '182', + }, + { + 'entity.lastSeenTimestamp': '2023-10-19T02:58:03.939Z', + 'entity.type': 'container', + 'entity.displayName': 'Syrin', + 'entity.id': '183', + }, + { + 'entity.lastSeenTimestamp': '2023-05-21T14:13:08.847Z', + 'entity.type': 'host', + 'entity.displayName': 'Moira MacTaggert', + 'entity.id': '184', + }, + { + 'entity.lastSeenTimestamp': '2024-02-09T05:57:59.984Z', + 'entity.type': 'container', + 'entity.displayName': 'Angel', + 'entity.id': '185', + }, + { + 'entity.lastSeenTimestamp': '2024-05-05T04:42:36.419Z', + 'entity.type': 'service', + 'entity.displayName': 'Archangel', + 'entity.id': '186', + }, + { + 'entity.lastSeenTimestamp': '2024-02-10T11:42:58.833Z', + 'entity.type': 'service', + 'entity.displayName': 'Iceman', + 'entity.id': '187', + }, + { + 'entity.lastSeenTimestamp': '2024-07-25T19:55:46.838Z', + 'entity.type': 'host', + 'entity.displayName': 'Beast', + 'entity.id': '188', + }, + { + 'entity.lastSeenTimestamp': '2024-09-11T05:07:10.339Z', + 'entity.type': 'host', + 'entity.displayName': 'Nightcrawler', + 'entity.id': '189', + }, + { + 'entity.lastSeenTimestamp': '2023-10-19T15:59:49.360Z', + 'entity.type': 'service', + 'entity.displayName': 'Phoenix', + 'entity.id': '190', + }, + { + 'entity.lastSeenTimestamp': '2024-09-07T17:32:26.019Z', + 'entity.type': 'host', + 'entity.displayName': 'X-Man', + 'entity.id': '191', + }, + { + 'entity.lastSeenTimestamp': '2023-07-13T12:49:11.603Z', + 'entity.type': 'container', + 'entity.displayName': 'Cable', + 'entity.id': '192', + }, + { + 'entity.lastSeenTimestamp': '2024-05-19T21:32:30.970Z', + 'entity.type': 'service', + 'entity.displayName': 'Deadpool', + 'entity.id': '193', + }, + { + 'entity.lastSeenTimestamp': '2023-12-12T00:33:27.870Z', + 'entity.type': 'host', + 'entity.displayName': 'Domino', + 'entity.id': '194', + }, + { + 'entity.lastSeenTimestamp': '2023-08-26T18:34:55.709Z', + 'entity.type': 'host', + 'entity.displayName': 'Shatterstar', + 'entity.id': '195', + }, + { + 'entity.lastSeenTimestamp': '2024-08-05T13:02:27.932Z', + 'entity.type': 'service', + 'entity.displayName': 'Warpath', + 'entity.id': '196', + }, + { + 'entity.lastSeenTimestamp': '2023-08-08T08:09:37.053Z', + 'entity.type': 'service', + 'entity.displayName': 'Rictor', + 'entity.id': '197', + }, + { + 'entity.lastSeenTimestamp': '2024-07-18T17:17:22.628Z', + 'entity.type': 'service', + 'entity.displayName': 'Boom Boom', + 'entity.id': '198', + }, + { + 'entity.lastSeenTimestamp': '2023-06-19T20:45:15.240Z', + 'entity.type': 'host', + 'entity.displayName': 'Magik', + 'entity.id': '199', + }, + { + 'entity.lastSeenTimestamp': '2023-07-29T15:18:44.936Z', + 'entity.type': 'container', + 'entity.displayName': 'Cannonball', + 'entity.id': '200', + }, + { + 'entity.lastSeenTimestamp': '2023-02-08T01:26:18.603Z', + 'entity.type': 'host', + 'entity.displayName': 'Sunspot', + 'entity.id': '201', + }, + { + 'entity.lastSeenTimestamp': '2023-02-22T16:06:39.387Z', + 'entity.type': 'service', + 'entity.displayName': 'Banshee', + 'entity.id': '202', + }, + { + 'entity.lastSeenTimestamp': '2023-04-27T03:32:37.015Z', + 'entity.type': 'host', + 'entity.displayName': 'Thunderbird', + 'entity.id': '203', + }, + { + 'entity.lastSeenTimestamp': '2023-09-08T13:07:04.895Z', + 'entity.type': 'service', + 'entity.displayName': 'X-23', + 'entity.id': '204', + }, + { + 'entity.lastSeenTimestamp': '2024-02-08T06:28:33.208Z', + 'entity.type': 'container', + 'entity.displayName': 'Daken', + 'entity.id': '205', + }, + { + 'entity.lastSeenTimestamp': '2024-01-19T19:28:19.416Z', + 'entity.type': 'host', + 'entity.displayName': 'Laura Kinney', + 'entity.id': '206', + }, + { + 'entity.lastSeenTimestamp': '2024-01-29T07:33:26.920Z', + 'entity.type': 'service', + 'entity.displayName': 'Jubilee', + 'entity.id': '207', + }, + { + 'entity.lastSeenTimestamp': '2023-02-20T10:19:34.322Z', + 'entity.type': 'host', + 'entity.displayName': 'Stepford Cuckoos', + 'entity.id': '208', + }, + { + 'entity.lastSeenTimestamp': '2024-06-03T03:31:08.704Z', + 'entity.type': 'service', + 'entity.displayName': 'Fantomex', + 'entity.id': '209', + }, + { + 'entity.lastSeenTimestamp': '2023-10-30T18:18:12.254Z', + 'entity.type': 'container', + 'entity.displayName': 'Marrow', + 'entity.id': '210', + }, + { + 'entity.lastSeenTimestamp': '2024-03-19T23:47:02.611Z', + 'entity.type': 'service', + 'entity.displayName': 'Pixie', + 'entity.id': '211', + }, + { + 'entity.lastSeenTimestamp': '2023-08-08T06:03:05.326Z', + 'entity.type': 'host', + 'entity.displayName': 'Armor', + 'entity.id': '212', + }, + { + 'entity.lastSeenTimestamp': '2023-04-05T11:25:37.426Z', + 'entity.type': 'service', + 'entity.displayName': 'Gentle', + 'entity.id': '213', + }, + { + 'entity.lastSeenTimestamp': '2023-01-10T22:18:30.812Z', + 'entity.type': 'container', + 'entity.displayName': 'Anole', + 'entity.id': '214', + }, + { + 'entity.lastSeenTimestamp': '2024-07-17T06:09:51.763Z', + 'entity.type': 'host', + 'entity.displayName': 'Rockslide', + 'entity.id': '215', + }, + { + 'entity.lastSeenTimestamp': '2024-02-02T00:44:56.270Z', + 'entity.type': 'host', + 'entity.displayName': 'Dust', + 'entity.id': '216', + }, + { + 'entity.lastSeenTimestamp': '2023-03-09T19:37:54.235Z', + 'entity.type': 'host', + 'entity.displayName': 'Mercury', + 'entity.id': '217', + }, + { + 'entity.lastSeenTimestamp': '2024-06-14T09:51:29.579Z', + 'entity.type': 'service', + 'entity.displayName': 'Surge', + 'entity.id': '218', + }, + { + 'entity.lastSeenTimestamp': '2024-03-12T17:28:48.254Z', + 'entity.type': 'host', + 'entity.displayName': 'Hellion', + 'entity.id': '219', + }, + { + 'entity.lastSeenTimestamp': '2023-04-09T07:19:02.429Z', + 'entity.type': 'service', + 'entity.displayName': 'Elixir', + 'entity.id': '220', + }, + { + 'entity.lastSeenTimestamp': '2024-05-10T08:28:21.025Z', + 'entity.type': 'host', + 'entity.displayName': 'X-23', + 'entity.id': '221', + }, + { + 'entity.lastSeenTimestamp': '2023-05-01T16:23:41.343Z', + 'entity.type': 'host', + 'entity.displayName': 'Prodigy', + 'entity.id': '222', + }, + { + 'entity.lastSeenTimestamp': '2023-02-03T07:17:47.909Z', + 'entity.type': 'container', + 'entity.displayName': 'Blindfold', + 'entity.id': '223', + }, + { + 'entity.lastSeenTimestamp': '2023-06-15T00:56:00.094Z', + 'entity.type': 'service', + 'entity.displayName': 'Ink', + 'entity.id': '224', + }, + { + 'entity.lastSeenTimestamp': '2024-04-28T22:32:11.149Z', + 'entity.type': 'container', + 'entity.displayName': 'Goldballs', + 'entity.id': '225', + }, + { + 'entity.lastSeenTimestamp': '2023-10-14T04:34:56.973Z', + 'entity.type': 'service', + 'entity.displayName': 'Magneto', + 'entity.id': '226', + }, + { + 'entity.lastSeenTimestamp': '2024-08-20T08:01:12.156Z', + 'entity.type': 'host', + 'entity.displayName': 'Juggernaut', + 'entity.id': '227', + }, + { + 'entity.lastSeenTimestamp': '2023-12-31T15:27:41.198Z', + 'entity.type': 'host', + 'entity.displayName': 'Mystique', + 'entity.id': '228', + }, + { + 'entity.lastSeenTimestamp': '2024-03-06T04:31:14.001Z', + 'entity.type': 'service', + 'entity.displayName': 'Sabretooth', + 'entity.id': '229', + }, + { + 'entity.lastSeenTimestamp': '2024-03-26T05:07:12.552Z', + 'entity.type': 'host', + 'entity.displayName': 'Toad', + 'entity.id': '230', + }, + { + 'entity.lastSeenTimestamp': '2024-05-20T17:34:56.098Z', + 'entity.type': 'service', + 'entity.displayName': 'Pyro', + 'entity.id': '231', + }, + { + 'entity.lastSeenTimestamp': '2023-04-12T16:53:27.530Z', + 'entity.type': 'host', + 'entity.displayName': 'Avalanche', + 'entity.id': '232', + }, + { + 'entity.lastSeenTimestamp': '2023-02-21T16:26:36.731Z', + 'entity.type': 'container', + 'entity.displayName': 'Blob', + 'entity.id': '233', + }, + { + 'entity.lastSeenTimestamp': '2023-03-23T03:52:18.017Z', + 'entity.type': 'host', + 'entity.displayName': 'Sauron', + 'entity.id': '234', + }, + { + 'entity.lastSeenTimestamp': '2024-04-10T21:31:37.929Z', + 'entity.type': 'container', + 'entity.displayName': 'Omega Red', + 'entity.id': '235', + }, + { + 'entity.lastSeenTimestamp': '2024-02-28T14:35:09.897Z', + 'entity.type': 'service', + 'entity.displayName': 'Mr. Sinister', + 'entity.id': '236', + }, + { + 'entity.lastSeenTimestamp': '2024-01-24T09:05:06.205Z', + 'entity.type': 'host', + 'entity.displayName': 'Apocalypse', + 'entity.id': '237', + }, + { + 'entity.lastSeenTimestamp': '2024-02-05T23:30:26.586Z', + 'entity.type': 'service', + 'entity.displayName': 'Genesis', + 'entity.id': '238', + }, + { + 'entity.lastSeenTimestamp': '2023-04-18T11:46:41.466Z', + 'entity.type': 'service', + 'entity.displayName': 'Archangel', + 'entity.id': '239', + }, + { + 'entity.lastSeenTimestamp': '2023-02-28T02:10:52.053Z', + 'entity.type': 'host', + 'entity.displayName': 'Holocaust', + 'entity.id': '240', + }, + { + 'entity.lastSeenTimestamp': '2024-04-03T12:19:13.947Z', + 'entity.type': 'host', + 'entity.displayName': 'Onslaught', + 'entity.id': '241', + }, + { + 'entity.lastSeenTimestamp': '2023-01-20T01:37:07.489Z', + 'entity.type': 'host', + 'entity.displayName': 'Exodus', + 'entity.id': '242', + }, + { + 'entity.lastSeenTimestamp': '2023-10-09T07:32:39.074Z', + 'entity.type': 'container', + 'entity.displayName': 'Gambit', + 'entity.id': '243', + }, + { + 'entity.lastSeenTimestamp': '2024-07-21T15:09:00.494Z', + 'entity.type': 'host', + 'entity.displayName': 'Rogue', + 'entity.id': '244', + }, + { + 'entity.lastSeenTimestamp': '2024-08-03T14:58:05.875Z', + 'entity.type': 'service', + 'entity.displayName': 'Magneto', + 'entity.id': '245', + }, + { + 'entity.lastSeenTimestamp': '2024-02-08T04:32:33.334Z', + 'entity.type': 'container', + 'entity.displayName': 'Longshot', + 'entity.id': '246', + }, + { + 'entity.lastSeenTimestamp': '2023-03-18T10:37:49.383Z', + 'entity.type': 'service', + 'entity.displayName': 'Dazzler', + 'entity.id': '247', + }, + { + 'entity.lastSeenTimestamp': '2024-07-11T17:35:31.669Z', + 'entity.type': 'service', + 'entity.displayName': 'Forge', + 'entity.id': '248', + }, + { + 'entity.lastSeenTimestamp': '2024-08-23T15:01:17.593Z', + 'entity.type': 'host', + 'entity.displayName': 'Mojo', + 'entity.id': '249', + }, + { + 'entity.lastSeenTimestamp': '2023-06-27T15:34:23.105Z', + 'entity.type': 'service', + 'entity.displayName': 'Spiral', + 'entity.id': '250', + }, + { + 'entity.lastSeenTimestamp': '2024-03-19T08:06:40.658Z', + 'entity.type': 'container', + 'entity.displayName': 'Warlock', + 'entity.id': '251', + }, + { + 'entity.lastSeenTimestamp': '2023-08-19T12:10:02.477Z', + 'entity.type': 'container', + 'entity.displayName': 'Magus', + 'entity.id': '252', + }, + { + 'entity.lastSeenTimestamp': '2024-05-30T12:20:06.653Z', + 'entity.type': 'service', + 'entity.displayName': 'Douglock', + 'entity.id': '253', + }, + { + 'entity.lastSeenTimestamp': '2023-05-31T17:48:07.719Z', + 'entity.type': 'service', + 'entity.displayName': 'Shatterstar', + 'entity.id': '254', + }, + { + 'entity.lastSeenTimestamp': '2023-12-10T05:35:40.666Z', + 'entity.type': 'service', + 'entity.displayName': 'Rictor', + 'entity.id': '255', + }, + { + 'entity.lastSeenTimestamp': '2024-02-02T22:18:47.168Z', + 'entity.type': 'host', + 'entity.displayName': 'Domino', + 'entity.id': '256', + }, + { + 'entity.lastSeenTimestamp': '2024-01-07T22:07:45.968Z', + 'entity.type': 'container', + 'entity.displayName': 'Cable', + 'entity.id': '257', + }, + { + 'entity.lastSeenTimestamp': '2023-01-15T11:22:54.155Z', + 'entity.type': 'host', + 'entity.displayName': 'Hope Summers', + 'entity.id': '258', + }, + { + 'entity.lastSeenTimestamp': '2023-03-26T13:56:10.553Z', + 'entity.type': 'service', + 'entity.displayName': 'Deadpool', + 'entity.id': '259', + }, + { + 'entity.lastSeenTimestamp': '2023-08-15T19:17:34.583Z', + 'entity.type': 'service', + 'entity.displayName': 'X-23', + 'entity.id': '260', + }, + { + 'entity.lastSeenTimestamp': '2024-06-26T09:02:40.512Z', + 'entity.type': 'host', + 'entity.displayName': 'Daken', + 'entity.id': '261', + }, + { + 'entity.lastSeenTimestamp': '2024-07-07T09:01:04.091Z', + 'entity.type': 'host', + 'entity.displayName': 'Wolverine', + 'entity.id': '262', + }, + { + 'entity.lastSeenTimestamp': '2023-10-15T22:25:29.643Z', + 'entity.type': 'service', + 'entity.displayName': 'Old Man Logan', + 'entity.id': '263', + }, + { + 'entity.lastSeenTimestamp': '2024-07-07T04:51:19.761Z', + 'entity.type': 'container', + 'entity.displayName': 'The Maker', + 'entity.id': '264', + }, + { + 'entity.lastSeenTimestamp': '2024-03-13T14:00:51.289Z', + 'entity.type': 'container', + 'entity.displayName': 'Ultimate Thor', + 'entity.id': '265', + }, + { + 'entity.lastSeenTimestamp': '2023-07-23T10:13:07.651Z', + 'entity.type': 'service', + 'entity.displayName': 'Ultimate Iron Man', + 'entity.id': '266', + }, + { + 'entity.lastSeenTimestamp': '2023-08-20T07:09:20.148Z', + 'entity.type': 'container', + 'entity.displayName': 'Ultimate Hulk', + 'entity.id': '267', + }, + { + 'entity.lastSeenTimestamp': '2024-09-08T10:53:13.256Z', + 'entity.type': 'service', + 'entity.displayName': 'Ultimate Captain America', + 'entity.id': '268', + }, + { + 'entity.lastSeenTimestamp': '2024-09-15T03:57:28.175Z', + 'entity.type': 'container', + 'entity.displayName': + 'Sed dignissim libero a diam sagittis, in convallis leo pellentesque. Cras ut sapien sed lacus scelerisque vehicula. Pellentesque at purus pulvinar, mollis justo hendrerit, pharetra purus. Morbi dapibus, augue et volutpat ultricies, neque quam sollicitudin mauris, vitae luctus ex libero id erat. Suspendisse risus lectus, scelerisque vel odio sed.', + 'entity.id': '269', + }, + { + 'entity.lastSeenTimestamp': '2023-10-22T13:49:53.092Z', + 'entity.type': 'host', + 'entity.displayName': 'Silk', + 'entity.id': '270', + }, + { + 'entity.lastSeenTimestamp': '2023-01-13T00:36:25.773Z', + 'entity.type': 'host', + 'entity.displayName': 'Scarlet Spider', + 'entity.id': '271', + }, + { + 'entity.lastSeenTimestamp': '2023-12-10T19:31:42.994Z', + 'entity.type': 'service', + 'entity.displayName': 'Ben Reilly', + 'entity.id': '272', + }, + { + 'entity.lastSeenTimestamp': '2023-01-17T09:49:30.447Z', + 'entity.type': 'service', + 'entity.displayName': 'Miles Morales', + 'entity.id': '273', + }, + { + 'entity.lastSeenTimestamp': '2023-01-02T18:45:44.012Z', + 'entity.type': 'container', + 'entity.displayName': 'Spider-Ham', + 'entity.id': '274', + }, + { + 'entity.lastSeenTimestamp': '2023-06-28T22:50:08.414Z', + 'entity.type': 'container', + 'entity.displayName': 'Agent Venom', + 'entity.id': '275', + }, + { + 'entity.lastSeenTimestamp': '2023-03-30T17:01:35.995Z', + 'entity.type': 'service', + 'entity.displayName': 'Anti-Venom', + 'entity.id': '276', + }, + { + 'entity.lastSeenTimestamp': '2023-06-11T05:23:11.367Z', + 'entity.type': 'host', + 'entity.displayName': 'Toxin', + 'entity.id': '277', + }, + { + 'entity.lastSeenTimestamp': '2023-07-22T15:27:17.077Z', + 'entity.type': 'service', + 'entity.displayName': 'Morbius', + 'entity.id': '278', + }, + { + 'entity.lastSeenTimestamp': '2024-01-26T11:19:34.147Z', + 'entity.type': 'host', + 'entity.displayName': 'Kraven the Hunter', + 'entity.id': '279', + }, + { + 'entity.lastSeenTimestamp': '2024-06-18T09:03:01.111Z', + 'entity.type': 'container', + 'entity.displayName': 'Doctor Octopus', + 'entity.id': '280', + }, + { + 'entity.lastSeenTimestamp': '2024-07-27T14:08:12.583Z', + 'entity.type': 'container', + 'entity.displayName': 'Green Goblin', + 'entity.id': '281', + }, + { + 'entity.lastSeenTimestamp': '2023-01-12T01:38:45.243Z', + 'entity.type': 'host', + 'entity.displayName': 'Electro', + 'entity.id': '282', + }, + { + 'entity.lastSeenTimestamp': '2024-04-19T05:33:59.289Z', + 'entity.type': 'container', + 'entity.displayName': 'Rhino', + 'entity.id': '283', + }, + { + 'entity.lastSeenTimestamp': '2023-04-13T22:06:02.389Z', + 'entity.type': 'service', + 'entity.displayName': 'Shocker', + 'entity.id': '284', + }, + { + 'entity.lastSeenTimestamp': '2023-01-26T15:36:08.782Z', + 'entity.type': 'host', + 'entity.displayName': 'Vulture', + 'entity.id': '285', + }, + { + 'entity.lastSeenTimestamp': '2023-11-11T19:54:14.523Z', + 'entity.type': 'container', + 'entity.displayName': 'Sandman', + 'entity.id': '286', + }, + { + 'entity.lastSeenTimestamp': '2023-12-06T06:20:06.995Z', + 'entity.type': 'host', + 'entity.displayName': 'Mysterio', + 'entity.id': '287', + }, + { + 'entity.lastSeenTimestamp': '2023-07-23T04:30:35.686Z', + 'entity.type': 'service', + 'entity.displayName': 'Black Cat', + 'entity.id': '288', + }, + { + 'entity.lastSeenTimestamp': '2023-01-18T03:09:26.047Z', + 'entity.type': 'host', + 'entity.displayName': 'Silver Sable', + 'entity.id': '289', + }, + { + 'entity.lastSeenTimestamp': '2024-06-08T12:42:08.485Z', + 'entity.type': 'service', + 'entity.displayName': 'Chameleon', + 'entity.id': '290', + }, + { + 'entity.lastSeenTimestamp': '2023-08-18T03:34:28.230Z', + 'entity.type': 'container', + 'entity.displayName': 'Hammerhead', + 'entity.id': '291', + }, + { + 'entity.lastSeenTimestamp': '2024-04-13T01:42:03.890Z', + 'entity.type': 'container', + 'entity.displayName': 'Tombstone', + 'entity.id': '292', + }, + { + 'entity.lastSeenTimestamp': '2023-11-21T17:39:56.066Z', + 'entity.type': 'container', + 'entity.displayName': 'Alistair Smythe', + 'entity.id': '293', + }, + { + 'entity.lastSeenTimestamp': '2024-02-29T04:45:41.113Z', + 'entity.type': 'host', + 'entity.displayName': 'The Beetle', + 'entity.id': '294', + }, + { + 'entity.lastSeenTimestamp': '2024-08-12T07:40:35.827Z', + 'entity.type': 'host', + 'entity.displayName': 'The Prowler', + 'entity.id': '295', + }, + { + 'entity.lastSeenTimestamp': '2023-11-27T23:09:49.629Z', + 'entity.type': 'service', + 'entity.displayName': 'Scorpion', + 'entity.id': '296', + }, + { + 'entity.lastSeenTimestamp': '2024-08-29T21:24:37.304Z', + 'entity.type': 'container', + 'entity.displayName': 'Jackal', + 'entity.id': '297', + }, + { + 'entity.lastSeenTimestamp': '2023-03-25T03:08:42.970Z', + 'entity.type': 'container', + 'entity.displayName': 'Morlun', + 'entity.id': '298', + }, + { + 'entity.lastSeenTimestamp': '2023-12-12T01:01:52.801Z', + 'entity.type': 'container', + 'entity.displayName': 'Lizard', + 'entity.id': '299', + }, + { + 'entity.lastSeenTimestamp': '2024-02-22T02:29:11.333Z', + 'entity.type': 'service', + 'entity.displayName': 'Kingpin', + 'entity.id': '300', + }, + { + 'entity.lastSeenTimestamp': '2024-09-03T19:31:38.700Z', + 'entity.type': 'host', + 'entity.displayName': 'Carnage', + 'entity.id': '301', + }, + { + 'entity.lastSeenTimestamp': '2023-04-09T17:55:20.565Z', + 'entity.type': 'container', + 'entity.displayName': 'Norman Osborn', + 'entity.id': '302', + }, + { + 'entity.lastSeenTimestamp': '2023-11-15T11:23:39.657Z', + 'entity.type': 'container', + 'entity.displayName': 'Harry Osborn', + 'entity.id': '303', + }, + { + 'entity.lastSeenTimestamp': '2024-08-16T08:14:11.415Z', + 'entity.type': 'service', + 'entity.displayName': 'Hobgoblin', + 'entity.id': '304', + }, + { + 'entity.lastSeenTimestamp': '2023-04-09T06:48:50.111Z', + 'entity.type': 'container', + 'entity.displayName': 'Phil Urich', + 'entity.id': '305', + }, + { + 'entity.lastSeenTimestamp': '2023-10-07T15:00:25.174Z', + 'entity.type': 'host', + 'entity.displayName': 'Demogoblin', + 'entity.id': '306', + }, + { + 'entity.lastSeenTimestamp': '2024-05-04T22:13:00.266Z', + 'entity.type': 'container', + 'entity.displayName': 'Red Goblin', + 'entity.id': '307', + }, + { + 'entity.lastSeenTimestamp': '2024-04-04T23:46:04.650Z', + 'entity.type': 'container', + 'entity.displayName': 'Doctor Octopus', + 'entity.id': '308', + }, + { + 'entity.lastSeenTimestamp': '2023-03-09T03:17:41.028Z', + 'entity.type': 'container', + 'entity.displayName': 'Otto Octavius', + 'entity.id': '309', + }, + { + 'entity.lastSeenTimestamp': '2023-02-15T01:52:08.165Z', + 'entity.type': 'service', + 'entity.displayName': 'Spider-Slayer', + 'entity.id': '310', + }, + { + 'entity.lastSeenTimestamp': '2024-05-18T16:03:17.334Z', + 'entity.type': 'container', + 'entity.displayName': 'The Spot', + 'entity.id': '311', + }, + { + 'entity.lastSeenTimestamp': '2023-10-24T01:14:40.519Z', + 'entity.type': 'host', + 'entity.displayName': 'White Tiger', + 'entity.id': '312', + }, + { + 'entity.lastSeenTimestamp': '2023-11-25T03:29:54.122Z', + 'entity.type': 'container', + 'entity.displayName': 'Kang', + 'entity.id': '313', + }, + { + 'entity.lastSeenTimestamp': '2023-03-10T14:39:44.761Z', + 'entity.type': 'container', + 'entity.displayName': 'Baron Zemo', + 'entity.id': '314', + }, + { + 'entity.lastSeenTimestamp': '2023-05-02T09:25:50.743Z', + 'entity.type': 'host', + 'entity.displayName': 'Red Skull', + 'entity.id': '315', + }, + { + 'entity.lastSeenTimestamp': '2023-04-09T14:57:15.653Z', + 'entity.type': 'container', + 'entity.displayName': 'MODOK', + 'entity.id': '316', + }, + { + 'entity.lastSeenTimestamp': '2023-12-02T10:21:33.045Z', + 'entity.type': 'service', + 'entity.displayName': 'Taskmaster', + 'entity.id': '317', + }, + { + 'entity.lastSeenTimestamp': '2023-09-26T12:18:47.857Z', + 'entity.type': 'service', + 'entity.displayName': 'Ultron', + 'entity.id': '318', + }, + { + 'entity.lastSeenTimestamp': '2023-06-29T22:13:32.744Z', + 'entity.type': 'container', + 'entity.displayName': 'Crossbones', + 'entity.id': '319', + }, + { + 'entity.lastSeenTimestamp': '2023-04-29T16:04:40.552Z', + 'entity.type': 'service', + 'entity.displayName': 'Madame Hydra', + 'entity.id': '320', + }, + { + 'entity.lastSeenTimestamp': '2023-07-26T05:34:55.857Z', + 'entity.type': 'host', + 'entity.displayName': 'The Leader', + 'entity.id': '321', + }, + { + 'entity.lastSeenTimestamp': '2023-05-23T13:21:34.771Z', + 'entity.type': 'service', + 'entity.displayName': 'Abomination', + 'entity.id': '322', + }, + { + 'entity.lastSeenTimestamp': '2024-05-06T22:15:26.389Z', + 'entity.type': 'container', + 'entity.displayName': 'The Mandarin', + 'entity.id': '323', + }, + { + 'entity.lastSeenTimestamp': '2024-01-08T09:12:59.615Z', + 'entity.type': 'service', + 'entity.displayName': 'Fin Fang Foom', + 'entity.id': '324', + }, + { + 'entity.lastSeenTimestamp': '2023-07-07T15:39:12.867Z', + 'entity.type': 'container', + 'entity.displayName': 'Killmonger', + 'entity.id': '325', + }, + { + 'entity.lastSeenTimestamp': '2023-12-04T02:42:55.907Z', + 'entity.type': 'container', + 'entity.displayName': 'Ulysses Klaue', + 'entity.id': '326', + }, + { + 'entity.lastSeenTimestamp': '2024-01-01T10:14:42.258Z', + 'entity.type': 'container', + 'entity.displayName': 'The Collector', + 'entity.id': '327', + }, + { + 'entity.lastSeenTimestamp': '2024-07-21T02:20:14.626Z', + 'entity.type': 'container', + 'entity.displayName': 'The Grandmaster', + 'entity.id': '328', + }, + { + 'entity.lastSeenTimestamp': '2024-04-19T01:54:14.317Z', + 'entity.type': 'service', + 'entity.displayName': 'Thanos', + 'entity.id': '329', + }, + { + 'entity.lastSeenTimestamp': '2023-12-15T04:43:05.141Z', + 'entity.type': 'host', + 'entity.displayName': 'Darkseid', + 'entity.id': '330', + }, + { + 'entity.lastSeenTimestamp': '2023-06-20T14:32:29.968Z', + 'entity.type': 'service', + 'entity.displayName': 'Lex Luthor', + 'entity.id': '331', + }, + { + 'entity.lastSeenTimestamp': '2023-11-02T15:33:40.790Z', + 'entity.type': 'container', + 'entity.displayName': 'Bane', + 'entity.id': '332', + }, + { + 'entity.lastSeenTimestamp': '2024-06-09T08:34:20.039Z', + 'entity.type': 'host', + 'entity.displayName': 'Brainiac', + 'entity.id': '333', + }, + { + 'entity.lastSeenTimestamp': '2024-08-30T14:00:25.077Z', + 'entity.type': 'container', + 'entity.displayName': 'Doomsday', + 'entity.id': '334', + }, + { + 'entity.lastSeenTimestamp': '2024-02-26T18:03:06.283Z', + 'entity.type': 'service', + 'entity.displayName': 'General Zod', + 'entity.id': '335', + }, + { + 'entity.lastSeenTimestamp': '2023-10-30T05:16:19.508Z', + 'entity.type': 'host', + 'entity.displayName': "Ra's al Ghul", + 'entity.id': '336', + }, + { + 'entity.lastSeenTimestamp': '2023-04-05T20:09:22.332Z', + 'entity.type': 'host', + 'entity.displayName': 'Scarecrow', + 'entity.id': '337', + }, + { + 'entity.lastSeenTimestamp': '2023-06-09T06:46:09.887Z', + 'entity.type': 'service', + 'entity.displayName': 'The Joker', + 'entity.id': '338', + }, + { + 'entity.lastSeenTimestamp': '2023-04-26T15:02:13.202Z', + 'entity.type': 'host', + 'entity.displayName': 'Harley Quinn', + 'entity.id': '339', + }, + { + 'entity.lastSeenTimestamp': '2024-04-09T05:21:09.975Z', + 'entity.type': 'service', + 'entity.displayName': 'Poison Ivy', + 'entity.id': '340', + }, + { + 'entity.lastSeenTimestamp': '2023-06-05T04:53:00.171Z', + 'entity.type': 'service', + 'entity.displayName': 'The Riddler', + 'entity.id': '341', + }, + { + 'entity.lastSeenTimestamp': '2024-03-07T01:23:08.698Z', + 'entity.type': 'host', + 'entity.displayName': 'Penguin', + 'entity.id': '342', + }, + { + 'entity.lastSeenTimestamp': '2024-05-17T13:08:12.434Z', + 'entity.type': 'container', + 'entity.displayName': 'Two-Face', + 'entity.id': '343', + }, + { + 'entity.lastSeenTimestamp': '2024-03-13T16:39:26.987Z', + 'entity.type': 'service', + 'entity.displayName': 'Mr. Freeze', + 'entity.id': '344', + }, + { + 'entity.lastSeenTimestamp': '2024-01-01T06:31:32.470Z', + 'entity.type': 'host', + 'entity.displayName': 'Clayface', + 'entity.id': '345', + }, + { + 'entity.lastSeenTimestamp': '2024-06-24T16:27:01.156Z', + 'entity.type': 'service', + 'entity.displayName': 'Hush', + 'entity.id': '346', + }, + { + 'entity.lastSeenTimestamp': '2023-10-19T14:35:47.544Z', + 'entity.type': 'host', + 'entity.displayName': 'Black Mask', + 'entity.id': '347', + }, + { + 'entity.lastSeenTimestamp': '2023-10-24T13:57:07.539Z', + 'entity.type': 'host', + 'entity.displayName': 'Killer Croc', + 'entity.id': '348', + }, + { + 'entity.lastSeenTimestamp': '2023-02-19T09:40:44.538Z', + 'entity.type': 'service', + 'entity.displayName': 'Deathstroke', + 'entity.id': '349', + }, + { + 'entity.lastSeenTimestamp': '2023-03-25T19:22:45.889Z', + 'entity.type': 'service', + 'entity.displayName': 'Deadshot', + 'entity.id': '350', + }, + { + 'entity.lastSeenTimestamp': '2024-06-08T03:10:02.475Z', + 'entity.type': 'container', + 'entity.displayName': 'Amanda Waller', + 'entity.id': '351', + }, + { + 'entity.lastSeenTimestamp': '2023-01-04T03:49:07.210Z', + 'entity.type': 'host', + 'entity.displayName': 'Captain Boomerang', + 'entity.id': '352', + }, + { + 'entity.lastSeenTimestamp': '2023-04-10T20:53:14.367Z', + 'entity.type': 'host', + 'entity.displayName': 'Katana', + 'entity.id': '353', + }, + { + 'entity.lastSeenTimestamp': '2024-04-25T09:42:55.170Z', + 'entity.type': 'host', + 'entity.displayName': 'El Diablo', + 'entity.id': '354', + }, + { + 'entity.lastSeenTimestamp': '2024-05-10T00:44:03.472Z', + 'entity.type': 'host', + 'entity.displayName': 'Enchantress', + 'entity.id': '355', + }, + { + 'entity.lastSeenTimestamp': '2024-02-16T03:47:56.021Z', + 'entity.type': 'service', + 'entity.displayName': 'Rick Flag', + 'entity.id': '356', + }, + { + 'entity.lastSeenTimestamp': '2023-09-30T16:45:27.670Z', + 'entity.type': 'host', + 'entity.displayName': 'King Shark', + 'entity.id': '357', + }, + { + 'entity.lastSeenTimestamp': '2023-10-14T03:04:21.380Z', + 'entity.type': 'host', + 'entity.displayName': 'Peacemaker', + 'entity.id': '358', + }, + { + 'entity.lastSeenTimestamp': '2023-06-27T20:42:18.732Z', + 'entity.type': 'host', + 'entity.displayName': 'Bloodsport', + 'entity.id': '359', + }, + { + 'entity.lastSeenTimestamp': '2024-05-25T22:56:14.675Z', + 'entity.type': 'container', + 'entity.displayName': 'Weasel', + 'entity.id': '360', + }, + { + 'entity.lastSeenTimestamp': '2024-05-15T05:34:39.704Z', + 'entity.type': 'container', + 'entity.displayName': 'Javelin', + 'entity.id': '361', + }, + { + 'entity.lastSeenTimestamp': '2024-07-18T13:40:24.040Z', + 'entity.type': 'container', + 'entity.displayName': 'Ratcatcher', + 'entity.id': '362', + }, + { + 'entity.lastSeenTimestamp': '2023-08-31T03:02:00.545Z', + 'entity.type': 'container', + 'entity.displayName': 'T.D.K.', + 'entity.id': '363', + }, + { + 'entity.lastSeenTimestamp': '2024-08-27T11:13:19.374Z', + 'entity.type': 'container', + 'entity.displayName': 'Doctor Fate', + 'entity.id': '364', + }, + { + 'entity.lastSeenTimestamp': '2023-08-29T06:47:41.545Z', + 'entity.type': 'container', + 'entity.displayName': 'Hawkman', + 'entity.id': '365', + }, + { + 'entity.lastSeenTimestamp': '2024-04-30T00:01:35.041Z', + 'entity.type': 'service', + 'entity.displayName': 'Hawkgirl', + 'entity.id': '366', + }, + { + 'entity.lastSeenTimestamp': '2024-01-24T01:02:59.317Z', + 'entity.type': 'container', + 'entity.displayName': 'Black Adam', + 'entity.id': '367', + }, + { + 'entity.lastSeenTimestamp': '2023-11-08T14:30:16.054Z', + 'entity.type': 'service', + 'entity.displayName': 'Atom Smasher', + 'entity.id': '368', + }, + { + 'entity.lastSeenTimestamp': '2024-08-02T05:40:07.271Z', + 'entity.type': 'host', + 'entity.displayName': 'Cyclone', + 'entity.id': '369', + }, + { + 'entity.lastSeenTimestamp': '2024-03-24T19:11:13.807Z', + 'entity.type': 'host', + 'entity.displayName': 'Stargirl', + 'entity.id': '370', + }, + { + 'entity.lastSeenTimestamp': '2024-01-25T19:31:31.536Z', + 'entity.type': 'host', + 'entity.displayName': 'Hourman', + 'entity.id': '371', + }, + { + 'entity.lastSeenTimestamp': '2024-05-20T22:09:46.339Z', + 'entity.type': 'service', + 'entity.displayName': 'Wildcat', + 'entity.id': '372', + }, + { + 'entity.lastSeenTimestamp': '2023-07-31T01:51:08.575Z', + 'entity.type': 'host', + 'entity.displayName': 'Green Arrow', + 'entity.id': '373', + }, + { + 'entity.lastSeenTimestamp': '2024-03-23T22:01:53.447Z', + 'entity.type': 'container', + 'entity.displayName': 'Speedy', + 'entity.id': '374', + }, + { + 'entity.lastSeenTimestamp': '2024-02-11T22:26:31.584Z', + 'entity.type': 'service', + 'entity.displayName': 'Arsenal', + 'entity.id': '375', + }, + { + 'entity.lastSeenTimestamp': '2024-04-06T12:30:22.601Z', + 'entity.type': 'service', + 'entity.displayName': 'Red Hood', + 'entity.id': '376', + }, + { + 'entity.lastSeenTimestamp': '2023-09-13T07:02:26.095Z', + 'entity.type': 'service', + 'entity.displayName': 'Batgirl', + 'entity.id': '377', + }, + { + 'entity.lastSeenTimestamp': '2024-07-07T22:22:48.331Z', + 'entity.type': 'container', + 'entity.displayName': 'Oracle', + 'entity.id': '378', + }, + { + 'entity.lastSeenTimestamp': '2024-08-09T21:51:59.774Z', + 'entity.type': 'host', + 'entity.displayName': 'Huntress', + 'entity.id': '379', + }, + { + 'entity.lastSeenTimestamp': '2024-02-04T21:15:45.848Z', + 'entity.type': 'service', + 'entity.displayName': 'Cassandra Cain', + 'entity.id': '380', + }, + { + 'entity.lastSeenTimestamp': '2023-07-23T14:22:33.033Z', + 'entity.type': 'host', + 'entity.displayName': 'Azrael', + 'entity.id': '381', + }, + { + 'entity.lastSeenTimestamp': '2024-09-04T05:28:23.197Z', + 'entity.type': 'container', + 'entity.displayName': 'Batwoman', + 'entity.id': '382', + }, + { + 'entity.lastSeenTimestamp': '2023-06-27T08:09:37.626Z', + 'entity.type': 'container', + 'entity.displayName': 'Stephanie Brown', + 'entity.id': '383', + }, + { + 'entity.lastSeenTimestamp': '2023-12-20T08:14:23.553Z', + 'entity.type': 'host', + 'entity.displayName': 'The Question', + 'entity.id': '384', + }, + { + 'entity.lastSeenTimestamp': '2024-03-17T00:19:48.826Z', + 'entity.type': 'container', + 'entity.displayName': 'Blue Beetle', + 'entity.id': '385', + }, + { + 'entity.lastSeenTimestamp': '2024-02-17T20:55:20.634Z', + 'entity.type': 'container', + 'entity.displayName': 'Booster Gold', + 'entity.id': '386', + }, + { + 'entity.lastSeenTimestamp': '2023-02-14T10:24:49.445Z', + 'entity.type': 'host', + 'entity.displayName': 'Plastic Man', + 'entity.id': '387', + }, + { + 'entity.lastSeenTimestamp': '2024-05-10T06:49:45.226Z', + 'entity.type': 'container', + 'entity.displayName': 'Metamorpho', + 'entity.id': '388', + }, + { + 'entity.lastSeenTimestamp': '2023-08-28T11:04:03.884Z', + 'entity.type': 'host', + 'entity.displayName': 'The Spectre', + 'entity.id': '389', + }, + { + 'entity.lastSeenTimestamp': '2023-06-03T09:16:22.294Z', + 'entity.type': 'service', + 'entity.displayName': 'Etrigan', + 'entity.id': '390', + }, + { + 'entity.lastSeenTimestamp': '2023-05-27T15:43:31.368Z', + 'entity.type': 'host', + 'entity.displayName': 'Swamp Thing', + 'entity.id': '391', + }, + { + 'entity.lastSeenTimestamp': '2024-01-23T00:27:36.339Z', + 'entity.type': 'service', + 'entity.displayName': 'Constantine', + 'entity.id': '392', + }, + { + 'entity.lastSeenTimestamp': '2023-12-19T09:00:36.251Z', + 'entity.type': 'host', + 'entity.displayName': 'Zatanna', + 'entity.id': '393', + }, + { + 'entity.lastSeenTimestamp': '2024-02-11T09:31:14.413Z', + 'entity.type': 'host', + 'entity.displayName': 'Doctor Fate', + 'entity.id': '394', + }, + { + 'entity.lastSeenTimestamp': '2024-08-15T14:04:15.345Z', + 'entity.type': 'service', + 'entity.displayName': 'Martian Manhunter', + 'entity.id': '395', + }, + { + 'entity.lastSeenTimestamp': '2024-03-23T06:41:28.527Z', + 'entity.type': 'container', + 'entity.displayName': 'Firestorm', + 'entity.id': '396', + }, + { + 'entity.lastSeenTimestamp': '2023-03-29T19:22:53.314Z', + 'entity.type': 'service', + 'entity.displayName': 'Captain Atom', + 'entity.id': '397', + }, + { + 'entity.lastSeenTimestamp': '2024-05-03T02:22:19.643Z', + 'entity.type': 'service', + 'entity.displayName': 'The Atom', + 'entity.id': '398', + }, + { + 'entity.lastSeenTimestamp': '2024-05-12T05:55:36.153Z', + 'entity.type': 'service', + 'entity.displayName': 'Vixen', + 'entity.id': '399', + }, + { + 'entity.lastSeenTimestamp': '2023-03-01T07:39:44.249Z', + 'entity.type': 'service', + 'entity.displayName': 'Animal Man', + 'entity.id': '400', + }, + { + 'entity.lastSeenTimestamp': '2023-05-20T14:24:33.191Z', + 'entity.type': 'host', + 'entity.displayName': 'Hawk', + 'entity.id': '401', + }, + { + 'entity.lastSeenTimestamp': '2023-06-24T16:44:21.444Z', + 'entity.type': 'host', + 'entity.displayName': 'Dove', + 'entity.id': '402', + }, + { + 'entity.lastSeenTimestamp': '2024-04-05T00:50:29.260Z', + 'entity.type': 'host', + 'entity.displayName': 'Steel', + 'entity.id': '403', + }, + { + 'entity.lastSeenTimestamp': '2024-05-01T07:44:47.694Z', + 'entity.type': 'host', + 'entity.displayName': 'Guardian', + 'entity.id': '404', + }, + { + 'entity.lastSeenTimestamp': '2024-08-10T20:46:37.204Z', + 'entity.type': 'container', + 'entity.displayName': 'The Phantom Stranger', + 'entity.id': '405', + }, + { + 'entity.lastSeenTimestamp': '2024-04-06T11:04:12.556Z', + 'entity.type': 'service', + 'entity.displayName': 'Lobo', + 'entity.id': '406', + }, + { + 'entity.lastSeenTimestamp': '2023-11-24T01:39:36.878Z', + 'entity.type': 'host', + 'entity.displayName': 'Red Tornado', + 'entity.id': '407', + }, + { + 'entity.lastSeenTimestamp': '2024-08-05T14:00:37.985Z', + 'entity.type': 'service', + 'entity.displayName': 'Miss Martian', + 'entity.id': '408', + }, + { + 'entity.lastSeenTimestamp': '2024-01-23T18:57:18.692Z', + 'entity.type': 'container', + 'entity.displayName': 'Bizarro', + 'entity.id': '409', + }, + { + 'entity.lastSeenTimestamp': '2023-01-29T08:35:22.194Z', + 'entity.type': 'service', + 'entity.displayName': 'Black Lightning', + 'entity.id': '410', + }, + { + 'entity.lastSeenTimestamp': '2024-04-03T21:32:10.035Z', + 'entity.type': 'container', + 'entity.displayName': 'Katana', + 'entity.id': '411', + }, + { + 'entity.lastSeenTimestamp': '2024-02-05T09:18:03.386Z', + 'entity.type': 'service', + 'entity.displayName': 'Mr. Terrific', + 'entity.id': '412', + }, + { + 'entity.lastSeenTimestamp': '2024-05-09T01:04:11.713Z', + 'entity.type': 'host', + 'entity.displayName': 'Plastic Man', + 'entity.id': '413', + }, + { + 'entity.lastSeenTimestamp': '2023-03-25T15:26:53.790Z', + 'entity.type': 'host', + 'entity.displayName': 'Shazam', + 'entity.id': '414', + }, + { + 'entity.lastSeenTimestamp': '2023-07-11T11:07:31.377Z', + 'entity.type': 'service', + 'entity.displayName': 'Spawn', + 'entity.id': '415', + }, + { + 'entity.lastSeenTimestamp': '2023-09-08T10:01:26.864Z', + 'entity.type': 'host', + 'entity.displayName': 'Invincible', + 'entity.id': '416', + }, + { + 'entity.lastSeenTimestamp': '2024-07-14T15:51:35.763Z', + 'entity.type': 'container', + 'entity.displayName': 'Atom Eve', + 'entity.id': '417', + }, + { + 'entity.lastSeenTimestamp': '2024-06-26T21:44:30.555Z', + 'entity.type': 'container', + 'entity.displayName': 'Rex Splode', + 'entity.id': '418', + }, + { + 'entity.lastSeenTimestamp': '2023-07-05T04:20:35.073Z', + 'entity.type': 'container', + 'entity.displayName': 'Allen the Alien', + 'entity.id': '419', + }, + { + 'entity.lastSeenTimestamp': '2024-05-31T19:57:53.543Z', + 'entity.type': 'service', + 'entity.displayName': 'Omni-Man', + 'entity.id': '420', + }, + { + 'entity.lastSeenTimestamp': '2023-02-19T17:22:07.379Z', + 'entity.type': 'service', + 'entity.displayName': 'The Tick', + 'entity.id': '421', + }, + { + 'entity.lastSeenTimestamp': '2023-12-17T22:51:04.060Z', + 'entity.type': 'host', + 'entity.displayName': 'Arthur', + 'entity.id': '422', + }, + { + 'entity.lastSeenTimestamp': '2024-03-09T23:54:47.229Z', + 'entity.type': 'service', + 'entity.displayName': 'Big Daddy', + 'entity.id': '423', + }, + { + 'entity.lastSeenTimestamp': '2024-07-14T11:52:37.828Z', + 'entity.type': 'service', + 'entity.displayName': 'Hit-Girl', + 'entity.id': '424', + }, + { + 'entity.lastSeenTimestamp': '2023-02-08T21:15:09.242Z', + 'entity.type': 'container', + 'entity.displayName': 'Kick-Ass', + 'entity.id': '425', + }, + { + 'entity.lastSeenTimestamp': '2024-03-01T17:58:53.274Z', + 'entity.type': 'host', + 'entity.displayName': 'Hellboy', + 'entity.id': '426', + }, + { + 'entity.lastSeenTimestamp': '2023-11-04T20:37:28.218Z', + 'entity.type': 'host', + 'entity.displayName': 'Abe Sapien', + 'entity.id': '427', + }, + { + 'entity.lastSeenTimestamp': '2024-05-16T15:38:01.584Z', + 'entity.type': 'service', + 'entity.displayName': 'Liz Sherman', + 'entity.id': '428', + }, + { + 'entity.lastSeenTimestamp': '2023-03-28T13:40:51.501Z', + 'entity.type': 'container', + 'entity.displayName': 'The Mask', + 'entity.id': '429', + }, + { + 'entity.lastSeenTimestamp': '2023-07-22T10:39:48.045Z', + 'entity.type': 'service', + 'entity.displayName': 'Judge Dredd', + 'entity.id': '430', + }, + { + 'entity.lastSeenTimestamp': '2023-11-10T02:21:09.389Z', + 'entity.type': 'service', + 'entity.displayName': 'Tank Girl', + 'entity.id': '431', + }, + { + 'entity.lastSeenTimestamp': '2024-04-21T16:23:33.730Z', + 'entity.type': 'container', + 'entity.displayName': 'Shadowman', + 'entity.id': '432', + }, + { + 'entity.lastSeenTimestamp': '2023-08-17T19:31:07.282Z', + 'entity.type': 'container', + 'entity.displayName': 'Bloodshot', + 'entity.id': '433', + }, + { + 'entity.lastSeenTimestamp': '2023-04-23T10:05:19.825Z', + 'entity.type': 'service', + 'entity.displayName': 'X-O Manowar', + 'entity.id': '434', + }, + { + 'entity.lastSeenTimestamp': '2024-04-30T21:58:46.410Z', + 'entity.type': 'host', + 'entity.displayName': 'Harbinger', + 'entity.id': '435', + }, + { + 'entity.lastSeenTimestamp': '2023-07-14T05:26:30.493Z', + 'entity.type': 'service', + 'entity.displayName': 'Ninjak', + 'entity.id': '436', + }, + { + 'entity.lastSeenTimestamp': '2024-01-30T09:21:55.939Z', + 'entity.type': 'host', + 'entity.displayName': 'Faith', + 'entity.id': '437', + }, + { + 'entity.lastSeenTimestamp': '2024-02-17T20:36:23.898Z', + 'entity.type': 'host', + 'entity.displayName': 'Archer', + 'entity.id': '438', + }, + { + 'entity.lastSeenTimestamp': '2023-04-04T15:08:08.423Z', + 'entity.type': 'container', + 'entity.displayName': 'Armstrong', + 'entity.id': '439', + }, + { + 'entity.lastSeenTimestamp': '2024-07-29T11:54:01.693Z', + 'entity.type': 'host', + 'entity.displayName': 'Eternal Warrior', + 'entity.id': '440', + }, + { + 'entity.lastSeenTimestamp': '2023-11-02T09:56:15.646Z', + 'entity.type': 'host', + 'entity.displayName': 'Quantum', + 'entity.id': '441', + }, + { + 'entity.lastSeenTimestamp': '2023-04-06T02:07:23.857Z', + 'entity.type': 'container', + 'entity.displayName': 'Woody', + 'entity.id': '442', + }, + { + 'entity.lastSeenTimestamp': '2023-05-20T10:33:26.328Z', + 'entity.type': 'host', + 'entity.displayName': 'The Darkness', + 'entity.id': '443', + }, + { + 'entity.lastSeenTimestamp': '2023-12-03T23:59:21.627Z', + 'entity.type': 'container', + 'entity.displayName': 'Witchblade', + 'entity.id': '444', + }, + { + 'entity.lastSeenTimestamp': '2023-05-31T10:56:01.829Z', + 'entity.type': 'container', + 'entity.displayName': 'Ripclaw', + 'entity.id': '445', + }, + { + 'entity.lastSeenTimestamp': '2024-07-28T11:56:20.407Z', + 'entity.type': 'host', + 'entity.displayName': 'Warblade', + 'entity.id': '446', + }, + { + 'entity.lastSeenTimestamp': '2023-05-03T18:24:08.227Z', + 'entity.type': 'host', + 'entity.displayName': 'Savage Dragon', + 'entity.id': '447', + }, + { + 'entity.lastSeenTimestamp': '2024-07-15T09:05:19.621Z', + 'entity.type': 'host', + 'entity.displayName': 'Spawn', + 'entity.id': '448', + }, + { + 'entity.lastSeenTimestamp': '2024-04-16T13:06:48.941Z', + 'entity.type': 'host', + 'entity.displayName': 'Witchblade', + 'entity.id': '449', + }, + { + 'entity.lastSeenTimestamp': '2024-04-22T12:52:06.912Z', + 'entity.type': 'container', + 'entity.displayName': 'Invincible', + 'entity.id': '450', + }, + { + 'entity.lastSeenTimestamp': '2023-02-23T23:57:49.389Z', + 'entity.type': 'host', + 'entity.displayName': 'The Maxx', + 'entity.id': '451', + }, + { + 'entity.lastSeenTimestamp': '2024-04-17T01:12:16.359Z', + 'entity.type': 'service', + 'entity.displayName': 'Lady Death', + 'entity.id': '452', + }, + { + 'entity.lastSeenTimestamp': '2024-05-07T14:14:02.286Z', + 'entity.type': 'container', + 'entity.displayName': 'The Shadow', + 'entity.id': '453', + }, + { + 'entity.lastSeenTimestamp': '2024-03-31T23:20:56.580Z', + 'entity.type': 'host', + 'entity.displayName': 'Doc Savage', + 'entity.id': '454', + }, + { + 'entity.lastSeenTimestamp': '2023-05-18T01:28:20.743Z', + 'entity.type': 'container', + 'entity.displayName': 'Zorro', + 'entity.id': '455', + }, + { + 'entity.lastSeenTimestamp': '2023-01-12T01:19:03.220Z', + 'entity.type': 'service', + 'entity.displayName': 'The Phantom', + 'entity.id': '456', + }, + { + 'entity.lastSeenTimestamp': '2023-10-10T20:35:47.302Z', + 'entity.type': 'container', + 'entity.displayName': 'Green Hornet', + 'entity.id': '457', + }, + { + 'entity.lastSeenTimestamp': '2023-05-09T19:35:59.568Z', + 'entity.type': 'service', + 'entity.displayName': 'Kato', + 'entity.id': '458', + }, + { + 'entity.lastSeenTimestamp': '2023-07-02T19:40:18.206Z', + 'entity.type': 'host', + 'entity.displayName': 'Red Sonja', + 'entity.id': '459', + }, + { + 'entity.lastSeenTimestamp': '2024-01-08T20:03:24.184Z', + 'entity.type': 'container', + 'entity.displayName': 'Conan the Barbarian', + 'entity.id': '460', + }, + { + 'entity.lastSeenTimestamp': '2024-03-13T05:26:16.730Z', + 'entity.type': 'service', + 'entity.displayName': 'Homer Simpson', + 'entity.id': '461', + }, + { + 'entity.lastSeenTimestamp': '2024-06-28T02:49:37.987Z', + 'entity.type': 'host', + 'entity.displayName': 'Marge Simpson', + 'entity.id': '462', + }, + { + 'entity.lastSeenTimestamp': '2024-06-17T21:16:08.180Z', + 'entity.type': 'host', + 'entity.displayName': 'Bart Simpson', + 'entity.id': '463', + }, + { + 'entity.lastSeenTimestamp': '2023-03-27T21:34:38.051Z', + 'entity.type': 'host', + 'entity.displayName': 'Lisa Simpson', + 'entity.id': '464', + }, + { + 'entity.lastSeenTimestamp': '2023-02-04T21:08:36.340Z', + 'entity.type': 'service', + 'entity.displayName': 'Maggie Simpson', + 'entity.id': '465', + }, + { + 'entity.lastSeenTimestamp': '2024-05-22T20:05:45.805Z', + 'entity.type': 'service', + 'entity.displayName': 'Abe Simpson', + 'entity.id': '466', + }, + { + 'entity.lastSeenTimestamp': '2023-04-02T23:57:33.378Z', + 'entity.type': 'container', + 'entity.displayName': 'Ned Flanders', + 'entity.id': '467', + }, + { + 'entity.lastSeenTimestamp': '2023-03-05T12:25:19.985Z', + 'entity.type': 'container', + 'entity.displayName': 'Maude Flanders', + 'entity.id': '468', + }, + { + 'entity.lastSeenTimestamp': '2024-05-31T22:44:52.035Z', + 'entity.type': 'container', + 'entity.displayName': 'Rod Flanders', + 'entity.id': '469', + }, + { + 'entity.lastSeenTimestamp': '2024-03-06T22:07:45.916Z', + 'entity.type': 'container', + 'entity.displayName': 'Todd Flanders', + 'entity.id': '470', + }, + { + 'entity.lastSeenTimestamp': '2023-09-29T20:39:30.536Z', + 'entity.type': 'service', + 'entity.displayName': 'Milhouse Van Houten', + 'entity.id': '471', + }, + { + 'entity.lastSeenTimestamp': '2023-07-13T22:08:03.669Z', + 'entity.type': 'host', + 'entity.displayName': 'Nelson Muntz', + 'entity.id': '472', + }, + { + 'entity.lastSeenTimestamp': '2024-01-11T11:44:27.608Z', + 'entity.type': 'service', + 'entity.displayName': 'Ralph Wiggum', + 'entity.id': '473', + }, + { + 'entity.lastSeenTimestamp': '2023-10-07T03:48:20.334Z', + 'entity.type': 'container', + 'entity.displayName': 'Chief Wiggum', + 'entity.id': '474', + }, + { + 'entity.lastSeenTimestamp': '2023-12-26T00:46:10.602Z', + 'entity.type': 'host', + 'entity.displayName': 'Clancy Wiggum', + 'entity.id': '475', + }, + { + 'entity.lastSeenTimestamp': '2023-03-24T03:32:51.643Z', + 'entity.type': 'host', + 'entity.displayName': 'Krusty the Clown', + 'entity.id': '476', + }, + { + 'entity.lastSeenTimestamp': '2023-01-19T18:15:10.942Z', + 'entity.type': 'container', + 'entity.displayName': 'Sideshow Bob', + 'entity.id': '477', + }, + { + 'entity.lastSeenTimestamp': '2023-02-05T23:13:30.639Z', + 'entity.type': 'service', + 'entity.displayName': 'Sideshow Mel', + 'entity.id': '478', + }, + { + 'entity.lastSeenTimestamp': '2024-03-06T07:02:19.760Z', + 'entity.type': 'host', + 'entity.displayName': 'Moe Szyslak', + 'entity.id': '479', + }, + { + 'entity.lastSeenTimestamp': '2024-08-26T17:28:47.162Z', + 'entity.type': 'service', + 'entity.displayName': 'Barney Gumble', + 'entity.id': '480', + }, + { + 'entity.lastSeenTimestamp': '2024-05-12T12:10:32.668Z', + 'entity.type': 'service', + 'entity.displayName': 'Lenny Leonard', + 'entity.id': '481', + }, + { + 'entity.lastSeenTimestamp': '2023-07-25T05:19:12.244Z', + 'entity.type': 'service', + 'entity.displayName': 'Carl Carlson', + 'entity.id': '482', + }, + { + 'entity.lastSeenTimestamp': '2023-09-14T19:23:00.311Z', + 'entity.type': 'container', + 'entity.displayName': 'Waylon Smithers', + 'entity.id': '483', + }, + { + 'entity.lastSeenTimestamp': '2023-07-06T12:21:13.655Z', + 'entity.type': 'service', + 'entity.displayName': 'Mr. Burns', + 'entity.id': '484', + }, + { + 'entity.lastSeenTimestamp': '2023-01-23T07:14:22.901Z', + 'entity.type': 'service', + 'entity.displayName': 'Principal Skinner', + 'entity.id': '485', + }, + { + 'entity.lastSeenTimestamp': '2024-05-07T18:03:19.312Z', + 'entity.type': 'service', + 'entity.displayName': 'Edna Krabappel', + 'entity.id': '486', + }, + { + 'entity.lastSeenTimestamp': '2023-02-14T07:33:02.981Z', + 'entity.type': 'service', + 'entity.displayName': 'Superintendent Chalmers', + 'entity.id': '487', + }, + { + 'entity.lastSeenTimestamp': '2024-01-21T22:32:55.738Z', + 'entity.type': 'container', + 'entity.displayName': 'Groundskeeper Willie', + 'entity.id': '488', + }, + { + 'entity.lastSeenTimestamp': '2024-03-31T13:42:07.765Z', + 'entity.type': 'service', + 'entity.displayName': 'Otto Mann', + 'entity.id': '489', + }, + { + 'entity.lastSeenTimestamp': '2023-08-23T18:26:32.084Z', + 'entity.type': 'container', + 'entity.displayName': 'Apu Nahasapeemapetilon', + 'entity.id': '490', + }, + { + 'entity.lastSeenTimestamp': '2024-02-14T04:17:17.737Z', + 'entity.type': 'container', + 'entity.displayName': 'Manjula Nahasapeemapetilon', + 'entity.id': '491', + }, + { + 'entity.lastSeenTimestamp': '2024-07-06T03:25:46.939Z', + 'entity.type': 'service', + 'entity.displayName': 'Kearney Zzyzwicz', + 'entity.id': '492', + }, + { + 'entity.lastSeenTimestamp': '2023-09-04T06:08:42.239Z', + 'entity.type': 'service', + 'entity.displayName': 'Jimbo Jones', + 'entity.id': '493', + }, + { + 'entity.lastSeenTimestamp': '2023-06-12T23:45:21.630Z', + 'entity.type': 'host', + 'entity.displayName': 'Dolph Starbeam', + 'entity.id': '494', + }, + { + 'entity.lastSeenTimestamp': '2023-11-18T18:43:41.585Z', + 'entity.type': 'container', + 'entity.displayName': 'Martin Prince', + 'entity.id': '495', + }, + { + 'entity.lastSeenTimestamp': '2024-07-29T01:12:36.480Z', + 'entity.type': 'container', + 'entity.displayName': 'Mrs. Prince', + 'entity.id': '496', + }, + { + 'entity.lastSeenTimestamp': '2023-09-25T18:32:05.791Z', + 'entity.type': 'container', + 'entity.displayName': 'Comic Book Guy', + 'entity.id': '497', + }, + { + 'entity.lastSeenTimestamp': '2023-04-05T12:49:08.814Z', + 'entity.type': 'host', + 'entity.displayName': 'Professor Frink', + 'entity.id': '498', + }, + { + 'entity.lastSeenTimestamp': '2023-04-07T20:07:02.744Z', + 'entity.type': 'host', + 'entity.displayName': 'Troy McClure', + 'entity.id': '499', + }, +]; diff --git a/x-pack/plugins/observability_solution/inventory/public/pages/inventory_page/index.tsx b/x-pack/plugins/observability_solution/inventory/public/pages/inventory_page/index.tsx index 9389fdaca3ea0..e77b46b26dc79 100644 --- a/x-pack/plugins/observability_solution/inventory/public/pages/inventory_page/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/pages/inventory_page/index.tsx @@ -5,12 +5,63 @@ * 2.0. */ import React from 'react'; +import { useAbortableAsync } from '@kbn/observability-utils/hooks/use_abortable_async'; +import { EuiDataGridSorting } from '@elastic/eui'; import { EntitiesGrid } from '../../components/entities_grid'; +import { useKibana } from '../../hooks/use_kibana'; +import { useInventoryParams } from '../../hooks/use_inventory_params'; +import { useInventoryRouter } from '../../hooks/use_inventory_router'; export function InventoryPage() { + const { + services: { inventoryAPIClient }, + } = useKibana(); + const { query } = useInventoryParams('/'); + const { sortDirection, sortField, pageIndex } = query; + const inventoryRoute = useInventoryRouter(); + + const { value = { entities: [] }, loading } = useAbortableAsync( + ({ signal }) => { + return inventoryAPIClient.fetch('GET /internal/inventory/entities', { + params: { + query: { + sortDirection, + sortField, + }, + }, + signal, + }); + }, + [inventoryAPIClient, sortDirection, sortField] + ); + + function handlePageChange(nextPage: number) { + inventoryRoute.push('/', { + path: {}, + query: { ...query, pageIndex: nextPage }, + }); + } + + function handleSortChange(sorting: EuiDataGridSorting['columns'][0]) { + inventoryRoute.push('/', { + path: {}, + query: { + ...query, + sortField: sorting.id, + sortDirection: sorting.direction, + }, + }); + } + return ( -
- -
+ ); } diff --git a/x-pack/plugins/observability_solution/inventory/public/plugin.tsx b/x-pack/plugins/observability_solution/inventory/public/plugin.tsx index 355309939ea6c..0cb7df9552c74 100644 --- a/x-pack/plugins/observability_solution/inventory/public/plugin.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/plugin.tsx @@ -7,6 +7,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { i18n } from '@kbn/i18n'; +import { from, map } from 'rxjs'; import { AppMountParameters, APP_WRAPPER_CLASS, @@ -49,6 +50,31 @@ export class InventoryPlugin ): InventoryPublicSetup { const inventoryAPIClient = createCallInventoryAPI(coreSetup); + pluginsSetup.observabilityShared.navigation.registerSections( + from(coreSetup.getStartServices()).pipe( + map(([coreStart, pluginsStart]) => { + return [ + { + label: '', + sortKey: 101, + entries: [ + { + label: i18n.translate('xpack.inventory.inventoryLinkTitle', { + defaultMessage: 'Inventory', + }), + app: INVENTORY_APP_ID, + path: '/', + matchPath(currentPath: string) { + return ['/', ''].some((testPath) => currentPath.startsWith(testPath)); + }, + }, + ], + }, + ]; + }) + ) + ); + coreSetup.application.register({ id: INVENTORY_APP_ID, title: i18n.translate('xpack.inventory.appTitle', { diff --git a/x-pack/plugins/observability_solution/inventory/public/routes/config.tsx b/x-pack/plugins/observability_solution/inventory/public/routes/config.tsx index 74eeaac220bc2..f0141a938e0bc 100644 --- a/x-pack/plugins/observability_solution/inventory/public/routes/config.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/routes/config.tsx @@ -7,8 +7,10 @@ import * as t from 'io-ts'; import { createRouter, Outlet } from '@kbn/typed-react-router-config'; import React from 'react'; +import { toNumberRt } from '@kbn/io-ts-utils'; import { InventoryPageTemplate } from '../components/inventory_page_template'; import { InventoryPage } from '../pages/inventory_page'; +import { ENTITY_LAST_SEEN } from '../../common/es_fields/entities'; /** * The array of route definitions to be used when the application @@ -21,6 +23,20 @@ const inventoryRoutes = { ), + params: t.type({ + query: t.type({ + sortField: t.string, + sortDirection: t.union([t.literal('asc'), t.literal('desc')]), + pageIndex: toNumberRt, + }), + }), + defaults: { + query: { + sortField: ENTITY_LAST_SEEN, + sortDirection: 'desc', + pageIndex: '0', + }, + }, children: { '/{type}': { element: <>, diff --git a/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts b/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts index 4ddcaaf75c9a4..e286f0e2fac75 100644 --- a/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts +++ b/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts @@ -5,23 +5,63 @@ * 2.0. */ -import { LatestEntity } from '../../../common/entities'; -import { EntitiesESClient } from '../../lib/create_es_client/create_entities_es_client'; +import { ENTITY_LATEST, entitiesAliasPattern } from '@kbn/entities-schema'; +import { type ObservabilityElasticsearchClient } from '@kbn/observability-utils/es/client/create_observability_es_client'; +import { esqlResultToPlainObjects } from '@kbn/observability-utils/es/utils/esql_result_to_plain_objects'; +import { MAX_NUMBER_OF_ENTITIES, type EntityType } from '../../../common/entities'; +import { + ENTITY_DEFINITION_ID, + ENTITY_DISPLAY_NAME, + ENTITY_ID, + ENTITY_LAST_SEEN, + ENTITY_TYPE, +} from '../../../common/es_fields/entities'; -const MAX_NUMBER_OF_ENTITIES = 500; +const ENTITIES_LATEST_ALIAS = entitiesAliasPattern({ + type: '*', + dataset: ENTITY_LATEST, +}); + +const BUILTIN_SERVICES_FROM_ECS_DATA = 'builtin_services_from_ecs_data'; +const BUILTIN_HOSTS_FROM_ECS_DATA = 'builtin_hosts_from_ecs_data'; +const BUILTIN_CONTAINERS_FROM_ECS_DATA = 'builtin_containers_from_ecs_data'; + +export interface LatestEntity { + [ENTITY_LAST_SEEN]: string; + [ENTITY_TYPE]: string; + [ENTITY_DISPLAY_NAME]: string; + [ENTITY_ID]: string; +} + +const DEFAULT_ENTITY_TYPES = ['service', 'host', 'container']; export async function getLatestEntities({ - entitiesESClient, + inventoryEsClient, + sortDirection, + sortField, + entityTypes, }: { - entitiesESClient: EntitiesESClient; + inventoryEsClient: ObservabilityElasticsearchClient; + sortDirection: 'asc' | 'desc'; + sortField: string; + entityTypes?: EntityType[]; }) { - const response = ( - await entitiesESClient.searchLatest('get_latest_entities', { - body: { - size: MAX_NUMBER_OF_ENTITIES, - }, - }) - ).hits.hits.map((hit) => hit._source); + const entityTypesFilter = entityTypes?.length ? entityTypes : DEFAULT_ENTITY_TYPES; + const latestEntitiesEsqlResponse = await inventoryEsClient.esql('get_latest_entities', { + query: `FROM ${ENTITIES_LATEST_ALIAS} + | WHERE ${ENTITY_TYPE} IN (${entityTypesFilter.map((entityType) => `"${entityType}"`).join()}) + | WHERE ${ENTITY_DEFINITION_ID} IN (${[ + BUILTIN_SERVICES_FROM_ECS_DATA, + BUILTIN_HOSTS_FROM_ECS_DATA, + BUILTIN_CONTAINERS_FROM_ECS_DATA, + ] + .map((buildin) => `"${buildin}"`) + .join()}) + | SORT ${sortField} ${sortDirection} + | LIMIT ${MAX_NUMBER_OF_ENTITIES} + | KEEP ${ENTITY_LAST_SEEN}, ${ENTITY_TYPE}, ${ENTITY_DISPLAY_NAME}, ${ENTITY_ID} + `, + }); - return response; + return esqlResultToPlainObjects(latestEntitiesEsqlResponse); } diff --git a/x-pack/plugins/observability_solution/inventory/server/routes/entities/route.ts b/x-pack/plugins/observability_solution/inventory/server/routes/entities/route.ts index 093e5ff399ed1..e77dccb8b8cdb 100644 --- a/x-pack/plugins/observability_solution/inventory/server/routes/entities/route.ts +++ b/x-pack/plugins/observability_solution/inventory/server/routes/entities/route.ts @@ -4,23 +4,46 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { jsonRt } from '@kbn/io-ts-utils'; +import { createObservabilityEsClient } from '@kbn/observability-utils/es/client/create_observability_es_client'; +import * as t from 'io-ts'; +import { INVENTORY_APP_ID } from '@kbn/deeplinks-observability/constants'; +import { entityTypeRt } from '../../../common/entities'; import { createInventoryServerRoute } from '../create_inventory_server_route'; -import { createEntitiesESClient } from '../../lib/create_es_client/create_entities_es_client'; import { getLatestEntities } from './get_latest_entities'; export const listLatestEntitiesRoute = createInventoryServerRoute({ endpoint: 'GET /internal/inventory/entities', + params: t.type({ + query: t.intersection([ + t.type({ + sortField: t.string, + sortDirection: t.union([t.literal('asc'), t.literal('desc')]), + }), + t.partial({ + entityTypes: jsonRt.pipe(t.array(entityTypeRt)), + }), + ]), + }), options: { tags: ['access:inventory'], }, - handler: async ({ plugins, request, context }) => { + handler: async ({ params, context, logger }) => { const coreContext = await context.core; - const entitiesESClient = createEntitiesESClient({ - esClient: coreContext.elasticsearch.client.asCurrentUser, - request, + const inventoryEsClient = createObservabilityEsClient({ + client: coreContext.elasticsearch.client.asCurrentUser, + logger, + plugin: `@kbn/${INVENTORY_APP_ID}-plugin`, }); - const latestEntities = await getLatestEntities({ entitiesESClient }); + const { sortDirection, sortField, entityTypes } = params.query; + + const latestEntities = await getLatestEntities({ + inventoryEsClient, + sortDirection, + sortField, + entityTypes, + }); return { entities: latestEntities }; }, diff --git a/x-pack/plugins/observability_solution/inventory/server/utils/with_apm_span.ts b/x-pack/plugins/observability_solution/inventory/server/utils/with_apm_span.ts deleted file mode 100644 index b9e79df6cb0d7..0000000000000 --- a/x-pack/plugins/observability_solution/inventory/server/utils/with_apm_span.ts +++ /dev/null @@ -1,7 +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. - */ -// export { withApmSpan } from '@kbn/apm-data-access-plugin/server/utils'; diff --git a/x-pack/plugins/observability_solution/inventory/tsconfig.json b/x-pack/plugins/observability_solution/inventory/tsconfig.json index c0fc7c2692fde..e5e530ce1233f 100644 --- a/x-pack/plugins/observability_solution/inventory/tsconfig.json +++ b/x-pack/plugins/observability_solution/inventory/tsconfig.json @@ -35,6 +35,8 @@ "@kbn/server-route-repository-client", "@kbn/react-kibana-context-render", "@kbn/es-types", - "@kbn/entities-schema" + "@kbn/entities-schema", + "@kbn/i18n-react", + "@kbn/io-ts-utils" ] } diff --git a/x-pack/plugins/observability_solution/investigate_app/public/hooks/query_key_factory.ts b/x-pack/plugins/observability_solution/investigate_app/public/hooks/query_key_factory.ts index 85a8c35b63a5e..44352e46997ea 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/hooks/query_key_factory.ts +++ b/x-pack/plugins/observability_solution/investigate_app/public/hooks/query_key_factory.ts @@ -9,6 +9,8 @@ export const investigationKeys = { all: ['investigations'] as const, + userProfiles: (profileIds: Set) => + [...investigationKeys.all, 'userProfiles', ...profileIds] as const, tags: () => [...investigationKeys.all, 'tags'] as const, stats: () => [...investigationKeys.all, 'stats'] as const, lists: () => [...investigationKeys.all, 'list'] as const, diff --git a/x-pack/plugins/observability_solution/investigate_app/public/hooks/use_fetch_user_profiles.tsx b/x-pack/plugins/observability_solution/investigate_app/public/hooks/use_fetch_user_profiles.tsx new file mode 100644 index 0000000000000..80a5017fe479d --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate_app/public/hooks/use_fetch_user_profiles.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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'; +import { UserProfile } from '@kbn/security-plugin/common'; +import { useQuery } from '@tanstack/react-query'; +import { Dictionary, keyBy } from 'lodash'; +import { investigationKeys } from './query_key_factory'; +import { useKibana } from './use_kibana'; + +export interface Params { + profileIds: Set; +} + +export interface Response { + isInitialLoading: boolean; + isLoading: boolean; + isRefetching: boolean; + isSuccess: boolean; + isError: boolean; + data: Dictionary | undefined; +} + +export function useFetchUserProfiles({ profileIds }: Params) { + const { + core: { + notifications: { toasts }, + userProfile, + }, + } = useKibana(); + + const { isInitialLoading, isLoading, isError, isSuccess, isRefetching, data } = useQuery({ + queryKey: investigationKeys.userProfiles(profileIds), + queryFn: async () => { + const userProfiles = await userProfile.bulkGet({ uids: profileIds }); + return keyBy(userProfiles, 'uid'); + }, + enabled: profileIds.size > 0, + retry: false, + cacheTime: Infinity, + staleTime: Infinity, + onError: (error: Error) => { + toasts.addError(error, { + title: i18n.translate('xpack.investigateApp.useFetchUserProfiles.errorTitle', { + defaultMessage: 'Something went wrong while fetching user profiles', + }), + }); + }, + }); + + return { + data, + isInitialLoading, + isLoading, + isRefetching, + isSuccess, + isError, + }; +} diff --git a/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/investigation_notes.tsx b/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/investigation_notes.tsx index 9e1741c1afd12..ec63b09358159 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/investigation_notes.tsx +++ b/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/investigation_notes.tsx @@ -18,6 +18,7 @@ import { i18n } from '@kbn/i18n'; import { InvestigationNoteResponse } from '@kbn/investigation-shared'; import { AuthenticatedUser } from '@kbn/security-plugin/common'; import React, { useState } from 'react'; +import { useFetchUserProfiles } from '../../../../hooks/use_fetch_user_profiles'; import { useTheme } from '../../../../hooks/use_theme'; import { useInvestigation } from '../../contexts/investigation_context'; import { Note } from './note'; @@ -30,8 +31,11 @@ export interface Props { export function InvestigationNotes({ user }: Props) { const theme = useTheme(); const { investigation, addNote, isAddingNote } = useInvestigation(); - const [noteInput, setNoteInput] = useState(''); + const { data: userProfiles, isLoading: isLoadingUserProfiles } = useFetchUserProfiles({ + profileIds: new Set(investigation?.notes.map((note) => note.createdBy)), + }); + const [noteInput, setNoteInput] = useState(''); const onAddNote = async (content: string) => { await addNote(content); setNoteInput(''); @@ -59,7 +63,9 @@ export function InvestigationNotes({ user }: Props) { ); })} diff --git a/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/note.tsx b/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/note.tsx index 4db3237b9a90a..8bd0f14c9d892 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/note.tsx +++ b/x-pack/plugins/observability_solution/investigate_app/public/pages/details/components/investigation_notes/note.tsx @@ -5,15 +5,16 @@ * 2.0. */ import { - EuiAvatar, EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, + EuiLoadingSpinner, EuiMarkdownFormat, EuiText, } from '@elastic/eui'; import { css } from '@emotion/css'; import { InvestigationNoteResponse } from '@kbn/investigation-shared'; +import { UserProfile } from '@kbn/security-plugin/common'; // eslint-disable-next-line import/no-extraneous-dependencies import { formatDistance } from 'date-fns'; import React, { useState } from 'react'; @@ -27,14 +28,16 @@ const textContainerClassName = css` interface Props { note: InvestigationNoteResponse; - disabled: boolean; + isOwner: boolean; + userProfile?: UserProfile; + userProfileLoading: boolean; } -export function Note({ note, disabled }: Props) { +export function Note({ note, isOwner, userProfile, userProfileLoading }: Props) { + const theme = useTheme(); const [isEditing, setIsEditing] = useState(false); const { deleteNote, isDeletingNote } = useInvestigation(); - const theme = useTheme(); const timelineContainerClassName = css` padding-bottom: 16px; border-bottom: 1px solid ${theme.colors.lightShade}; @@ -43,51 +46,65 @@ export function Note({ note, disabled }: Props) { } `; + const actionButtonClassname = css` + color: ${theme.colors.mediumShade}; + :hover { + color: ${theme.colors.darkShade}; + } + `; + + const timestampClassName = css` + color: ${theme.colors.darkShade}; + `; + return ( - - + + - + {userProfileLoading ? ( + + ) : ( + + {userProfile?.user.full_name ?? userProfile?.user.username ?? note?.createdBy} + + )} - + {formatDistance(new Date(note.createdAt), new Date(), { addSuffix: true })} - - - { - setIsEditing(!isEditing); - }} - /> - - - await deleteNote(note.id)} - data-test-subj="deleteInvestigationNoteButton" - /> - - + {isOwner && ( + + + { + setIsEditing(!isEditing); + }} + className={actionButtonClassname} + /> + + + await deleteNote(note.id)} + data-test-subj="deleteInvestigationNoteButton" + className={actionButtonClassname} + /> + + + )} {isEditing ? ( diff --git a/x-pack/plugins/observability_solution/investigate_app/public/pages/list/components/investigation_list.tsx b/x-pack/plugins/observability_solution/investigate_app/public/pages/list/components/investigation_list.tsx index d75710f817703..a65eb12001342 100644 --- a/x-pack/plugins/observability_solution/investigate_app/public/pages/list/components/investigation_list.tsx +++ b/x-pack/plugins/observability_solution/investigate_app/public/pages/list/components/investigation_list.tsx @@ -6,6 +6,7 @@ */ import { Criteria, + EuiAvatar, EuiBadge, EuiBasicTable, EuiBasicTableColumn, @@ -22,6 +23,7 @@ import React, { useState } from 'react'; import { paths } from '../../../../common/paths'; import { InvestigationStatusBadge } from '../../../components/investigation_status_badge/investigation_status_badge'; import { useFetchInvestigationList } from '../../../hooks/use_fetch_investigation_list'; +import { useFetchUserProfiles } from '../../../hooks/use_fetch_user_profiles'; import { useKibana } from '../../../hooks/use_kibana'; import { InvestigationListActions } from './investigation_list_actions'; import { InvestigationStats } from './investigation_stats'; @@ -51,6 +53,10 @@ export function InvestigationList() { filter: toFilter(status, tags), }); + const { data: userProfiles, isLoading: isUserProfilesLoading } = useFetchUserProfiles({ + profileIds: new Set(data?.results.map((i) => i.createdBy)), + }); + const investigations = data?.results ?? []; const totalItemCount = data?.total ?? 0; @@ -77,6 +83,27 @@ export function InvestigationList() { defaultMessage: 'Created by', }), truncateText: true, + render: (value: InvestigationResponse['createdBy']) => { + return isUserProfilesLoading ? ( + + ) : ( + + + + {userProfiles?.[value]?.user.full_name ?? + userProfiles?.[value]?.user.username ?? + value} + + + ); + }, }, { field: 'tags', diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation.ts index eb8277d7d6f83..6a7355c0ef875 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation.ts @@ -23,7 +23,7 @@ export async function createInvestigation( ...params, updatedAt: now, createdAt: now, - createdBy: user.username, + createdBy: user.profile_uid!, status: 'triage', notes: [], items: [], diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_item.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_item.ts index cf77887aab0a3..548912b576618 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_item.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_item.ts @@ -23,7 +23,7 @@ export async function createInvestigationItem( const now = Date.now(); const investigationItem = { id: v4(), - createdBy: user.username, + createdBy: user.profile_uid!, createdAt: now, updatedAt: now, ...params, diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_note.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_note.ts index 2f74123b6f269..f2fe766cdf52d 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_note.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/create_investigation_note.ts @@ -24,7 +24,7 @@ export async function createInvestigationNote( const investigationNote = { id: v4(), content: params.content, - createdBy: user.username, + createdBy: user.profile_uid!, updatedAt: now, createdAt: now, }; diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_item.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_item.ts index d40938804badc..a9856cc0eaa99 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_item.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_item.ts @@ -19,7 +19,7 @@ export async function deleteInvestigationItem( throw new Error('Note not found'); } - if (item.createdBy !== user.username) { + if (item.createdBy !== user.profile_uid) { throw new Error('User does not have permission to delete note'); } diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_note.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_note.ts index b0a9e7adf8492..fabbd6f0cdb9c 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_note.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/delete_investigation_note.ts @@ -19,7 +19,7 @@ export async function deleteInvestigationNote( throw new Error('Note not found'); } - if (note.createdBy !== user.username) { + if (note.createdBy !== user.profile_uid) { throw new Error('User does not have permission to delete note'); } diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_item.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_item.ts index 7e7f03bc7f12c..f95950560ca08 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_item.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_item.ts @@ -25,7 +25,7 @@ export async function updateInvestigationItem( throw new Error('Cannot change item type'); } - if (item.createdBy !== user.username) { + if (item.createdBy !== user.profile_uid) { throw new Error('User does not have permission to update item'); } diff --git a/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_note.ts b/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_note.ts index fc4c5a2c0b1fc..9113be5fedf4d 100644 --- a/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_note.ts +++ b/x-pack/plugins/observability_solution/investigate_app/server/services/update_investigation_note.ts @@ -21,7 +21,7 @@ export async function updateInvestigationNote( throw new Error('Note not found'); } - if (note.createdBy !== user.username) { + if (note.createdBy !== user.profile_uid) { throw new Error('User does not have permission to update note'); } diff --git a/x-pack/plugins/observability_solution/observability/kibana.jsonc b/x-pack/plugins/observability_solution/observability/kibana.jsonc index 3697fa0ff628a..859e7340a799d 100644 --- a/x-pack/plugins/observability_solution/observability/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability/kibana.jsonc @@ -6,10 +6,7 @@ "id": "observability", "server": true, "browser": true, - "configPath": [ - "xpack", - "observability" - ], + "configPath": ["xpack", "observability"], "requiredPlugins": [ "aiops", "alerting", @@ -52,8 +49,7 @@ "serverless", "guidedOnboarding", "observabilityAIAssistant", - "investigate", - "inventory" + "investigate" ], "requiredBundles": [ "data", @@ -61,10 +57,8 @@ "kibanaUtils", "unifiedSearch", "stackAlerts", - "spaces", + "spaces" ], - "extraPublicDirs": [ - "common" - ] + "extraPublicDirs": ["common"] } } diff --git a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts index 67062d2230235..6d63c9c89eaf1 100644 --- a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts +++ b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts @@ -49,22 +49,6 @@ export function createNavTree(pluginsStart: ObservabilityPublicPluginsStart) { return pathNameSerialized.startsWith(prepend('/app/dashboards')); }, }, - ...(pluginsStart.inventory - ? [ - { - link: 'inventory' as const, - getIsActive: ({ - pathNameSerialized, - prepend, - }: { - pathNameSerialized: string; - prepend: (path: string) => string; - }) => { - return pathNameSerialized.startsWith(prepend('/app/observability/inventory')); - }, - }, - ] - : []), { link: 'observability-overview:alerts', }, @@ -83,6 +67,9 @@ export function createNavTree(pluginsStart: ObservabilityPublicPluginsStart) { { link: 'slo', }, + { + link: 'inventory', + }, { id: 'aiMl', title: i18n.translate('xpack.observability.obltNav.ml.aiAndMlGroupTitle', { diff --git a/x-pack/plugins/observability_solution/observability/public/plugin.ts b/x-pack/plugins/observability_solution/observability/public/plugin.ts index a22638213adbf..a4b0d8e57ce4b 100644 --- a/x-pack/plugins/observability_solution/observability/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability/public/plugin.ts @@ -48,11 +48,9 @@ import { BehaviorSubject, from, map, mergeMap } from 'rxjs'; import type { AiopsPluginStart } from '@kbn/aiops-plugin/public/types'; import type { DataViewFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; -import { INVENTORY_APP_ID } from '@kbn/deeplinks-observability/constants'; import type { EmbeddableSetup } from '@kbn/embeddable-plugin/public'; import type { ExploratoryViewPublicStart } from '@kbn/exploratory-view-plugin/public'; import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; -import type { InventoryPublicSetup, InventoryPublicStart } from '@kbn/inventory-plugin/public'; import type { InvestigatePublicStart } from '@kbn/investigate-plugin/public'; import type { LicenseManagementUIPluginSetup } from '@kbn/license-management-plugin/public'; import type { LicensingPluginStart } from '@kbn/licensing-plugin/public'; @@ -126,7 +124,6 @@ export interface ObservabilityPublicPluginsSetup { licensing: LicensingPluginSetup; serverless?: ServerlessPluginSetup; presentationUtil?: PresentationUtilPluginStart; - inventory?: InventoryPublicSetup; } export interface ObservabilityPublicPluginsStart { actionTypeRegistry: ActionTypeRegistryContract; @@ -165,7 +162,6 @@ export interface ObservabilityPublicPluginsStart { dataViewFieldEditor: DataViewFieldEditorStart; toastNotifications: ToastsStart; investigate?: InvestigatePublicStart; - inventory?: InventoryPublicStart; } export type ObservabilityPublicStart = ReturnType; @@ -361,18 +357,6 @@ export class Plugin ] : []; - const inventoryLink = pluginsSetup.inventory - ? [ - { - label: i18n.translate('xpack.observability.inventoryLinkTitle', { - defaultMessage: 'Inventory', - }), - app: INVENTORY_APP_ID, - path: '', - }, - ] - : []; - const isAiAssistantEnabled = pluginsStart.observabilityAIAssistant?.service.isEnabled(); @@ -436,7 +420,6 @@ export class Plugin sortKey: 100, entries: [ ...overviewLink, - ...inventoryLink, ...alertsLink, ...sloLink, ...casesLink, diff --git a/x-pack/plugins/observability_solution/observability/tsconfig.json b/x-pack/plugins/observability_solution/observability/tsconfig.json index 873a87c11d1a4..d7a33cb6492cb 100644 --- a/x-pack/plugins/observability_solution/observability/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability/tsconfig.json @@ -9,7 +9,7 @@ "public/**/*.json", "server/**/*", "typings/**/*", - "../../../../typings/**/*", + "../../../../typings/**/*" ], "kbn_references": [ "@kbn/rule-data-utils", @@ -94,7 +94,6 @@ "@kbn/home-plugin", "@kbn/data-view-field-editor-plugin", "@kbn/guided-onboarding-plugin", - "@kbn/inventory-plugin", "@kbn/investigate-plugin", "@kbn/license-management-plugin", "@kbn/presentation-util-plugin", @@ -114,9 +113,7 @@ "@kbn/io-ts-utils", "@kbn/core-ui-settings-server-mocks", "@kbn/es-types", - "@kbn/logging-mocks", + "@kbn/logging-mocks" ], - "exclude": [ - "target/**/*" - ] + "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_solution/observability_onboarding/README.md b/x-pack/plugins/observability_solution/observability_onboarding/README.md index 1284f71750e41..ad29a8a0c90a6 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/README.md +++ b/x-pack/plugins/observability_solution/observability_onboarding/README.md @@ -8,13 +8,4 @@ To run the stateful onboarding flows start Kibana as usual. ## Serverless onboarding -To run the experimental serverless onboarding flows add the following settings to `kibana.dev.yml`: - -```yml -xpack.cloud_integrations.experiments.enabled: true -xpack.cloud_integrations.experiments.flag_overrides: - "observability_onboarding.experimental_onboarding_flow_enabled": true - -``` - -Then start Kibana using `yarn serverless-oblt`. +To run the serverless onboarding flows start Kibana using `yarn serverless-oblt`. diff --git a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc index fd4e955b9bd95..859f9539bd9fa 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc @@ -16,7 +16,7 @@ "fleet", "customIntegrations" ], - "optionalPlugins": ["cloud", "cloudExperiments", "usageCollection"], + "optionalPlugins": ["cloud", "usageCollection"], "requiredBundles": ["kibanaReact"], "extraPublicDirs": ["common"] } diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts index 514a4fcc94049..97850fc5ff47b 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts @@ -21,7 +21,6 @@ import { Plugin, PluginInitializerContext, } from '@kbn/core/public'; -import type { CloudExperimentsPluginStart } from '@kbn/cloud-experiments-plugin/common'; import { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; import { DiscoverSetup, DiscoverStart } from '@kbn/discover-plugin/public'; @@ -62,7 +61,6 @@ export interface ObservabilityOnboardingPluginStartDeps { fleet: FleetStart; cloud?: CloudStart; usageCollection?: UsageCollectionStart; - cloudExperiments?: CloudExperimentsPluginStart; } export type ObservabilityOnboardingContextValue = CoreStart & diff --git a/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json b/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json index 12a908624cfd9..8730f85b5943f 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_onboarding/tsconfig.json @@ -34,7 +34,6 @@ "@kbn/deeplinks-observability", "@kbn/fleet-plugin", "@kbn/shared-ux-link-redirect-app", - "@kbn/cloud-experiments-plugin", "@kbn/home-sample-data-tab", "@kbn/react-kibana-context-render", "@kbn/react-kibana-context-theme", diff --git a/x-pack/plugins/observability_solution/synthetics/common/translations/translations.ts b/x-pack/plugins/observability_solution/synthetics/common/translations/translations.ts index cbfa5fff3995a..d28771cf213d1 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/translations/translations.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/translations/translations.ts @@ -7,18 +7,6 @@ import { i18n } from '@kbn/i18n'; -export const URL_LABEL = i18n.translate('xpack.synthetics.monitorList.table.url.name', { - defaultMessage: 'Url', -}); - -export const TAGS_LABEL = i18n.translate('xpack.synthetics.monitorList.table.tags.name', { - defaultMessage: 'Tags', -}); - -export const PROJECT_LABEL = i18n.translate('xpack.synthetics.monitorList.table.project.name', { - defaultMessage: 'Project ID', -}); - export const STATUS_UP_LABEL = i18n.translate('xpack.synthetics.monitorList.statusColumn.upLabel', { defaultMessage: 'Up', }); @@ -29,29 +17,3 @@ export const STATUS_DOWN_LABEL = i18n.translate( defaultMessage: 'Down', } ); - -export const STATUS_COMPLETE_LABEL = i18n.translate( - 'xpack.synthetics.monitorList.statusColumn.completeLabel', - { - defaultMessage: 'Complete', - } -); - -export const STATUS_FAILED_LABEL = i18n.translate( - 'xpack.synthetics.monitorList.statusColumn.failedLabel', - { - defaultMessage: 'Failed', - } -); - -export const SECONDS_LABEL = i18n.translate('xpack.synthetics.seconds.label', { - defaultMessage: 'seconds', -}); - -export const SEC_LABEL = i18n.translate('xpack.synthetics.seconds.shortForm.label', { - defaultMessage: 'sec', -}); - -export const MS_LABEL = i18n.translate('xpack.synthetics.millisecond.abbreviation.label', { - defaultMessage: 'ms', -}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx deleted file mode 100644 index f090f807a0fb8..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useEffect, useState } from 'react'; -import { EuiFlexItem } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { useFetcher } from '@kbn/observability-shared-plugin/public'; -import { SYNTHETICS_INDEX_PATTERN } from '../../../../../common/constants'; -import { ClientPluginsStart } from '../../../../plugin'; - -interface Props { - query: string; - onChange: (query: string) => void; -} -export const isValidKuery = (query: string) => { - if (query === '') { - return true; - } - const listOfOperators = [':', '>=', '=>', '>', '<']; - for (let i = 0; i < listOfOperators.length; i++) { - const operator = listOfOperators[i]; - const qParts = query.trim().split(operator); - if (query.includes(operator) && qParts.length > 1 && qParts[1]) { - return true; - } - } - return false; -}; - -export const AlertQueryBar = ({ query = '', onChange }: Props) => { - const { services } = useKibana(); - - const { - appName, - dataViews, - unifiedSearch: { - ui: { QueryStringInput }, - }, - } = services; - - const [inputVal, setInputVal] = useState(query); - - const { data: dataView } = useFetcher(async () => { - return await dataViews.create({ title: SYNTHETICS_INDEX_PATTERN }); - }, [dataViews]); - - useEffect(() => { - onChange(query); - setInputVal(query); - }, [onChange, query]); - - return ( - - { - setInputVal(queryN?.query as string); - if (isValidKuery(queryN?.query as string)) { - // we want to submit when user clears or paste a complete kuery - onChange(queryN.query as string); - } - }} - onSubmit={(queryN) => { - if (queryN) onChange(queryN.query as string); - }} - query={{ query: inputVal, language: 'kuery' }} - dataTestSubj="xpack.synthetics.alerts.monitorStatus.filterBar" - autoSubmit={true} - disableLanguageSwitcher={true} - isInvalid={!!(inputVal && !query)} - placeholder={i18n.translate('xpack.synthetics.alerts.searchPlaceholder.kql', { - defaultMessage: 'Filter using kql syntax', - })} - appName={appName} - /> - - ); -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/certificates/index.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/certificates/index.ts index 7cfbdca179d04..29d4478877fc3 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/certificates/index.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/certificates/index.ts @@ -5,8 +5,11 @@ * 2.0. */ +export * from './cert_refresh_btn'; export * from './cert_monitors'; export * from './cert_search'; export * from './cert_status'; +export * from './certificates'; export * from './certificates_list'; +export * from './certificate_title'; export * from './fingerprint_col'; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx deleted file mode 100644 index e41b2be1a7c11..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/view_errors.tsx +++ /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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { useSyntheticsSettingsContext } from '../../../contexts'; - -export const ErrorsLink = ({ disabled }: { disabled?: boolean }) => { - const { basePath } = useSyntheticsSettingsContext(); - - return ( - - - - ); -}; - -const VIEW_ERRORS = i18n.translate('xpack.synthetics.monitorSummary.viewErrors', { - defaultMessage: 'View errors', -}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx index 1233bb0390c7e..4809491305cd7 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/getting_started/simple_monitor_form.tsx @@ -119,13 +119,6 @@ export const WEBSITE_URL_LABEL = i18n.translate( } ); -export const WEBSITE_URL_PLACEHOLDER = i18n.translate( - 'xpack.synthetics.monitorManagement.websiteUrlPlaceholder', - { - defaultMessage: 'Enter a website URL', - } -); - export const WEBSITE_URL_HELP_TEXT = i18n.translate( 'xpack.synthetics.monitorManagement.websiteUrlHelpText', { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/tags.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/tags.tsx deleted file mode 100644 index b50d97fcecefa..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/tags.tsx +++ /dev/null @@ -1,47 +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 { EuiBadge, EuiBadgeGroup } from '@elastic/eui'; -import { EXPAND_TAGS_LABEL } from './labels'; - -interface Props { - tags: string[]; -} - -export const MonitorTags = ({ tags }: Props) => { - const [toDisplay, setToDisplay] = useState(5); - - const tagsToDisplay = tags.slice(0, toDisplay); - - return ( - - {tagsToDisplay.map((tag) => ( - // filtering only makes sense in monitor list, where we have summary - - {tag} - - ))} - {tags.length > toDisplay && ( - { - setToDisplay(tags.length); - }} - onClickAriaLabel={EXPAND_TAGS_LABEL} - > - +{tags.length - 5} - - )} - - ); -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/empty_state/empty_state_error.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/empty_state/empty_state_error.tsx deleted file mode 100644 index 3f3a3552446f2..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/empty_state/empty_state_error.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 React, { Fragment } from 'react'; -import { EuiEmptyPrompt, EuiPanel, EuiTitle, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { IHttpSerializedFetchError } from '../../../../state'; - -interface EmptyStateErrorProps { - errors: IHttpSerializedFetchError[]; -} - -export const EmptyStateError = ({ errors }: EmptyStateErrorProps) => { - const unauthorized = errors.find( - (error) => error?.body?.message && error.body.message.includes('unauthorized') - ); - - return ( - - - - - {unauthorized ? ( -

- {i18n.translate('xpack.synthetics.emptyStateError.notAuthorized', { - defaultMessage: - 'You are not authorized to view Uptime data, please contact your system administrator.', - })} -

- ) : ( -

- {i18n.translate('xpack.synthetics.emptyStateError.title', { - defaultMessage: 'Error', - })} -

- )} - - } - body={ - - {!unauthorized && - errors.map((error) =>

{error.body?.message}

)} -
- } - /> -
-
-
- ); -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/use_infinite_scroll.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/use_infinite_scroll.ts deleted file mode 100644 index e3e1f48d4e520..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/use_infinite_scroll.ts +++ /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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import useThrottle from 'react-use/lib/useThrottle'; -import { useEffect, useState, MutableRefObject } from 'react'; -import useIntersection from 'react-use/lib/useIntersection'; -import { useSelector } from 'react-redux'; -import type { MonitorListSortField } from '../../../../../../../common/runtime_types/monitor_management/sort_field'; -import { useGetUrlParams } from '../../../../hooks'; -import { selectOverviewState } from '../../../../state'; -import { MonitorOverviewItem } from '../../../../../../../common/runtime_types'; - -export const useInfiniteScroll = ({ - intersectionRef, - monitorsSortedByStatus, -}: { - intersectionRef: MutableRefObject; - monitorsSortedByStatus: any; -}) => { - const [page, setPage] = useState(1); - const [loadNextPage, setLoadNextPage] = useState(false); - - const { statusFilter } = useGetUrlParams(); - const { - pageState: { perPage, sortField }, - data: { monitors }, - } = useSelector(selectOverviewState); - - const currentMonitors = getCurrentMonitors({ - monitors, - monitorsSortedByStatus, - perPage, - page, - sortField, - statusFilter, - }); - - const intersection = useIntersection(intersectionRef, { - root: null, - rootMargin: '640px', // Height of 4 rows of monitors, minus the gutters - threshold: 0.1, - }); - const hasIntersected = intersection && intersection.intersectionRatio > 0; - - useThrottle(() => { - if ( - hasIntersected && - currentMonitors.length === page * perPage && - currentMonitors.length !== monitors.length - ) { - setLoadNextPage(true); - } else { - setLoadNextPage(false); - } - }, 1000); - - useEffect(() => { - if (loadNextPage) { - setPage((p) => p + 1); - setLoadNextPage(false); - } - }, [loadNextPage]); - - return { currentMonitors }; -}; - -const getCurrentMonitors = ({ - sortField, - perPage, - page, - monitors, - monitorsSortedByStatus, - statusFilter, -}: { - sortField: MonitorListSortField; - perPage: number; - page: number; - monitors: MonitorOverviewItem[]; - monitorsSortedByStatus: MonitorOverviewItem[]; - statusFilter?: string; -}) => { - if (sortField === 'status' || statusFilter) { - return monitorsSortedByStatus.slice(0, perPage * page); - } else { - return monitors.slice(0, perPage * page); - } -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/not_found/not_found.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/not_found/not_found.tsx deleted file mode 100644 index 2efdb43ed0b15..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/not_found/not_found.tsx +++ /dev/null @@ -1,39 +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 { EuiEmptyPrompt } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -const NOT_FOUND_TITLE = i18n.translate('xpack.synthetics.notFoundTitle', { - defaultMessage: 'Page not found', -}); - -const NOT_FOUND_BODY = i18n.translate('xpack.synthetics.notFoundBody', { - defaultMessage: - "Sorry, we can't find the page you're looking for. It might have been removed or renamed, or maybe it never existed.", -}); - -/** - * Renders a "Page not found" error. - * - * @deprecated This component must be moved to Kibana/Shared UX. It was created - * as a temporary solution to move #144366 forward but it should not be used. - */ -export function NotFound(): JSX.Element { - return ( - {NOT_FOUND_TITLE}} - body={

{NOT_FOUND_BODY}

} - /> - ); -} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.test.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.test.ts index 2f4136d425963..7313d21dd3ffb 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.test.ts @@ -12,8 +12,14 @@ import { getSeriesAndDomain, getSidebarItems, } from './data_formatting'; -import { MimeType, FriendlyFlyoutLabels, FriendlyTimingLabels, Timings, Metadata } from './types'; -import { WaterfallDataEntry } from './types'; +import { + MimeType, + FriendlyFlyoutLabels, + FriendlyTimingLabels, + Timings, + Metadata, + WaterfallTooltipItem, +} from './types'; import type { DateFormatter } from '../../../../../../hooks/use_date_format'; import { mockMoment } from '../../../../utils/formatting/test_helpers'; import { NetworkEvent } from '../../../../../../../common/runtime_types'; @@ -247,11 +253,6 @@ describe('getSeriesAndDomain', () => { "colour": "#b0c9e0", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#b0c9e0", - "value": "Queued / Blocked: 0.9ms", - }, }, "x": 0, "y": 0.8540000017092098, @@ -262,11 +263,6 @@ describe('getSeriesAndDomain', () => { "colour": "#aad9cc", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#aad9cc", - "value": "DNS: 4ms", - }, }, "x": 0, "y": 4.413999999087537, @@ -277,11 +273,6 @@ describe('getSeriesAndDomain', () => { "colour": "#c8b8dc", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#c8b8dc", - "value": "Connecting: 26ms", - }, }, "x": 0, "y": 30.135000000882428, @@ -292,11 +283,6 @@ describe('getSeriesAndDomain', () => { "colour": "#e5c7d7", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#e5c7d7", - "value": "TLS: 55ms", - }, }, "x": 0, "y": 85.52200000121957, @@ -307,11 +293,6 @@ describe('getSeriesAndDomain', () => { "colour": "#f3b3a6", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#f3b3a6", - "value": "Sending request: 0.4ms", - }, }, "x": 0, "y": 85.88200000303914, @@ -322,11 +303,6 @@ describe('getSeriesAndDomain', () => { "colour": "#e7664c", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#e7664c", - "value": "Waiting (TTFB): 35ms", - }, }, "x": 0, "y": 120.4600000019127, @@ -337,11 +313,6 @@ describe('getSeriesAndDomain', () => { "colour": "#9170b8", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#9170b8", - "value": "Content downloading (CSS): 0.6ms", - }, }, "x": 0, "y": 121.01200000324752, @@ -352,11 +323,6 @@ describe('getSeriesAndDomain', () => { "colour": "#b0c9e0", "id": 1, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#b0c9e0", - "value": "Queued / Blocked: 85ms", - }, }, "x": 1, "y": 84.90799999795854, @@ -367,11 +333,6 @@ describe('getSeriesAndDomain', () => { "colour": "#f3b3a6", "id": 1, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#f3b3a6", - "value": "Sending request: 0.2ms", - }, }, "x": 1, "y": 85.14699999883305, @@ -382,11 +343,6 @@ describe('getSeriesAndDomain', () => { "colour": "#e7664c", "id": 1, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#e7664c", - "value": "Waiting (TTFB): 53ms", - }, }, "x": 1, "y": 137.70799999925657, @@ -397,11 +353,6 @@ describe('getSeriesAndDomain', () => { "colour": "#da8b45", "id": 1, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#da8b45", - "value": "Content downloading (JS): 3ms", - }, }, "x": 1, "y": 140.7760000010603, @@ -420,11 +371,6 @@ describe('getSeriesAndDomain', () => { "colour": "#b0c9e0", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#b0c9e0", - "value": "Queued / Blocked: 0.9ms", - }, }, "x": 0, "y": 0.8540000017092098, @@ -435,11 +381,6 @@ describe('getSeriesAndDomain', () => { "colour": "#aad9cc", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#aad9cc", - "value": "DNS: 4ms", - }, }, "x": 0, "y": 4.413999999087537, @@ -450,11 +391,6 @@ describe('getSeriesAndDomain', () => { "colour": "#c8b8dc", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#c8b8dc", - "value": "Connecting: 26ms", - }, }, "x": 0, "y": 30.135000000882428, @@ -465,11 +401,6 @@ describe('getSeriesAndDomain', () => { "colour": "#e5c7d7", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#e5c7d7", - "value": "TLS: 55ms", - }, }, "x": 0, "y": 85.52200000121957, @@ -480,11 +411,6 @@ describe('getSeriesAndDomain', () => { "colour": "#f3b3a6", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#f3b3a6", - "value": "Sending request: 0.4ms", - }, }, "x": 0, "y": 85.88200000303914, @@ -495,11 +421,6 @@ describe('getSeriesAndDomain', () => { "colour": "#e7664c", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#e7664c", - "value": "Waiting (TTFB): 35ms", - }, }, "x": 0, "y": 120.4600000019127, @@ -510,11 +431,6 @@ describe('getSeriesAndDomain', () => { "colour": "#9170b8", "id": 0, "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#9170b8", - "value": "Content downloading (CSS): 0.6ms", - }, }, "x": 0, "y": 121.01200000324752, @@ -524,11 +440,6 @@ describe('getSeriesAndDomain', () => { "config": Object { "colour": "#da8b45", "isHighlighted": true, - "showTooltip": true, - "tooltipProps": Object { - "colour": "#da8b45", - "value": "Content downloading (JS): 3ms", - }, }, "x": 1, "y": 3.714999998046551, @@ -546,8 +457,6 @@ describe('getSeriesAndDomain', () => { "config": Object { "colour": "", "isHighlighted": true, - "showTooltip": false, - "tooltipProps": undefined, }, "x": 0, "y": 0, @@ -614,8 +523,10 @@ describe('getSeriesAndDomain', () => { "value": undefined, }, ], + "networkItemTooltipProps": Array [], "requestHeaders": undefined, "responseHeaders": undefined, + "showTooltip": false, "url": "file:///Users/dominiqueclarke/dev/synthetics/examples/todos/app/app.js", "x": 0, }, @@ -625,8 +536,6 @@ describe('getSeriesAndDomain', () => { "config": Object { "colour": "", "isHighlighted": true, - "showTooltip": false, - "tooltipProps": undefined, }, "x": 0, "y": 0, @@ -660,23 +569,21 @@ describe('getSeriesAndDomain', () => { }); it('handles formatting when mime type is not mapped to a specific mime type bucket', () => { - const { series } = getSeriesAndDomain( + const { metadata } = getSeriesAndDomain( networkItemsWithUnknownMimeType, false, mockDateFormatter ); /* verify that raw mime type appears in the tooltip config and that * the colour is mapped to mime type other */ - const contentDownloadingConfigItem = series.find((item: WaterfallDataEntry) => { - const { tooltipProps } = item.config; - if (tooltipProps && typeof tooltipProps.value === 'string') { + const contentDownloadingConfigItem = metadata[0].networkItemTooltipProps.find( + (item: WaterfallTooltipItem) => { return ( - tooltipProps.value.includes('application/x-unknown') && - tooltipProps.colour === colourPalette[MimeType.Other] + item.value.includes('application/x-unknown') && + item.colour === colourPalette[MimeType.Other] ); } - return false; - }); + ); expect(contentDownloadingConfigItem).toBeDefined(); }); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.ts index 8ad55e56ee40a..31fac41865d6a 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/data_formatting.ts @@ -20,7 +20,8 @@ import { Metadata, MimeType, MimeTypesMap, - SidebarItem, + WaterfallNetworkItem, + WaterfallTooltipItem, TIMING_ORDER, Timings, } from './types'; @@ -167,10 +168,11 @@ export const getSeriesAndDomain = ( const queryMatcher = getQueryMatcher(query); const filterMatcher = getFilterMatcher(activeFilters); items.forEach((item, index) => { + let showTooltip = true; const mimeTypeColour = getColourForMimeType(item.mimeType); const offsetValue = getValueForOffset(item); let currentOffset = offsetValue - zeroOffset; - metadata.push(formatMetadata({ item, index, requestStart: currentOffset, dateFormatter })); + const requestStart = currentOffset; const isHighlighted = isHighlightedItem(item, queryMatcher, filterMatcher); if (isHighlighted) { totalHighlightedRequests++; @@ -190,14 +192,26 @@ export const getSeriesAndDomain = ( } let timingValueFound = false; + const networkItemTooltipProps = []; TIMING_ORDER.forEach((timing) => { const value = getValue(item.timings, timing); - if (value && value >= 0) { + const colour = timing === Timings.Receive ? mimeTypeColour : colourPalette[timing]; + + if (value !== null && value !== undefined && value >= 0) { timingValueFound = true; - const colour = timing === Timings.Receive ? mimeTypeColour : colourPalette[timing]; const y = currentOffset + value; + const tooltipProps = { + value: getFriendlyTooltipValue({ + value: y - currentOffset, + timing, + mimeType: item.mimeType, + }), + colour, + }; + networkItemTooltipProps.push(tooltipProps); + series.push({ x: index, y0: currentOffset, @@ -206,15 +220,6 @@ export const getSeriesAndDomain = ( id: index, colour, isHighlighted, - showTooltip: true, - tooltipProps: { - value: getFriendlyTooltipValue({ - value: y - currentOffset, - timing, - mimeType: item.mimeType, - }), - colour, - }, }, }); currentOffset = y; @@ -225,8 +230,19 @@ export const getSeriesAndDomain = ( * if total time is not available use 0, set showTooltip to false, * and omit tooltip props */ if (!timingValueFound) { + showTooltip = false; const total = item.timings.total; const hasTotal = total !== -1; + if (hasTotal) { + networkItemTooltipProps.push({ + value: getFriendlyTooltipValue({ + value: total, + timing: Timings.Receive, + mimeType: item.mimeType, + }), + colour: mimeTypeColour, + }); + } series.push({ x: index, y0: hasTotal ? currentOffset : 0, @@ -234,20 +250,20 @@ export const getSeriesAndDomain = ( config: { isHighlighted, colour: hasTotal ? mimeTypeColour : '', - showTooltip: hasTotal, - tooltipProps: hasTotal - ? { - value: getFriendlyTooltipValue({ - value: total, - timing: Timings.Receive, - mimeType: item.mimeType, - }), - colour: mimeTypeColour, - } - : undefined, }, }); } + + metadata.push( + formatMetadata({ + item, + index, + showTooltip, + requestStart, + dateFormatter, + networkItemTooltipProps, + }) + ); }); const yValues = series.map((serie) => serie.y); @@ -282,11 +298,15 @@ const formatMetadata = ({ index, requestStart, dateFormatter, + showTooltip, + networkItemTooltipProps, }: { item: NetworkEvent; index: number; requestStart: number; dateFormatter: DateFormatter; + showTooltip: boolean; + networkItemTooltipProps: WaterfallTooltipItem[]; }) => { const { certificates, @@ -304,6 +324,8 @@ const formatMetadata = ({ return { x: index, url, + networkItemTooltipProps, + showTooltip, requestHeaders: formatHeaders(requestHeaders), responseHeaders: formatHeaders(responseHeaders), certificates: certificates @@ -383,7 +405,7 @@ export const getSidebarItems = ( onlyHighlighted: boolean, query: string, activeFilters: string[] -): SidebarItem[] => { +): WaterfallNetworkItem[] => { const queryMatcher = getQueryMatcher(query); const filterMatcher = getFilterMatcher(activeFilters); const sideBarItems = items.map((item, index) => { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/types.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/types.ts index 78076be872dbb..4496009aaa796 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/types.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/common/network_data/types.ts @@ -256,7 +256,7 @@ export const MimeTypesMap: Record = { 'application/json': MimeType.XHR, }; -export type SidebarItem = Pick & { +export type WaterfallNetworkItem = Pick & { isHighlighted: boolean; index: number; offsetIndex: number; @@ -310,27 +310,29 @@ interface PlotProperties { y0: number; } -export interface WaterfallDataSeriesConfigProperties { - tooltipProps?: Record; - showTooltip: boolean; -} - export interface WaterfallMetadataItem { name: string; value?: string; } +export interface WaterfallTooltipItem { + colour: string; + value: string; +} + export interface WaterfallMetadataEntry { x: number; url: string; requestHeaders?: WaterfallMetadataItem[]; responseHeaders?: WaterfallMetadataItem[]; certificates?: WaterfallMetadataItem[]; + networkItemTooltipProps: WaterfallTooltipItem[]; + showTooltip: boolean; details: WaterfallMetadataItem[]; } export type WaterfallDataEntry = PlotProperties & { - config: WaterfallDataSeriesConfigProperties & Record; + config: Record; }; export type WaterfallMetadata = WaterfallMetadataEntry[]; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/screenshot_link.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/screenshot_link.tsx deleted file mode 100644 index 1ad619735e03d..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/screenshot_link.tsx +++ /dev/null @@ -1,47 +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 { FormattedMessage } from '@kbn/i18n-react'; -import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import { ReactRouterEuiLink } from '../../common/react_router_helpers'; -import { Ping } from '../../../../../../common/runtime_types'; - -const LabelLink = euiStyled.div` - margin-bottom: ${(props) => props.theme.eui.euiSizeXS}; - font-size: ${({ theme }) => theme.eui.euiFontSizeS}; -`; - -interface Props { - lastSuccessfulCheck: Ping; -} - -export const ScreenshotLink = ({ lastSuccessfulCheck }: Props) => { - return ( - - - - - - - ), - }} - /> - - ); -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/README.md b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/README.md index cf8d3b5345eaa..61e5de6249c4f 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/README.md +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/README.md @@ -6,7 +6,7 @@ The waterfall chart component aims to be agnostic in it's approach, so that a va ## Requirements for usage -The waterfall chart component asssumes that the consumer is making use of `KibanaReactContext`, and as such things like `useKibana` can be called. +The waterfall chart component asssumes that the consumer is making use of `KibanaReactContext`, and as such things like `useKibana` can be called. Consumers are also expected to be using the `` so that the waterfall chart can apply styled-component styles based on the EUI theme. @@ -24,13 +24,13 @@ This section aims to cover some things that are non-standard. By default the formatting of tooltip values is very basic, but for a waterfall chart there needs to be a great deal of flexibility to represent whatever breakdown you're trying to show. -As such a custom tooltip component is used. This custom component would usually only have access to some basic props that pertain to the values of the hovered bar. The waterfall chart component extends this by making us of a waterfall chart context. +As such a custom tooltip component is used. This custom component would usually only have access to some basic props that pertain to the values of the hovered bar. The waterfall chart component extends this by making us of a waterfall chart context. -The custom tooltip component can use the context to access the full set of chart data, find the relevant items (those with the same `x` value) and call a custom `renderTooltipItem` for each item, `renderTooltipItem` will be passed `item.config.tooltipProps`. Every consumer can choose what they use for their `tooltipProps`. +The custom tooltip component can use the context to access the full set of chart data, find the relevant items (those with the same `x` value) and call a custom `renderTooltipItem` for each item, `renderTooltipItem` will be passed `item.config.tooltipProps`. Every consumer can choose what they use for their `tooltipProps`. Some consumers might need colours, some might need iconography and so on. The waterfall chart doesn't make assumptions, and will render out the React content returned by `renderTooltipItem`. -IMPORTANT: `renderTooltipItem` is provided via context and not as a direct prop due to the fact the custom tooltip component would usually only have access to the props provided directly to it from Elastic Charts. +IMPORTANT: `renderTooltipItem` is provided via context and not as a direct prop due to the fact the custom tooltip component would usually only have access to the props provided directly to it from Elastic Charts. ### Colours @@ -90,7 +90,7 @@ A legend is optional. Pulling all of this together, things look like this (for a specific solution): ``` -const renderSidebarItem: RenderItem = (item, index) => { +const renderSidebarItem: RenderItem = (item, index) => { return ; }; @@ -119,5 +119,3 @@ const renderLegendItem: RenderItem = (item) => { ``` A solution could easily forego a sidebar and legend for a more minimalistic view, e.g. maybe a mini waterfall within a table column. - - diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/context/waterfall_context.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/context/waterfall_context.tsx index 39b8479560cbb..1ccc95f562d5a 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/context/waterfall_context.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/context/waterfall_context.tsx @@ -20,7 +20,7 @@ import { WaterfallMetadata, } from '../../../common/network_data/types'; import { OnSidebarClick, OnElementClick, OnProjectionClick } from '../waterfall_flyout/use_flyout'; -import { SidebarItem } from '../../../common/network_data/types'; +import { WaterfallNetworkItem } from '../../../common/network_data/types'; export type MarkerItems = Array<{ id: @@ -43,7 +43,7 @@ export interface IWaterfallContext { onSidebarClick?: OnSidebarClick; showOnlyHighlightedNetworkRequests: boolean; showCustomMarks: boolean; - sidebarItems?: SidebarItem[]; + sidebarItems?: WaterfallNetworkItem[]; metadata: WaterfallMetadata; renderTooltipItem: ( item: WaterfallDataEntry['config']['tooltipProps'], diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.test.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.test.tsx index e6b29cfb9faa7..035eaba33cb90 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.test.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.test.tsx @@ -26,14 +26,12 @@ describe('getChunks', () => { }); describe('Component', () => { - const url = 'http://www.elastic.co'; it('renders truncated text and aria label', () => { const { getByText, getByLabelText } = render( @@ -47,13 +45,7 @@ describe('Component', () => { it('renders screen reader only text', () => { const { getByTestId } = render( - + ); const { getByText } = within(getByTestId('middleTruncatedTextSROnly')); @@ -63,17 +55,11 @@ describe('Component', () => { it('renders external link', () => { const { getByText } = render( - + ); const link = getByText('Open resource in new tab').closest('a'); - expect(link).toHaveAttribute('href', url); + expect(link).toHaveAttribute('href', longString); expect(link).toHaveAttribute('target', '_blank'); }); @@ -82,9 +68,8 @@ describe('Component', () => { const { getByTestId } = render( diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.tsx index 7f95069c56f08..701790799dfba 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/middle_truncated_text.tsx @@ -26,7 +26,6 @@ interface Props { index: number; highestIndex: number; ariaLabel: string; - text: string; onClick?: (event: React.MouseEvent) => void; setButtonRef?: (ref: HTMLButtonElement | HTMLAnchorElement | null) => void; url: string; @@ -102,14 +101,13 @@ export const getChunks = (text: string = '') => { export const MiddleTruncatedText = ({ index, ariaLabel, - text: fullText, onClick, setButtonRef, url, highestIndex, }: Props) => { - const secureHttps = fullText.startsWith('https://'); - const text = fullText.replace(/https:\/\/www.|http:\/\/www.|http:\/\/|https:\/\//, ''); + const secureHttps = url.startsWith('https://'); + const text = url.replace(/https:\/\/www.|http:\/\/www.|http:\/\/|https:\/\//, ''); const chunks = useMemo(() => { return getChunks(text); @@ -118,15 +116,17 @@ export const MiddleTruncatedText = ({ return ( - {fullText} + {url} + } data-test-subj="middleTruncatedTextToolTip" - delay="long" position="top" > <> diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx index 2d44735857f40..3f0a80082aec6 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_bar_chart.tsx @@ -39,27 +39,29 @@ const getChartHeight = (data: WaterfallData): number => { }; const CustomTooltip: CustomChartTooltip = (tooltipInfo) => { - const { data, sidebarItems } = useWaterfallContext(); + const { sidebarItems, metadata } = useWaterfallContext(); return useMemo(() => { const sidebarItem = sidebarItems?.find((item) => item.index === tooltipInfo.header?.value); - const relevantItems = data.filter((item) => { - return ( - item.x === tooltipInfo.header?.value && item.config.showTooltip && item.config.tooltipProps - ); - }); - return relevantItems.length ? ( + if (!sidebarItem) { + return null; + } + const metadataEntry = metadata?.[sidebarItem.index]; + const showTooltip = + metadataEntry?.showTooltip && metadataEntry?.networkItemTooltipProps.length > 1; + return showTooltip ? ( {sidebarItem && ( )} ) : null; - }, [data, sidebarItems, tooltipInfo.header?.value]); + }, [sidebarItems, tooltipInfo.header?.value, metadata]); }; interface Props { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_chart_wrapper.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_chart_wrapper.tsx index 4f155d56db833..ec43aa4508f15 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_chart_wrapper.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_chart_wrapper.tsx @@ -11,7 +11,7 @@ import { EuiHealth } from '@elastic/eui'; import { JourneyStep, NetworkEvent } from '../../../../../../../common/runtime_types'; import { useDateFormat } from '../../../../../../hooks/use_date_format'; import { getSeriesAndDomain, getSidebarItems } from '../../common/network_data/data_formatting'; -import { SidebarItem, LegendItem } from '../../common/network_data/types'; +import { WaterfallNetworkItem, LegendItem } from '../../common/network_data/types'; import { RenderItem, WaterfallDataEntry } from '../../common/network_data/types'; import { useFlyout } from './waterfall_flyout/use_flyout'; import { WaterfallFlyout } from './waterfall_flyout/waterfall_flyout'; @@ -92,7 +92,7 @@ export const WaterfallChartWrapper: React.FC = ({ const highestSideBarIndex = Math.max(...series.map((sr: WaterfallDataEntry) => sr.x)); - const renderSidebarItem: RenderItem = useCallback( + const renderSidebarItem: RenderItem = useCallback( (item) => { return ( { value: 'text/html', }, ], + showTooltip: false, + networkItemTooltipProps: [], }, ]; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.test.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.test.tsx index 6e91c47922170..e2d3e8e990066 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.test.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.test.tsx @@ -29,6 +29,8 @@ describe('WaterfallFlyout', () => { value: 'text/html', }, ], + showTooltip: false, + networkItemTooltipProps: [], }; const defaultProps = { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.tsx index cb3babffd16b4..7b7c5c9b5a73e 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_flyout/waterfall_flyout.tsx @@ -93,13 +93,7 @@ export const WaterfallFlyout = ({

- +

diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.test.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.test.tsx index 786978e3647a7..8f7516abe9083 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.test.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import 'jest-canvas-mock'; import { fireEvent } from '@testing-library/react'; -import { SidebarItem } from '../../common/network_data/types'; +import { WaterfallNetworkItem } from '../../common/network_data/types'; import { WaterfallSidebarItem } from './waterfall_sidebar_item'; import { SIDEBAR_FILTER_MATCHES_SCREENREADER_LABEL } from './translations'; import { getChunks } from './middle_truncated_text'; @@ -19,7 +19,7 @@ describe('waterfall filter', () => { const url = 'http://www.elastic.co/observability/uptime'; const index = 0; const offsetIndex = index + 1; - const item: SidebarItem = { + const item: WaterfallNetworkItem = { url, isHighlighted: true, index, diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.tsx index a5d26e33a9b5a..f553c8a81337c 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_sidebar_item.tsx @@ -7,14 +7,14 @@ import React, { RefObject, useMemo, useCallback, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiBadge } from '@elastic/eui'; -import { SidebarItem } from '../../common/network_data/types'; +import { WaterfallNetworkItem } from '../../common/network_data/types'; import { MiddleTruncatedText } from './middle_truncated_text'; import { SideBarItemHighlighter } from './styles'; import { SIDEBAR_FILTER_MATCHES_SCREENREADER_LABEL } from './translations'; import { OnSidebarClick } from './waterfall_flyout/use_flyout'; interface SidebarItemProps { - item: SidebarItem; + item: WaterfallNetworkItem; renderFilterScreenReaderText?: boolean; onClick?: OnSidebarClick; highestIndex: number; @@ -44,13 +44,11 @@ export const WaterfallSidebarItem = React.memo(function WaterfallSidebarItem({ return is400 || is500 || isSpecific300; }; - const text = item.url; - const ariaLabel = `${ isHighlighted && renderFilterScreenReaderText ? `${SIDEBAR_FILTER_MATCHES_SCREENREADER_LABEL} ` : '' - }${text}`; + }${url}`; return ( ({ }, }, ], + metadata: { + 0: { + networkItemTooltipProps: [ + { + colour: '#000000', + value: 'test-val', + }, + ], + showTooltip: true, + }, + 1: { + networkItemTooltipProps: [ + { + colour: '#010000', + value: 'test-val-missing', + }, + ], + showTooltip: true, + }, + }, renderTooltipItem: (props: any) => (
{props.colour}
@@ -64,7 +84,11 @@ jest.mock('./context/waterfall_context', () => ({ describe('WaterfallTooltipContent', () => { it('renders tooltip', () => { const { getByText, queryByText } = render( - + ); expect(getByText('#000000')).toBeInTheDocument(); expect(getByText('test-val')).toBeInTheDocument(); @@ -75,7 +99,11 @@ describe('WaterfallTooltipContent', () => { it(`doesn't render metric if tooltip props missing`, () => { const { getAllByLabelText, getByText } = render( - + ); const metricElements = getAllByLabelText('tooltip item'); expect(metricElements).toHaveLength(1); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_tooltip_content.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_tooltip_content.tsx index b4e4ff040d6c6..e783cf0858867 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_tooltip_content.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_waterfall_chart/waterfall/waterfall_tooltip_content.tsx @@ -13,6 +13,7 @@ import { useWaterfallContext } from './context/waterfall_context'; interface Props { text: string; url: string; + index: number; } const StyledText = euiStyled(EuiText)` @@ -23,22 +24,24 @@ const StyledHorizontalRule = euiStyled(EuiHorizontalRule)` background-color: ${(props) => props.theme.eui.euiColorDarkShade}; `; -export const WaterfallTooltipContent: React.FC = ({ text, url }) => { - const { data, renderTooltipItem, sidebarItems } = useWaterfallContext(); +export const WaterfallTooltipContent: React.FC = ({ text, url, index }) => { + const { renderTooltipItem, metadata } = useWaterfallContext(); + // the passed index is base 1, so we need to subtract 1 to get the correct index + const metadataEntry = metadata?.[index - 1]; + const tooltipItems = metadataEntry?.networkItemTooltipProps; + const showTooltip = metadataEntry?.showTooltip; + + if (!tooltipItems || !showTooltip) { + return null; + } - const tooltipMetrics = data.filter( - (datum) => - datum.x === sidebarItems?.find((sidebarItem) => sidebarItem.url === url)?.index && - datum.config.tooltipProps && - datum.config.showTooltip - ); return (
{text} - {tooltipMetrics.map((item, idx) => ( - {renderTooltipItem(item.config.tooltipProps)} + {tooltipItems.map((item, idx) => ( + {renderTooltipItem(item)} ))}
diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/routes.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/routes.tsx index ca1d194994e8d..8f475f458deef 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/routes.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/routes.tsx @@ -18,8 +18,7 @@ import { APP_WRAPPER_CLASS } from '@kbn/core/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; import { useInspectorContext } from '@kbn/observability-shared-plugin/public'; -import { CertificateTitle } from './components/certificates/certificate_title'; -import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; +import { CertRefreshBtn, CertificateTitle, CertificatesPage } from './components/certificates'; import { useSyntheticsPrivileges } from './hooks/use_synthetics_priviliges'; import { ClientPluginsStart } from '../../plugin'; import { getMonitorsRoute } from './components/monitors_page/route_config'; @@ -47,7 +46,6 @@ import { import { PLUGIN } from '../../../common/constants/plugin'; import { apiService } from '../../utils/api_service'; import { getErrorDetailsRouteConfig } from './components/error_details/route_config'; -import { CertificatesPage } from './components/certificates/certificates'; export type RouteProps = LazyObservabilityPageTemplateProps & { path: string; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/formatting/format.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/formatting/format.ts index 44393b034ac56..5e4c9360fcd37 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/formatting/format.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/formatting/format.ts @@ -18,7 +18,7 @@ const NUM_MICROSECONDS_IN_MILLISECOND = 1000; * This simply converts microseconds to milliseconds. People tend to prefer ms to us * when visualizing request duration times. */ -export const microsToMillis = (microseconds: number | null): number | null => { +const microsToMillis = (microseconds: number | null): number | null => { if (!microseconds && microseconds !== 0) return null; return Math.floor(microseconds / NUM_MICROSECONDS_IN_MILLISECOND); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/screenshot_ref.mock.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/screenshot_ref.mock.ts deleted file mode 100644 index f704c3309c1f9..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/screenshot_ref.mock.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ScreenshotRefImageData } from '../../../../../../common/runtime_types'; - -export const mockRef: ScreenshotRefImageData = { - maxSteps: 1, - stepName: 'load homepage', - ref: { - screenshotRef: { - '@timestamp': '2021-06-08T19:42:30.257Z', - synthetics: { - package_version: '1.0.0-beta.2', - step: { name: 'load homepage', index: 1 }, - type: 'step/screenshot_ref', - }, - screenshot_ref: { - blocks: [ - { - top: 0, - left: 0, - width: 160, - hash: 'd518801fc523cf02727cd520f556c4113b3098c7', - height: 90, - }, - { - top: 0, - left: 160, - width: 160, - hash: 'fa90345d5d7b05b1601e9ee645e663bc358869e0', - height: 90, - }, - ], - width: 1280, - height: 720, - }, - monitor: { check_group: 'a567cc7a-c891-11eb-bdf9-3e22fb19bf97' }, - }, - }, -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx index 9d4870b8c9154..af007700c4484 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/rtl_helpers.tsx @@ -356,41 +356,12 @@ export const makeSyntheticsPermissionsCore = ( }; }; -// This function filters out the queried elements which appear only -// either on mobile or desktop. -// -// It does so by filtering those with the class passed as the `classWrapper`. -// For mobile, we filter classes which tell elements to be hidden on desktop. -// For desktop, we do the opposite. -// -// We have this function because EUI will manipulate the visibility of some -// elements through pure CSS, which we can't assert on tests. Therefore, -// we look for the corresponding class wrapper. -const finderWithClassWrapper = - (classWrapper: string) => - ( - getterFn: (f: MatcherFunction) => HTMLElement | null, - customAttribute?: keyof Element | keyof HTMLElement - ) => - (text: string): HTMLElement | null => - getterFn((_content: string, node: Element | null) => { - if (!node) return false; - // There are actually properties that are not in Element but which - // appear on the `node`, so we must cast the customAttribute as a keyof Element - const content = node[(customAttribute as keyof Element) ?? 'innerHTML']; - if (content === text && wrappedInClass(node, classWrapper)) return true; - return false; - }); - const wrappedInClass = (element: HTMLElement | Element, classWrapper: string): boolean => { if (element.className.includes(classWrapper)) return true; if (element.parentElement) return wrappedInClass(element.parentElement, classWrapper); return false; }; -export const forMobileOnly = finderWithClassWrapper('hideForDesktop'); -export const forDesktopOnly = finderWithClassWrapper('hideForMobile'); - export const makeUptimePermissionsCore = ( permissions: Partial<{ 'alerting:save': boolean; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/spy_use_fetcher.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/spy_use_fetcher.ts deleted file mode 100644 index e1f43ee0b003e..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/spy_use_fetcher.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 * as observabilitySharedPublic from '@kbn/observability-shared-plugin/public'; - -jest.mock('@kbn/observability-shared-plugin/public', () => { - const originalModule = jest.requireActual('@kbn/observability-shared-plugin/public'); - - return { - ...originalModule, - useFetcher: jest.fn().mockReturnValue({ - data: null, - status: 'success', - }), - useTrackPageview: jest.fn(), - }; -}); - -export function spyOnUseFetcher( - payload: unknown, - status = observabilitySharedPublic.FETCH_STATUS.SUCCESS -) { - return jest.spyOn(observabilitySharedPublic, 'useFetcher').mockReturnValue({ - status, - data: payload, - refetch: () => null, - }); -} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.test.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.test.ts deleted file mode 100644 index 3842c2c20dbda..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.test.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 { parseIsPaused } from './parse_is_paused'; - -describe('parseIsPaused', () => { - it('parses correct true isPaused value', () => { - expect(parseIsPaused('true', false)).toEqual(true); - }); - - it('parses correct false isPaused value', () => { - expect(parseIsPaused('false', true)).toEqual(false); - }); - - it('uses default value for non-boolean string', () => { - expect(parseIsPaused('foo', true)).toEqual(true); - }); -}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.ts deleted file mode 100644 index 82502f5290cbc..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_is_paused.ts +++ /dev/null @@ -1,17 +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. - */ - -// TODO: add a comment explaining the purpose of this function -export const parseIsPaused = (value: string | undefined, defaultValue: boolean): boolean => { - if (value === 'true') { - return true; - } - if (value === 'false') { - return false; - } - return defaultValue; -}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.test.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.test.ts deleted file mode 100644 index e8b2aea4f6f11..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.test.ts +++ /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 { parseUrlInt } from './parse_url_int'; - -describe('parseUrlInt', () => { - it('parses a number', () => { - const result = parseUrlInt('23', 50); - expect(result).toBe(23); - }); - - it('returns default value for empty string', () => { - const result = parseUrlInt('', 50); - expect(result).toBe(50); - }); - - it('returns default value for non-numeric string', () => { - const result = parseUrlInt('abc', 50); - expect(result).toBe(50); - }); -}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.ts deleted file mode 100644 index a48ded2fac9ff..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/url_params/parse_url_int.ts +++ /dev/null @@ -1,11 +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. - */ - -export const parseUrlInt = (value: string | undefined, defaultValue: number): number => { - const parsed = parseInt(value || '', 10); - return isNaN(parsed) ? defaultValue : parsed; -}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/types.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/types.ts deleted file mode 100644 index 9c8cc0b9a6e36..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/types.ts +++ /dev/null @@ -1,23 +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. - */ - -export interface MonitorSummaryStatusRule { - reason: string; - status: string; - configId: string; - hostName: string; - monitorId: string; - checkedAt: string; - monitorUrl: string; - locationId: string; - monitorType: string; - monitorName: string; - locationName: string; - lastErrorMessage: string; - stateId: string | null; - monitorUrlLabel: string; -} diff --git a/x-pack/plugins/observability_solution/synthetics/server/common/unzipt_project_code.ts b/x-pack/plugins/observability_solution/synthetics/server/common/unzip_project_code.ts similarity index 100% rename from x-pack/plugins/observability_solution/synthetics/server/common/unzipt_project_code.ts rename to x-pack/plugins/observability_solution/synthetics/server/common/unzip_project_code.ts diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/inspect_monitor.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/inspect_monitor.ts index 2c7d62f4830d4..6b4687e2bea81 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/inspect_monitor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/inspect_monitor.ts @@ -8,7 +8,7 @@ import { v4 as uuidV4 } from 'uuid'; import { schema } from '@kbn/config-schema'; import { PrivateLocationAttributes } from '../../runtime_types/private_locations'; import { SyntheticsRestApiRouteFactory } from '../types'; -import { unzipFile } from '../../common/unzipt_project_code'; +import { unzipFile } from '../../common/unzip_project_code'; import { ConfigKey, MonitorFields, SyntheticsMonitor } from '../../../common/runtime_types'; import { SYNTHETICS_API_URLS } from '../../../common/constants'; import { DEFAULT_FIELDS } from '../../../common/constants/monitor_defaults'; diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/pings/journey_screenshot_blocks.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/pings/journey_screenshot_blocks.ts index c86ccbd169c71..e155e2f320584 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/pings/journey_screenshot_blocks.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/pings/journey_screenshot_blocks.ts @@ -23,8 +23,8 @@ export const createJourneyScreenshotBlocksRoute: SyntheticsRestApiRouteFactory = }), }, writeAccess: false, - handler: async (routeProps) => { - return await journeyScreenshotBlocksHandler(routeProps); + handler: (routeProps) => { + return journeyScreenshotBlocksHandler(routeProps); }, }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/telemetry/constants.ts b/x-pack/plugins/observability_solution/synthetics/server/telemetry/constants.ts index ebb462301dea5..021fc57713471 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/telemetry/constants.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/telemetry/constants.ts @@ -8,5 +8,3 @@ export const MONITOR_UPDATE_CHANNEL = 'synthetics-monitor-update'; export const MONITOR_CURRENT_CHANNEL = 'synthetics-monitor-current'; export const MONITOR_ERROR_EVENTS_CHANNEL = 'synthetics-monitor-error-events'; -export const MONITOR_SYNC_STATE_CHANNEL = 'synthetics-monitor-sync-state'; -export const MONITOR_SYNC_EVENTS_CHANNEL = 'synthetics-monitor-sync-events'; diff --git a/x-pack/plugins/observability_solution/uptime/common/constants/data_filters.ts b/x-pack/plugins/observability_solution/uptime/common/constants/data_filters.ts deleted file mode 100644 index d7ca3b43376b9..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/common/constants/data_filters.ts +++ /dev/null @@ -1,12 +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. - */ - -export const STEP_END_FILTER = { - terms: { - 'synthetics.type': ['step/end'], - }, -}; diff --git a/x-pack/plugins/observability_solution/uptime/common/field_names.ts b/x-pack/plugins/observability_solution/uptime/common/field_names.ts deleted file mode 100644 index 0407fad341d8a..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/common/field_names.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. - */ - -export const AGENT_NAME = 'agent.name'; -export const MONITOR_ID = 'monitor.id'; -export const MONITOR_NAME = 'monitor.name'; -export const MONITOR_TYPE = 'monitor.type'; -export const URL_FULL = 'url.full'; -export const URL_PORT = 'url.port'; -export const OBSERVER_GEO_NAME = 'observer.geo.name'; -export const ERROR_MESSAGE = 'error.message'; -export const STATE_ID = 'monitor.state.id'; - -export const CERT_COMMON_NAME = 'tls.server.x509.subject.common_name'; -export const CERT_ISSUER_NAME = 'tls.server.x509.issuer.common_name'; -export const CERT_VALID_NOT_AFTER = 'tls.server.x509.not_after'; -export const CERT_VALID_NOT_BEFORE = 'tls.server.x509.not_before'; -export const CERT_HASH_SHA256 = 'tls.server.hash.sha256'; diff --git a/x-pack/plugins/observability_solution/uptime/common/formatters/format_space_name.ts b/x-pack/plugins/observability_solution/uptime/common/formatters/format_space_name.ts deleted file mode 100644 index 88beb7cda1407..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/common/formatters/format_space_name.ts +++ /dev/null @@ -1,13 +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. - */ -/* Formats kibana space id into a valid Fleet-compliant data-stream namespace */ -import { INVALID_NAMESPACE_CHARACTERS } from '@kbn/fleet-plugin/common'; - -export const formatKibanaNamespace = (spaceId: string) => { - const namespaceRegExp = new RegExp(INVALID_NAMESPACE_CHARACTERS, 'g'); - return spaceId.replace(namespaceRegExp, '_'); -}; diff --git a/x-pack/plugins/observability_solution/uptime/common/formatters/index.ts b/x-pack/plugins/observability_solution/uptime/common/formatters/index.ts deleted file mode 100644 index 17c9567043197..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/common/formatters/index.ts +++ /dev/null @@ -1,8 +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. - */ - -export { formatKibanaNamespace } from './format_space_name'; diff --git a/x-pack/plugins/observability_solution/uptime/common/utils/t_enum.ts b/x-pack/plugins/observability_solution/uptime/common/utils/t_enum.ts deleted file mode 100644 index e00a51dbdf438..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/common/utils/t_enum.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; - -/** - * This utility function can be used to turn a TypeScript enum into a io-ts codec. - * - * @example - * import { PathReporter } from "io-ts/lib/PathReporter"; - * - * enum Thing { - * FOO = "foo", - * BAR = "bar" - * } - * - * const ThingCodec = tEnum("Thing", Thing); - * - * console.log(PathReporter.report(ThingCodec.decode('invalidvalue'))); - * // prints [ 'Invalid value "invalidvalue" supplied to : Thing' ] - * console.log(PathReporter.report(ThingCodec.decode('foo'))); - * // prints [ 'No errors!' ] - */ -export function tEnum(enumName: string, theEnum: Record) { - const isEnumValue = (input: unknown): input is EnumType => - Object.values(theEnum).includes(input); - - return new t.Type( - enumName, - isEnumValue, - (input, context) => (isEnumValue(input) ? t.success(input) : t.failure(input, context)), - t.identity - ); -} diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/spy_use_fetcher.ts b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/spy_use_fetcher.ts deleted file mode 100644 index e1f43ee0b003e..0000000000000 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/spy_use_fetcher.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 * as observabilitySharedPublic from '@kbn/observability-shared-plugin/public'; - -jest.mock('@kbn/observability-shared-plugin/public', () => { - const originalModule = jest.requireActual('@kbn/observability-shared-plugin/public'); - - return { - ...originalModule, - useFetcher: jest.fn().mockReturnValue({ - data: null, - status: 'success', - }), - useTrackPageview: jest.fn(), - }; -}); - -export function spyOnUseFetcher( - payload: unknown, - status = observabilitySharedPublic.FETCH_STATUS.SUCCESS -) { - return jest.spyOn(observabilitySharedPublic, 'useFetcher').mockReturnValue({ - status, - data: payload, - refetch: () => null, - }); -} diff --git a/x-pack/plugins/screenshotting/server/browsers/chromium/driver.ts b/x-pack/plugins/screenshotting/server/browsers/chromium/driver.ts index 02d611f9ca00f..3c199b2916b30 100644 --- a/x-pack/plugins/screenshotting/server/browsers/chromium/driver.ts +++ b/x-pack/plugins/screenshotting/server/browsers/chromium/driver.ts @@ -244,15 +244,17 @@ export class HeadlessChromiumDriver { if (error) { await this.injectScreenshottingErrorHeader(error, getPrintLayoutSelectors().screenshot); } - return this.page.pdf({ - format: 'a4', - preferCSSPageSize: true, - scale: 1, - landscape: false, - displayHeaderFooter: true, - headerTemplate: await getHeaderTemplate({ title }), - footerTemplate: await getFooterTemplate({ logo }), - }); + return Buffer.from( + await this.page.pdf({ + format: 'a4', + preferCSSPageSize: true, + scale: 1, + landscape: false, + displayHeaderFooter: true, + headerTemplate: await getHeaderTemplate({ title }), + footerTemplate: await getFooterTemplate({ logo }), + }) + ); } /* @@ -272,6 +274,7 @@ export class HeadlessChromiumDriver { } const { boundingClientRect, scroll } = elementPosition; + const screenshot = await this.page.screenshot({ clip: { x: boundingClientRect.left + scroll.x, @@ -282,8 +285,8 @@ export class HeadlessChromiumDriver { captureBeyondViewport: false, // workaround for an internal resize. See: https://github.com/puppeteer/puppeteer/issues/7043 }); - if (Buffer.isBuffer(screenshot)) { - return screenshot; + if (screenshot.byteLength) { + return Buffer.from(screenshot); } if (typeof screenshot === 'string') { diff --git a/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/index.ts b/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/index.ts index f6015c319cc0a..d8503b70ad963 100644 --- a/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/index.ts +++ b/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/index.ts @@ -150,7 +150,7 @@ export class HeadlessChromiumDriverFactory { pipe: !this.config.browser.chromium.inspect, userDataDir: this.userDataDir, executablePath: this.binaryPath, - ignoreHTTPSErrors: true, + acceptInsecureCerts: true, handleSIGHUP: false, args: chromiumArgs, defaultViewport: viewport, diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.gen.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.gen.ts index 2d3dbcd3f436f..a723eb8e7da89 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.gen.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.gen.ts @@ -224,6 +224,7 @@ export const EqlOptionalFields = z.object({ tiebreaker_field: TiebreakerField.optional(), timestamp_field: TimestampField.optional(), alert_suppression: AlertSuppression.optional(), + response_actions: z.array(ResponseAction).optional(), }); export type EqlRuleCreateFields = z.infer; @@ -521,6 +522,7 @@ export const NewTermsRuleOptionalFields = z.object({ data_view_id: DataViewId.optional(), filters: RuleFilterArray.optional(), alert_suppression: AlertSuppression.optional(), + response_actions: z.array(ResponseAction).optional(), }); export type NewTermsRuleDefaultableFields = z.infer; @@ -574,6 +576,7 @@ export const EsqlRuleRequiredFields = z.object({ export type EsqlRuleOptionalFields = z.infer; export const EsqlRuleOptionalFields = z.object({ alert_suppression: AlertSuppression.optional(), + response_actions: z.array(ResponseAction).optional(), }); export type EsqlRulePatchFields = z.infer; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.schema.yaml b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.schema.yaml index 4ade72c15fbb9..ca2f325c8f713 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.schema.yaml @@ -292,6 +292,10 @@ components: $ref: './specific_attributes/eql_attributes.schema.yaml#/components/schemas/TimestampField' alert_suppression: $ref: './common_attributes.schema.yaml#/components/schemas/AlertSuppression' + response_actions: + type: array + items: + $ref: '../rule_response_actions/response_actions.schema.yaml#/components/schemas/ResponseAction' EqlRuleCreateFields: allOf: @@ -762,6 +766,10 @@ components: $ref: './common_attributes.schema.yaml#/components/schemas/RuleFilterArray' alert_suppression: $ref: './common_attributes.schema.yaml#/components/schemas/AlertSuppression' + response_actions: + type: array + items: + $ref: '../rule_response_actions/response_actions.schema.yaml#/components/schemas/ResponseAction' NewTermsRuleDefaultableFields: type: object @@ -840,6 +848,10 @@ components: properties: alert_suppression: $ref: './common_attributes.schema.yaml#/components/schemas/AlertSuppression' + response_actions: + type: array + items: + $ref: '../rule_response_actions/response_actions.schema.yaml#/components/schemas/ResponseAction' EsqlRulePatchFields: allOf: diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts index 7b71bb6f16c7a..c8c4238709849 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff.ts @@ -131,6 +131,7 @@ export interface ThreeWayDiff { * True if: * - base=A, current=A, target=B * - base=A, current=B, target=C + * - base=, current=A, target=B */ has_update: boolean; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts index f33c52d33abfc..541c51d4f571f 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_conflict.ts @@ -7,8 +7,8 @@ /** * Enum of possible conflict outcomes of a three-way diff: - * - NON_SOLVABLE_CONFLICT: current != target and we couldn't automatically resolve the conflict between them - * - SOLVABLE_CONFLICT: current != target and we automatically resolved the conflict between them + * - NON_SOLVABLE: current != target and we couldn't automatically resolve the conflict between them + * - SOLVABLE: current != target and we automatically resolved the conflict between them * - NO_CONFLICT: * - current == target (value won't change) * - current != target && current == base (stock rule will get a new value) diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.gen.ts index e5f8c631fcbae..75263643c2fc9 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.gen.ts +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.gen.ts @@ -36,3 +36,9 @@ export const EngineDescriptor = z.object({ status: EngineStatus.optional(), filter: z.string().optional(), }); + +export type InspectQuery = z.infer; +export const InspectQuery = z.object({ + response: z.array(z.string()), + dsl: z.array(z.string()), +}); diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.schema.yaml index dc17ad6193ee5..505caac10d8df 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/common.schema.yaml @@ -6,7 +6,6 @@ info: paths: {} components: schemas: - EntityType: type: string enum: @@ -31,7 +30,21 @@ components: - installing - started - stopped - + IndexPattern: type: string - \ No newline at end of file + + InspectQuery: + type: object + properties: + response: + type: array + items: + type: string + dsl: + type: array + items: + type: string + required: + - dsl + - response diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts new file mode 100644 index 0000000000000..eb123b5a9da1f --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.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. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Common Entities Schemas + * version: 1 + */ + +import { z } from '@kbn/zod'; + +export type UserEntity = z.infer; +export const UserEntity = z.object({ + user: z + .object({ + full_name: z.array(z.string()).optional(), + domain: z.array(z.string()).optional(), + roles: z.array(z.string()).optional(), + name: z.string(), + id: z.array(z.string()).optional(), + email: z.array(z.string()).optional(), + hash: z.array(z.string()).optional(), + }) + .optional(), + entity: z + .object({ + lastSeenTimestamp: z.string().datetime(), + schemaVersion: z.string(), + definitionVersion: z.string(), + displayName: z.string(), + identityFields: z.array(z.string()), + id: z.string(), + type: z.literal('node'), + firstSeenTimestamp: z.string().datetime(), + definitionId: z.string(), + }) + .optional(), +}); + +export type HostEntity = z.infer; +export const HostEntity = z.object({ + host: z + .object({ + hostname: z.array(z.string()).optional(), + domain: z.array(z.string()).optional(), + ip: z.array(z.string()).optional(), + name: z.string(), + id: z.array(z.string()).optional(), + type: z.array(z.string()).optional(), + mac: z.array(z.string()).optional(), + architecture: z.array(z.string()).optional(), + }) + .optional(), + entity: z + .object({ + lastSeenTimestamp: z.string().datetime(), + schemaVersion: z.string(), + definitionVersion: z.string(), + displayName: z.string(), + identityFields: z.array(z.string()), + id: z.string(), + type: z.literal('node'), + firstSeenTimestamp: z.string().datetime(), + definitionId: z.string(), + }) + .optional(), +}); + +export type Entity = z.infer; +export const Entity = z.union([UserEntity, HostEntity]); diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml new file mode 100644 index 0000000000000..0f7f31792306c --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml @@ -0,0 +1,159 @@ +openapi: 3.0.0 +info: + title: Common Entities Schemas + description: Common Entities schemas for the Entity Store + version: '1' +paths: {} +components: + schemas: + UserEntity: + type: object + properties: + user: + type: object + properties: + full_name: + type: array + items: + type: string + domain: + type: array + items: + type: string + roles: + type: array + items: + type: string + name: + type: string + id: + type: array + items: + type: string + email: + type: array + items: + type: string + hash: + type: array + items: + type: string + required: + - name + entity: + type: object + properties: + lastSeenTimestamp: + type: string + format: date-time + schemaVersion: + type: string + definitionVersion: + type: string + displayName: + type: string + identityFields: + type: array + items: + type: string + id: + type: string + type: + type: string + enum: + - node + firstSeenTimestamp: + type: string + format: date-time + definitionId: + type: string + required: + - lastSeenTimestamp + - schemaVersion + - definitionVersion + - displayName + - identityFields + - id + - type + - firstSeenTimestamp + - definitionId + HostEntity: + type: object + properties: + host: + type: object + properties: + hostname: + type: array + items: + type: string + domain: + type: array + items: + type: string + ip: + type: array + items: + type: string + name: + type: string + id: + type: array + items: + type: string + type: + type: array + items: + type: string + mac: + type: array + items: + type: string + architecture: + type: array + items: + type: string + required: + - name + entity: + type: object + properties: + lastSeenTimestamp: + type: string + format: date-time + schemaVersion: + type: string + definitionVersion: + type: string + displayName: + type: string + identityFields: + type: array + items: + type: string + id: + type: string + type: + type: string + enum: + - node + firstSeenTimestamp: + type: string + format: date-time + definitionId: + type: string + required: + - lastSeenTimestamp + - schemaVersion + - definitionVersion + - displayName + - identityFields + - id + - type + - firstSeenTimestamp + - definitionId + + Entity: + oneOf: + - $ref: '#/components/schemas/UserEntity' + - $ref: '#/components/schemas/HostEntity' diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.gen.ts new file mode 100644 index 0000000000000..0c500f97986ed --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.gen.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Entities List Schema + * version: 2023-10-31 + */ + +import { z } from '@kbn/zod'; +import { ArrayFromString } from '@kbn/zod-helpers'; + +import { EntityType, InspectQuery } from '../common.gen'; +import { Entity } from './common.gen'; + +export type ListEntitiesRequestQuery = z.infer; +export const ListEntitiesRequestQuery = z.object({ + sort_field: z.string().optional(), + sort_order: z.enum(['asc', 'desc']).optional(), + page: z.coerce.number().int().min(1).optional(), + per_page: z.coerce.number().int().min(1).max(10000).optional(), + /** + * An ES query to filter by. + */ + filterQuery: z.string().optional(), + entities_types: ArrayFromString(EntityType), +}); +export type ListEntitiesRequestQueryInput = z.input; + +export type ListEntitiesResponse = z.infer; +export const ListEntitiesResponse = z.object({ + records: z.array(Entity), + page: z.number().int().min(1), + per_page: z.number().int().min(1).max(1000), + total: z.number().int().min(0), + inspect: InspectQuery.optional(), +}); diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.schema.yaml new file mode 100644 index 0000000000000..7664473dc61f4 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/list_entities.schema.yaml @@ -0,0 +1,82 @@ +# ⚠️ Updating this file? Also update the public API docs at https://github.com/elastic/security-docs/tree/main/docs/advanced-entity-analytics/api +openapi: 3.0.0 +info: + version: '2023-10-31' + title: Entities List Schema +paths: + /api/entity_store/entities/list: + get: + x-labels: [ess, serverless] + x-codegen-enabled: true + operationId: ListEntities + summary: List Entity Store Entities + description: List entities records, paging, sorting and filtering as needed. + parameters: + - name: sort_field + in: query + required: false + schema: + type: string + - name: sort_order + in: query + required: false + schema: + type: string + enum: + - asc + - desc + - name: page + in: query + required: false + schema: + type: integer + minimum: 1 + - name: per_page + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 10000 + - name: filterQuery + in: query + required: false + schema: + type: string + description: An ES query to filter by. + - name: entities_types + in: query + required: true + schema: + type: array + items: + $ref: '../common.schema.yaml#/components/schemas/EntityType' + responses: + '200': + description: Entities returned successfully + content: + application/json: + schema: + type: object + properties: + records: + type: array + items: + $ref: './common.schema.yaml#/components/schemas/Entity' + page: + type: integer + minimum: 1 + per_page: + type: integer + minimum: 1 + maximum: 1000 + total: + type: integer + minimum: 0 + inspect: + $ref: '../common.schema.yaml#/components/schemas/InspectQuery' + required: + - records + - page + - per_page + - total diff --git a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts index c08f807d4926b..5c9d33858d0f7 100644 --- a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts +++ b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts @@ -269,6 +269,10 @@ import type { StopEntityStoreRequestParamsInput, StopEntityStoreResponse, } from './entity_analytics/entity_store/engine/stop.gen'; +import type { + ListEntitiesRequestQueryInput, + ListEntitiesResponse, +} from './entity_analytics/entity_store/entities/list_entities.gen'; import type { DisableRiskEngineResponse } from './entity_analytics/risk_engine/engine_disable_route.gen'; import type { EnableRiskEngineResponse } from './entity_analytics/risk_engine/engine_enable_route.gen'; import type { InitRiskEngineResponse } from './entity_analytics/risk_engine/engine_init_route.gen'; @@ -511,7 +515,9 @@ after 30 days. It also deletes other artifacts specific to the migration impleme .catch(catchAxiosErrorFormatAndThrow); } /** - * Retrieves a clean draft timeline. If a draft timeline does not exist, it is created and returned. + * Create a clean draft Timeline or Timeline template for the current user. +> info +> If the user already has a draft Timeline, the existing draft Timeline is cleared and returned. */ async cleanDraftTimelines(props: CleanDraftTimelinesProps) { @@ -589,6 +595,9 @@ Migrations are initiated per index. While the process is neither destructive nor }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Create a new Timeline or Timeline template. + */ async createTimelines(props: CreateTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API CreateTimelines`); return this.kbnClient @@ -661,6 +670,9 @@ Migrations are initiated per index. While the process is neither destructive nor }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Delete a note from a Timeline using the note ID. + */ async deleteNote(props: DeleteNoteProps) { this.log.info(`${new Date().toISOString()} Calling API DeleteNote`); return this.kbnClient @@ -691,6 +703,9 @@ Migrations are initiated per index. While the process is neither destructive nor }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Delete one or more Timelines or Timeline templates. + */ async deleteTimelines(props: DeleteTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API DeleteTimelines`); return this.kbnClient @@ -1045,6 +1060,9 @@ Migrations are initiated per index. While the process is neither destructive nor }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Export Timelines as an NDJSON file. + */ async exportTimelines(props: ExportTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API ExportTimelines`); return this.kbnClient @@ -1155,6 +1173,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get the details of the draft Timeline or Timeline template for the current user. If the user doesn't have a draft Timeline, an empty Timeline is returned. + */ async getDraftTimelines(props: GetDraftTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API GetDraftTimelines`); return this.kbnClient @@ -1221,7 +1242,7 @@ finalize it. .catch(catchAxiosErrorFormatAndThrow); } /** - * Gets notes + * Get all notes for a given document. */ async getNotes(props: GetNotesProps) { this.log.info(`${new Date().toISOString()} Calling API GetNotes`); @@ -1315,6 +1336,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get the details of an existing saved Timeline or Timeline template. + */ async getTimeline(props: GetTimelineProps) { this.log.info(`${new Date().toISOString()} Calling API GetTimeline`); return this.kbnClient @@ -1329,6 +1353,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Get a list of all saved Timelines or Timeline templates. + */ async getTimelines(props: GetTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API GetTimelines`); return this.kbnClient @@ -1363,6 +1390,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Import Timelines. + */ async importTimelines(props: ImportTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API ImportTimelines`); return this.kbnClient @@ -1419,6 +1449,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Install or update prepackaged Timelines. + */ async installPrepackedTimelines(props: InstallPrepackedTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API InstallPrepackedTimelines`); return this.kbnClient @@ -1445,6 +1478,23 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * List entities records, paging, sorting and filtering as needed. + */ + async listEntities(props: ListEntitiesProps) { + this.log.info(`${new Date().toISOString()} Calling API ListEntities`); + return this.kbnClient + .request({ + path: '/api/entity_store/entities/list', + headers: { + [ELASTIC_HTTP_VERSION_HEADER]: '2023-10-31', + }, + method: 'GET', + + query: props.query, + }) + .catch(catchAxiosErrorFormatAndThrow); + } async listEntityStoreEngines() { this.log.info(`${new Date().toISOString()} Calling API ListEntityStoreEngines`); return this.kbnClient @@ -1474,7 +1524,7 @@ finalize it. .catch(catchAxiosErrorFormatAndThrow); } /** - * Updates an existing timeline. This API is used to update the title, description, date range, pinned events, pinned queries, and/or pinned saved queries of an existing timeline. + * Update an existing Timeline. You can update the title, description, date range, pinned events, pinned queries, and/or pinned saved queries of an existing Timeline. */ async patchTimeline(props: PatchTimelineProps) { this.log.info(`${new Date().toISOString()} Calling API PatchTimeline`); @@ -1506,6 +1556,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Favorite a Timeline or Timeline template for the current user. + */ async persistFavoriteRoute(props: PersistFavoriteRouteProps) { this.log.info(`${new Date().toISOString()} Calling API PersistFavoriteRoute`); return this.kbnClient @@ -1519,6 +1572,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Add a note to a Timeline or update an existing note. + */ async persistNoteRoute(props: PersistNoteRouteProps) { this.log.info(`${new Date().toISOString()} Calling API PersistNoteRoute`); return this.kbnClient @@ -1532,6 +1588,9 @@ finalize it. }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Pin an event to an existing Timeline. + */ async persistPinnedEventRoute(props: PersistPinnedEventRouteProps) { this.log.info(`${new Date().toISOString()} Calling API PersistPinnedEventRoute`); return this.kbnClient @@ -2066,6 +2125,9 @@ export interface InstallPrepackedTimelinesProps { export interface InternalUploadAssetCriticalityRecordsProps { attachment: FormData; } +export interface ListEntitiesProps { + query: ListEntitiesRequestQueryInput; +} export interface PatchRuleProps { body: PatchRuleRequestBodyInput; } diff --git a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml index e5e9f3ed4cfc6..5e1fbff1f296d 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml @@ -15,13 +15,15 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: CleanDraftTimelines - summary: Retrieves a draft timeline or timeline template. + summary: Create a clean draft Timeline or Timeline template description: | - Retrieves a clean draft timeline. If a draft timeline does not exist, it is created and returned. + Create a clean draft Timeline or Timeline template for the current user. + > info + > If the user already has a draft Timeline, the existing draft Timeline is cleared and returned. tags: - access:securitySolution requestBody: - description: The type of timeline to create. Valid values are `default` and `template`. + description: The type of Timeline to create. Valid values are `default` and `template`. required: true content: application/json: @@ -33,7 +35,7 @@ paths: $ref: '../model/components.schema.yaml#/components/schemas/TimelineType' responses: '200': - description: Indicates that the draft timeline was successfully created. In the event the user already has a draft timeline, the existing draft timeline is cleared and returned. + description: Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft Timeline is cleared and returned. content: application/json: schema: @@ -51,7 +53,7 @@ paths: timeline: $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' '403': - description: Indicates that the user does not have the required permissions to create a draft timeline. + description: Indicates that the user does not have the required permissions to create a draft Timeline. content: application:json: schema: @@ -62,7 +64,7 @@ paths: status_code: type: number '409': - description: Indicates that there is already a draft timeline with the given timelineId. + description: Indicates that there is already a draft Timeline with the given `timelineId`. content: application:json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml index 561ce75c84fe2..9dce2658694ab 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml @@ -18,11 +18,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: CreateTimelines - summary: Creates a new timeline. + summary: Create a Timeline or Timeline template + description: Create a new Timeline or Timeline template. tags: - access:securitySolution requestBody: - description: The required timeline fields used to create a new timeline along with optional fields that will be created if not provided. + description: The required Timeline fields used to create a new Timeline, along with optional fields that will be created if not provided. required: true content: application/json: @@ -53,7 +54,7 @@ paths: $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' responses: '200': - description: Indicates the timeline was successfully created. + description: Indicates the Timeline was successfully created. content: application/json: schema: @@ -70,7 +71,7 @@ paths: timeline: $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' '405': - description: Indicates that there was an error in the timeline creation. + description: Indicates that there was an error in the Timeline creation. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml index b330cc82d2fdc..02a75d4e0ac77 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml @@ -15,11 +15,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: DeleteNote - summary: Deletes a note from a timeline. + summary: Delete a note + description: Delete a note from a Timeline using the note ID. tags: - access:securitySolution requestBody: - description: The id of the note to delete. + description: The ID of the note to delete. required: true content: application/json: diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml index 85c1b7c9a6736..7a0a168747d47 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml @@ -18,11 +18,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: DeleteTimelines - summary: Deletes one or more timelines or timeline templates. + summary: Delete Timelines or Timeline templates + description: Delete one or more Timelines or Timeline templates. tags: - access:securitySolution requestBody: - description: The ids of the timelines or timeline templates to delete. + description: The IDs of the Timelines or Timeline templates to delete. required: true content: application/json: @@ -41,7 +42,7 @@ paths: type: string responses: '200': - description: Indicates the timeline was successfully deleted. + description: Indicates the Timeline was successfully deleted. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml index 2c0a367dc5d28..44ef7d0f3abe0 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml @@ -18,7 +18,8 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: ExportTimelines - summary: Exports timelines as an NDJSON file + summary: Export Timelines + description: Export Timelines as an NDJSON file. tags: - access:securitySolution parameters: @@ -29,7 +30,7 @@ paths: type: string description: The name of the file to export requestBody: - description: The ids of the timelines to export + description: The IDs of the Timelines to export. required: true content: application/json: @@ -43,14 +44,14 @@ paths: type: string responses: '200': - description: Indicates the timelines were successfully exported + description: Indicates the Timelines were successfully exported. content: application/ndjson: schema: type: string - description: NDJSON of the exported timelines + description: NDJSON of the exported Timelines '400': - description: Indicates that the export size limit was exceeded + description: Indicates that the export size limit was exceeded. content: application/ndjson: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml index c7a77af98a7f3..21cabb87cd335 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml @@ -15,7 +15,8 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: GetDraftTimelines - summary: Retrieves the draft timeline for the current user. If the user does not have a draft timeline, an empty timeline is returned. + summary: Get draft Timeline or Timeline template details + description: Get the details of the draft Timeline or Timeline template for the current user. If the user doesn't have a draft Timeline, an empty Timeline is returned. tags: - access:securitySolution parameters: @@ -26,7 +27,7 @@ paths: $ref: '../model/components.schema.yaml#/components/schemas/TimelineType' responses: '200': - description: Indicates that the draft timeline was successfully retrieved. + description: Indicates that the draft Timeline was successfully retrieved. content: application/json: schema: @@ -44,7 +45,7 @@ paths: timeline: $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' '403': - description: If a draft timeline was not found and we attempted to create one, it indicates that the user does not have the required permissions to create a draft timeline. + description: If a draft Timeline was not found and we attempted to create one, it indicates that the user does not have the required permissions to create a draft Timeline. content: application:json: schema: @@ -55,7 +56,7 @@ paths: status_code: type: number '409': - description: This should never happen, but if a draft timeline was not found and we attempted to create one, it indicates that there is already a draft timeline with the given timelineId. + description: This should never happen, but if a draft Timeline was not found and we attempted to create one, it indicates that there is already a draft Timeline with the given `timelineId`. content: application:json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml index f2e58e2b4e729..19b5d2074d18e 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml @@ -15,8 +15,8 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: GetNotes - description: Gets notes - summary: Get all notes for a given document. + description: Get all notes for a given document. + summary: Get notes tags: - access:securitySolution parameters: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts index 77c8edb5c69b0..622545e22b37a 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts @@ -25,7 +25,7 @@ export const GetTimelineRequestQuery = z.object({ */ template_timeline_id: z.string().optional(), /** - * The ID of the timeline to retrieve + * The ID of the Timeline to retrieve. */ id: z.string().optional(), }); diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml index 9a94bafb63a76..d0944bc0fcb10 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml @@ -18,7 +18,8 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: GetTimeline - summary: Get an existing saved timeline or timeline template. This API is used to retrieve an existing saved timeline or timeline template. + summary: Get Timeline or Timeline template details + description: Get the details of an existing saved Timeline or Timeline template. tags: - access:securitySolution parameters: @@ -31,10 +32,10 @@ paths: name: id schema: type: string - description: The ID of the timeline to retrieve + description: The ID of the Timeline to retrieve. responses: '200': - description: Indicates that the (template) timeline was found and returned. + description: Indicates that the (template) Timeline was found and returned. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml index 189865a9344d4..f889af73e10d7 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml @@ -18,7 +18,8 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: GetTimelines - summary: This API is used to retrieve a list of existing saved timelines or timeline templates. + summary: Get Timelines or Timeline templates + description: Get a list of all saved Timelines or Timeline templates. tags: - access:securitySolution parameters: @@ -69,7 +70,7 @@ paths: nullable: true responses: '200': - description: Indicates that the (template) timelines were found and returned. + description: Indicates that the (template) Timelines were found and returned. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml index 9925ae10322e6..34a35aa59db0e 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml @@ -18,11 +18,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: ImportTimelines - summary: Imports timelines. + summary: Import Timelines + description: Import Timelines. tags: - access:securitySolution requestBody: - description: The timelines to import as a readable stream. + description: The Timelines to import as a readable stream. required: true content: application/json: @@ -50,7 +51,7 @@ paths: - 'false' responses: '200': - description: Indicates the import of timelines was successful. + description: Indicates the import of Timelines was successful. content: application/json: schema: @@ -61,7 +62,7 @@ paths: $ref: '../model/components.schema.yaml#/components/schemas/ImportTimelineResult' '400': - description: Indicates the import of timelines was unsuccessful because of an invalid file extension. + description: Indicates the import of Timelines was unsuccessful because of an invalid file extension. content: application/json: schema: @@ -86,7 +87,7 @@ paths: statusCode: type: number '409': - description: Indicates the import of timelines was unsuccessful. + description: Indicates the import of Timelines was unsuccessful. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml index af96bbeb9c6d2..7dfa5afbbe5ed 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml @@ -15,11 +15,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: InstallPrepackedTimelines - summary: Installs prepackaged timelines. + summary: Install prepackaged Timelines + description: Install or update prepackaged Timelines. tags: - access:securitySolution requestBody: - description: The timelines to install or update. + description: The Timelines to install or update. required: true content: application/json: @@ -43,7 +44,7 @@ paths: $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' responses: '200': - description: Indicates the installation of prepackaged timelines was successful. + description: Indicates the installation of prepackaged Timelines was successful. content: application/json: schema: @@ -53,7 +54,7 @@ paths: data: $ref: '../model/components.schema.yaml#/components/schemas/ImportTimelineResult' '500': - description: Indicates the installation of prepackaged timelines was unsuccessful. + description: Indicates the installation of prepackaged Timelines was unsuccessful. content: application:json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml index 04d6de3cc3f87..31ff7d8312673 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml @@ -15,12 +15,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: PatchTimeline - summary: Updates an existing timeline. - description: Updates an existing timeline. This API is used to update the title, description, date range, pinned events, pinned queries, and/or pinned saved queries of an existing timeline. + summary: Update a Timeline + description: Update an existing Timeline. You can update the title, description, date range, pinned events, pinned queries, and/or pinned saved queries of an existing Timeline. tags: - access:securitySolution requestBody: - description: The timeline updates along with the timeline ID and version. + description: The Timeline updates, along with the Timeline ID and version. required: true content: application/json: @@ -38,7 +38,7 @@ paths: $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' responses: '200': - description: Indicates that the draft timeline was successfully created. In the event the user already has a draft timeline, the existing draft timeline is cleared and returned. + description: Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft Timeline is cleared and returned. content: application/json: schema: @@ -56,7 +56,7 @@ paths: timeline: $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' '405': - description: Indicates that the user does not have the required access to create a draft timeline. + description: Indicates that the user does not have the required access to create a draft Timeline. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml index 87a9e4d21ac68..9ad4d03901d70 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml @@ -15,11 +15,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: PersistFavoriteRoute - summary: Persists a given users favorite status of a timeline. + summary: Favorite a Timeline or Timeline template + description: Favorite a Timeline or Timeline template for the current user. tags: - access:securitySolution requestBody: - description: The required fields used to favorite a (template) timeline. + description: The required fields used to favorite a (template) Timeline. required: true content: application/json: diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml index e5de10d97e013..41ae12c974d6f 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml @@ -18,11 +18,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: PersistNoteRoute - summary: Persists a note to a timeline. + summary: Add or update a note + description: Add a note to a Timeline or update an existing note. tags: - access:securitySolution requestBody: - description: The note to persist or update along with additional metadata. + description: The note to add or update, along with additional metadata. required: true content: application/json: diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml index dd16dda4f273c..de6ff200257c4 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml @@ -18,11 +18,12 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: PersistPinnedEventRoute - summary: Persists a pinned event to a timeline. + summary: Pin an event + description: Pin an event to an existing Timeline. tags: - access:securitySolution requestBody: - description: The pinned event to persist or update along with additional metadata. + description: The pinned event to add or update, along with additional metadata. required: true content: application/json: @@ -39,7 +40,7 @@ paths: type: string responses: '200': - description: Indicate the event was successfully pinned in the timeline. + description: Indicates the event was successfully pinned to the Timeline. content: application/json: schema: diff --git a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml index 6c2b0d309f01f..ee26ac4a97896 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml @@ -15,7 +15,7 @@ paths: x-labels: [serverless, ess] x-codegen-enabled: true operationId: ResolveTimeline - summary: Get an existing saved timeline or timeline template. + summary: Get an existing saved Timeline or Timeline template tags: - access:securitySolution parameters: @@ -31,7 +31,7 @@ paths: description: The ID of the timeline to resolve responses: '200': - description: The (template) timeline has been found + description: The (template) Timeline has been found content: application/json: schema: @@ -48,4 +48,4 @@ paths: '400': description: The request is missing parameters '404': - description: The (template) timeline was not found + description: The (template) Timeline was not found diff --git a/x-pack/plugins/security_solution/common/detection_engine/utils.ts b/x-pack/plugins/security_solution/common/detection_engine/utils.ts index e0cefdebecd93..503e0c58ff46e 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/utils.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/utils.ts @@ -93,3 +93,14 @@ export const isSuppressionRuleConfiguredWithMissingFields = (ruleType: Type) => export const isSuppressionRuleInGA = (ruleType: Type): boolean => { return isSuppressibleAlertRule(ruleType) && SUPPRESSIBLE_ALERT_RULES_GA.includes(ruleType); }; + +export const shouldShowResponseActions = ( + ruleType: Type | undefined, + automatedResponseActionsForMoreRulesEnabled: boolean +) => { + return ( + isQueryRule(ruleType) || + (automatedResponseActionsForMoreRulesEnabled && + (isEsqlRule(ruleType) || isEqlRule(ruleType) || isNewTermsRule(ruleType))) + ); +}; diff --git a/x-pack/plugins/observability_solution/uptime/common/rules/status_rule.ts b/x-pack/plugins/security_solution/common/entity_analytics/entity_store/constants.ts similarity index 52% rename from x-pack/plugins/observability_solution/uptime/common/rules/status_rule.ts rename to x-pack/plugins/security_solution/common/entity_analytics/entity_store/constants.ts index 375e0c0dd08c1..157ec6845e33a 100644 --- a/x-pack/plugins/observability_solution/uptime/common/rules/status_rule.ts +++ b/x-pack/plugins/security_solution/common/entity_analytics/entity_store/constants.ts @@ -5,8 +5,11 @@ * 2.0. */ -import { schema, TypeOf } from '@kbn/config-schema'; +/** + * Entity Store routes + */ -export const StatusRulePramsSchema = schema.object({}); +export const ENTITY_STORE_URL = '/api/entity_store' as const; +export const ENTITIES_URL = `${ENTITY_STORE_URL}/entities` as const; -export type StatusRuleParams = TypeOf; +export const LIST_ENTITIES_URL = `${ENTITIES_URL}/list` as const; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index e11965653526f..4147404e940c1 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -52,6 +52,11 @@ export const allowedExperimentalValues = Object.freeze({ */ automatedProcessActionsEnabled: true, + /** + * Temporary feature flag to enable the Response Actions in Rules UI - intermediate release + */ + automatedResponseActionsForMoreRulesEnabled: false, + /** * Enables the ability to send Response actions to SentinelOne and persist the results * in ES. Adds API changes to support `agentType` and supports `isolate` and `release` @@ -108,6 +113,11 @@ export const allowedExperimentalValues = Object.freeze({ */ assistantBedrockChat: true, + /** + * Enables the NaturalLanguageESQLTool and disables the ESQLKnowledgeBaseTool, introduced in `8.16.0`. + */ + assistantNaturalLanguageESQLTool: false, + /** * Enables the Managed User section inside the new user details flyout. */ diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_detections_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_detections_api_2023_10_31.bundled.schema.yaml index dcee1694a4aeb..8642113778fe0 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_detections_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_detections_api_2023_10_31.bundled.schema.yaml @@ -2042,6 +2042,10 @@ components: $ref: '#/components/schemas/RuleFilterArray' index: $ref: '#/components/schemas/IndexPatternArray' + response_actions: + items: + $ref: '#/components/schemas/ResponseAction' + type: array tiebreaker_field: $ref: '#/components/schemas/TiebreakerField' timestamp_field: @@ -2729,6 +2733,10 @@ components: properties: alert_suppression: $ref: '#/components/schemas/AlertSuppression' + response_actions: + items: + $ref: '#/components/schemas/ResponseAction' + type: array EsqlRulePatchProps: allOf: - type: object @@ -3873,6 +3881,10 @@ components: $ref: '#/components/schemas/RuleFilterArray' index: $ref: '#/components/schemas/IndexPatternArray' + response_actions: + items: + $ref: '#/components/schemas/ResponseAction' + type: array NewTermsRulePatchFields: allOf: - type: object diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml index 9e56395f2af75..58729b3729f45 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml @@ -437,6 +437,82 @@ paths: summary: Stop the Entity Store engine tags: - Security Solution Entity Analytics API + /api/entity_store/entities/list: + get: + description: 'List entities records, paging, sorting and filtering as needed.' + operationId: ListEntities + parameters: + - in: query + name: sort_field + required: false + schema: + type: string + - in: query + name: sort_order + required: false + schema: + enum: + - asc + - desc + type: string + - in: query + name: page + required: false + schema: + minimum: 1 + type: integer + - in: query + name: per_page + required: false + schema: + maximum: 10000 + minimum: 1 + type: integer + - description: An ES query to filter by. + in: query + name: filterQuery + required: false + schema: + type: string + - in: query + name: entities_types + required: true + schema: + items: + $ref: '#/components/schemas/EntityType' + type: array + responses: + '200': + content: + application/json: + schema: + type: object + properties: + inspect: + $ref: '#/components/schemas/InspectQuery' + page: + minimum: 1 + type: integer + per_page: + maximum: 1000 + minimum: 1 + type: integer + records: + items: + $ref: '#/components/schemas/Entity' + type: array + total: + minimum: 0 + type: integer + required: + - records + - page + - per_page + - total + description: Entities returned successfully + summary: List Entity Store Entities + tags: + - Security Solution Entity Analytics API /api/risk_score/engine/schedule_now: post: operationId: ScheduleRiskEngineNow @@ -549,11 +625,90 @@ components: - started - stopped type: string + Entity: + oneOf: + - $ref: '#/components/schemas/UserEntity' + - $ref: '#/components/schemas/HostEntity' EntityType: enum: - user - host type: string + HostEntity: + type: object + properties: + entity: + type: object + properties: + definitionId: + type: string + definitionVersion: + type: string + displayName: + type: string + firstSeenTimestamp: + format: date-time + type: string + id: + type: string + identityFields: + items: + type: string + type: array + lastSeenTimestamp: + format: date-time + type: string + schemaVersion: + type: string + type: + enum: + - node + type: string + required: + - lastSeenTimestamp + - schemaVersion + - definitionVersion + - displayName + - identityFields + - id + - type + - firstSeenTimestamp + - definitionId + host: + type: object + properties: + architecture: + items: + type: string + type: array + domain: + items: + type: string + type: array + hostname: + items: + type: string + type: array + id: + items: + type: string + type: array + ip: + items: + type: string + type: array + mac: + items: + type: string + type: array + name: + type: string + type: + items: + type: string + type: array + required: + - name IdField: enum: - host.name @@ -561,6 +716,20 @@ components: type: string IndexPattern: type: string + InspectQuery: + type: object + properties: + dsl: + items: + type: string + type: array + response: + items: + type: string + type: array + required: + - dsl + - response RiskEngineScheduleNowErrorResponse: type: object properties: @@ -588,6 +757,77 @@ components: required: - status_code - message + UserEntity: + type: object + properties: + entity: + type: object + properties: + definitionId: + type: string + definitionVersion: + type: string + displayName: + type: string + firstSeenTimestamp: + format: date-time + type: string + id: + type: string + identityFields: + items: + type: string + type: array + lastSeenTimestamp: + format: date-time + type: string + schemaVersion: + type: string + type: + enum: + - node + type: string + required: + - lastSeenTimestamp + - schemaVersion + - definitionVersion + - displayName + - identityFields + - id + - type + - firstSeenTimestamp + - definitionId + user: + type: object + properties: + domain: + items: + type: string + type: array + email: + items: + type: string + type: array + full_name: + items: + type: string + type: array + hash: + items: + type: string + type: array + id: + items: + type: string + type: array + name: + type: string + roles: + items: + type: string + type: array + required: + - name securitySchemes: BasicAuth: scheme: basic diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index e658a2df0284c..c5aa5c5385521 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -15,6 +15,7 @@ servers: paths: /api/note: delete: + description: Delete a note from a Timeline using the note ID. operationId: DeleteNote requestBody: content: @@ -37,7 +38,7 @@ paths: type: array required: - noteIds - description: The id of the note to delete. + description: The ID of the note to delete. required: true responses: '200': @@ -49,12 +50,12 @@ paths: data: type: object description: Indicates the note was successfully deleted. - summary: Deletes a note from a timeline. + summary: Delete a note tags: - Security Solution Timeline API - 'access:securitySolution' get: - description: Gets notes + description: Get all notes for a given document. operationId: GetNotes parameters: - in: query @@ -95,11 +96,12 @@ paths: responses: '200': description: Indicates the requested notes were returned. - summary: Get all notes for a given document. + summary: Get notes tags: - Security Solution Timeline API - 'access:securitySolution' patch: + description: Add a note to a Timeline or update an existing note. operationId: PersistNoteRoute requestBody: content: @@ -129,7 +131,7 @@ paths: type: string required: - note - description: The note to persist or update along with additional metadata. + description: 'The note to add or update, along with additional metadata.' required: true responses: '200': @@ -159,12 +161,13 @@ paths: required: - data description: Indicates the note was successfully created. - summary: Persists a note to a timeline. + summary: Add or update a note tags: - Security Solution Timeline API - 'access:securitySolution' /api/pinned_event: patch: + description: Pin an event to an existing Timeline. operationId: PersistPinnedEventRoute requestBody: content: @@ -182,7 +185,7 @@ paths: required: - eventId - timelineId - description: The pinned event to persist or update along with additional metadata. + description: 'The pinned event to add or update, along with additional metadata.' required: true responses: '200': @@ -207,13 +210,14 @@ paths: - persistPinnedEventOnTimeline required: - data - description: Indicate the event was successfully pinned in the timeline. - summary: Persists a pinned event to a timeline. + description: Indicates the event was successfully pinned to the Timeline. + summary: Pin an event tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline: delete: + description: Delete one or more Timelines or Timeline templates. operationId: DeleteTimelines requestBody: content: @@ -234,7 +238,7 @@ paths: type: array required: - savedObjectIds - description: The ids of the timelines or timeline templates to delete. + description: The IDs of the Timelines or Timeline templates to delete. required: true responses: '200': @@ -252,12 +256,13 @@ paths: - deleteTimeline required: - data - description: Indicates the timeline was successfully deleted. - summary: Deletes one or more timelines or timeline templates. + description: Indicates the Timeline was successfully deleted. + summary: Delete Timelines or Timeline templates tags: - Security Solution Timeline API - 'access:securitySolution' get: + description: Get the details of an existing saved Timeline or Timeline template. operationId: GetTimeline parameters: - description: The ID of the template timeline to retrieve @@ -265,7 +270,7 @@ paths: name: template_timeline_id schema: type: string - - description: The ID of the timeline to retrieve + - description: The ID of the Timeline to retrieve. in: query name: id schema: @@ -287,18 +292,16 @@ paths: - getOneTimeline required: - data - description: Indicates that the (template) timeline was found and returned. - summary: >- - Get an existing saved timeline or timeline template. This API is used to - retrieve an existing saved timeline or timeline template. + description: Indicates that the (template) Timeline was found and returned. + summary: Get Timeline or Timeline template details tags: - Security Solution Timeline API - 'access:securitySolution' patch: description: >- - Updates an existing timeline. This API is used to update the title, - description, date range, pinned events, pinned queries, and/or pinned - saved queries of an existing timeline. + Update an existing Timeline. You can update the title, description, date + range, pinned events, pinned queries, and/or pinned saved queries of an + existing Timeline. operationId: PatchTimeline requestBody: content: @@ -318,7 +321,7 @@ paths: - timelineId - version - timeline - description: The timeline updates along with the timeline ID and version. + description: 'The Timeline updates, along with the Timeline ID and version.' required: true responses: '200': @@ -342,9 +345,9 @@ paths: required: - data description: >- - Indicates that the draft timeline was successfully created. In the - event the user already has a draft timeline, the existing draft - timeline is cleared and returned. + Indicates that the draft Timeline was successfully created. In the + event the user already has a draft Timeline, the existing draft + Timeline is cleared and returned. '405': content: application/json: @@ -357,12 +360,13 @@ paths: type: number description: >- Indicates that the user does not have the required access to create - a draft timeline. - summary: Updates an existing timeline. + a draft Timeline. + summary: Update a Timeline tags: - Security Solution Timeline API - 'access:securitySolution' post: + description: Create a new Timeline or Timeline template. operationId: CreateTimelines requestBody: content: @@ -393,7 +397,7 @@ paths: required: - timeline description: >- - The required timeline fields used to create a new timeline along with + The required Timeline fields used to create a new Timeline, along with optional fields that will be created if not provided. required: true responses: @@ -415,7 +419,7 @@ paths: - persistTimeline required: - data - description: Indicates the timeline was successfully created. + description: Indicates the Timeline was successfully created. '405': content: application/json: @@ -426,13 +430,17 @@ paths: type: string statusCode: type: number - description: Indicates that there was an error in the timeline creation. - summary: Creates a new timeline. + description: Indicates that there was an error in the Timeline creation. + summary: Create a Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_draft: get: + description: >- + Get the details of the draft Timeline or Timeline template for the + current user. If the user doesn't have a draft Timeline, an empty + Timeline is returned. operationId: GetDraftTimelines parameters: - in: query @@ -461,7 +469,7 @@ paths: - persistTimeline required: - data - description: Indicates that the draft timeline was successfully retrieved. + description: Indicates that the draft Timeline was successfully retrieved. '403': content: 'application:json': @@ -473,9 +481,9 @@ paths: status_code: type: number description: >- - If a draft timeline was not found and we attempted to create one, it + If a draft Timeline was not found and we attempted to create one, it indicates that the user does not have the required permissions to - create a draft timeline. + create a draft Timeline. '409': content: 'application:json': @@ -487,19 +495,21 @@ paths: status_code: type: number description: >- - This should never happen, but if a draft timeline was not found and + This should never happen, but if a draft Timeline was not found and we attempted to create one, it indicates that there is already a - draft timeline with the given timelineId. - summary: >- - Retrieves the draft timeline for the current user. If the user does not - have a draft timeline, an empty timeline is returned. + draft Timeline with the given `timelineId`. + summary: Get draft Timeline or Timeline template details tags: - Security Solution Timeline API - 'access:securitySolution' post: description: > - Retrieves a clean draft timeline. If a draft timeline does not exist, it - is created and returned. + Create a clean draft Timeline or Timeline template for the current user. + + > info + + > If the user already has a draft Timeline, the existing draft Timeline + is cleared and returned. operationId: CleanDraftTimelines requestBody: content: @@ -512,7 +522,7 @@ paths: required: - timelineType description: >- - The type of timeline to create. Valid values are `default` and + The type of Timeline to create. Valid values are `default` and `template`. required: true responses: @@ -537,9 +547,9 @@ paths: required: - data description: >- - Indicates that the draft timeline was successfully created. In the - event the user already has a draft timeline, the existing draft - timeline is cleared and returned. + Indicates that the draft Timeline was successfully created. In the + event the user already has a draft Timeline, the existing draft + Timeline is cleared and returned. '403': content: 'application:json': @@ -552,7 +562,7 @@ paths: type: number description: >- Indicates that the user does not have the required permissions to - create a draft timeline. + create a draft Timeline. '409': content: 'application:json': @@ -564,14 +574,15 @@ paths: status_code: type: number description: >- - Indicates that there is already a draft timeline with the given - timelineId. - summary: Retrieves a draft timeline or timeline template. + Indicates that there is already a draft Timeline with the given + `timelineId`. + summary: Create a clean draft Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_export: post: + description: Export Timelines as an NDJSON file. operationId: ExportTimelines parameters: - description: The name of the file to export @@ -591,16 +602,16 @@ paths: type: string nullable: true type: array - description: The ids of the timelines to export + description: The IDs of the Timelines to export. required: true responses: '200': content: application/ndjson: schema: - description: NDJSON of the exported timelines + description: NDJSON of the exported Timelines type: string - description: Indicates the timelines were successfully exported + description: Indicates the Timelines were successfully exported. '400': content: application/ndjson: @@ -611,13 +622,14 @@ paths: type: string statusCode: type: number - description: Indicates that the export size limit was exceeded - summary: Exports timelines as an NDJSON file + description: Indicates that the export size limit was exceeded. + summary: Export Timelines tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_favorite: patch: + description: Favorite a Timeline or Timeline template for the current user. operationId: PersistFavoriteRoute requestBody: content: @@ -642,7 +654,7 @@ paths: - templateTimelineId - templateTimelineVersion - timelineType - description: The required fields used to favorite a (template) timeline. + description: The required fields used to favorite a (template) Timeline. required: true responses: '200': @@ -674,12 +686,13 @@ paths: description: >- Indicates the user does not have the required permissions to persist the favorite status. - summary: Persists a given users favorite status of a timeline. + summary: Favorite a Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_import: post: + description: Import Timelines. operationId: ImportTimelines requestBody: content: @@ -709,7 +722,7 @@ paths: - headers required: - hapi - description: The timelines to import as a readable stream. + description: The Timelines to import as a readable stream. required: true responses: '200': @@ -722,7 +735,7 @@ paths: $ref: '#/components/schemas/ImportTimelineResult' required: - data - description: Indicates the import of timelines was successful. + description: Indicates the import of Timelines was successful. '400': content: application/json: @@ -736,7 +749,7 @@ paths: statusCode: type: number description: >- - Indicates the import of timelines was unsuccessful because of an + Indicates the import of Timelines was unsuccessful because of an invalid file extension. '404': content: @@ -763,13 +776,14 @@ paths: type: string statusCode: type: number - description: Indicates the import of timelines was unsuccessful. - summary: Imports timelines. + description: Indicates the import of Timelines was unsuccessful. + summary: Import Timelines tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_prepackaged: post: + description: Install or update prepackaged Timelines. operationId: InstallPrepackedTimelines requestBody: content: @@ -795,7 +809,7 @@ paths: - timelinesToInstall - timelinesToUpdate - prepackagedTimelines - description: The timelines to install or update. + description: The Timelines to install or update. required: true responses: '200': @@ -808,7 +822,7 @@ paths: $ref: '#/components/schemas/ImportTimelineResult' required: - data - description: Indicates the installation of prepackaged timelines was successful. + description: Indicates the installation of prepackaged Timelines was successful. '500': content: 'application:json': @@ -820,9 +834,9 @@ paths: statusCode: type: number description: >- - Indicates the installation of prepackaged timelines was + Indicates the installation of prepackaged Timelines was unsuccessful. - summary: Installs prepackaged timelines. + summary: Install prepackaged Timelines tags: - Security Solution Timeline API - 'access:securitySolution' @@ -857,17 +871,18 @@ paths: - getOneTimeline required: - data - description: The (template) timeline has been found + description: The (template) Timeline has been found '400': description: The request is missing parameters '404': - description: The (template) timeline was not found - summary: Get an existing saved timeline or timeline template. + description: The (template) Timeline was not found + summary: Get an existing saved Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timelines: get: + description: Get a list of all saved Timelines or Timeline templates. operationId: GetTimelines parameters: - description: >- @@ -953,7 +968,7 @@ paths: - customTemplateTimelineCount required: - data - description: Indicates that the (template) timelines were found and returned. + description: Indicates that the (template) Timelines were found and returned. '400': content: 'application:json': @@ -965,9 +980,7 @@ paths: statusCode: type: number description: Bad request. The user supplied invalid data. - summary: >- - This API is used to retrieve a list of existing saved timelines or - timeline templates. + summary: Get Timelines or Timeline templates tags: - Security Solution Timeline API - 'access:securitySolution' diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_detections_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_detections_api_2023_10_31.bundled.schema.yaml index e3a294c9f92a5..514c4c87405cd 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_detections_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_detections_api_2023_10_31.bundled.schema.yaml @@ -1316,6 +1316,10 @@ components: $ref: '#/components/schemas/RuleFilterArray' index: $ref: '#/components/schemas/IndexPatternArray' + response_actions: + items: + $ref: '#/components/schemas/ResponseAction' + type: array tiebreaker_field: $ref: '#/components/schemas/TiebreakerField' timestamp_field: @@ -2003,6 +2007,10 @@ components: properties: alert_suppression: $ref: '#/components/schemas/AlertSuppression' + response_actions: + items: + $ref: '#/components/schemas/ResponseAction' + type: array EsqlRulePatchProps: allOf: - type: object @@ -3026,6 +3034,10 @@ components: $ref: '#/components/schemas/RuleFilterArray' index: $ref: '#/components/schemas/IndexPatternArray' + response_actions: + items: + $ref: '#/components/schemas/ResponseAction' + type: array NewTermsRulePatchFields: allOf: - type: object diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml index 754c8f94d1c63..ff4a6f54afe9b 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml @@ -437,6 +437,82 @@ paths: summary: Stop the Entity Store engine tags: - Security Solution Entity Analytics API + /api/entity_store/entities/list: + get: + description: 'List entities records, paging, sorting and filtering as needed.' + operationId: ListEntities + parameters: + - in: query + name: sort_field + required: false + schema: + type: string + - in: query + name: sort_order + required: false + schema: + enum: + - asc + - desc + type: string + - in: query + name: page + required: false + schema: + minimum: 1 + type: integer + - in: query + name: per_page + required: false + schema: + maximum: 10000 + minimum: 1 + type: integer + - description: An ES query to filter by. + in: query + name: filterQuery + required: false + schema: + type: string + - in: query + name: entities_types + required: true + schema: + items: + $ref: '#/components/schemas/EntityType' + type: array + responses: + '200': + content: + application/json: + schema: + type: object + properties: + inspect: + $ref: '#/components/schemas/InspectQuery' + page: + minimum: 1 + type: integer + per_page: + maximum: 1000 + minimum: 1 + type: integer + records: + items: + $ref: '#/components/schemas/Entity' + type: array + total: + minimum: 0 + type: integer + required: + - records + - page + - per_page + - total + description: Entities returned successfully + summary: List Entity Store Entities + tags: + - Security Solution Entity Analytics API /api/risk_score/engine/schedule_now: post: operationId: ScheduleRiskEngineNow @@ -549,11 +625,90 @@ components: - started - stopped type: string + Entity: + oneOf: + - $ref: '#/components/schemas/UserEntity' + - $ref: '#/components/schemas/HostEntity' EntityType: enum: - user - host type: string + HostEntity: + type: object + properties: + entity: + type: object + properties: + definitionId: + type: string + definitionVersion: + type: string + displayName: + type: string + firstSeenTimestamp: + format: date-time + type: string + id: + type: string + identityFields: + items: + type: string + type: array + lastSeenTimestamp: + format: date-time + type: string + schemaVersion: + type: string + type: + enum: + - node + type: string + required: + - lastSeenTimestamp + - schemaVersion + - definitionVersion + - displayName + - identityFields + - id + - type + - firstSeenTimestamp + - definitionId + host: + type: object + properties: + architecture: + items: + type: string + type: array + domain: + items: + type: string + type: array + hostname: + items: + type: string + type: array + id: + items: + type: string + type: array + ip: + items: + type: string + type: array + mac: + items: + type: string + type: array + name: + type: string + type: + items: + type: string + type: array + required: + - name IdField: enum: - host.name @@ -561,6 +716,20 @@ components: type: string IndexPattern: type: string + InspectQuery: + type: object + properties: + dsl: + items: + type: string + type: array + response: + items: + type: string + type: array + required: + - dsl + - response RiskEngineScheduleNowErrorResponse: type: object properties: @@ -588,6 +757,77 @@ components: required: - status_code - message + UserEntity: + type: object + properties: + entity: + type: object + properties: + definitionId: + type: string + definitionVersion: + type: string + displayName: + type: string + firstSeenTimestamp: + format: date-time + type: string + id: + type: string + identityFields: + items: + type: string + type: array + lastSeenTimestamp: + format: date-time + type: string + schemaVersion: + type: string + type: + enum: + - node + type: string + required: + - lastSeenTimestamp + - schemaVersion + - definitionVersion + - displayName + - identityFields + - id + - type + - firstSeenTimestamp + - definitionId + user: + type: object + properties: + domain: + items: + type: string + type: array + email: + items: + type: string + type: array + full_name: + items: + type: string + type: array + hash: + items: + type: string + type: array + id: + items: + type: string + type: array + name: + type: string + roles: + items: + type: string + type: array + required: + - name securitySchemes: BasicAuth: scheme: basic diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index d3b079e0551ab..144ea915b9a2f 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -15,6 +15,7 @@ servers: paths: /api/note: delete: + description: Delete a note from a Timeline using the note ID. operationId: DeleteNote requestBody: content: @@ -37,7 +38,7 @@ paths: type: array required: - noteIds - description: The id of the note to delete. + description: The ID of the note to delete. required: true responses: '200': @@ -49,12 +50,12 @@ paths: data: type: object description: Indicates the note was successfully deleted. - summary: Deletes a note from a timeline. + summary: Delete a note tags: - Security Solution Timeline API - 'access:securitySolution' get: - description: Gets notes + description: Get all notes for a given document. operationId: GetNotes parameters: - in: query @@ -95,11 +96,12 @@ paths: responses: '200': description: Indicates the requested notes were returned. - summary: Get all notes for a given document. + summary: Get notes tags: - Security Solution Timeline API - 'access:securitySolution' patch: + description: Add a note to a Timeline or update an existing note. operationId: PersistNoteRoute requestBody: content: @@ -129,7 +131,7 @@ paths: type: string required: - note - description: The note to persist or update along with additional metadata. + description: 'The note to add or update, along with additional metadata.' required: true responses: '200': @@ -159,12 +161,13 @@ paths: required: - data description: Indicates the note was successfully created. - summary: Persists a note to a timeline. + summary: Add or update a note tags: - Security Solution Timeline API - 'access:securitySolution' /api/pinned_event: patch: + description: Pin an event to an existing Timeline. operationId: PersistPinnedEventRoute requestBody: content: @@ -182,7 +185,7 @@ paths: required: - eventId - timelineId - description: The pinned event to persist or update along with additional metadata. + description: 'The pinned event to add or update, along with additional metadata.' required: true responses: '200': @@ -207,13 +210,14 @@ paths: - persistPinnedEventOnTimeline required: - data - description: Indicate the event was successfully pinned in the timeline. - summary: Persists a pinned event to a timeline. + description: Indicates the event was successfully pinned to the Timeline. + summary: Pin an event tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline: delete: + description: Delete one or more Timelines or Timeline templates. operationId: DeleteTimelines requestBody: content: @@ -234,7 +238,7 @@ paths: type: array required: - savedObjectIds - description: The ids of the timelines or timeline templates to delete. + description: The IDs of the Timelines or Timeline templates to delete. required: true responses: '200': @@ -252,12 +256,13 @@ paths: - deleteTimeline required: - data - description: Indicates the timeline was successfully deleted. - summary: Deletes one or more timelines or timeline templates. + description: Indicates the Timeline was successfully deleted. + summary: Delete Timelines or Timeline templates tags: - Security Solution Timeline API - 'access:securitySolution' get: + description: Get the details of an existing saved Timeline or Timeline template. operationId: GetTimeline parameters: - description: The ID of the template timeline to retrieve @@ -265,7 +270,7 @@ paths: name: template_timeline_id schema: type: string - - description: The ID of the timeline to retrieve + - description: The ID of the Timeline to retrieve. in: query name: id schema: @@ -287,18 +292,16 @@ paths: - getOneTimeline required: - data - description: Indicates that the (template) timeline was found and returned. - summary: >- - Get an existing saved timeline or timeline template. This API is used to - retrieve an existing saved timeline or timeline template. + description: Indicates that the (template) Timeline was found and returned. + summary: Get Timeline or Timeline template details tags: - Security Solution Timeline API - 'access:securitySolution' patch: description: >- - Updates an existing timeline. This API is used to update the title, - description, date range, pinned events, pinned queries, and/or pinned - saved queries of an existing timeline. + Update an existing Timeline. You can update the title, description, date + range, pinned events, pinned queries, and/or pinned saved queries of an + existing Timeline. operationId: PatchTimeline requestBody: content: @@ -318,7 +321,7 @@ paths: - timelineId - version - timeline - description: The timeline updates along with the timeline ID and version. + description: 'The Timeline updates, along with the Timeline ID and version.' required: true responses: '200': @@ -342,9 +345,9 @@ paths: required: - data description: >- - Indicates that the draft timeline was successfully created. In the - event the user already has a draft timeline, the existing draft - timeline is cleared and returned. + Indicates that the draft Timeline was successfully created. In the + event the user already has a draft Timeline, the existing draft + Timeline is cleared and returned. '405': content: application/json: @@ -357,12 +360,13 @@ paths: type: number description: >- Indicates that the user does not have the required access to create - a draft timeline. - summary: Updates an existing timeline. + a draft Timeline. + summary: Update a Timeline tags: - Security Solution Timeline API - 'access:securitySolution' post: + description: Create a new Timeline or Timeline template. operationId: CreateTimelines requestBody: content: @@ -393,7 +397,7 @@ paths: required: - timeline description: >- - The required timeline fields used to create a new timeline along with + The required Timeline fields used to create a new Timeline, along with optional fields that will be created if not provided. required: true responses: @@ -415,7 +419,7 @@ paths: - persistTimeline required: - data - description: Indicates the timeline was successfully created. + description: Indicates the Timeline was successfully created. '405': content: application/json: @@ -426,13 +430,17 @@ paths: type: string statusCode: type: number - description: Indicates that there was an error in the timeline creation. - summary: Creates a new timeline. + description: Indicates that there was an error in the Timeline creation. + summary: Create a Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_draft: get: + description: >- + Get the details of the draft Timeline or Timeline template for the + current user. If the user doesn't have a draft Timeline, an empty + Timeline is returned. operationId: GetDraftTimelines parameters: - in: query @@ -461,7 +469,7 @@ paths: - persistTimeline required: - data - description: Indicates that the draft timeline was successfully retrieved. + description: Indicates that the draft Timeline was successfully retrieved. '403': content: 'application:json': @@ -473,9 +481,9 @@ paths: status_code: type: number description: >- - If a draft timeline was not found and we attempted to create one, it + If a draft Timeline was not found and we attempted to create one, it indicates that the user does not have the required permissions to - create a draft timeline. + create a draft Timeline. '409': content: 'application:json': @@ -487,19 +495,21 @@ paths: status_code: type: number description: >- - This should never happen, but if a draft timeline was not found and + This should never happen, but if a draft Timeline was not found and we attempted to create one, it indicates that there is already a - draft timeline with the given timelineId. - summary: >- - Retrieves the draft timeline for the current user. If the user does not - have a draft timeline, an empty timeline is returned. + draft Timeline with the given `timelineId`. + summary: Get draft Timeline or Timeline template details tags: - Security Solution Timeline API - 'access:securitySolution' post: description: > - Retrieves a clean draft timeline. If a draft timeline does not exist, it - is created and returned. + Create a clean draft Timeline or Timeline template for the current user. + + > info + + > If the user already has a draft Timeline, the existing draft Timeline + is cleared and returned. operationId: CleanDraftTimelines requestBody: content: @@ -512,7 +522,7 @@ paths: required: - timelineType description: >- - The type of timeline to create. Valid values are `default` and + The type of Timeline to create. Valid values are `default` and `template`. required: true responses: @@ -537,9 +547,9 @@ paths: required: - data description: >- - Indicates that the draft timeline was successfully created. In the - event the user already has a draft timeline, the existing draft - timeline is cleared and returned. + Indicates that the draft Timeline was successfully created. In the + event the user already has a draft Timeline, the existing draft + Timeline is cleared and returned. '403': content: 'application:json': @@ -552,7 +562,7 @@ paths: type: number description: >- Indicates that the user does not have the required permissions to - create a draft timeline. + create a draft Timeline. '409': content: 'application:json': @@ -564,14 +574,15 @@ paths: status_code: type: number description: >- - Indicates that there is already a draft timeline with the given - timelineId. - summary: Retrieves a draft timeline or timeline template. + Indicates that there is already a draft Timeline with the given + `timelineId`. + summary: Create a clean draft Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_export: post: + description: Export Timelines as an NDJSON file. operationId: ExportTimelines parameters: - description: The name of the file to export @@ -591,16 +602,16 @@ paths: type: string nullable: true type: array - description: The ids of the timelines to export + description: The IDs of the Timelines to export. required: true responses: '200': content: application/ndjson: schema: - description: NDJSON of the exported timelines + description: NDJSON of the exported Timelines type: string - description: Indicates the timelines were successfully exported + description: Indicates the Timelines were successfully exported. '400': content: application/ndjson: @@ -611,13 +622,14 @@ paths: type: string statusCode: type: number - description: Indicates that the export size limit was exceeded - summary: Exports timelines as an NDJSON file + description: Indicates that the export size limit was exceeded. + summary: Export Timelines tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_favorite: patch: + description: Favorite a Timeline or Timeline template for the current user. operationId: PersistFavoriteRoute requestBody: content: @@ -642,7 +654,7 @@ paths: - templateTimelineId - templateTimelineVersion - timelineType - description: The required fields used to favorite a (template) timeline. + description: The required fields used to favorite a (template) Timeline. required: true responses: '200': @@ -674,12 +686,13 @@ paths: description: >- Indicates the user does not have the required permissions to persist the favorite status. - summary: Persists a given users favorite status of a timeline. + summary: Favorite a Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_import: post: + description: Import Timelines. operationId: ImportTimelines requestBody: content: @@ -709,7 +722,7 @@ paths: - headers required: - hapi - description: The timelines to import as a readable stream. + description: The Timelines to import as a readable stream. required: true responses: '200': @@ -722,7 +735,7 @@ paths: $ref: '#/components/schemas/ImportTimelineResult' required: - data - description: Indicates the import of timelines was successful. + description: Indicates the import of Timelines was successful. '400': content: application/json: @@ -736,7 +749,7 @@ paths: statusCode: type: number description: >- - Indicates the import of timelines was unsuccessful because of an + Indicates the import of Timelines was unsuccessful because of an invalid file extension. '404': content: @@ -763,13 +776,14 @@ paths: type: string statusCode: type: number - description: Indicates the import of timelines was unsuccessful. - summary: Imports timelines. + description: Indicates the import of Timelines was unsuccessful. + summary: Import Timelines tags: - Security Solution Timeline API - 'access:securitySolution' /api/timeline/_prepackaged: post: + description: Install or update prepackaged Timelines. operationId: InstallPrepackedTimelines requestBody: content: @@ -795,7 +809,7 @@ paths: - timelinesToInstall - timelinesToUpdate - prepackagedTimelines - description: The timelines to install or update. + description: The Timelines to install or update. required: true responses: '200': @@ -808,7 +822,7 @@ paths: $ref: '#/components/schemas/ImportTimelineResult' required: - data - description: Indicates the installation of prepackaged timelines was successful. + description: Indicates the installation of prepackaged Timelines was successful. '500': content: 'application:json': @@ -820,9 +834,9 @@ paths: statusCode: type: number description: >- - Indicates the installation of prepackaged timelines was + Indicates the installation of prepackaged Timelines was unsuccessful. - summary: Installs prepackaged timelines. + summary: Install prepackaged Timelines tags: - Security Solution Timeline API - 'access:securitySolution' @@ -857,17 +871,18 @@ paths: - getOneTimeline required: - data - description: The (template) timeline has been found + description: The (template) Timeline has been found '400': description: The request is missing parameters '404': - description: The (template) timeline was not found - summary: Get an existing saved timeline or timeline template. + description: The (template) Timeline was not found + summary: Get an existing saved Timeline or Timeline template tags: - Security Solution Timeline API - 'access:securitySolution' /api/timelines: get: + description: Get a list of all saved Timelines or Timeline templates. operationId: GetTimelines parameters: - description: >- @@ -953,7 +968,7 @@ paths: - customTemplateTimelineCount required: - data - description: Indicates that the (template) timelines were found and returned. + description: Indicates that the (template) Timelines were found and returned. '400': content: 'application:json': @@ -965,9 +980,7 @@ paths: statusCode: type: number description: Bad request. The user supplied invalid data. - summary: >- - This API is used to retrieve a list of existing saved timelines or - timeline templates. + summary: Get Timelines or Timeline templates tags: - Security Solution Timeline API - 'access:securitySolution' diff --git a/x-pack/plugins/security_solution/kibana.jsonc b/x-pack/plugins/security_solution/kibana.jsonc index e5840a6662e79..075da90b44a0f 100644 --- a/x-pack/plugins/security_solution/kibana.jsonc +++ b/x-pack/plugins/security_solution/kibana.jsonc @@ -57,7 +57,6 @@ "entityManager" ], "optionalPlugins": [ - "cloudExperiments", "encryptedSavedObjects", "fleet", "ml", diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_links.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_links.ts index a87fc8e7d4f21..7a7e7334fefb3 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_links.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_links.ts @@ -86,6 +86,7 @@ export const mlNavCategories: SolutionLinkCategory[] = [ linkIds: [ ExternalPageName.mlFileUpload, ExternalPageName.mlIndexDataVisualizer, + ExternalPageName.mlESQLdataVisualizer, ExternalPageName.mlDataDrift, ], }, @@ -186,6 +187,12 @@ export const mlNavLinks: SolutionNavLink[] = [ landingIcon: IconDataViewLazy, description: i18n.INDEX_DATA_VISUALIZER_DESC, }, + { + id: ExternalPageName.mlESQLdataVisualizer, + title: i18n.ESQL_DATA_VISUALIZER_TITLE, + landingIcon: 'sqlApp', + description: i18n.ESQL_DATA_VISUALIZER_DESC, + }, { id: ExternalPageName.mlDataDrift, title: i18n.DATA_DRIFT_TITLE, diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_translations.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_translations.ts index c8005b57298d6..d00b6056fcdb8 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_translations.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/ml_translations.ts @@ -207,6 +207,18 @@ export const INDEX_DATA_VISUALIZER_DESC = i18n.translate( defaultMessage: 'Data view data visualizer page', } ); +export const ESQL_DATA_VISUALIZER_TITLE = i18n.translate( + 'xpack.securitySolution.navLinks.ml.esqlDataVisualizer.title', + { + defaultMessage: 'ES|QL data visualizer', + } +); +export const ESQL_DATA_VISUALIZER_DESC = i18n.translate( + 'xpack.securitySolution.navLinks.ml.esqlDataVisualizer.desc', + { + defaultMessage: 'ES|QL data visualizer page', + } +); export const DATA_DRIFT_TITLE = i18n.translate( 'xpack.securitySolution.navLinks.ml.dataDrift.title', { diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx index fa91a99c858a8..595aaf5127ca3 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx @@ -6,55 +6,16 @@ */ import React, { memo } from 'react'; -import { EuiButtonGroup, EuiSpacer } from '@elastic/eui'; -import type { EuiButtonGroupOptionProps } from '@elastic/eui/src/components/button/button_group/button_group'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { useExpandableFlyoutState } from '@kbn/expandable-flyout'; +import { EuiSpacer } from '@elastic/eui'; import { MisconfigurationFindingsDetailsTable } from './misconfiguration_findings_details_table'; -enum InsightsTabCspTab { - MISCONFIGURATION = 'misconfigurationTabId', -} - -const insightsButtons: EuiButtonGroupOptionProps[] = [ - { - id: InsightsTabCspTab.MISCONFIGURATION, - label: ( - - ), - 'data-test-subj': 'misconfigurationTabDataTestId', - }, -]; - /** * Insights view displayed in the document details expandable flyout left section */ export const InsightsTabCsp = memo( ({ name, fieldName }: { name: string; fieldName: 'host.name' | 'user.name' }) => { - const panels = useExpandableFlyoutState(); - const activeInsightsId = panels.left?.path?.subTab ?? 'misconfigurationTabId'; - return ( <> - {}} - buttonSize="compressed" - isFullWidth - data-test-subj={'insightButtonGroupsTestId'} - /> diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx index 1362e0e42e6ba..ba413709d6cca 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx @@ -102,14 +102,14 @@ export const MisconfigurationFindingsDetailsTable = memo( const navToFindings = useNavigateFindings(); - const navToFindingsByHostName = (hostName: string) => { - navToFindings({ 'host.name': hostName }, ['rule.name']); - }; - const navToFindingsByRuleAndResourceId = (ruleId: string, resourceId: string) => { navToFindings({ 'rule.id': ruleId, 'resource.id': resourceId }); }; + const navToFindingsByName = (name: string, queryField: 'host.name' | 'user.name') => { + navToFindings({ [queryField]: name }, ['rule.name']); + }; + const columns: Array> = [ { field: 'rule', @@ -154,13 +154,13 @@ export const MisconfigurationFindingsDetailsTable = memo( { - navToFindingsByHostName(queryName); + navToFindingsByName(queryName, fieldName); }} > {i18n.translate( 'xpack.securitySolution.flyout.left.insights.misconfigurations.tableTitle', { - defaultMessage: 'Misconfigurations', + defaultMessage: 'Misconfigurations ', } )} diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/index.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/index.tsx index 3058300036565..6045a8b8c9a5e 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/index.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/index.tsx @@ -13,7 +13,15 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { useCspSetupStatusApi } from '@kbn/cloud-security-posture/src/hooks/use_csp_setup_status_api'; import { MisconfigurationsPreview } from './misconfiguration/misconfiguration_preview'; -export const EntityInsight = ({ hostName }: { hostName: string }) => { +export const EntityInsight = ({ + name, + fieldName, + isPreviewMode, +}: { + name: string; + fieldName: 'host.name' | 'user.name'; + isPreviewMode?: boolean; +}) => { const { euiTheme } = useEuiTheme(); const getSetupStatus = useCspSetupStatusApi(); const hasMisconfigurationFindings = getSetupStatus.data?.hasMisconfigurationsFindings; @@ -22,7 +30,6 @@ export const EntityInsight = ({ hostName }: { hostName: string }) => { <> {hasMisconfigurationFindings && ( <> - ({ hostName }: { hostName: string }) => { } > - + + )} diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.test.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.test.tsx index 1c4c2adb60218..2e10d481b9934 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.test.tsx @@ -11,8 +11,9 @@ import { render } from '@testing-library/react'; import React from 'react'; import { MisconfigurationsPreview } from './misconfiguration_preview'; -const mockProps = { - hostName: 'testContextID', +const mockProps: { name: string; fieldName: 'host.name' | 'user.name' } = { + name: 'testContextID', + fieldName: 'host.name', }; describe('MisconfigurationsPreview', () => { diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx index f6ba0389f752a..e6c3950e81583 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx @@ -17,10 +17,12 @@ import { i18n } from '@kbn/i18n'; import { ExpandablePanel } from '@kbn/security-solution-common'; import { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { UserDetailsPanelKey } from '../../../flyout/entity_details/user_details_left'; import { HostDetailsPanelKey } from '../../../flyout/entity_details/host_details_left'; import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; -import { buildHostNamesFilter } from '../../../../common/search_strategy'; +import type { HostRiskScore, UserRiskScore } from '../../../../common/search_strategy'; +import { buildHostNamesFilter, buildUserNamesFilter } from '../../../../common/search_strategy'; const FIRST_RECORD_PAGINATION = { cursorStart: 0, @@ -120,46 +122,63 @@ const MisconfigurationPreviewScore = ({ ); }; -export const MisconfigurationsPreview = ({ hostName }: { hostName: string }) => { +export const MisconfigurationsPreview = ({ + name, + fieldName, + isPreviewMode, +}: { + name: string; + fieldName: 'host.name' | 'user.name'; + isPreviewMode?: boolean; +}) => { const { data } = useMisconfigurationPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', hostName), + query: buildEntityFlyoutPreviewQuery(fieldName, name), sort: [], enabled: true, pageSize: 1, }); - + const isUsingHostName = fieldName === 'host.name'; const passedFindings = data?.count.passed || 0; const failedFindings = data?.count.failed || 0; const { euiTheme } = useEuiTheme(); const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; - const hostNameFilterQuery = useMemo( - () => (hostName ? buildHostNamesFilter([hostName]) : undefined), - [hostName] + + const buildFilterQuery = useMemo( + () => (isUsingHostName ? buildHostNamesFilter([name]) : buildUserNamesFilter([name])), + [isUsingHostName, name] ); const riskScoreState = useRiskScore({ - riskEntity: RiskScoreEntity.host, - filterQuery: hostNameFilterQuery, + riskEntity: isUsingHostName ? RiskScoreEntity.host : RiskScoreEntity.user, + filterQuery: buildFilterQuery, onlyLatest: false, pagination: FIRST_RECORD_PAGINATION, }); const { data: hostRisk } = riskScoreState; - const hostRiskData = hostRisk && hostRisk.length > 0 ? hostRisk[0] : undefined; - const isRiskScoreExist = !!hostRiskData?.host.risk; + const riskData = hostRisk?.[0]; + const isRiskScoreExist = isUsingHostName + ? !!(riskData as HostRiskScore)?.host.risk + : !!(riskData as UserRiskScore)?.user.risk; const { openLeftPanel } = useExpandableFlyoutApi(); - const isPreviewMode = false; const goToEntityInsightTab = useCallback(() => { openLeftPanel({ - id: HostDetailsPanelKey, - params: { - name: hostName, - isRiskScoreExist, - hasMisconfigurationFindings, - path: { tab: 'csp_insights' }, - }, + id: isUsingHostName ? HostDetailsPanelKey : UserDetailsPanelKey, + params: isUsingHostName + ? { + name, + isRiskScoreExist, + hasMisconfigurationFindings, + path: { tab: 'csp_insights' }, + } + : { + user: { name }, + isRiskScoreExist, + hasMisconfigurationFindings, + path: { tab: 'csp_insights' }, + }, }); - }, [hasMisconfigurationFindings, hostName, isRiskScoreExist, openLeftPanel]); + }, [hasMisconfigurationFindings, isRiskScoreExist, isUsingHostName, name, openLeftPanel]); const link = useMemo( () => !isPreviewMode @@ -178,7 +197,7 @@ export const MisconfigurationsPreview = ({ hostName }: { hostName: string }) => return ( = ({ const { services: { application }, } = useKibana(); + const automatedResponseActionsForMoreRulesEnabled = useIsExperimentalFeatureEnabled( + 'automatedResponseActionsForMoreRulesEnabled' + ); const displayActionsOptions = useMemo( () => ( <> @@ -101,7 +105,7 @@ const StepRuleActionsComponent: FC = ({ [actionMessageParams, summaryActionMessageParams] ); const displayResponseActionsOptions = useMemo(() => { - if (isQueryRule(ruleType)) { + if (shouldShowResponseActions(ruleType, automatedResponseActionsForMoreRulesEnabled)) { return ( {ResponseActionsForm} @@ -109,7 +113,7 @@ const StepRuleActionsComponent: FC = ({ ); } return null; - }, [ruleType]); + }, [ruleType, automatedResponseActionsForMoreRulesEnabled]); // only display the actions dropdown if the user has "read" privileges for actions const displayActionsDropDown = useMemo(() => { return application.capabilities.actions.show ? ( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/prebuilt_rules/use_perform_specific_rules_install_mutation.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/prebuilt_rules/use_perform_specific_rules_install_mutation.ts index 7f7fab65b0d95..3b448219d6e01 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/prebuilt_rules/use_perform_specific_rules_install_mutation.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/prebuilt_rules/use_perform_specific_rules_install_mutation.ts @@ -16,8 +16,10 @@ import { useInvalidateFindRulesQuery } from '../use_find_rules_query'; import { useInvalidateFetchRuleManagementFiltersQuery } from '../use_fetch_rule_management_filters_query'; import { useInvalidateFetchRulesSnoozeSettingsQuery } from '../use_fetch_rules_snooze_settings_query'; import { useInvalidateFetchPrebuiltRulesInstallReviewQuery } from './use_fetch_prebuilt_rules_install_review_query'; +import type { BulkAction } from '../../api'; import { performInstallSpecificRules } from '../../api'; import { useInvalidateFetchCoverageOverviewQuery } from '../use_fetch_coverage_overview_query'; +import { useBulkActionMutation } from '../use_bulk_action_mutation'; export const PERFORM_SPECIFIC_RULES_INSTALLATION_KEY = [ 'POST', @@ -25,11 +27,16 @@ export const PERFORM_SPECIFIC_RULES_INSTALLATION_KEY = [ PERFORM_RULE_INSTALLATION_URL, ]; +export interface UsePerformSpecificRulesInstallParams { + rules: InstallSpecificRulesRequest['rules']; + enable?: boolean; +} + export const usePerformSpecificRulesInstallMutation = ( options?: UseMutationOptions< PerformRuleInstallationResponseBody, Error, - InstallSpecificRulesRequest['rules'] + UsePerformSpecificRulesInstallParams > ) => { const invalidateFindRulesQuery = useInvalidateFindRulesQuery(); @@ -40,15 +47,15 @@ export const usePerformSpecificRulesInstallMutation = ( useInvalidateFetchPrebuiltRulesInstallReviewQuery(); const invalidateRuleStatus = useInvalidateFetchPrebuiltRulesStatusQuery(); const invalidateFetchCoverageOverviewQuery = useInvalidateFetchCoverageOverviewQuery(); + const { mutateAsync } = useBulkActionMutation(); return useMutation< PerformRuleInstallationResponseBody, Error, - InstallSpecificRulesRequest['rules'] + UsePerformSpecificRulesInstallParams >( - (rulesToInstall: InstallSpecificRulesRequest['rules']) => { - return performInstallSpecificRules(rulesToInstall); - }, + (rulesToInstall: UsePerformSpecificRulesInstallParams) => + performInstallSpecificRules(rulesToInstall.rules), { ...options, mutationKey: PERFORM_SPECIFIC_RULES_INSTALLATION_KEY, @@ -62,6 +69,14 @@ export const usePerformSpecificRulesInstallMutation = ( invalidateRuleStatus(); invalidateFetchCoverageOverviewQuery(); + const [response, , { enable }] = args; + + if (response && enable) { + const ruleIdsToEnable = response.results.created.map((rule) => rule.id); + const bulkAction: BulkAction = { type: 'enable', ids: ruleIdsToEnable }; + mutateAsync({ bulkAction }); + } + if (options?.onSettled) { options.onSettled(...args); } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts index 9810cd4882cc7..08e4c9535ae91 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { isPlainObject } from 'lodash'; import type { Filter } from '@kbn/es-query'; import type { DiffableAllFields, @@ -77,16 +78,12 @@ export function getQueryLanguageLabel(language: string) { } /** - * Assigns type `Filter` to items that have a `meta` property. Removes any other items. + * Assigns type `Filter[]` to an array if every item in it has a `meta` property. */ -export function typeCheckFilters(filters: unknown[]): Filter[] { - return filters.filter((f) => { - if (typeof f === 'object' && f !== null && 'meta' in f) { - return true; - } - - return false; - }) as Filter[]; +export function isFilters(maybeFilters: unknown[]): maybeFilters is Filter[] { + return maybeFilters.every( + (f) => typeof f === 'object' && f !== null && 'meta' in f && isPlainObject(f.meta) + ); } type DataSourceProps = diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx index c7c9ec3ca732d..1d2e93df8e7f7 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx @@ -256,7 +256,7 @@ interface TagsProps { tags: string[]; } -const Tags = ({ tags }: TagsProps) => ( +export const Tags = ({ tags }: TagsProps) => ( ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/common_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/common_rule_field_readonly.tsx new file mode 100644 index 0000000000000..35bde351bbeb6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/common_rule_field_readonly.tsx @@ -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 React from 'react'; +import type { + DiffableCommonFields, + DiffableRule, +} from '../../../../../../../common/api/detection_engine'; +import { RelatedIntegrationsReadOnly } from './fields/related_integrations/related_integrations'; +import { RequiredFieldsReadOnly } from './fields/required_fields/required_fields'; +import { SeverityMappingReadOnly } from './fields/severity_mapping/severity_mapping'; +import { RiskScoreMappingReadOnly } from './fields/risk_score_mapping/risk_score_mapping'; +import { ThreatReadOnly } from './fields/threat/threat'; +import { NameReadOnly } from './fields/name/name'; +import { TagsReadOnly } from './fields/tags/tags'; +import { DescriptionReadOnly } from './fields/description/description'; +import { assertUnreachable } from '../../../../../../../common/utility_types'; + +interface CommonRuleFieldReadOnlyProps { + fieldName: keyof DiffableCommonFields; + finalDiffableRule: DiffableRule; +} + +// eslint-disable-next-line complexity +export function CommonRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: CommonRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'author': + return null; + case 'building_block': + return null; + case 'description': + return ; + case 'exceptions_list': + return null; + case 'investigation_fields': + return null; + case 'false_positives': + return null; + case 'license': + return null; + case 'max_signals': + return null; + case 'name': + return ; + case 'note': + return null; + case 'related_integrations': + return ( + + ); + case 'required_fields': + return ; + case 'risk_score_mapping': + return ; + case 'rule_schedule': + return null; + case 'severity_mapping': + return ; + case 'tags': + return ; + case 'threat': + return ; + case 'references': + return null; + case 'risk_score': + return null; + case 'rule_id': + return null; + case 'rule_name_override': + return null; + case 'setup': + return null; + case 'severity': + return null; + case 'timestamp_override': + return null; + case 'timeline_template': + return null; + case 'version': + return null; + default: + return assertUnreachable(fieldName); + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/custom_query_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/custom_query_rule_field_readonly.tsx new file mode 100644 index 0000000000000..3d22d268438c4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/custom_query_rule_field_readonly.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 React from 'react'; +import type { DiffableCustomQueryFields } from '../../../../../../../common/api/detection_engine'; +import { DataSourceReadOnly } from './fields/data_source/data_source'; +import { KqlQueryReadOnly } from './fields/kql_query'; + +interface CustomQueryRuleFieldReadOnlyProps { + fieldName: keyof DiffableCustomQueryFields; + finalDiffableRule: DiffableCustomQueryFields; +} + +export function CustomQueryRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: CustomQueryRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'data_source': + return ; + case 'kql_query': + return ( + + ); + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx new file mode 100644 index 0000000000000..126775965724b --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { DiffableEqlFields } from '../../../../../../../common/api/detection_engine'; +import { DataSourceReadOnly } from './fields/data_source/data_source'; +import { EqlQueryReadOnly } from './fields/eql_query/eql_query'; + +interface EqlRuleFieldReadOnlyProps { + fieldName: keyof DiffableEqlFields; + finalDiffableRule: DiffableEqlFields; +} + +export function EqlRuleFieldReadOnly({ fieldName, finalDiffableRule }: EqlRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'data_source': + return ; + case 'eql_query': + return ( + + ); + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/esql_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/esql_rule_field_readonly.tsx new file mode 100644 index 0000000000000..755ad6b1b4789 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/esql_rule_field_readonly.tsx @@ -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 React from 'react'; +import type { DiffableEsqlFields } from '../../../../../../../common/api/detection_engine'; +import { EsqlQueryReadOnly } from './fields/esql_query/esql_query'; + +interface EsqlRuleFieldReadOnlyProps { + fieldName: keyof DiffableEsqlFields; + finalDiffableRule: DiffableEsqlFields; +} + +export function EsqlRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: EsqlRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'esql_query': + return ; + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} 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_readonly.tsx index f3d436ad7a26a..d8d31e343278b 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_readonly.tsx @@ -5,85 +5,105 @@ * 2.0. */ -import React from 'react'; -import type { DiffableAllFields } from '../../../../../../../common/api/detection_engine'; -import { KqlQueryReadOnly } from './fields/kql_query'; -import { DataSourceReadOnly } from './fields/data_source/data_source'; -import { EqlQueryReadOnly } from './fields/eql_query/eql_query'; -import { EsqlQueryReadOnly } from './fields/esql_query/esql_query'; -import { MachineLearningJobIdReadOnly } from './fields/machine_learning_job_id/machine_learning_job_id'; -import { RelatedIntegrationsReadOnly } from './fields/related_integrations/related_integrations'; -import { RequiredFieldsReadOnly } from './fields/required_fields/required_fields'; -import { SeverityMappingReadOnly } from './fields/severity_mapping/severity_mapping'; -import { RiskScoreMappingReadOnly } from './fields/risk_score_mapping/risk_score_mapping'; -import { ThreatMappingReadOnly } from './fields/threat_mapping/threat_mapping'; -import { ThreatReadOnly } from './fields/threat/threat'; -import { ThreatIndexReadOnly } from './fields/threat_index/threat_index'; -import { ThreatIndicatorPathReadOnly } from './fields/threat_indicator_path/threat_indicator_path'; -import { ThreatQueryReadOnly } from './fields/threat_query/threat_query'; +import React, { useMemo } from 'react'; +import { DiffableCommonFields } from '../../../../../../../common/api/detection_engine'; +import type { + DiffableRule, + DiffableCustomQueryFields, + DiffableSavedQueryFields, + DiffableEqlFields, + DiffableThreatMatchFields, + DiffableThresholdFields, + DiffableNewTermsFields, + DiffableEsqlFields, + DiffableMachineLearningFields, +} from '../../../../../../../common/api/detection_engine'; +import { assertUnreachable } from '../../../../../../../common/utility_types'; +import { CustomQueryRuleFieldReadOnly } from './custom_query_rule_field_readonly'; +import { SavedQueryRuleFieldReadOnly } from './saved_query_rule_field_readonly'; +import { EqlRuleFieldReadOnly } from './eql_rule_field_readonly'; +import { EsqlRuleFieldReadOnly } from './esql_rule_field_readonly'; +import { ThreatMatchRuleFieldReadOnly } from './threat_match_rule_field_readonly'; +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'; interface FieldReadOnlyProps { - fieldName: keyof DiffableAllFields; - finalDiffableRule: DiffableAllFields; + fieldName: string; + finalDiffableRule: DiffableRule; } export function FieldReadOnly({ fieldName, finalDiffableRule }: FieldReadOnlyProps) { - switch (fieldName) { - case 'data_source': - return ; - case 'eql_query': + const { data: commonField } = useMemo( + () => DiffableCommonFields.keyof().safeParse(fieldName), + [fieldName] + ); + + if (commonField) { + return ( + + ); + } + + switch (finalDiffableRule.type) { + case 'query': + return ( + + ); + case 'saved_query': return ( - ); - case 'esql_query': - return ; - case 'kql_query': + case 'eql': return ( - ); - case 'machine_learning_job_id': + case 'esql': return ( - ); - case 'related_integrations': + case 'threat_match': return ( - + + ); + case 'threshold': + return ( + ); - case 'required_fields': - return ; - case 'risk_score_mapping': - return ; - case 'severity_mapping': - return ; - case 'threat': - return ; - case 'threat_index': - return ; - case 'threat_indicator_path': + case 'machine_learning': return ( - ); - case 'threat_mapping': - return ; - case 'threat_query': + case 'new_terms': return ( - ); default: - return null; + return assertUnreachable(finalDiffableRule); } } 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 6ffe47a254de9..9deebf794c241 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 @@ -8,12 +8,13 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { dataSourceWithDataView, dataSourceWithIndexPatterns, mockDataView, + mockCustomQueryRule, } from '../../storybook/mocks'; export default { @@ -22,17 +23,14 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; kibanaServicesMock?: Record; } const Template: Story = (args) => { return ( - + ); }; @@ -40,17 +38,17 @@ const Template: Story = (args) => { export const DataSourceWithIndexPatterns = Template.bind({}); DataSourceWithIndexPatterns.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ data_source: dataSourceWithIndexPatterns, - }, + }), }; export const DataSourceWithDataView = Template.bind({}); DataSourceWithDataView.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ data_source: dataSourceWithDataView, - }, + }), kibanaServicesMock: { data: { dataViews: { 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.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.tsx index 29518981011fa..2a7bff6ff8b2d 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.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.tsx @@ -8,13 +8,13 @@ import React from 'react'; import { EuiDescriptionList } from '@elastic/eui'; import { DataSourceType } from '../../../../../../../../../common/api/detection_engine'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { RuleDataSource } from '../../../../../../../../../common/api/detection_engine'; import { Index, DataViewId, DataViewIndexPattern } from '../../../../rule_definition_section'; import * as ruleDetailsI18n from '../../../../translations'; import { assertUnreachable } from '../../../../../../../../../common/utility_types'; interface DataSourceReadOnlyProps { - dataSource: DiffableAllFields['data_source']; + dataSource?: RuleDataSource; } export function DataSourceReadOnly({ dataSource }: DataSourceReadOnlyProps) { 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 new file mode 100644 index 0000000000000..ba094ecfe54f9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.stories.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { Story } from '@storybook/react'; +import { DescriptionReadOnly } from './description'; +import { FieldReadOnly } from '../../field_readonly'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { mockCustomQueryRule } from '../../storybook/mocks'; + +export default { + component: DescriptionReadOnly, + title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/description', +}; + +interface TemplateProps { + finalDiffableRule: DiffableRule; +} + +const Template: Story = (args) => { + return ; +}; + +export const Default = Template.bind({}); + +Default.args = { + finalDiffableRule: mockCustomQueryRule({ + description: + "Identifies the occurrence of a security alert from the Google Workspace alerts center. Google Workspace's security alert center provides an overview of actionable alerts that may be affecting an organization's domain. An alert is a warning of a potential security issue that Google has detected.", + }), +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.tsx new file mode 100644 index 0000000000000..add624ba15a6d --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/description/description.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 React from 'react'; +import { EuiDescriptionList } from '@elastic/eui'; +import * as ruleDetailsI18n from '../../../../translations'; +import type { RuleDescription } from '../../../../../../../../../common/api/detection_engine'; + +interface DescriptionReadOnlyProps { + description: RuleDescription; +} + +export function DescriptionReadOnly({ description }: DescriptionReadOnlyProps) { + return ( + , + }, + ]} + /> + ); +} + +interface DescriptionProps { + description: RuleDescription; +} + +function Description({ description }: DescriptionProps) { + return <>{description}; +} 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 205e87e209068..af835c5a92779 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 @@ -8,7 +8,7 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { EqlQueryReadOnly } from './eql_query'; import { @@ -16,6 +16,7 @@ import { dataSourceWithIndexPatterns, eqlQuery, mockDataView, + mockEqlRule, } from '../../storybook/mocks'; export default { @@ -24,17 +25,14 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; kibanaServicesMock?: Record; } const Template: Story = (args) => { return ( - + ); }; @@ -42,10 +40,10 @@ const Template: Story = (args) => { export const EqlQueryWithIndexPatterns = Template.bind({}); EqlQueryWithIndexPatterns.args = { - finalDiffableRule: { + finalDiffableRule: mockEqlRule({ eql_query: eqlQuery, data_source: dataSourceWithIndexPatterns, - }, + }), kibanaServicesMock: { data: { dataViews: { @@ -58,10 +56,10 @@ EqlQueryWithIndexPatterns.args = { export const EqlQueryWithDataView = Template.bind({}); EqlQueryWithDataView.args = { - finalDiffableRule: { + finalDiffableRule: mockEqlRule({ eql_query: eqlQuery, data_source: dataSourceWithDataView, - }, + }), kibanaServicesMock: { data: { dataViews: { 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.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.tsx index 3238e7bb7eeef..f94f0bbfbe6c8 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.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.tsx @@ -8,14 +8,17 @@ import React from 'react'; import { EuiDescriptionList } from '@elastic/eui'; import type { EuiDescriptionListProps } from '@elastic/eui'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { + RuleDataSource, + RuleEqlQuery, +} from '../../../../../../../../../common/api/detection_engine'; import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; import { Query, Filters } from '../../../../rule_definition_section'; -import { getDataSourceProps, typeCheckFilters } from '../../../../helpers'; +import { getDataSourceProps, isFilters } from '../../../../helpers'; interface EqlQueryReadOnlyProps { - eqlQuery: DiffableAllFields['eql_query']; - dataSource: DiffableAllFields['data_source']; + eqlQuery: RuleEqlQuery; + dataSource?: RuleDataSource; } export function EqlQueryReadOnly({ eqlQuery, dataSource }: EqlQueryReadOnlyProps) { @@ -26,14 +29,12 @@ export function EqlQueryReadOnly({ eqlQuery, dataSource }: EqlQueryReadOnlyProps }, ]; - const filters = typeCheckFilters(eqlQuery.filters); - - if (filters.length > 0) { + if (isFilters(eqlQuery.filters) && eqlQuery.filters.length > 0) { const dataSourceProps = getDataSourceProps(dataSource); listItems.push({ title: descriptionStepI18n.FILTERS_LABEL, - description: , + description: , }); } 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 cda1c99a218bb..664294dbe768c 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 @@ -8,7 +8,8 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { mockEsqlRule } from '../../storybook/mocks'; export default { component: FieldReadOnly, @@ -16,25 +17,20 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { - return ( - - ); + return ; }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockEsqlRule({ esql_query: { query: `SELECT user.name, source.ip FROM "logs-*" WHERE event.action = 'user_login' AND event.outcome = 'failure'`, language: 'esql', }, - }, + }), }; 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.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.tsx index ec110bd034b67..9277d2ded7a7d 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.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.tsx @@ -9,10 +9,10 @@ import React from 'react'; import { EuiDescriptionList } from '@elastic/eui'; import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; import { Query } from '../../../../rule_definition_section'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { RuleEsqlQuery } from '../../../../../../../../../common/api/detection_engine'; interface EsqlQueryReadonlyProps { - esqlQuery: DiffableAllFields['esql_query']; + esqlQuery: RuleEsqlQuery; } export function EsqlQueryReadOnly({ esqlQuery }: EsqlQueryReadonlyProps) { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/index.tsx index a2dd75e188a0c..d5bea0866c22f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/index.tsx @@ -8,7 +8,8 @@ import React from 'react'; import { KqlQueryType } from '../../../../../../../../../common/api/detection_engine'; import type { - DiffableAllFields, + DiffableRuleTypes, + RuleDataSource, RuleKqlQuery, } from '../../../../../../../../../common/api/detection_engine'; import { InlineKqlQueryReadOnly } from './inline_kql_query'; @@ -17,8 +18,8 @@ import { assertUnreachable } from '../../../../../../../../../common/utility_typ interface KqlQueryReadOnlyProps { kqlQuery: RuleKqlQuery; - dataSource: DiffableAllFields['data_source']; - ruleType: DiffableAllFields['type']; + dataSource?: RuleDataSource; + ruleType: DiffableRuleTypes; } export function KqlQueryReadOnly({ kqlQuery, dataSource, ruleType }: KqlQueryReadOnlyProps) { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/inline_kql_query.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/inline_kql_query.tsx index a70909745d8dc..54d3836573ab5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/inline_kql_query.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/inline_kql_query.tsx @@ -9,13 +9,13 @@ import React from 'react'; import { EuiDescriptionList } from '@elastic/eui'; import type { EuiDescriptionListProps } from '@elastic/eui'; import type { - DiffableAllFields, InlineKqlQuery, + RuleDataSource, } from '../../../../../../../../../common/api/detection_engine'; import { Query, Filters } from '../../../../rule_definition_section'; import * as ruleDetailsI18n from '../../../../translations'; import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; -import { getDataSourceProps, getQueryLanguageLabel, typeCheckFilters } from '../../../../helpers'; +import { getDataSourceProps, getQueryLanguageLabel, isFilters } from '../../../../helpers'; const defaultI18nLabels = { query: descriptionStepI18n.QUERY_LABEL, @@ -25,7 +25,7 @@ const defaultI18nLabels = { interface InlineQueryProps { kqlQuery: InlineKqlQuery; - dataSource?: DiffableAllFields['data_source']; + dataSource?: RuleDataSource; i18nLabels?: { query: string; language: string; @@ -49,14 +49,12 @@ export function InlineKqlQueryReadOnly({ }, ]; - const filters = typeCheckFilters(kqlQuery.filters); - - if (filters.length > 0) { + if (isFilters(kqlQuery.filters) && kqlQuery.filters.length > 0) { const dataSourceProps = getDataSourceProps(dataSource); listItems.push({ title: i18nLabels.filters, - description: , + description: , }); } 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 61d31d983b183..2b4844ceac5d5 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 @@ -8,18 +8,17 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { - DiffableAllFields, - RuleKqlQuery, -} from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; import { dataSourceWithDataView, dataSourceWithIndexPatterns, inlineKqlQuery, mockDataView, + mockCustomQueryRule, savedKqlQuery, savedQueryResponse, + mockSavedQueryRule, } from '../../storybook/mocks'; export default { @@ -28,17 +27,14 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial | { kql_query: RuleKqlQuery }; + finalDiffableRule: DiffableRule; kibanaServicesMock?: Record; } const Template: Story = (args) => { return ( - + ); }; @@ -46,10 +42,10 @@ const Template: Story = (args) => { export const InlineKqlQueryWithIndexPatterns = Template.bind({}); InlineKqlQueryWithIndexPatterns.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ kql_query: inlineKqlQuery, data_source: dataSourceWithIndexPatterns, - }, + }), kibanaServicesMock: { data: { dataViews: { @@ -62,10 +58,10 @@ InlineKqlQueryWithIndexPatterns.args = { export const InlineKqlQueryWithDataView = Template.bind({}); InlineKqlQueryWithDataView.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ kql_query: inlineKqlQuery, data_source: dataSourceWithDataView, - }, + }), kibanaServicesMock: { data: { dataViews: { @@ -82,9 +78,9 @@ export const InlineKqlQueryWithoutDataSource = Template.bind({}); Component would fall back to the default index pattern in such case. */ InlineKqlQueryWithoutDataSource.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ kql_query: inlineKqlQuery, - }, + }), kibanaServicesMock: { data: { dataViews: { @@ -97,11 +93,11 @@ InlineKqlQueryWithoutDataSource.args = { export const SavedKqlQueryWithIndexPatterns = Template.bind({}); SavedKqlQueryWithIndexPatterns.args = { - finalDiffableRule: { + finalDiffableRule: mockSavedQueryRule({ kql_query: savedKqlQuery, data_source: dataSourceWithIndexPatterns, type: 'saved_query', - }, + }), kibanaServicesMock: { data: { dataViews: { @@ -117,11 +113,11 @@ SavedKqlQueryWithIndexPatterns.args = { export const SavedKqlQueryWithDataView = Template.bind({}); SavedKqlQueryWithDataView.args = { - finalDiffableRule: { + finalDiffableRule: mockSavedQueryRule({ kql_query: savedKqlQuery, data_source: dataSourceWithDataView, type: 'saved_query', - }, + }), kibanaServicesMock: { data: { dataViews: { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/saved_kql_query.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/saved_kql_query.tsx index d7741f41af820..5f50a9c1b9eae 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/saved_kql_query.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/kql_query/saved_kql_query.tsx @@ -10,8 +10,8 @@ import { EuiDescriptionList } from '@elastic/eui'; import type { EuiDescriptionListProps } from '@elastic/eui'; import type { SavedKqlQuery, - DiffableRule, - DiffableAllFields, + RuleDataSource, + DiffableRuleTypes, } from '../../../../../../../../../common/api/detection_engine'; import { Query, SavedQueryName, Filters } from '../../../../rule_definition_section'; import * as ruleDetailsI18n from '../../../../translations'; @@ -21,8 +21,8 @@ import { getDataSourceProps, getQueryLanguageLabel } from '../../../../helpers'; interface SavedQueryProps { kqlQuery: SavedKqlQuery; - dataSource?: DiffableAllFields['data_source']; - ruleType: DiffableRule['type']; + dataSource?: RuleDataSource; + ruleType: DiffableRuleTypes; } export function SavedKqlQueryReadOnly({ kqlQuery, dataSource, ruleType }: SavedQueryProps) { 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 4d334f3aa57ec..8dc504b737e00 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 @@ -9,12 +9,13 @@ import React from 'react'; import { useQueryClient } from '@tanstack/react-query'; import type { Story } from '@storybook/react'; import { MachineLearningJobIdReadOnly } from './machine_learning_job_id'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { FieldReadOnly } from '../../field_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'; import { GET_JOBS_SUMMARY_QUERY_KEY } from '../../../../../../../../common/components/ml/hooks/use_fetch_jobs_summary_query'; +import { mockMachineLearningRule } from '../../storybook/mocks'; export default { component: MachineLearningJobIdReadOnly, @@ -58,7 +59,7 @@ function MockMlData({ children }: { children: React.ReactNode }) { } interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { @@ -67,7 +68,7 @@ const Template: Story = (args) => { @@ -77,7 +78,7 @@ const Template: Story = (args) => { export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockMachineLearningRule({ machine_learning_job_id: 'auth_high_count_logon_events', - }, + }), }; 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.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.tsx index b177da1467910..570c58539ea84 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.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.tsx @@ -8,11 +8,11 @@ import React from 'react'; import { EuiDescriptionList } from '@elastic/eui'; import { MachineLearningJobList } from '../../../../rule_definition_section'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { MachineLearningJobId } from '../../../../../../../../../common/api/detection_engine'; import * as ruleDetailsI18n from '../../../../translations'; interface MachineLearningJobIdProps { - machineLearningJobId: DiffableAllFields['machine_learning_job_id']; + machineLearningJobId: MachineLearningJobId; } export function MachineLearningJobIdReadOnly({ machineLearningJobId }: MachineLearningJobIdProps) { 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 new file mode 100644 index 0000000000000..1451d3b70ef8b --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.stories.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { Story } from '@storybook/react'; +import { NameReadOnly } from './name'; +import { FieldReadOnly } from '../../field_readonly'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { mockCustomQueryRule } from '../../storybook/mocks'; + +export default { + component: NameReadOnly, + title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/name', +}; + +interface TemplateProps { + finalDiffableRule: DiffableRule; +} + +const Template: Story = (args) => { + return ; +}; + +export const Default = Template.bind({}); + +Default.args = { + finalDiffableRule: mockCustomQueryRule({ + name: 'Forwarded Google Workspace Security Alert', + }), +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.tsx new file mode 100644 index 0000000000000..a611f9821d54e --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/name/name.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 React from 'react'; +import { EuiDescriptionList } from '@elastic/eui'; +import * as ruleDetailsI18n from '../../../../translations'; +import type { RuleName } from '../../../../../../../../../common/api/detection_engine'; + +interface NameReadOnlyProps { + name: RuleName; +} + +export function NameReadOnly({ name }: NameReadOnlyProps) { + return ( + , + }, + ]} + /> + ); +} + +interface NameProps { + name: RuleName; +} + +function Name({ name }: NameProps) { + return <>{name}; +} 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 9855e2f974096..4657b21b0c64e 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 @@ -11,7 +11,8 @@ 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 type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { mockCustomQueryRule } from '../../storybook/mocks'; export default { component: RelatedIntegrationsReadOnly, @@ -39,7 +40,7 @@ function MockRelatedIntegrationsData({ children }: { children: React.ReactNode } } interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { @@ -48,7 +49,7 @@ const Template: Story = (args) => { @@ -58,7 +59,7 @@ const Template: Story = (args) => { export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ related_integrations: [{ package: 'endpoint', version: '^8.2.0' }], - }, + }), }; 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 2957d8ff7ceaf..44d3383ae8227 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 @@ -8,7 +8,8 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { RequiredFieldsReadOnly } from './required_fields'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { mockCustomQueryRule } from '../../storybook/mocks'; export default { component: RequiredFieldsReadOnly, @@ -16,25 +17,20 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { - return ( - - ); + return ; }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ required_fields: [ { name: 'event.kind', type: 'keyword', ecs: true }, { name: 'event.module', type: 'keyword', ecs: true }, ], - }, + }), }; 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 76775d6da4586..40c8644ffd3ea 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 @@ -8,8 +8,9 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { RiskScoreMappingReadOnly } from './risk_score_mapping'; +import { mockCustomQueryRule } from '../../storybook/mocks'; export default { component: RiskScoreMappingReadOnly, @@ -18,22 +19,19 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { return ( - + ); }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ risk_score_mapping: [{ field: 'event.risk_score', operator: 'equals', value: '' }], - }, + }), }; 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 92d7b95b17c2b..6a4b365a86db5 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 @@ -8,8 +8,9 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { SeverityMappingReadOnly } from './severity_mapping'; +import { mockCustomQueryRule } from '../../storybook/mocks'; export default { component: SeverityMappingReadOnly, @@ -18,22 +19,17 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { - return ( - - ); + return ; }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ severity_mapping: [ { field: 'event.severity', @@ -48,5 +44,5 @@ Default.args = { value: 'VERY HIGH', }, ], - }, + }), }; 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 new file mode 100644 index 0000000000000..b2c483cbc8c97 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.stories.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { Story } from '@storybook/react'; +import { TagsReadOnly } from './tags'; +import { FieldReadOnly } from '../../field_readonly'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { mockCustomQueryRule } from '../../storybook/mocks'; + +export default { + component: TagsReadOnly, + title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/tags', +}; + +interface TemplateProps { + finalDiffableRule: DiffableRule; +} + +const Template: Story = (args) => { + return ; +}; + +export const Default = Template.bind({}); + +Default.args = { + finalDiffableRule: mockCustomQueryRule({ + tags: ['Elastic', 'Cloud', 'Google Workspace', 'Log Auditing', 'Threat Detection'], + }), +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.tsx new file mode 100644 index 0000000000000..dbb7928b5f22e --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tags/tags.tsx @@ -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 React from 'react'; +import { EuiDescriptionList } from '@elastic/eui'; +import * as ruleDetailsI18n from '../../../../translations'; +import type { RuleTagArray } from '../../../../../../../../../common/api/detection_engine'; +import { Tags } from '../../../../rule_about_section'; + +interface TagsReadOnlyProps { + tags: RuleTagArray; +} + +export function TagsReadOnly({ tags }: TagsReadOnlyProps) { + return ( + , + }, + ]} + /> + ); +} 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 4909174dcb577..aa95633349260 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 @@ -8,8 +8,9 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatReadOnly } from './threat'; +import { mockCustomQueryRule } from '../../storybook/mocks'; export default { component: ThreatReadOnly, @@ -17,22 +18,17 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { - return ( - - ); + return ; }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockCustomQueryRule({ threat: [ { framework: 'MITRE ATT&CK', @@ -57,5 +53,5 @@ Default.args = { ], }, ], - }, + }), }; 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 c42fa2e890c52..4f10cb8932ab1 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 @@ -8,8 +8,9 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatIndexReadOnly } from './threat_index'; +import { mockThreatMatchRule } from '../../storybook/mocks'; export default { component: ThreatIndexReadOnly, @@ -17,22 +18,17 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { - return ( - - ); + return ; }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockThreatMatchRule({ threat_index: ['logs-ti_*', 'logs-defend_*'], - }, + }), }; 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 34f0cdbcac317..be8906d76eb6b 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 @@ -8,8 +8,9 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatIndicatorPathReadOnly } from './threat_indicator_path'; +import { mockThreatMatchRule } from '../../storybook/mocks'; export default { component: ThreatIndicatorPathReadOnly, @@ -18,22 +19,19 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { return ( - + ); }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockThreatMatchRule({ threat_indicator_path: 'threat.indicator', - }, + }), }; 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 05d1aaa6cb028..4f5b8f608c4bf 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 @@ -8,8 +8,9 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatMappingReadOnly } from './threat_mapping'; +import { mockThreatMatchRule } from '../../storybook/mocks'; export default { component: ThreatMappingReadOnly, @@ -17,22 +18,17 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; } const Template: Story = (args) => { - return ( - - ); + return ; }; export const Default = Template.bind({}); Default.args = { - finalDiffableRule: { + finalDiffableRule: mockThreatMatchRule({ threat_mapping: [ { entries: [ @@ -44,5 +40,5 @@ Default.args = { ], }, ], - }, + }), }; 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 5b59287255bc9..28b4cd65ba78b 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 @@ -8,13 +8,14 @@ import React from 'react'; import type { Story } from '@storybook/react'; import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableAllFields } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; import { ThreatQueryReadOnly } from './threat_query'; import { dataSourceWithDataView, dataSourceWithIndexPatterns, inlineKqlQuery, mockDataView, + mockThreatMatchRule, } from '../../storybook/mocks'; import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; @@ -24,17 +25,14 @@ export default { }; interface TemplateProps { - finalDiffableRule: Partial; + finalDiffableRule: DiffableRule; kibanaServicesMock?: Record; } const Template: Story = (args) => { return ( - + ); }; @@ -42,10 +40,10 @@ const Template: Story = (args) => { export const ThreatQueryWithIndexPatterns = Template.bind({}); ThreatQueryWithIndexPatterns.args = { - finalDiffableRule: { + finalDiffableRule: mockThreatMatchRule({ threat_query: inlineKqlQuery, data_source: dataSourceWithIndexPatterns, - }, + }), kibanaServicesMock: { data: { dataViews: { @@ -58,10 +56,10 @@ ThreatQueryWithIndexPatterns.args = { export const ThreatQueryWithDataView = Template.bind({}); ThreatQueryWithDataView.args = { - finalDiffableRule: { + finalDiffableRule: mockThreatMatchRule({ threat_query: inlineKqlQuery, data_source: dataSourceWithDataView, - }, + }), kibanaServicesMock: { data: { dataViews: { 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.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.tsx index 6092fd8a0e0ce..b321213b75ad5 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.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.tsx @@ -7,8 +7,8 @@ import React from 'react'; import type { - DiffableAllFields, InlineKqlQuery, + RuleDataSource, } from '../../../../../../../../../common/api/detection_engine'; import * as ruleDetailsI18n from '../../../../translations'; import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; @@ -22,7 +22,7 @@ const i18nLabels = { export interface ThreatQueryReadOnlyProps { threatQuery: InlineKqlQuery; - dataSource: DiffableAllFields['data_source']; + dataSource?: RuleDataSource; } export const ThreatQueryReadOnly = ({ threatQuery, dataSource }: ThreatQueryReadOnlyProps) => { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/machine_learning_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/machine_learning_rule_field_readonly.tsx new file mode 100644 index 0000000000000..5ebc6f80b13f2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/machine_learning_rule_field_readonly.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { DiffableMachineLearningFields } from '../../../../../../../common/api/detection_engine'; +import { MachineLearningJobIdReadOnly } from './fields/machine_learning_job_id/machine_learning_job_id'; + +interface MachineLearningRuleFieldReadOnlyProps { + fieldName: keyof DiffableMachineLearningFields; + finalDiffableRule: DiffableMachineLearningFields; +} + +export function MachineLearningRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: MachineLearningRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'machine_learning_job_id': + return ( + + ); + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/new_terms_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/new_terms_rule_field_readonly.tsx new file mode 100644 index 0000000000000..0e2b52c71ba2b --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/new_terms_rule_field_readonly.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { DiffableNewTermsFields } from '../../../../../../../common/api/detection_engine'; +import { DataSourceReadOnly } from './fields/data_source/data_source'; +import { KqlQueryReadOnly } from './fields/kql_query'; + +interface NewTermsRuleFieldReadOnlyProps { + fieldName: keyof DiffableNewTermsFields; + finalDiffableRule: DiffableNewTermsFields; +} + +export function NewTermsRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: NewTermsRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'data_source': + return ; + case 'kql_query': + return ( + + ); + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/saved_query_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/saved_query_rule_field_readonly.tsx new file mode 100644 index 0000000000000..41e2e0c32108b --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/saved_query_rule_field_readonly.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { DiffableSavedQueryFields } from '../../../../../../../common/api/detection_engine'; +import { DataSourceReadOnly } from './fields/data_source/data_source'; +import { KqlQueryReadOnly } from './fields/kql_query'; + +interface SavedQueryRuleFieldReadOnlyProps { + fieldName: keyof DiffableSavedQueryFields; + finalDiffableRule: DiffableSavedQueryFields; +} + +export function SavedQueryRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: SavedQueryRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'data_source': + return ; + case 'kql_query': + return ( + + ); + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/mocks.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/mocks.ts index 2b21558e9b0ca..854251450809f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/mocks.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/storybook/mocks.ts @@ -9,9 +9,21 @@ import type { FieldFormatsStartCommon } from '@kbn/field-formats-plugin/common'; import { DataView } from '@kbn/data-views-plugin/common'; import { DataSourceType, KqlQueryType } from '../../../../../../../../common/api/detection_engine'; import type { - DiffableAllFields, + DataSourceDataView, + DataSourceIndexPatterns, + DiffableCommonFields, + DiffableCustomQueryFields, + DiffableEqlFields, + DiffableEsqlFields, + DiffableMachineLearningFields, + DiffableRule, + DiffableSavedQueryFields, + DiffableThreatMatchFields, + InlineKqlQuery, + RuleEqlQuery, SavedKqlQuery, } from '../../../../../../../../common/api/detection_engine'; +import { DEFAULT_MAX_SIGNALS } from '../../../../../../../../common/constants'; export const filters = [ { @@ -50,7 +62,7 @@ export const savedQueryResponse = { namespaces: ['default'], }; -export const inlineKqlQuery: DiffableAllFields['kql_query'] = { +export const inlineKqlQuery: InlineKqlQuery = { type: KqlQueryType.inline_query, query: 'event.action: "user_login" and source.ip: "192.168.1.100"', language: 'kuery', @@ -62,18 +74,18 @@ export const savedKqlQuery: SavedKqlQuery = { saved_query_id: 'fake-saved-query-id', }; -export const eqlQuery: DiffableAllFields['eql_query'] = { +export const eqlQuery: RuleEqlQuery = { query: 'process where process.name == "powershell.exe" and process.args : "* -EncodedCommand *"', language: 'eql', filters, }; -export const dataSourceWithIndexPatterns: DiffableAllFields['data_source'] = { +export const dataSourceWithIndexPatterns: DataSourceIndexPatterns = { type: DataSourceType.index_patterns, index_patterns: ['logs-*'], }; -export const dataSourceWithDataView: DiffableAllFields['data_source'] = { +export const dataSourceWithDataView: DataSourceDataView = { type: DataSourceType.data_view, data_view_id: 'logs-*', }; @@ -103,3 +115,162 @@ export function mockDataView(spec: Partial = {}): DataView return dataView; } + +const commonDiffableRuleFields: DiffableCommonFields = { + rule_id: 'some-rule-id', + version: 1, + + name: 'Some Rule Name', + tags: [], + description: 'Some rule description', + severity: 'low', + severity_mapping: [], + risk_score: 1, + risk_score_mapping: [], + + references: [], + false_positives: [], + threat: [], + note: '', + setup: '', + related_integrations: [], + required_fields: [], + author: [], + license: '', + + rule_schedule: { + interval: '5m', + lookback: '360s', + }, + exceptions_list: [], + max_signals: DEFAULT_MAX_SIGNALS, +}; + +const customQueryDiffableRuleFields: DiffableCustomQueryFields = { + type: 'query', + kql_query: { + type: KqlQueryType.inline_query, + query: '*', + language: 'kuery', + filters: [], + }, +}; + +export function mockCustomQueryRule( + overrides: Partial +): DiffableRule { + return { + ...commonDiffableRuleFields, + ...customQueryDiffableRuleFields, + ...overrides, + }; +} + +const savedQueryDiffableRuleFields: DiffableSavedQueryFields = { + type: 'saved_query', + kql_query: { + type: KqlQueryType.saved_query, + saved_query_id: 'some-saved-query-id', + }, +}; + +export function mockSavedQueryRule( + overrides: Partial +): DiffableRule { + return { + ...commonDiffableRuleFields, + ...savedQueryDiffableRuleFields, + ...overrides, + }; +} + +const eqlDiffableRuleFields: DiffableEqlFields = { + type: 'eql', + eql_query: { + query: 'any where true', + language: 'eql', + filters: [], + }, +}; + +export function mockEqlRule( + overrides: Partial +): DiffableRule { + return { + ...commonDiffableRuleFields, + ...eqlDiffableRuleFields, + ...overrides, + }; +} + +const esqlDiffableRuleFields: DiffableEsqlFields = { + type: 'esql', + esql_query: { + query: 'SELECT * FROM any', + language: 'esql', + }, +}; + +export function mockEsqlRule( + overrides: Partial +): DiffableRule { + return { + ...commonDiffableRuleFields, + ...esqlDiffableRuleFields, + ...overrides, + }; +} + +const machineLearningDiffableRuleFields: DiffableMachineLearningFields = { + type: 'machine_learning', + machine_learning_job_id: 'ml-job-id-123', + anomaly_threshold: 0, +}; + +export function mockMachineLearningRule( + overrides: Partial +): DiffableRule { + return { + ...commonDiffableRuleFields, + ...machineLearningDiffableRuleFields, + ...overrides, + }; +} + +const threatMatchDiffableRuleFields: DiffableThreatMatchFields = { + type: 'threat_match', + kql_query: { + type: KqlQueryType.inline_query, + query: '*', + language: 'kuery', + filters: [], + }, + threat_query: { + type: KqlQueryType.inline_query, + query: '*', + language: 'kuery', + filters: [], + }, + threat_index: [], + threat_mapping: [ + { + entries: [ + { + field: 'abc', + type: 'mapping', + value: 'xyz', + }, + ], + }, + ], +}; + +export function mockThreatMatchRule( + overrides: Partial +): DiffableRule { + return { + ...commonDiffableRuleFields, + ...threatMatchDiffableRuleFields, + ...overrides, + }; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threat_match_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threat_match_rule_field_readonly.tsx new file mode 100644 index 0000000000000..11fd941601922 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threat_match_rule_field_readonly.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 React from 'react'; +import type { DiffableThreatMatchFields } from '../../../../../../../common/api/detection_engine'; +import { DataSourceReadOnly } from './fields/data_source/data_source'; +import { KqlQueryReadOnly } from './fields/kql_query'; +import { ThreatIndexReadOnly } from './fields/threat_index/threat_index'; +import { ThreatIndicatorPathReadOnly } from './fields/threat_indicator_path/threat_indicator_path'; +import { ThreatMappingReadOnly } from './fields/threat_mapping/threat_mapping'; +import { ThreatQueryReadOnly } from './fields/threat_query/threat_query'; + +interface ThreatMatchRuleFieldReadOnlyProps { + fieldName: keyof DiffableThreatMatchFields; + finalDiffableRule: DiffableThreatMatchFields; +} + +export function ThreatMatchRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: ThreatMatchRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'data_source': + return ; + case 'kql_query': + return ( + + ); + case 'threat_index': + return ; + case 'threat_indicator_path': + return ( + + ); + case 'threat_mapping': + return ; + case 'threat_query': + return ( + + ); + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threshold_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threshold_rule_field_readonly.tsx new file mode 100644 index 0000000000000..da7d3984d7ccb --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/threshold_rule_field_readonly.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { DiffableThresholdFields } from '../../../../../../../common/api/detection_engine'; +import { DataSourceReadOnly } from './fields/data_source/data_source'; +import { KqlQueryReadOnly } from './fields/kql_query'; + +interface ThresholdRuleFieldReadOnlyProps { + fieldName: keyof DiffableThresholdFields; + finalDiffableRule: DiffableThresholdFields; +} + +export function ThresholdRuleFieldReadOnly({ + fieldName, + finalDiffableRule, +}: ThresholdRuleFieldReadOnlyProps) { + switch (fieldName) { + case 'data_source': + return ; + case 'kql_query': + return ( + + ); + case 'type': + return null; + default: + return null; // Will replace with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx index b943022f5d53d..b4ff6ab29a3ff 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx @@ -5,8 +5,18 @@ * 2.0. */ -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; -import React from 'react'; +import { + EuiButton, + EuiButtonIcon, + EuiContextMenuItem, + EuiContextMenuPanel, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiPopover, +} from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; +import { useBoolean } from 'react-use'; import { useUserData } from '../../../../../detections/components/user_info'; import { useAddPrebuiltRulesTableContext } from './add_prebuilt_rules_table_context'; import * as i18n from './translations'; @@ -31,19 +41,69 @@ export const AddPrebuiltRulesHeaderButtons = () => { const isRuleInstalling = loadingRules.length > 0; const isRequestInProgress = isRuleInstalling || isRefetching || isUpgradingSecurityPackages; + const [isOverflowPopoverOpen, setOverflowPopover] = useBoolean(false); + + const onOverflowButtonClick = () => { + setOverflowPopover(!isOverflowPopoverOpen); + }; + + const closeOverflowPopover = useCallback(() => { + setOverflowPopover(false); + }, [setOverflowPopover]); + + const enableOnClick = useCallback(() => { + installSelectedRules(true); + closeOverflowPopover(); + }, [closeOverflowPopover, installSelectedRules]); + + const installOnClick = useCallback(() => { + installSelectedRules(); + }, [installSelectedRules]); + + const overflowItems = useMemo( + () => [ + + {i18n.INSTALL_AND_ENABLE_BUTTON_LABEL} + , + ], + [enableOnClick] + ); + return ( {shouldDisplayInstallSelectedRulesButton ? ( - - - {i18n.INSTALL_SELECTED_RULES(numberOfSelectedRules)} - {isRuleInstalling ? : undefined} - - + <> + + + {i18n.INSTALL_SELECTED_RULES(numberOfSelectedRules)} + {isRuleInstalling && } + + + + + } + isOpen={isOverflowPopoverOpen} + closePopover={closeOverflowPopover} + panelPaddingSize="s" + anchorPosition="downRight" + > + + + + ) : null} { aria-label={i18n.INSTALL_ALL_ARIA_LABEL} > {i18n.INSTALL_ALL} - {isRuleInstalling ? : undefined} + {isRuleInstalling && } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_install_button.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_install_button.tsx new file mode 100644 index 0000000000000..ea83efae768fa --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_install_button.tsx @@ -0,0 +1,118 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButtonEmpty, + EuiButtonIcon, + EuiContextMenuItem, + EuiContextMenuPanel, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiPopover, +} from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; +import { useBoolean } from 'react-use'; +import type { Rule } from '../../../../rule_management/logic'; +import type { RuleSignatureId } from '../../../../../../common/api/detection_engine'; +import type { AddPrebuiltRulesTableActions } from './add_prebuilt_rules_table_context'; +import * as i18n from './translations'; + +export interface PrebuiltRulesInstallButtonProps { + ruleId: RuleSignatureId; + record: Rule; + installOneRule: AddPrebuiltRulesTableActions['installOneRule']; + loadingRules: RuleSignatureId[]; + isDisabled: boolean; +} + +export const PrebuiltRulesInstallButton = ({ + ruleId, + record, + installOneRule, + loadingRules, + isDisabled, +}: PrebuiltRulesInstallButtonProps) => { + const isRuleInstalling = loadingRules.includes(ruleId); + const isInstallButtonDisabled = isRuleInstalling || isDisabled; + const [isPopoverOpen, setPopover] = useBoolean(false); + + const onOverflowButtonClick = useCallback(() => { + setPopover(!isPopoverOpen); + }, [isPopoverOpen, setPopover]); + + const closeOverflowPopover = useCallback(() => { + setPopover(false); + }, [setPopover]); + + const enableOnClick = useCallback(() => { + installOneRule(ruleId, true); + closeOverflowPopover(); + }, [closeOverflowPopover, installOneRule, ruleId]); + + const installOnClick = useCallback(() => { + installOneRule(ruleId); + }, [installOneRule, ruleId]); + + const overflowItems = useMemo( + () => [ + + {i18n.INSTALL_AND_ENABLE_BUTTON_LABEL} + , + ], + [enableOnClick] + ); + + const popoverButton = useMemo( + () => ( + + ), + [isInstallButtonDisabled, onOverflowButtonClick] + ); + + if (isRuleInstalling) { + return ( + + ); + } + return ( + + + + {i18n.INSTALL_BUTTON_LABEL} + + + + + + + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_table_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_table_context.tsx index 5450fc1f64a1c..14e539ec40ae1 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_table_context.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_table_context.tsx @@ -7,7 +7,7 @@ import type { Dispatch, SetStateAction } from 'react'; import React, { createContext, useCallback, useContext, useMemo, useState } from 'react'; -import { EuiButton } from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { useUserData } from '../../../../../detections/components/user_info'; import { useFetchPrebuiltRulesStatusQuery } from '../../../../rule_management/api/hooks/prebuilt_rules/use_fetch_prebuilt_rules_status_query'; import { useIsUpgradingSecurityPackages } from '../../../../rule_management/logic/use_upgrade_security_packages'; @@ -75,9 +75,9 @@ export interface AddPrebuiltRulesTableState { export interface AddPrebuiltRulesTableActions { reFetchRules: () => void; - installOneRule: (ruleId: RuleSignatureId) => void; + installOneRule: (ruleId: RuleSignatureId, enable?: boolean) => void; installAllRules: () => void; - installSelectedRules: () => void; + installSelectedRules: (enable?: boolean) => void; setFilterOptions: Dispatch>; selectRules: (rules: RuleResponse[]) => void; openRulePreview: (ruleId: RuleSignatureId) => void; @@ -140,13 +140,16 @@ export const AddPrebuiltRulesTableContextProvider = ({ const filteredRules = useFilterPrebuiltRulesToInstall({ filterOptions, rules }); const installOneRule = useCallback( - async (ruleId: RuleSignatureId) => { + async (ruleId: RuleSignatureId, enable?: boolean) => { const rule = rules.find((r) => r.rule_id === ruleId); invariant(rule, `Rule with id ${ruleId} not found`); setLoadingRules((prev) => [...prev, ruleId]); try { - await installSpecificRulesRequest([{ rule_id: ruleId, version: rule.version }]); + await installSpecificRulesRequest({ + rules: [{ rule_id: ruleId, version: rule.version }], + enable, + }); } finally { setLoadingRules((prev) => prev.filter((id) => id !== ruleId)); } @@ -154,19 +157,24 @@ export const AddPrebuiltRulesTableContextProvider = ({ [installSpecificRulesRequest, rules] ); - const installSelectedRules = useCallback(async () => { - const rulesToUpgrade = selectedRules.map((rule) => ({ - rule_id: rule.rule_id, - version: rule.version, - })); - setLoadingRules((prev) => [...prev, ...rulesToUpgrade.map((r) => r.rule_id)]); - try { - await installSpecificRulesRequest(rulesToUpgrade); - } finally { - setLoadingRules((prev) => prev.filter((id) => !rulesToUpgrade.some((r) => r.rule_id === id))); - setSelectedRules([]); - } - }, [installSpecificRulesRequest, selectedRules]); + const installSelectedRules = useCallback( + async (enable?: boolean) => { + const rulesToUpgrade = selectedRules.map((rule) => ({ + rule_id: rule.rule_id, + version: rule.version, + })); + setLoadingRules((prev) => [...prev, ...rulesToUpgrade.map((r) => r.rule_id)]); + try { + await installSpecificRulesRequest({ rules: rulesToUpgrade, enable }); + } finally { + setLoadingRules((prev) => + prev.filter((id) => !rulesToUpgrade.some((r) => r.rule_id === id)) + ); + setSelectedRules([]); + } + }, + [installSpecificRulesRequest, selectedRules] + ); const installAllRules = useCallback(async () => { // Unselect all rules so that the table doesn't show the "bulk actions" bar @@ -188,17 +196,33 @@ export const AddPrebuiltRulesTableContextProvider = ({ !(isPreviewRuleLoading || isRefetching || isUpgradingSecurityPackages); return ( - { - installOneRule(rule.rule_id); - closeRulePreview(); - }} - fill - data-test-subj="installPrebuiltRuleFromFlyoutButton" - > - {i18n.INSTALL_BUTTON_LABEL} - + + + { + installOneRule(rule.rule_id); + closeRulePreview(); + }} + data-test-subj="installPrebuiltRuleFromFlyoutButton" + > + {i18n.INSTALL_WITHOUT_ENABLING_BUTTON_LABEL} + + + + { + installOneRule(rule.rule_id, true); + closeRulePreview(); + }} + fill + data-test-subj="installAndEnablePrebuiltRuleFromFlyoutButton" + > + {i18n.INSTALL_AND_ENABLE_BUTTON_LABEL} + + + ); }, [ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/translations.ts index a3ea514571151..c335f7624afd8 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/translations.ts @@ -44,3 +44,32 @@ export const INSTALL_BUTTON_LABEL = i18n.translate( defaultMessage: 'Install', } ); + +export const INSTALL_WITHOUT_ENABLING_BUTTON_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.installWithoutEnablingButtonLabel', + { + defaultMessage: 'Install without enabling', + } +); + +export const INSTALL_AND_ENABLE_BUTTON_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.installAndEnableButtonLabel', + { + defaultMessage: 'Install and enable', + } +); + +export const INSTALL_RULE_BUTTON_ARIA_LABEL = (ruleName: string) => + i18n.translate('xpack.securitySolution.addRules.installRuleButton.ariaLabel', { + defaultMessage: 'Install "{ruleName}"', + values: { + ruleName, + }, + }); + +export const INSTALL_RULES_OVERFLOW_BUTTON_ARIA_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.installOverflowButton.ariaLabel', + { + defaultMessage: 'More install options', + } +); 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 70c40349fc80c..eaf3af79ee360 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 @@ -6,7 +6,7 @@ */ import type { EuiBasicTableColumn } from '@elastic/eui'; -import { EuiButtonEmpty, EuiBadge, EuiText, EuiLoadingSpinner, EuiLink } from '@elastic/eui'; +import { EuiBadge, EuiText, EuiLink } from '@elastic/eui'; import React, { useMemo } from 'react'; import { RulesTableEmptyColumnName } from '../rules_table_empty_column_name'; import { SHOW_RELATED_INTEGRATIONS_SETTING } from '../../../../../../common/constants'; @@ -25,6 +25,7 @@ import type { RuleResponse, } from '../../../../../../common/api/detection_engine/model/rule_schema'; import { getNormalizedSeverity } from '../helpers'; +import { PrebuiltRulesInstallButton } from './add_prebuilt_rules_install_button'; export type TableColumn = EuiBasicTableColumn; @@ -113,28 +114,15 @@ const createInstallButtonColumn = ( ): TableColumn => ({ field: 'rule_id', name: , - render: (ruleId: RuleSignatureId, record: Rule) => { - const isRuleInstalling = loadingRules.includes(ruleId); - const isInstallButtonDisabled = isRuleInstalling || isDisabled; - return ( - installOneRule(ruleId)} - data-test-subj={`installSinglePrebuiltRuleButton-${ruleId}`} - aria-label={i18n.INSTALL_RULE_BUTTON_ARIA_LABEL(record.name)} - > - {isRuleInstalling ? ( - - ) : ( - i18n.INSTALL_RULE_BUTTON - )} - - ); - }, + render: (ruleId: RuleSignatureId, record: Rule) => ( + + ), width: '10%', align: 'center', }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index ca42502d93c4e..b573edd84343f 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -1393,14 +1393,6 @@ export const INSTALL_RULE_BUTTON = i18n.translate( } ); -export const INSTALL_RULE_BUTTON_ARIA_LABEL = (ruleName: string) => - i18n.translate('xpack.securitySolution.addRules.installRuleButton.ariaLabel', { - defaultMessage: 'Install "{ruleName}"', - values: { - ruleName, - }, - }); - export const UPDATE_RULE_BUTTON = i18n.translate( 'xpack.securitySolution.addRules.upgradeRuleButton', { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts index 427a5633a7265..f958d20d7c96b 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts @@ -6,6 +6,7 @@ */ import { useMemo } from 'react'; +import { LIST_ENTITIES_URL } from '../../../common/entity_analytics/entity_store/constants'; import type { RiskEngineScheduleNowResponse } from '../../../common/api/entity_analytics/risk_engine/engine_schedule_now_route.gen'; import type { DisableRiskEngineResponse } from '../../../common/api/entity_analytics/risk_engine/engine_disable_route.gen'; import type { UploadAssetCriticalityRecordsResponse } from '../../../common/api/entity_analytics/asset_criticality/upload_asset_criticality_csv.gen'; @@ -44,6 +45,8 @@ import { import type { SnakeToCamelCase } from '../common/utils'; import { useKibana } from '../../common/lib/kibana/kibana_react'; import type { ReadRiskEngineSettingsResponse } from '../../../common/api/entity_analytics/risk_engine'; +import type { ListEntitiesResponse } from '../../../common/api/entity_analytics/entity_store/entities/list_entities.gen'; +import { type ListEntitiesRequestQuery } from '../../../common/api/entity_analytics/entity_store/entities/list_entities.gen'; export interface DeleteAssetCriticalityResponse { deleted: true; @@ -69,6 +72,30 @@ export const useEntityAnalyticsRoutes = () => { signal, }); + /** + * Fetches entities from the Entity Store + */ + const fetchEntitiesList = ({ + signal, + params, + }: { + signal?: AbortSignal; + params: FetchEntitiesListParams; + }) => + http.fetch(LIST_ENTITIES_URL, { + version: API_VERSIONS.public.v1, + method: 'GET', + query: { + entities_types: params.entitiesTypes, + sort_field: params.sortField, + sort_order: params.sortOrder, + page: params.page, + per_page: params.perPage, + filterQuery: params.filterQuery, + }, + signal, + }); + /** * Fetches risks engine status */ @@ -256,8 +283,11 @@ export const useEntityAnalyticsRoutes = () => { getRiskScoreIndexStatus, fetchRiskEngineSettings, calculateEntityRiskScore, + fetchEntitiesList, }; }, [http]); }; export type AssetCriticality = SnakeToCamelCase; + +export type FetchEntitiesListParams = SnakeToCamelCase; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx index 1db11becf9610..8ea65a7f3096b 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx @@ -64,6 +64,7 @@ export const HostPanelContent = ({ entity={{ name: hostName, type: 'host' }} onChange={onAssetCriticalityChange} /> + - ); }; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx index bdff465e0b982..9c4b9938d6daa 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx @@ -51,4 +51,46 @@ describe('LeftPanel', () => { expect(tabElement).not.toBeInTheDocument(); }); + + it("doesn't render insights panel when there no misconfiguration findings", () => { + const { queryByText } = render( + , + { + wrapper: TestProviders, + } + ); + + const tabElement = queryByText('Insights'); + + expect(tabElement).not.toBeInTheDocument(); + }); + + it('render insights panel when there are misconfiguration findings', () => { + const { queryByText } = render( + , + { + wrapper: TestProviders, + } + ); + + const tabElement = queryByText('Insights'); + + expect(tabElement).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx index a04bd739eb299..ae3e99cc17cfe 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx @@ -28,6 +28,7 @@ export interface UserDetailsPanelProps extends Record { user: UserParam; path?: PanelPath; scopeId: string; + hasMisconfigurationFindings?: boolean; } export interface UserDetailsExpandableFlyoutProps extends FlyoutPanelProps { key: 'user_details'; @@ -40,10 +41,24 @@ export const UserDetailsPanel = ({ user, path, scopeId, + hasMisconfigurationFindings, }: UserDetailsPanelProps) => { const managedUser = useManagedUser(user.name, user.email); - const tabs = useTabs(managedUser.data, user.name, isRiskScoreExist, scopeId); - const { selectedTabId, setSelectedTabId } = useSelectedTab(isRiskScoreExist, user, tabs, path); + const tabs = useTabs( + managedUser.data, + user.name, + isRiskScoreExist, + scopeId, + hasMisconfigurationFindings + ); + + const { selectedTabId, setSelectedTabId } = useSelectedTab( + isRiskScoreExist, + user, + tabs, + path, + hasMisconfigurationFindings + ); if (managedUser.isLoading) return ; @@ -67,7 +82,8 @@ const useSelectedTab = ( isRiskScoreExist: boolean, user: UserParam, tabs: LeftPanelTabsType, - path: PanelPath | undefined + path: PanelPath | undefined, + hasMisconfigurationFindings?: boolean ) => { const { openLeftPanel } = useExpandableFlyoutApi(); @@ -81,12 +97,13 @@ const useSelectedTab = ( const setSelectedTabId = (tabId: EntityDetailsLeftPanelTab) => { openLeftPanel({ id: UserDetailsPanelKey, - path: { - tab: tabId, - }, params: { user, isRiskScoreExist, + hasMisconfigurationFindings, + path: { + tab: tabId, + }, }, }); }; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx index 3a6814a28e62c..6f27b054759f2 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/tabs.tsx @@ -8,7 +8,10 @@ import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getRiskInputTab } from '../../../entity_analytics/components/entity_details_flyout'; +import { + getInsightsInputTab, + getRiskInputTab, +} from '../../../entity_analytics/components/entity_details_flyout'; import { UserAssetTableType } from '../../../explore/users/store/model'; import { ManagedUserDatasetKey } from '../../../../common/search_strategy/security_solution/users/managed_details'; import type { @@ -26,7 +29,8 @@ export const useTabs = ( managedUser: ManagedUserHits, name: string, isRiskScoreExist: boolean, - scopeId: string + scopeId: string, + hasMisconfigurationFindings?: boolean ): LeftPanelTabsType => useMemo(() => { const tabs: LeftPanelTabsType = []; @@ -51,8 +55,12 @@ export const useTabs = ( tabs.push(getEntraTab(entraManagedUser)); } + if (hasMisconfigurationFindings) { + tabs.push(getInsightsInputTab({ name, fieldName: 'user.name' })); + } + return tabs; - }, [isRiskScoreExist, managedUser, name, scopeId]); + }, [hasMisconfigurationFindings, isRiskScoreExist, managedUser, name, scopeId]); const getOktaTab = (oktaManagedUser: ManagedUserHit) => ({ id: EntityDetailsLeftPanelTab.OKTA, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx index 26945a12f8bd6..42b281d0c8d2b 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx @@ -23,6 +23,7 @@ import { ObservedEntity } from '../shared/components/observed_entity'; import type { ObservedEntityData } from '../shared/components/observed_entity/types'; import { useObservedUserItems } from './hooks/use_observed_user_items'; import type { EntityDetailsLeftPanelTab } from '../shared/components/left_panel/left_panel_header'; +import { EntityInsight } from '../../../cloud_security_posture/components'; interface UserPanelContentProps { userName: string; @@ -72,6 +73,7 @@ export const UserPanelContent = ({ entity={{ name: userName, type: 'user' }} onChange={onAssetCriticalityChange} /> + 0 || failedFindings > 0; + useQueryInspector({ deleteQuery, inspect, @@ -119,11 +134,20 @@ export const UserPanel = ({ name: userName, email, }, + path: tab ? { tab } : undefined, + hasMisconfigurationFindings, }, - path: tab ? { tab } : undefined, }); }, - [telemetry, openLeftPanel, userRiskData?.user?.risk, userName, email, scopeId] + [ + telemetry, + openLeftPanel, + userRiskData?.user?.risk, + scopeId, + userName, + email, + hasMisconfigurationFindings, + ] ); const openPanelFirstTab = useCallback(() => openPanelTab(), [openPanelTab]); @@ -156,7 +180,9 @@ export const UserPanel = ({ return ( <> ( - + ), }, { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts index bc909bb62a30e..4b1b8e728e8c2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts @@ -12,6 +12,8 @@ import { tryAddingDisabledResponseAction, validateAvailableCommands, visitRuleActions, + selectIsolateAndSaveWithoutEnabling, + fillUpNewEsqlRule, } from '../../tasks/response_actions'; import { cleanupRule, generateRandomStringName, loadRule } from '../../tasks/api_fixtures'; import { ResponseActionTypesEnum } from '../../../../../common/api/detection_engine'; @@ -28,6 +30,7 @@ describe( kbnServerArgs: [ `--xpack.securitySolution.enableExperimental=${JSON.stringify([ 'automatedProcessActionsEnabled', + 'automatedResponseActionsForMoreRulesEnabled', ])}`, ], }, @@ -202,6 +205,23 @@ describe( }); }); + describe('User should be able to add response action to ESQL rule', () => { + const [ruleName, ruleDescription] = generateRandomStringName(2); + + beforeEach(() => { + login(ROLE.soc_manager); + }); + + it('create and save endpoint response action inside of a rule', () => { + const query = 'FROM * METADATA _index, _id'; + fillUpNewEsqlRule(ruleName, ruleDescription, query); + addEndpointResponseAction(); + focusAndOpenCommandDropdown(); + validateAvailableCommands(); + selectIsolateAndSaveWithoutEnabling(ruleName); + }); + }); + describe('User should not see endpoint action when no rbac', () => { const [ruleName, ruleDescription] = generateRandomStringName(2); diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts index 0e46b99c40d72..715f8adc972f5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts @@ -42,6 +42,12 @@ export const validateAvailableCommands = () => { cy.getByTestSubj(`command-type-${command}`); }); }; +export const selectIsolateAndSaveWithoutEnabling = (ruleName: string) => { + cy.getByTestSubj(`command-type-isolate`).click(); + cy.getByTestSubj('create-enabled-false').click(); + cy.contains(`${ruleName} was created`); +}; + export const addEndpointResponseAction = () => { cy.getByTestSubj('response-actions-wrapper').within(() => { cy.getByTestSubj('Elastic Defend-response-action-type-selection-option').click(); @@ -69,6 +75,26 @@ export const fillUpNewRule = (name = 'Test', description = 'Test') => { cy.getByTestSubj('about-continue').click(); cy.getByTestSubj('schedule-continue').click(); }; +export const fillUpNewEsqlRule = (name = 'Test', description = 'Test', query: string) => { + loadPage('app/security/rules/management'); + cy.getByTestSubj('create-new-rule').click(); + cy.getByTestSubj('stepDefineRule').within(() => { + cy.getByTestSubj('esqlRuleType').click(); + cy.getByTestSubj('detectionEngineStepDefineRuleEsqlQueryBar').within(() => { + cy.getByTestSubj('globalQueryBar').click(); + cy.getByTestSubj('kibanaCodeEditor').type(query); + }); + }); + cy.getByTestSubj('define-continue').click(); + cy.getByTestSubj('detectionEngineStepAboutRuleName').within(() => { + cy.getByTestSubj('input').type(name); + }); + cy.getByTestSubj('detectionEngineStepAboutRuleDescription').within(() => { + cy.getByTestSubj('input').type(description); + }); + cy.getByTestSubj('about-continue').click(); + cy.getByTestSubj('schedule-continue').click(); +}; export const visitRuleActions = (ruleId: string) => { loadPage(`app/security/rules/id/${ruleId}/edit`); cy.getByTestSubj('edit-rule-actions-tab').should('exist'); diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index 42c332d5f8449..ca144c21d7847 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -45,7 +45,6 @@ import type { SavedObjectTaggingOssPluginStart, } from '@kbn/saved-objects-tagging-oss-plugin/public'; import type { ThreatIntelligencePluginStart } from '@kbn/threat-intelligence-plugin/public'; -import type { CloudExperimentsPluginStart } from '@kbn/cloud-experiments-plugin/common'; import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; import type { DataViewsServicePublic } from '@kbn/data-views-plugin/public'; import type { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; @@ -143,7 +142,6 @@ export interface StartPlugins { cloudDefend: CloudDefendPluginStart; cloudSecurityPosture: CspClientPluginStart; threatIntelligence: ThreatIntelligencePluginStart; - cloudExperiments?: CloudExperimentsPluginStart; dataViews: DataViewsServicePublic; fieldFormats: FieldFormatsStartCommon; discover: DiscoverStart; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/nl_to_esql_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/nl_to_esql_tool.ts new file mode 100644 index 0000000000000..b5dc209043d5d --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/nl_to_esql_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 { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from '@kbn/zod'; +import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; +import { lastValueFrom } from 'rxjs'; +import { naturalLanguageToEsql } from '@kbn/inference-plugin/server'; +import { APP_UI_ID } from '../../../../common'; + +export type ESQLToolParams = AssistantToolParams; + +const TOOL_NAME = 'NaturalLanguageESQLTool'; + +const toolDetails = { + id: 'nl-to-esql-tool', + name: TOOL_NAME, + description: `You MUST use the "${TOOL_NAME}" function when the user wants to: + - run any arbitrary query + - breakdown or filter ES|QL queries that are displayed on the current page + - convert queries from another language to ES|QL + - asks general questions about ES|QL + + DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself. + DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "${TOOL_NAME}" function for this. + + Even if the "${TOOL_NAME}" function was used before that, follow it up with the "${TOOL_NAME}" function. If a query fails, do not attempt to correct it yourself. Again you should call the "${TOOL_NAME}" function, + even if it has been called before.`, +}; + +export const NL_TO_ESQL_TOOL: AssistantTool = { + ...toolDetails, + sourceRegister: APP_UI_ID, + isSupported: (params: ESQLToolParams): params is ESQLToolParams => { + const { chain, isEnabledKnowledgeBase, modelExists } = params; + return isEnabledKnowledgeBase && modelExists && chain != null; + }, + getTool(params: ESQLToolParams) { + if (!this.isSupported(params)) return null; + + const { connectorId, inference, logger, request } = params as ESQLToolParams; + if (inference == null || connectorId == null) return null; + + const callNaturalLanguageToEsql = async (question: string) => { + return lastValueFrom( + naturalLanguageToEsql({ + client: inference.getClient({ request }), + connectorId, + input: question, + logger: { + debug: (source) => { + logger.debug(typeof source === 'function' ? source() : source); + }, + }, + }) + ); + }; + + return new DynamicStructuredTool({ + name: toolDetails.name, + description: toolDetails.description, + schema: z.object({ + question: z.string().describe(`The user's exact question about ESQL`), + }), + func: async (input) => { + const generateEvent = await callNaturalLanguageToEsql(input.question); + const answer = generateEvent.content ?? 'An error occurred in the tool'; + + logger.debug(`Received response from NL to ESQL tool: ${answer}`); + return answer; + }, + tags: ['esql', 'query-generation', 'knowledge-base'], + // TODO: Remove after ZodAny is fixed https://github.com/langchain-ai/langchainjs/blob/main/langchain-core/src/tools.ts + }) as unknown as DynamicStructuredTool; + }, +}; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts index 047c84ceddf3b..b64f34e4b6ee9 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/index.test.ts @@ -13,7 +13,7 @@ describe('getAssistantTools', () => { }); it('should return an array of applicable tools', () => { - const tools = getAssistantTools(); + const tools = getAssistantTools(true); const minExpectedTools = 3; // 3 tools are currently implemented diff --git a/x-pack/plugins/security_solution/server/assistant/tools/index.ts b/x-pack/plugins/security_solution/server/assistant/tools/index.ts index 0e5ea3a8f69d1..181e55353adc7 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/index.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/index.ts @@ -7,17 +7,18 @@ import type { AssistantTool } from '@kbn/elastic-assistant-plugin/server'; -import { ALERT_COUNTS_TOOL } from './alert_counts/alert_counts_tool'; import { ESQL_KNOWLEDGE_BASE_TOOL } from './esql_language_knowledge_base/esql_language_knowledge_base_tool'; +import { NL_TO_ESQL_TOOL } from './esql_language_knowledge_base/nl_to_esql_tool'; +import { ALERT_COUNTS_TOOL } from './alert_counts/alert_counts_tool'; import { OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL } from './open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool'; import { ATTACK_DISCOVERY_TOOL } from './attack_discovery/attack_discovery_tool'; import { KNOWLEDGE_BASE_RETRIEVAL_TOOL } from './knowledge_base/knowledge_base_retrieval_tool'; import { KNOWLEDGE_BASE_WRITE_TOOL } from './knowledge_base/knowledge_base_write_tool'; -export const getAssistantTools = (): AssistantTool[] => [ +export const getAssistantTools = (naturalLanguageESQLToolEnabled: boolean): AssistantTool[] => [ ALERT_COUNTS_TOOL, ATTACK_DISCOVERY_TOOL, - ESQL_KNOWLEDGE_BASE_TOOL, + naturalLanguageESQLToolEnabled ? NL_TO_ESQL_TOOL : ESQL_KNOWLEDGE_BASE_TOOL, KNOWLEDGE_BASE_RETRIEVAL_TOOL, KNOWLEDGE_BASE_WRITE_TOOL, OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts index ee028cfc7f203..45a561996e0a9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts @@ -51,6 +51,7 @@ describe('Prebuilt rule asset schema', () => { // See: detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts const omittedBaseFields = [ 'actions', + 'response_actions', 'throttle', 'meta', 'output_index', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts index 6267be09652e8..2d7b056f86248 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts @@ -63,14 +63,14 @@ const TYPE_SPECIFIC_FIELDS_TO_OMIT_FROM_SAVED_QUERY_RULES = export type TypeSpecificFields = z.infer; export const TypeSpecificFields = z.discriminatedUnion('type', [ - EqlRuleCreateFields, + EqlRuleCreateFields.omit(TYPE_SPECIFIC_FIELDS_TO_OMIT_FROM_QUERY_RULES), QueryRuleCreateFields.omit(TYPE_SPECIFIC_FIELDS_TO_OMIT_FROM_QUERY_RULES), SavedQueryRuleCreateFields.omit(TYPE_SPECIFIC_FIELDS_TO_OMIT_FROM_SAVED_QUERY_RULES), ThresholdRuleCreateFields, ThreatMatchRuleCreateFields, MachineLearningRuleCreateFields, - NewTermsRuleCreateFields, - EsqlRuleCreateFields, + NewTermsRuleCreateFields.omit(TYPE_SPECIFIC_FIELDS_TO_OMIT_FROM_QUERY_RULES), + EsqlRuleCreateFields.omit(TYPE_SPECIFIC_FIELDS_TO_OMIT_FROM_QUERY_RULES), ]); // Make sure the type-specific fields contain all the same rule types as the type-specific rule params. diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts index 7441aec8c8fa5..b0d0b202341d3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts @@ -16,7 +16,12 @@ import { } from '../../../../routes/__mocks__/request_responses'; import { requestContextMock, serverMock, requestMock } from '../../../../routes/__mocks__'; import { createRuleRoute } from './route'; -import { getCreateRulesSchemaMock } from '../../../../../../../common/api/detection_engine/model/rule_schema/mocks'; +import { + getCreateEqlRuleSchemaMock, + getCreateEsqlRulesSchemaMock, + getCreateNewTermsRulesSchemaMock, + getCreateRulesSchemaMock, +} from '../../../../../../../common/api/detection_engine/model/rule_schema/mocks'; import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { getQueryRuleParams } from '../../../../rule_schema/mocks'; import { HttpAuthzError } from '../../../../../machine_learning/validation'; @@ -181,20 +186,29 @@ describe('Create rule route', () => { }, }); const defaultAction = getResponseAction(); + const ruleTypes: Array<[string, () => object]> = [ + ['query', getCreateRulesSchemaMock], + ['esql', getCreateEsqlRulesSchemaMock], + ['eql', getCreateEqlRuleSchemaMock], + ['new_terms', getCreateNewTermsRulesSchemaMock], + ]; - test('is successful', async () => { - const request = requestMock.create({ - method: 'post', - path: DETECTION_ENGINE_RULES_URL, - body: { - ...getCreateRulesSchemaMock(), - response_actions: [defaultAction], - }, - }); + test.each(ruleTypes)( + 'is successful for %s rule', + async (ruleType: string, schemaMock: (ruleId: string) => object) => { + const request = requestMock.create({ + method: 'post', + path: DETECTION_ENGINE_RULES_URL, + body: { + ...schemaMock(`rule-${ruleType}`), + response_actions: [defaultAction], + }, + }); - const response = await server.inject(request, requestContextMock.convertContext(context)); - expect(response.status).toEqual(200); - }); + const response = await server.inject(request, requestContextMock.convertContext(context)); + expect(response.status).toEqual(200); + } + ); test('fails when isolate rbac is set to false', async () => { (context.securitySolution.getEndpointAuthz as jest.Mock).mockReturnValue(() => ({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts index 87f42a014c1d2..315ab9e80a5de 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts @@ -17,6 +17,9 @@ import { getRulesSchemaMock } from '../../../../../../../common/api/detection_en import { DETECTION_ENGINE_RULES_URL } from '../../../../../../../common/constants'; import { updateRuleRoute } from './route'; import { + getCreateEqlRuleSchemaMock, + getCreateEsqlRulesSchemaMock, + getCreateNewTermsRulesSchemaMock, getCreateRulesSchemaMock, getUpdateRulesSchemaMock, } from '../../../../../../../common/api/detection_engine/model/rule_schema/mocks'; @@ -189,19 +192,29 @@ describe('Update rule route', () => { }); const defaultAction = getResponseAction(); - test('is successful', async () => { - const request = requestMock.create({ - method: 'post', - path: DETECTION_ENGINE_RULES_URL, - body: { - ...getCreateRulesSchemaMock(), - response_actions: [defaultAction], - }, - }); + const ruleTypes: Array<[string, () => object]> = [ + ['query', () => getCreateRulesSchemaMock()], + ['esql', getCreateEsqlRulesSchemaMock], + ['eql', getCreateEqlRuleSchemaMock], + ['new_terms', getCreateNewTermsRulesSchemaMock], + ]; - const response = await server.inject(request, requestContextMock.convertContext(context)); - expect(response.status).toEqual(200); - }); + test.each(ruleTypes)( + 'is successful for %s rule', + async (ruleType: string, schemaMock: (ruleId: string) => object) => { + const request = requestMock.create({ + method: 'post', + path: DETECTION_ENGINE_RULES_URL, + body: { + ...schemaMock(`rule-${ruleType}`), + response_actions: [defaultAction], + }, + }); + + const response = await server.inject(request, requestContextMock.convertContext(context)); + expect(response.status).toEqual(200); + } + ); test('fails when isolate rbac is set to false', async () => { (context.securitySolution.getEndpointAuthz as jest.Mock).mockReturnValue(() => ({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/convert_rule_response_to_alerting_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/convert_rule_response_to_alerting_rule.ts index 8a2609b712c53..2348c11027c65 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/convert_rule_response_to_alerting_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/convert_rule_response_to_alerting_rule.ts @@ -119,6 +119,9 @@ const typeSpecificSnakeToCamel = (params: TypeSpecificCreateProps): TypeSpecific eventCategoryOverride: params.event_category_override, tiebreakerField: params.tiebreaker_field, alertSuppression: convertObjectKeysToCamelCase(params.alert_suppression), + responseActions: params.response_actions?.map((rule) => + transformRuleToAlertResponseAction(rule) + ), }; } case 'esql': { @@ -127,6 +130,9 @@ const typeSpecificSnakeToCamel = (params: TypeSpecificCreateProps): TypeSpecific language: params.language, query: params.query, alertSuppression: convertObjectKeysToCamelCase(params.alert_suppression), + responseActions: params.response_actions?.map((rule) => + transformRuleToAlertResponseAction(rule) + ), }; } case 'threat_match': { @@ -173,9 +179,6 @@ const typeSpecificSnakeToCamel = (params: TypeSpecificCreateProps): TypeSpecific filters: params.filters, savedId: params.saved_id, dataViewId: params.data_view_id, - responseActions: params.response_actions?.map((rule) => - transformRuleToAlertResponseAction(rule) - ), alertSuppression: convertObjectKeysToCamelCase(params.alert_suppression), }; } @@ -213,6 +216,9 @@ const typeSpecificSnakeToCamel = (params: TypeSpecificCreateProps): TypeSpecific language: params.language ?? 'kuery', dataViewId: params.data_view_id, alertSuppression: convertObjectKeysToCamelCase(params.alert_suppression), + responseActions: params.response_actions?.map((rule) => + transformRuleToAlertResponseAction(rule) + ), }; } default: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/type_specific_camel_to_snake.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/type_specific_camel_to_snake.ts index 0808d1921e9bf..a4b74e31ba291 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/type_specific_camel_to_snake.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/converters/type_specific_camel_to_snake.ts @@ -6,8 +6,8 @@ */ import type { RequiredOptional } from '@kbn/zod-helpers'; -import type { TypeSpecificResponse } from '../../../../../../../common/api/detection_engine/model/rule_schema'; import { transformAlertToRuleResponseAction } from '../../../../../../../common/detection_engine/transform_actions'; +import type { TypeSpecificResponse } from '../../../../../../../common/api/detection_engine/model/rule_schema'; import { assertUnreachable } from '../../../../../../../common/utility_types'; import { convertObjectKeysToSnakeCase } from '../../../../../../utils/object_case_converters'; import type { TypeSpecificRuleParams } from '../../../../rule_schema'; @@ -28,6 +28,7 @@ export const typeSpecificCamelToSnake = ( event_category_override: params.eventCategoryOverride, tiebreaker_field: params.tiebreakerField, alert_suppression: convertObjectKeysToSnakeCase(params.alertSuppression), + response_actions: params.responseActions?.map(transformAlertToRuleResponseAction), }; } case 'esql': { @@ -36,6 +37,7 @@ export const typeSpecificCamelToSnake = ( language: params.language, query: params.query, alert_suppression: convertObjectKeysToSnakeCase(params.alertSuppression), + response_actions: params.responseActions?.map(transformAlertToRuleResponseAction), }; } case 'threat_match': { @@ -118,6 +120,7 @@ export const typeSpecificCamelToSnake = ( language: params.language, data_view_id: params.dataViewId, alert_suppression: convertObjectKeysToSnakeCase(params.alertSuppression), + response_actions: params.responseActions?.map(transformAlertToRuleResponseAction), }; } default: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_defaults.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_defaults.ts index 0263a60ab44ad..388b1ab695269 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_defaults.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_defaults.ts @@ -86,6 +86,7 @@ export const setTypeSpecificDefaults = (props: TypeSpecificCreateProps) => { event_category_override: props.event_category_override, tiebreaker_field: props.tiebreaker_field, alert_suppression: props.alert_suppression, + response_actions: props.response_actions, }; } case 'esql': { @@ -94,6 +95,7 @@ export const setTypeSpecificDefaults = (props: TypeSpecificCreateProps) => { language: props.language, query: props.query, alert_suppression: props.alert_suppression, + response_actions: props.response_actions, }; } case 'threat_match': { @@ -176,6 +178,7 @@ export const setTypeSpecificDefaults = (props: TypeSpecificCreateProps) => { language: props.language ?? 'kuery', data_view_id: props.data_view_id, alert_suppression: props.alert_suppression, + response_actions: props.response_actions, }; } default: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_patch.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_patch.ts index a8beef1bf2a0e..d864170746ed3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_patch.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/mergers/apply_rule_patch.ts @@ -138,6 +138,7 @@ const patchEqlParams = ( rulePatch.event_category_override ?? existingRule.event_category_override, tiebreaker_field: rulePatch.tiebreaker_field ?? existingRule.tiebreaker_field, alert_suppression: rulePatch.alert_suppression ?? existingRule.alert_suppression, + response_actions: rulePatch.response_actions ?? existingRule.response_actions, }; }; @@ -150,6 +151,7 @@ const patchEsqlParams = ( language: rulePatch.language ?? existingRule.language, query: rulePatch.query ?? existingRule.query, alert_suppression: rulePatch.alert_suppression ?? existingRule.alert_suppression, + response_actions: rulePatch.response_actions ?? existingRule.response_actions, }; }; @@ -258,6 +260,7 @@ const patchNewTermsParams = ( new_terms_fields: params.new_terms_fields ?? existingRule.new_terms_fields, history_window_start: params.history_window_start ?? existingRule.history_window_start, alert_suppression: params.alert_suppression ?? existingRule.alert_suppression, + response_actions: params.response_actions ?? existingRule.response_actions, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts index 500db54acd867..1274a2d7e7cad 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts @@ -9,8 +9,13 @@ import type { PartialRule } from '@kbn/alerting-plugin/server'; import type { Rule } from '@kbn/alerting-plugin/common'; import { isEqual, xorWith } from 'lodash'; import { stringifyZodError } from '@kbn/zod-helpers'; +import type { + EqlRule, + EsqlRule, + NewTermsRule, + QueryRule, +} from '../../../../../common/api/detection_engine'; import { - type QueryRule, type ResponseAction, type RuleCreateProps, RuleResponse, @@ -21,9 +26,10 @@ import { RESPONSE_ACTION_API_COMMAND_TO_CONSOLE_COMMAND_MAP, RESPONSE_CONSOLE_ACTION_COMMANDS_TO_REQUIRED_AUTHZ, } from '../../../../../common/endpoint/service/response_actions/constants'; -import { isQueryRule } from '../../../../../common/detection_engine/utils'; +import { shouldShowResponseActions } from '../../../../../common/detection_engine/utils'; import type { SecuritySolutionApiRequestHandlerContext } from '../../../..'; import { CustomHttpRequestError } from '../../../../utils/custom_http_request_error'; +import type { EqlRuleParams, EsqlRuleParams, NewTermsRuleParams } from '../../rule_schema'; import { hasValidRuleType, type RuleAlertType, @@ -64,11 +70,21 @@ export const validateResponseActionsPermissions = async ( ruleUpdate: RuleCreateProps | RuleUpdateProps, existingRule?: RuleAlertType | null ): Promise => { - if (!isQueryRule(ruleUpdate.type)) { + const { experimentalFeatures } = await securitySolution.getConfig(); + + if ( + !shouldShowResponseActions( + ruleUpdate.type, + experimentalFeatures.automatedResponseActionsForMoreRulesEnabled + ) + ) { return; } - if (!isQueryRulePayload(ruleUpdate) || (existingRule && !isQueryRuleObject(existingRule))) { + if ( + !rulePayloadContainsResponseActions(ruleUpdate) || + (existingRule && !ruleObjectContainsResponseActions(existingRule)) + ) { return; } @@ -108,10 +124,14 @@ export const validateResponseActionsPermissions = async ( }); }; -function isQueryRulePayload(rule: RuleCreateProps | RuleUpdateProps): rule is QueryRule { +function rulePayloadContainsResponseActions( + rule: RuleCreateProps | RuleUpdateProps +): rule is QueryRule | EsqlRule | EqlRule | NewTermsRule { return 'response_actions' in rule; } -function isQueryRuleObject(rule?: RuleAlertType): rule is Rule { +function ruleObjectContainsResponseActions( + rule?: RuleAlertType +): rule is Rule { return rule != null && 'params' in rule && 'responseActions' in rule?.params; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/endpoint_response_action.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/endpoint_response_action.ts index a310cb33497e8..040433789ecd7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/endpoint_response_action.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/endpoint_response_action.ts @@ -6,7 +6,6 @@ */ import { each } from 'lodash'; -import { ALERT_RULE_NAME, ALERT_RULE_UUID } from '@kbn/rule-data-utils'; import { stringify } from '../../../endpoint/utils/stringify'; import type { RuleResponseEndpointAction, @@ -29,8 +28,8 @@ export const endpointResponseAction = async ( 'ruleExecution', 'automatedResponseActions' ); - const ruleId = alerts[0][ALERT_RULE_UUID]; - const ruleName = alerts[0][ALERT_RULE_NAME]; + const ruleId = alerts[0].kibana.alert?.rule.uuid; + const ruleName = alerts[0].kibana.alert?.rule.name; const logMsgPrefix = `Rule [${ruleName}][${ruleId}]:`; const { comment, command } = responseAction.params; const errors: string[] = []; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.test.ts index 4dccc9ad0aae7..d98dc0782b796 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.test.ts @@ -96,8 +96,13 @@ describe('ScheduleNotificationResponseActions', () => { }, }, ]; - await scheduleNotificationResponseActions({ signals, responseActions }); + const response = await scheduleNotificationResponseActions({ + signals, + signalsCount: signals.length, + responseActions, + }); + expect(response).not.toBeUndefined(); expect(osqueryActionMock.create).toHaveBeenCalledWith({ ...defaultQueryResultParams, query: simpleQuery, @@ -123,8 +128,13 @@ describe('ScheduleNotificationResponseActions', () => { }, }, ]; - await scheduleNotificationResponseActions({ signals, responseActions }); + const response = await scheduleNotificationResponseActions({ + signals, + signalsCount: signals.length, + responseActions, + }); + expect(response).not.toBeUndefined(); expect(osqueryActionMock.create).toHaveBeenCalledWith({ ...defaultPackResultParams, queries: [{ ...defaultQueries, id: 'query-1', query: simpleQuery }], @@ -149,8 +159,12 @@ describe('ScheduleNotificationResponseActions', () => { }, }, ]; - await scheduleNotificationResponseActions({ signals, responseActions }); - + const response = await scheduleNotificationResponseActions({ + signals, + signalsCount: signals.length, + responseActions, + }); + expect(response).not.toBeUndefined(); expect(endpointActionMock.getInternalResponseActionsClient).toHaveBeenCalledTimes(1); expect(endpointActionMock.getInternalResponseActionsClient).toHaveBeenCalledWith({ agentType: 'endpoint', @@ -188,11 +202,14 @@ describe('ScheduleNotificationResponseActions', () => { }, }, ]; - await scheduleNotificationResponseActions({ + const response = await scheduleNotificationResponseActions({ signals, + signalsCount: signals.length, responseActions, }); + expect(response).not.toBeUndefined(); + expect(mockedResponseActionsClient.killProcess).toHaveBeenCalledWith( { alert_ids: ['alert-id-1'], @@ -223,12 +240,42 @@ describe('ScheduleNotificationResponseActions', () => { }, }, ]; - await scheduleNotificationResponseActions({ + const response = await scheduleNotificationResponseActions({ signals, + signalsCount: signals.length, responseActions, }); + expect(response).not.toBeUndefined(); expect(mockedResponseActionsClient.isolate).toHaveBeenCalledTimes(signals.length - 1); }); + it('should not call any action service if no response actions are provided', async () => { + const response = await scheduleNotificationResponseActions({ + signals: getSignals(), + signalsCount: 2, + responseActions: [], + }); + expect(response).toBeUndefined(); + }); + it('should not call any action service if signalsCount is 0', async () => { + const signals = getSignals(); + const responseActions: RuleResponseAction[] = [ + { + actionTypeId: ResponseActionTypesEnum['.endpoint'], + params: { + command: 'isolate', + comment: 'test process comment', + }, + }, + ]; + + const response = await scheduleNotificationResponseActions({ + signals, + signalsCount: 0, + responseActions, + }); + + expect(response).toBeUndefined(); + }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.ts index 2fcf09d6cfbb4..b4f4689fed0ff 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/schedule_notification_response_actions.ts @@ -5,13 +5,14 @@ * 2.0. */ +import { expandDottedObject } from '../../../../common/utils/expand_dotted'; import type { EndpointAppContextService } from '../../../endpoint/endpoint_app_context_services'; import type { SetupPlugins } from '../../../plugin_contract'; import { ResponseActionTypesEnum } from '../../../../common/api/detection_engine/model/rule_response_actions'; import { osqueryResponseAction } from './osquery_response_action'; import { endpointResponseAction } from './endpoint_response_action'; import type { ScheduleNotificationActions } from '../rule_types/types'; -import type { AlertWithAgent, Alert } from './types'; +import type { Alert, AlertWithAgent } from './types'; interface ScheduleNotificationResponseActionsService { endpointAppContextService: EndpointAppContextService; @@ -23,10 +24,15 @@ export const getScheduleNotificationResponseActionsService = osqueryCreateActionService, endpointAppContextService, }: ScheduleNotificationResponseActionsService) => - async ({ signals, responseActions }: ScheduleNotificationActions) => { - const alerts = (signals as Alert[]).filter((alert) => alert.agent?.id) as AlertWithAgent[]; + async ({ signals, signalsCount, responseActions }: ScheduleNotificationActions) => { + if (!signalsCount || !responseActions?.length) { + return; + } + // expandDottedObject is needed eg in ESQL rule because it's alerts come without nested agent, host etc data but everything is dotted + const nestedAlerts = signals.map((signal) => expandDottedObject(signal as object)) as Alert[]; + const alerts = nestedAlerts.filter((alert) => alert.agent?.id) as AlertWithAgent[]; - await Promise.all( + return Promise.all( responseActions.map(async (responseAction) => { if ( responseAction.actionTypeId === ResponseActionTypesEnum['.osquery'] && diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts index e7317acfd7ca1..a72e813dcb6a7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts @@ -19,6 +19,14 @@ export type Alert = ParsedTechnicalFields & { process?: { pid: string; }; + kibana: { + alert?: { + rule: { + uuid: string; + name: string; + }; + }; + }; }; export interface AlertAgent { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema/model/rule_schemas.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema/model/rule_schemas.ts index 632649f733473..e651ffeebaf49 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema/model/rule_schemas.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema/model/rule_schemas.ts @@ -162,6 +162,7 @@ export const EqlSpecificRuleParams = z.object({ timestampField: TimestampField.optional(), tiebreakerField: TiebreakerField.optional(), alertSuppression: AlertSuppressionCamel.optional(), + responseActions: z.array(RuleResponseAction).optional(), }); export type EqlRuleParams = BaseRuleParams & EqlSpecificRuleParams; @@ -173,6 +174,7 @@ export const EsqlSpecificRuleParams = z.object({ language: z.literal('esql'), query: RuleQuery, alertSuppression: AlertSuppressionCamel.optional(), + responseActions: z.array(RuleResponseAction).optional(), }); export type EsqlRuleParams = BaseRuleParams & EsqlSpecificRuleParams; @@ -280,6 +282,7 @@ export const NewTermsSpecificRuleParams = z.object({ language: KqlQueryLanguage, dataViewId: DataViewId.optional(), alertSuppression: AlertSuppressionCamel.optional(), + responseActions: z.array(RuleResponseAction).optional(), }); export type NewTermsRuleParams = BaseRuleParams & NewTermsSpecificRuleParams; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/create_eql_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/create_eql_alert_type.ts index 81971feeecfc1..ca16b38404e48 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/create_eql_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/create_eql_alert_type.ts @@ -11,16 +11,22 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; import { SERVER_APP_ID } from '../../../../../common/constants'; import { EqlRuleParams } from '../../rule_schema'; import { eqlExecutor } from './eql'; -import type { CreateRuleOptions, SecurityAlertType, SignalSourceHit } from '../types'; +import type { + CreateRuleOptions, + SecurityAlertType, + SignalSourceHit, + CreateRuleAdditionalOptions, +} from '../types'; import { validateIndexPatterns } from '../utils'; import type { BuildReasonMessage } from '../utils/reason_formatters'; import { wrapSuppressedAlerts } from '../utils/wrap_suppressed_alerts'; import { getIsAlertSuppressionActive } from '../utils/get_is_alert_suppression_active'; export const createEqlAlertType = ( - createOptions: CreateRuleOptions + createOptions: CreateRuleOptions & CreateRuleAdditionalOptions ): SecurityAlertType => { - const { experimentalFeatures, version, licensing } = createOptions; + const { experimentalFeatures, version, licensing, scheduleNotificationResponseActionsService } = + createOptions; return { id: EQL_RULE_TYPE_ID, name: 'Event Correlation Rule', @@ -125,6 +131,7 @@ export const createEqlAlertType = ( alertWithSuppression, isAlertSuppressionActive: isNonSeqAlertSuppressionActive, experimentalFeatures, + scheduleNotificationResponseActionsService, }); return { ...result, state }; }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.test.ts index c16d61d3b0ea5..9ef9faeb9de3a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.test.ts @@ -37,6 +37,7 @@ describe('eql_executor', () => { maxSignals: params.maxSignals, }; const mockExperimentalFeatures = {} as ExperimentalFeatures; + const mockScheduleNotificationResponseActionsService = jest.fn(); beforeEach(() => { jest.clearAllMocks(); @@ -72,6 +73,8 @@ describe('eql_executor', () => { alertWithSuppression: jest.fn(), isAlertSuppressionActive: false, experimentalFeatures: mockExperimentalFeatures, + scheduleNotificationResponseActionsService: + mockScheduleNotificationResponseActionsService, }); expect(result.warningMessages).toEqual([ `The following exceptions won't be applied to rule execution: ${ @@ -121,6 +124,8 @@ describe('eql_executor', () => { alertWithSuppression: jest.fn(), isAlertSuppressionActive: true, experimentalFeatures: mockExperimentalFeatures, + scheduleNotificationResponseActionsService: + mockScheduleNotificationResponseActionsService, }); expect(result.warningMessages).toContain( @@ -154,10 +159,40 @@ describe('eql_executor', () => { alertWithSuppression: jest.fn(), isAlertSuppressionActive: true, experimentalFeatures: mockExperimentalFeatures, + scheduleNotificationResponseActionsService: mockScheduleNotificationResponseActionsService, }); expect(result.userError).toEqual(true); }); + it('should handle scheduleNotificationResponseActionsService call', async () => { + const result = await eqlExecutor({ + inputIndex: DEFAULT_INDEX_PATTERN, + runtimeMappings: {}, + completeRule: eqlCompleteRule, + tuple, + ruleExecutionLogger, + services: alertServices, + version, + bulkCreate: jest.fn(), + wrapHits: jest.fn(), + wrapSequences: jest.fn(), + primaryTimestamp: '@timestamp', + exceptionFilter: undefined, + unprocessedExceptions: [], + wrapSuppressedHits: jest.fn(), + alertTimestampOverride: undefined, + alertWithSuppression: jest.fn(), + isAlertSuppressionActive: false, + experimentalFeatures: mockExperimentalFeatures, + scheduleNotificationResponseActionsService: mockScheduleNotificationResponseActionsService, + }); + expect(mockScheduleNotificationResponseActionsService).toBeCalledWith({ + signals: result.createdSignals, + signalsCount: result.createdSignalsCount, + responseActions: eqlCompleteRule.ruleParams.responseActions, + }); + }); + it('should pass frozen tier filters in eql search request', async () => { getDataTierFilterMock.mockResolvedValue([ { @@ -189,6 +224,7 @@ describe('eql_executor', () => { alertWithSuppression: jest.fn(), isAlertSuppressionActive: true, experimentalFeatures: mockExperimentalFeatures, + scheduleNotificationResponseActionsService: mockScheduleNotificationResponseActionsService, }); const searchArgs = diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.ts index a3a1ba545c0ea..3379d0a0c6867 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/eql.ts @@ -26,6 +26,7 @@ import type { SearchAfterAndBulkCreateReturnType, SignalSource, WrapSuppressedHits, + CreateRuleAdditionalOptions, } from '../types'; import { addToSearchAfterReturn, @@ -66,6 +67,7 @@ interface EqlExecutorParams { alertWithSuppression: SuppressedAlertService; isAlertSuppressionActive: boolean; experimentalFeatures: ExperimentalFeatures; + scheduleNotificationResponseActionsService: CreateRuleAdditionalOptions['scheduleNotificationResponseActionsService']; } export const eqlExecutor = async ({ @@ -88,6 +90,7 @@ export const eqlExecutor = async ({ alertWithSuppression, isAlertSuppressionActive, experimentalFeatures, + scheduleNotificationResponseActionsService, }: EqlExecutorParams): Promise => { const ruleParams = completeRule.ruleParams; @@ -188,6 +191,14 @@ export const eqlExecutor = async ({ result.warningMessages.push(maxSignalsWarning); } + if (scheduleNotificationResponseActionsService) { + scheduleNotificationResponseActionsService({ + signals: result.createdSignals, + signalsCount: result.createdSignalsCount, + responseActions: completeRule.ruleParams.responseActions, + }); + } + return result; } catch (error) { if ( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/create_esql_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/create_esql_alert_type.ts index 10c82ad8fed7c..31afe8d2a191f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/create_esql_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/create_esql_alert_type.ts @@ -11,12 +11,13 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; import { SERVER_APP_ID } from '../../../../../common/constants'; import { EsqlRuleParams } from '../../rule_schema'; import { esqlExecutor } from './esql'; -import type { CreateRuleOptions, SecurityAlertType } from '../types'; +import type { CreateRuleOptions, SecurityAlertType, CreateRuleAdditionalOptions } from '../types'; export const createEsqlAlertType = ( - createOptions: CreateRuleOptions + createOptions: CreateRuleOptions & CreateRuleAdditionalOptions ): SecurityAlertType => { - const { version, experimentalFeatures, licensing } = createOptions; + const { version, experimentalFeatures, licensing, scheduleNotificationResponseActionsService } = + createOptions; return { id: ESQL_RULE_TYPE_ID, name: 'ES|QL Rule', @@ -44,6 +45,13 @@ export const createEsqlAlertType = ( isExportable: false, category: DEFAULT_APP_CATEGORIES.security.id, producer: SERVER_APP_ID, - executor: (params) => esqlExecutor({ ...params, experimentalFeatures, version, licensing }), + executor: (params) => + esqlExecutor({ + ...params, + experimentalFeatures, + version, + licensing, + scheduleNotificationResponseActionsService, + }), }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/esql.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/esql.ts index b129a7ef0c5bb..0dd2b0e50d4ba 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/esql.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/esql.ts @@ -28,8 +28,7 @@ import { rowToDocument } from './utils'; import { fetchSourceDocuments } from './fetch_source_documents'; import { buildReasonMessageForEsqlAlert } from '../utils/reason_formatters'; -import type { RunOpts, SignalSource } from '../types'; - +import type { RunOpts, SignalSource, CreateRuleAdditionalOptions } from '../types'; import { addToSearchAfterReturn, createSearchAfterReturnType, @@ -63,6 +62,7 @@ export const esqlExecutor = async ({ spaceId, experimentalFeatures, licensing, + scheduleNotificationResponseActionsService, }: { runOpts: RunOpts; services: RuleExecutorServices; @@ -71,6 +71,7 @@ export const esqlExecutor = async ({ version: string; experimentalFeatures: ExperimentalFeatures; licensing: LicensingPluginSetup; + scheduleNotificationResponseActionsService: CreateRuleAdditionalOptions['scheduleNotificationResponseActionsService']; }) => { const ruleParams = completeRule.ruleParams; /** @@ -225,6 +226,13 @@ export const esqlExecutor = async ({ break; } } + if (scheduleNotificationResponseActionsService) { + scheduleNotificationResponseActionsService({ + signals: result.createdSignals, + signalsCount: result.createdSignalsCount, + responseActions: completeRule.ruleParams.responseActions, + }); + } // no more results will be found if (response.values.length < size) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts index 74c7d9437851e..e33f580388f98 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts @@ -12,7 +12,7 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; import { SERVER_APP_ID } from '../../../../../common/constants'; import { NewTermsRuleParams } from '../../rule_schema'; -import type { CreateRuleOptions, SecurityAlertType } from '../types'; +import type { CreateRuleOptions, SecurityAlertType, CreateRuleAdditionalOptions } from '../types'; import { singleSearchAfter } from '../utils/single_search_after'; import { getFilter } from '../utils/get_filter'; import { wrapNewTermsAlerts } from './wrap_new_terms_alerts'; @@ -46,9 +46,10 @@ import { multiTermsComposite } from './multi_terms_composite'; import type { GenericBulkCreateResponse } from '../utils/bulk_create_with_suppression'; export const createNewTermsAlertType = ( - createOptions: CreateRuleOptions + createOptions: CreateRuleOptions & CreateRuleAdditionalOptions ): SecurityAlertType => { - const { logger, licensing, experimentalFeatures } = createOptions; + const { logger, licensing, experimentalFeatures, scheduleNotificationResponseActionsService } = + createOptions; return { id: NEW_TERMS_RULE_TYPE_ID, name: 'New Terms Rule', @@ -414,6 +415,15 @@ export const createNewTermsAlertType = ( afterKey = searchResultWithAggs.aggregations.new_terms.after_key; } + + if (scheduleNotificationResponseActionsService) { + scheduleNotificationResponseActionsService({ + signals: result.createdSignals, + signalsCount: result.createdSignalsCount, + responseActions: completeRule.ruleParams.responseActions, + }); + } + return { ...result, state }; }, }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts index 272184dbf1e58..5915447e5a541 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts @@ -22,7 +22,7 @@ import type { UnifiedQueryRuleParams } from '../../rule_schema'; import type { ExperimentalFeatures } from '../../../../../common/experimental_features'; import { buildReasonMessageForQueryAlert } from '../utils/reason_formatters'; import { withSecuritySpan } from '../../../../utils/with_security_span'; -import type { CreateQueryRuleAdditionalOptions, RunOpts } from '../types'; +import type { CreateRuleAdditionalOptions, RunOpts } from '../types'; export const queryExecutor = async ({ runOpts, @@ -42,7 +42,7 @@ export const queryExecutor = async ({ version: string; spaceId: string; bucketHistory?: BucketHistory[]; - scheduleNotificationResponseActionsService?: CreateQueryRuleAdditionalOptions['scheduleNotificationResponseActionsService']; + scheduleNotificationResponseActionsService: CreateRuleAdditionalOptions['scheduleNotificationResponseActionsService']; licensing: LicensingPluginSetup; }) => { const completeRule = runOpts.completeRule; @@ -99,13 +99,10 @@ export const queryExecutor = async ({ state: {}, }; - if ( - completeRule.ruleParams.responseActions?.length && - result.createdSignalsCount && - scheduleNotificationResponseActionsService - ) { + if (scheduleNotificationResponseActionsService) { scheduleNotificationResponseActionsService({ signals: result.createdSignals, + signalsCount: result.createdSignalsCount, responseActions: completeRule.ruleParams.responseActions, }); } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts index 4069b7782e0e8..a29beef7bbb20 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts @@ -161,15 +161,15 @@ export interface CreateRuleOptions { export interface ScheduleNotificationActions { signals: unknown[]; - responseActions: RuleResponseAction[]; + signalsCount: number; + responseActions: RuleResponseAction[] | undefined; } -export interface CreateQueryRuleAdditionalOptions { + +export interface CreateRuleAdditionalOptions { scheduleNotificationResponseActionsService?: (params: ScheduleNotificationActions) => void; } -export interface CreateQueryRuleOptions - extends CreateRuleOptions, - CreateQueryRuleAdditionalOptions { +export interface CreateQueryRuleOptions extends CreateRuleOptions, CreateRuleAdditionalOptions { id: typeof QUERY_RULE_TYPE_ID | typeof SAVED_QUERY_RULE_TYPE_ID; name: 'Custom Query Rule' | 'Saved Query Rule'; } diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/__snapshots__/entity_store_data_client.test.ts.snap b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/__snapshots__/entity_store_data_client.test.ts.snap new file mode 100644 index 0000000000000..9bf156dc25efd --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/__snapshots__/entity_store_data_client.test.ts.snap @@ -0,0 +1,34 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EntityStoreDataClient search entities returns inspect query params 1`] = ` +Object { + "dsl": Array [ + "{ + \\"index\\": [ + \\".entities.v1.latest.ea_host_entity_store\\" + ], + \\"body\\": { + \\"bool\\": { + \\"filter\\": [] + } + } +}", + ], + "response": Array [ + "{ + \\"took\\": 0, + \\"timed_out\\": false, + \\"_shards\\": { + \\"total\\": 0, + \\"successful\\": 0, + \\"skipped\\": 0, + \\"failed\\": 0 + }, + \\"hits\\": { + \\"total\\": 0, + \\"hits\\": [] + } +}", + ], +} +`; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts index ce5a61fa7e6c9..e2ddb69f60b0b 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts @@ -19,3 +19,5 @@ export const ENGINE_STATUS: Record, EngineStatus> = { STARTED: 'started', STOPPED: 'stopped', }; + +export const MAX_SEARCH_RESPONSE_SIZE = 10_000; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/definition.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/definition.ts index 2ee5f984aaa1c..391e8b16dd32d 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/definition.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/definition.ts @@ -7,52 +7,52 @@ import { entityDefinitionSchema, type EntityDefinition } from '@kbn/entities-schema'; import { ENTITY_STORE_DEFAULT_SOURCE_INDICES } from './constants'; +import { getEntityDefinitionId } from './utils/utils'; -export const HOST_ENTITY_DEFINITION: EntityDefinition = entityDefinitionSchema.parse({ - id: 'ea_host_entity_store', - name: 'EA Host Store', - type: 'host', - indexPatterns: ENTITY_STORE_DEFAULT_SOURCE_INDICES, - identityFields: ['host.name'], - displayNameTemplate: '{{host.name}}', - metadata: [ - 'host.domain', - 'host.hostname', - 'host.id', - 'host.ip', - 'host.mac', - 'host.name', - 'host.type', - 'host.architecture', - 'asset.criticality', - ], - history: { - timestampField: '@timestamp', - interval: '1m', - }, - version: '1.0.0', -}); +export const buildHostEntityDefinition = (): EntityDefinition => + entityDefinitionSchema.parse({ + id: getEntityDefinitionId('host'), + name: 'EA Host Store', + type: 'host', + indexPatterns: ENTITY_STORE_DEFAULT_SOURCE_INDICES, + identityFields: ['host.name'], + displayNameTemplate: '{{host.name}}', + metadata: [ + 'host.domain', + 'host.hostname', + 'host.id', + 'host.ip', + 'host.mac', + 'host.name', + 'host.type', + 'host.architecture', + ], + history: { + timestampField: '@timestamp', + interval: '1m', + }, + version: '1.0.0', + }); -export const USER_ENTITY_DEFINITION: EntityDefinition = entityDefinitionSchema.parse({ - id: 'ea_user_entity_store', - name: 'EA User Store', - type: 'user', - indexPatterns: ENTITY_STORE_DEFAULT_SOURCE_INDICES, - identityFields: ['user.name'], - displayNameTemplate: '{{user.name}}', - metadata: [ - 'user.domain', - 'user.email', - 'user.full_name', - 'user.hash', - 'user.id', - 'user.name', - 'user.roles', - 'asset.criticality', - ], - history: { - timestampField: '@timestamp', - interval: '1m', - }, - version: '1.0.0', -}); +export const buildUserEntityDefinition = (): EntityDefinition => + entityDefinitionSchema.parse({ + id: getEntityDefinitionId('user'), + name: 'EA User Store', + indexPatterns: ENTITY_STORE_DEFAULT_SOURCE_INDICES, + identityFields: ['user.name'], + displayNameTemplate: '{{user.name}}', + metadata: [ + 'user.domain', + 'user.email', + 'user.full_name', + 'user.hash', + 'user.id', + 'user.name', + 'user.roles', + ], + history: { + timestampField: '@timestamp', + interval: '1m', + }, + version: '1.0.0', + }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.mock.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.mock.ts index 095565343e130..4c5066e344182 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.mock.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.mock.ts @@ -15,6 +15,7 @@ const createEntityStoreDataClientMock = () => get: jest.fn(), list: jest.fn(), delete: jest.fn(), + searchEntities: jest.fn(), } as unknown as jest.Mocked); export const entityStoreDataClientMock = { create: createEntityStoreDataClientMock }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts new file mode 100644 index 0000000000000..040b6e60eb695 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts @@ -0,0 +1,138 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + loggingSystemMock, + elasticsearchServiceMock, + savedObjectsClientMock, +} from '@kbn/core/server/mocks'; +import { EntityStoreDataClient } from './entity_store_data_client'; +import { EntityClient } from '@kbn/entityManager-plugin/server/lib/entity_client'; +import type { SortOrder } from '@elastic/elasticsearch/lib/api/types'; +import type { EntityType } from '../../../../common/api/entity_analytics/entity_store/common.gen'; + +describe('EntityStoreDataClient', () => { + const logger = loggingSystemMock.createLogger(); + const mockSavedObjectClient = savedObjectsClientMock.create(); + const esClientMock = elasticsearchServiceMock.createScopedClusterClient().asInternalUser; + const loggerMock = loggingSystemMock.createLogger(); + const dataClient = new EntityStoreDataClient({ + esClient: esClientMock, + logger: loggerMock, + namespace: 'default', + soClient: mockSavedObjectClient, + entityClient: new EntityClient({ + esClient: esClientMock, + soClient: mockSavedObjectClient, + logger, + }), + }); + + const defaultSearchParams = { + entityTypes: ['host'] as EntityType[], + page: 1, + perPage: 10, + sortField: 'hostName', + sortOrder: 'asc' as SortOrder, + }; + + describe('search entities', () => { + beforeEach(() => { + jest.resetAllMocks(); + esClientMock.search.mockResolvedValue({ + took: 0, + timed_out: false, + _shards: { + total: 0, + successful: 0, + skipped: 0, + failed: 0, + }, + hits: { + total: 0, + hits: [], + }, + }); + }); + + it('searches in the entities store indices', async () => { + await dataClient.searchEntities({ + ...defaultSearchParams, + entityTypes: ['host', 'user'], + }); + + expect(esClientMock.search).toHaveBeenCalledWith( + expect.objectContaining({ + index: [ + '.entities.v1.latest.ea_host_entity_store', + '.entities.v1.latest.ea_user_entity_store', + ], + }) + ); + }); + + it('should filter by filterQuery param', async () => { + await dataClient.searchEntities({ + ...defaultSearchParams, + filterQuery: '{"match_all":{}}', + }); + + expect(esClientMock.search).toHaveBeenCalledWith( + expect.objectContaining({ query: { bool: { filter: [{ match_all: {} }] } } }) + ); + }); + + it('should paginate', async () => { + await dataClient.searchEntities({ + ...defaultSearchParams, + page: 3, + perPage: 7, + }); + + expect(esClientMock.search).toHaveBeenCalledWith( + expect.objectContaining({ from: 14, size: 7 }) + ); + }); + + it('should sort', async () => { + await dataClient.searchEntities({ + ...defaultSearchParams, + sortField: '@timestamp', + sortOrder: 'asc', + }); + + expect(esClientMock.search).toHaveBeenCalledWith( + expect.objectContaining({ sort: [{ '@timestamp': 'asc' }] }) + ); + }); + + it('caps the size to the maximum query size', async () => { + await dataClient.searchEntities({ + ...defaultSearchParams, + perPage: 999_999, + }); + + const maxSize = 10_000; + + expect(esClientMock.search).toHaveBeenCalledWith(expect.objectContaining({ size: maxSize })); + }); + + it('ignores an index_not_found_exception if the entity index does not exist', async () => { + await dataClient.searchEntities(defaultSearchParams); + + expect(esClientMock.search).toHaveBeenCalledWith( + expect.objectContaining({ ignore_unavailable: true }) + ); + }); + + it('returns inspect query params', async () => { + const response = await dataClient.searchEntities(defaultSearchParams); + + expect(response.inspect).toMatchSnapshot(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts index f9c72ba2f2ffe..adccc630eacc9 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts @@ -8,6 +8,9 @@ import type { Logger, ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; import type { EntityClient } from '@kbn/entityManager-plugin/server/lib/entity_client'; +import type { SortOrder } from '@elastic/elasticsearch/lib/api/types'; +import type { Entity } from '../../../../common/api/entity_analytics/entity_store/entities/common.gen'; +import { createQueryFilterClauses } from '../../../utils/build_query'; import type { InitEntityStoreRequestBody, InitEntityStoreResponse, @@ -15,6 +18,7 @@ import type { import type { EngineDescriptor, EntityType, + InspectQuery, } from '../../../../common/api/entity_analytics/entity_store/common.gen'; import { entityEngineDescriptorTypeName } from './saved_object'; import { EngineDescriptorClient } from './saved_object/engine_descriptor'; @@ -25,6 +29,8 @@ import { executeAssetCriticalityEnrichPolicies, getAssetCriticalityPipelineSteps, } from '../asset_criticality/asset_criticality_enrich_policy'; +import { getEntitiesIndexName, getEntityDefinition } from './utils/utils'; +import { ENGINE_STATUS, MAX_SEARCH_RESPONSE_SIZE } from './constants'; interface EntityStoreClientOpts { logger: Logger; @@ -34,6 +40,15 @@ interface EntityStoreClientOpts { soClient: SavedObjectsClientContract; } +interface SearchEntitiesParams { + entityTypes: EntityType[]; + filterQuery?: string; + page: number; + perPage: number; + sortField: string; + sortOrder: SortOrder; +} + export class EntityStoreDataClient { private engineClient: EngineDescriptorClient; constructor(private readonly options: EntityStoreClientOpts) { @@ -122,4 +137,44 @@ export class EntityStoreDataClient { return { deleted: true }; } + + public async searchEntities(params: SearchEntitiesParams): Promise<{ + records: Entity[]; + total: number; + inspect: InspectQuery; + }> { + const { page, perPage, sortField, sortOrder, filterQuery, entityTypes } = params; + + const index = entityTypes.map(getEntitiesIndexName); + const from = (page - 1) * perPage; + const sort = sortField ? [{ [sortField]: sortOrder }] : undefined; + + const filter = [...createQueryFilterClauses(filterQuery)]; + const query = { + bool: { + filter, + }, + }; + + const response = await this.options.esClient.search({ + index, + query, + size: Math.min(perPage, MAX_SEARCH_RESPONSE_SIZE), + from, + sort, + ignore_unavailable: true, + }); + const { hits } = response; + + const total = typeof hits.total === 'number' ? hits.total : hits.total?.value ?? 0; + + const records = hits.hits.map((hit) => hit._source as Entity); + + const inspect: InspectQuery = { + dsl: [JSON.stringify({ index, body: query }, null, 2)], + response: [JSON.stringify(response, null, 2)], + }; + + return { records, total, inspect }; + } } diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/entities/list.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/entities/list.ts new file mode 100644 index 0000000000000..6aaab39656e7d --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/entities/list.ts @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: List Entity Store engines + * version: 1 + */ + +import type { IKibanaResponse, Logger } from '@kbn/core/server'; +import { buildSiemResponse } from '@kbn/lists-plugin/server/routes/utils'; +import { transformError } from '@kbn/securitysolution-es-utils'; + +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; +import { LIST_ENTITIES_URL } from '../../../../../../common/entity_analytics/entity_store/constants'; +import type { ListEntitiesResponse } from '../../../../../../common/api/entity_analytics/entity_store/entities/list_entities.gen'; +import { ListEntitiesRequestQuery } from '../../../../../../common/api/entity_analytics/entity_store/entities/list_entities.gen'; +import { APP_ID } from '../../../../../../common'; +import { API_VERSIONS } from '../../../../../../common/entity_analytics/constants'; + +import type { EntityAnalyticsRoutesDeps } from '../../../types'; + +export const listEntitiesRoute = (router: EntityAnalyticsRoutesDeps['router'], logger: Logger) => { + router.versioned + .get({ + access: 'public', + path: LIST_ENTITIES_URL, + options: { + tags: ['access:securitySolution', `access:${APP_ID}-entity-analytics`], + }, + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { + request: { + query: buildRouteValidationWithZod(ListEntitiesRequestQuery), + }, + }, + }, + + async (context, request, response): Promise> => { + const siemResponse = buildSiemResponse(response); + + try { + const { + page = 1, + per_page: perPage = 10, + sort_field: sortField = 'entity.lastSeenTimestamp', + sort_order: sortOrder = 'desc', + entities_types: entityTypes, + filterQuery, + } = request.query; + + const securitySolution = await context.securitySolution; + const entityStoreClient = securitySolution.getEntityStoreDataClient(); + const { records, total, inspect } = await entityStoreClient.searchEntities({ + entityTypes, + filterQuery, + page, + perPage, + sortField, + sortOrder, + }); + + return response.ok({ + body: { + records, + total, + page, + per_page: perPage, + inspect, + }, + }); + } catch (e) { + logger.error(e); + const error = transformError(e); + return siemResponse.error({ + statusCode: error.statusCode, + body: error.message, + }); + } + } + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/register_entity_store_routes.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/register_entity_store_routes.ts index b78316b02c91e..dfc9007486bf5 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/register_entity_store_routes.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/register_entity_store_routes.ts @@ -7,6 +7,7 @@ import type { EntityAnalyticsRoutesDeps } from '../../types'; import { deleteEntityEngineRoute } from './delete'; +import { listEntitiesRoute } from './entities/list'; import { getEntityEngineRoute } from './get'; import { initEntityEngineRoute } from './init'; import { listEntityEnginesRoute } from './list'; @@ -20,4 +21,5 @@ export const registerEntityStoreRoutes = ({ router, logger }: EntityAnalyticsRou deleteEntityEngineRoute(router, logger); getEntityEngineRoute(router, logger); listEntityEnginesRoute(router, logger); + listEntitiesRoute(router, logger); }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/utils/utils.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/utils/utils.ts index 278ee90f81b86..64aa3c72bbff2 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/utils/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/utils/utils.ts @@ -6,16 +6,20 @@ */ import type { SavedObjectsFindResponse } from '@kbn/core-saved-objects-api-server'; -import { getAssetCriticalityIndex } from '../../../../../common/entity_analytics/asset_criticality'; + +import { + ENTITY_LATEST, + ENTITY_SCHEMA_VERSION_V1, + entitiesIndexPattern, +} from '@kbn/entities-schema'; import type { EngineDescriptor, EntityType, } from '../../../../../common/api/entity_analytics/entity_store/common.gen'; -import { HOST_ENTITY_DEFINITION, USER_ENTITY_DEFINITION } from '../definition'; +import { buildHostEntityDefinition, buildUserEntityDefinition } from '../definition'; import { entityEngineDescriptorTypeName } from '../saved_object'; export const getEntityDefinition = (entityType: EntityType, spaceId: string = 'default') => { - // throw if invalid entity type const entityDefinition = entityType === 'host' ? HOST_ENTITY_DEFINITION : USER_ENTITY_DEFINITION; const assetCriticalityIndex = getAssetCriticalityIndex(spaceId); @@ -42,3 +46,12 @@ export const ensureEngineExists = export const getByEntityTypeQuery = (entityType: EntityType) => { return `${entityEngineDescriptorTypeName}.attributes.type: ${entityType}`; }; + +export const getEntitiesIndexName = (entityType: EntityType) => + entitiesIndexPattern({ + schemaVersion: ENTITY_SCHEMA_VERSION_V1, + dataset: ENTITY_LATEST, + definitionId: getEntityDefinitionId(entityType), + }); + +export const getEntityDefinitionId = (entityType: EntityType) => `ea_${entityType}_entity_store`; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index c24e70baa5db8..17f31718070b3 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -78,7 +78,7 @@ import type { IRuleMonitoringService } from './lib/detection_engine/rule_monitor import { createRuleMonitoringService } from './lib/detection_engine/rule_monitoring'; import { EndpointMetadataService } from './endpoint/services/metadata'; import type { - CreateQueryRuleAdditionalOptions, + CreateRuleAdditionalOptions, CreateRuleOptions, } from './lib/detection_engine/rule_types/types'; // eslint-disable-next-line no-restricted-imports @@ -311,7 +311,7 @@ export class Plugin implements ISecuritySolutionPlugin { analytics: core.analytics, }; - const queryRuleAdditionalOptions: CreateQueryRuleAdditionalOptions = { + const ruleAdditionalOptions: CreateRuleAdditionalOptions = { scheduleNotificationResponseActionsService: getScheduleNotificationResponseActionsService({ endpointAppContextService: this.endpointAppContextService, osqueryCreateActionService: plugins.osquery.createActionService, @@ -320,15 +320,19 @@ export class Plugin implements ISecuritySolutionPlugin { const securityRuleTypeWrapper = createSecurityRuleTypeWrapper(securityRuleTypeOptions); - plugins.alerting.registerType(securityRuleTypeWrapper(createEqlAlertType(ruleOptions))); + plugins.alerting.registerType( + securityRuleTypeWrapper(createEqlAlertType({ ...ruleOptions, ...ruleAdditionalOptions })) + ); if (!experimentalFeatures.esqlRulesDisabled) { - plugins.alerting.registerType(securityRuleTypeWrapper(createEsqlAlertType(ruleOptions))); + plugins.alerting.registerType( + securityRuleTypeWrapper(createEsqlAlertType({ ...ruleOptions, ...ruleAdditionalOptions })) + ); } plugins.alerting.registerType( securityRuleTypeWrapper( createQueryAlertType({ ...ruleOptions, - ...queryRuleAdditionalOptions, + ...ruleAdditionalOptions, id: SAVED_QUERY_RULE_TYPE_ID, name: 'Saved Query Rule', }) @@ -342,14 +346,16 @@ export class Plugin implements ISecuritySolutionPlugin { securityRuleTypeWrapper( createQueryAlertType({ ...ruleOptions, - ...queryRuleAdditionalOptions, + ...ruleAdditionalOptions, id: QUERY_RULE_TYPE_ID, name: 'Custom Query Rule', }) ) ); plugins.alerting.registerType(securityRuleTypeWrapper(createThresholdAlertType(ruleOptions))); - plugins.alerting.registerType(securityRuleTypeWrapper(createNewTermsAlertType(ruleOptions))); + plugins.alerting.registerType( + securityRuleTypeWrapper(createNewTermsAlertType({ ...ruleOptions, ...ruleAdditionalOptions })) + ); // TODO We need to get the endpoint routes inside of initRoutes initRoutes( @@ -544,7 +550,10 @@ export class Plugin implements ISecuritySolutionPlugin { this.licensing$ = plugins.licensing.license$; // Assistant Tool and Feature Registration - plugins.elasticAssistant.registerTools(APP_UI_ID, getAssistantTools()); + plugins.elasticAssistant.registerTools( + APP_UI_ID, + getAssistantTools(config.experimentalFeatures.assistantNaturalLanguageESQLTool) + ); plugins.elasticAssistant.registerFeatures(APP_UI_ID, { assistantBedrockChat: config.experimentalFeatures.assistantBedrockChat, assistantKnowledgeBaseByDefault: config.experimentalFeatures.assistantKnowledgeBaseByDefault, diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index b2df523f67d6b..e33ecb852b5b1 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -39,7 +39,6 @@ "@kbn/actions-plugin", "@kbn/alerting-plugin", "@kbn/cases-plugin", - "@kbn/cloud-experiments-plugin", "@kbn/cloud-security-posture-plugin", "@kbn/encrypted-saved-objects-plugin", "@kbn/features-plugin", @@ -226,5 +225,6 @@ "@kbn/presentation-publishing", "@kbn/entityManager-plugin", "@kbn/entities-schema", + "@kbn/inference-plugin", ] } diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx index e8239e85f9ec3..091057a2f4a4c 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx @@ -19,7 +19,6 @@ import { mountWithIntl, shallowWithIntl } from '@kbn/test-jest-helpers'; import { SpacesGridPage } from './spaces_grid_page'; import { SpaceAvatarInternal } from '../../space_avatar/space_avatar_internal'; -import type { SpacesManager } from '../../spaces_manager'; import { spacesManagerMock } from '../../spaces_manager/mocks'; const spaces = [ @@ -73,7 +72,7 @@ describe('SpacesGridPage', () => { const wrapper = shallowWithIntl( { const wrapper = shallowWithIntl( { }); it('renders a "current" badge for the current space', async () => { - spacesManager.getActiveSpace.mockResolvedValue(spaces[2]); - const current = await spacesManager.getActiveSpace(); - expect(current.id).toBe('custom-2'); + const spacesWithCurrent = [ + { id: 'default', name: 'Default', disabledFeatures: [], _reserved: true }, + { id: 'test-1', name: 'Test', disabledFeatures: [] }, + { id: 'test-2', name: 'Test', disabledFeatures: [] }, + ]; + const spacesManagerWithCurrent = spacesManagerMock.create(); + spacesManagerWithCurrent.getSpaces = jest.fn().mockResolvedValue(spacesWithCurrent); + spacesManagerWithCurrent.getActiveSpace.mockResolvedValue(spacesWithCurrent[2]); + + const current = await spacesManagerWithCurrent.getActiveSpace(); + expect(current.id).toBe('test-2'); const wrapper = mountWithIntl( { await act(async () => {}); wrapper.update(); - const activeRow = wrapper.find('[data-test-subj="spacesListTableRow-custom-2"]'); + const activeRow = wrapper.find('[data-test-subj="spacesListTableRow-test-2"]'); const nameCell = activeRow.find('[data-test-subj="spacesListTableRowNameCell"]'); const activeBadge = nameCell.find('EuiBadge'); expect(activeBadge.text()).toBe('current'); + + // ensure that current badge appears only once + const currentBadges = wrapper.findWhere((node) => { + return ( + node.type() === 'span' && + node.prop('data-test-subj') && + node.prop('data-test-subj').includes('spacesListCurrentBadge') + ); + }); + expect(currentBadges.length).toBe(1); }); it('renders a non-clickable "switch" action for the current space', async () => { @@ -202,7 +219,7 @@ describe('SpacesGridPage', () => { const wrapper = mountWithIntl( { const wrapper = mountWithIntl( { const wrapper = mountWithIntl( { const wrapper = mountWithIntl( { const wrapper = shallowWithIntl( { const wrapper = shallowWithIntl( Promise.reject(error)} notifications={notifications} getUrlForApp={getUrlForApp} diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index 95ef9a563162f..2bbcc290a8a83 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -284,7 +284,7 @@ export class SpacesGridPage extends Component { {value} - {this.state.activeSpace?.name === rowRecord.name && ( + {this.state.activeSpace?.id === rowRecord.id && ( {i18n.translate('xpack.spaces.management.spacesGridPage.currentSpaceMarkerText', { 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 11c1a0a7edee0..ff79fcf4632a3 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -1724,6 +1724,15 @@ "count_rules_muted": { "type": "long" }, + "count_mw_total": { + "type": "long" + }, + "count_mw_with_repeat_toggle_on": { + "type": "long" + }, + "count_mw_with_filter_alert_toggle_on": { + "type": "long" + }, "count_rules_with_muted_alerts": { "type": "long" }, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5a4660f362987..fb6953bde31f7 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -43963,7 +43963,6 @@ "xpack.synthetics.alerts.monitorStatus.removedLocation.status": "a récupéré", "xpack.synthetics.alerts.monitorStatus.upCheck.reasonWithoutDuration": "le moniteur est de nouveau opérationnel. Il a été exécuté avec succès à {checkedAt}", "xpack.synthetics.alerts.monitorStatus.upCheck.status": "est désormais disponible", - "xpack.synthetics.alerts.searchPlaceholder.kql": "Filtrer à l'aide de la syntaxe KQL", "xpack.synthetics.alerts.settings.addConnector": "Ajouter un connecteur", "xpack.synthetics.alerts.syntheticsMonitorStatus.clientName": "Statut du moniteur", "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoverySubjectMessage": "\"{monitorName}\" ({locationName}) {recoveryStatus} - Elastic Synthetics", @@ -44100,8 +44099,6 @@ "xpack.synthetics.emptyState.enablement.contactAdministrator": "Seuls les administrateurs peuvent activer cette fonctionnalité.", "xpack.synthetics.emptyState.enablement.disabledDescription": "Exécutez des vérifications automatiques basées sur des simulations de navigateur réel et des pings de point de terminaison légers pour mesurer l’expérience de vos utilisateurs depuis n'importe quel endroit dans le monde.", "xpack.synthetics.emptyState.enablement.title": "Monitorer le statut de vos services et applications avec Synthetics", - "xpack.synthetics.emptyStateError.notAuthorized": "Vous n'êtes pas autorisé à afficher les données Uptime, veuillez contacter votre administrateur système.", - "xpack.synthetics.emptyStateError.title": "Erreur", "xpack.synthetics.errorDetails.errorDuration": "Erreur de durée", "xpack.synthetics.errorDetails.errorDuration.days": "{value} jours", "xpack.synthetics.errorDetails.errorDuration.hours": "{value} heures", @@ -44219,7 +44216,6 @@ "xpack.synthetics.management.noLabel": "Annuler", "xpack.synthetics.management.yesLabel": "Supprimer", "xpack.synthetics.manualTestRun.failedTest.name": "L'exécution de test manuelle a échoué pour {name}", - "xpack.synthetics.millisecond.abbreviation.label": "ms", "xpack.synthetics.monitor.duration.label": "Durée", "xpack.synthetics.monitor.result.label": "Résultat", "xpack.synthetics.monitor.result.lastSuccessful": "Dernière réussite", @@ -44496,13 +44492,8 @@ "xpack.synthetics.monitorList.redirects.openWindow": "Le lien s'ouvrira dans une nouvelle fenêtre.", "xpack.synthetics.monitorList.redirects.title": "Redirections", "xpack.synthetics.monitorList.runTest.label": "Exécuter le test", - "xpack.synthetics.monitorList.statusColumn.completeLabel": "Terminé", "xpack.synthetics.monitorList.statusColumn.downLabel": "Arrêté", - "xpack.synthetics.monitorList.statusColumn.failedLabel": "Échoué", "xpack.synthetics.monitorList.statusColumn.upLabel": "Opérationnel", - "xpack.synthetics.monitorList.table.project.name": "ID de projet", - "xpack.synthetics.monitorList.table.tags.name": "Balises", - "xpack.synthetics.monitorList.table.url.name": "Url", "xpack.synthetics.monitorList.testNow.AriaLabel": "Cliquer pour exécuter le test maintenant", "xpack.synthetics.monitorList.testNow.scheduled": "Le test est déjà programmé", "xpack.synthetics.monitorList.testRunLogs": "Logs d'exécution de test", @@ -44647,7 +44638,6 @@ "xpack.synthetics.monitorManagement.viewZeroMonitors": "{name} n'est encore utilisé dans aucun moniteur pour le moment.", "xpack.synthetics.monitorManagement.websiteUrlHelpText": "Par exemple, la page d'accueil de votre entreprise ou https://elastic.co.", "xpack.synthetics.monitorManagement.websiteUrlLabel": "URL de site web", - "xpack.synthetics.monitorManagement.websiteUrlPlaceholder": "Entrer l'URL d'un site web", "xpack.synthetics.monitorManagementRoute.title": "Synthetics Management | {baseTitle}", "xpack.synthetics.monitorNotFound.title": "Moniteur Synthetics introuvable | {baseTitle}", "xpack.synthetics.monitorOverviewTab.title": "Aperçu", @@ -44677,7 +44667,6 @@ "xpack.synthetics.monitorSummary.runTestManually": "Exécuter le test manuellement", "xpack.synthetics.monitorSummary.selectMonitor": "Sélectionner un autre moniteur pour afficher ses détails", "xpack.synthetics.monitorSummary.viewAlerts": "Afficher les alertes", - "xpack.synthetics.monitorSummary.viewErrors": "Afficher les erreurs", "xpack.synthetics.monitorSummaryRoute.monitorBreadcrumb": "Moniteurs", "xpack.synthetics.monitorTestResult.screenshotImageLabel": "\"{stepName}\", {stepNumber} sur {totalSteps}", "xpack.synthetics.namespaceValidation.error": "Espace de nom non valide : {error}", @@ -44685,8 +44674,6 @@ "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedDescription": "Pour afficher les données des moniteurs Synthetics, vous devez mettre à jour les privilèges. Pour en savoir plus, contactez votre administrateur Kibana.", "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedFooterMarkdown": "Privilège d'index Elasticsearch `read` requis pour les index suivants :", "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedTitle": "Privilèges requis", - "xpack.synthetics.notFoundBody": "Désolé, nous ne trouvons pas la page que vous recherchez. Elle a peut-être été retirée ou renommée, ou peut-être qu'elle n'a jamais existé.", - "xpack.synthetics.notFoundTitle": "Page introuvable", "xpack.synthetics.overview.actions.cloneMonitor.name": "Cloner le moniteur", "xpack.synthetics.overview.actions.disabledSuccessLabel": "Moniteur \"{name}\" désactivé.", "xpack.synthetics.overview.actions.disabledSuccessLabel.alert": "Les alertes sont maintenant désactivées pour le moniteur \"{name}\".", @@ -44829,8 +44816,6 @@ "xpack.synthetics.rules.tls.validBeforeExpiredString": "Valide depuis le {date}, il y a {relativeDate} jours.", "xpack.synthetics.rules.tls.validBeforeExpiringString": "Non valide jusqu'au {date}, dans {relativeDate} jours.", "xpack.synthetics.runTest.failure": "Impossible d'exécuter le test manuellement", - "xpack.synthetics.seconds.label": "secondes", - "xpack.synthetics.seconds.shortForm.label": "s", "xpack.synthetics.send": "Envoyer", "xpack.synthetics.server.monitors.invalidConfigurationError": "Impossible d’enregistrer ou de mettre à jour le moniteur en raison d’une configuration non valide.", "xpack.synthetics.server.monitors.invalidPayloadError": "La charge utile n’est pas un objet moniteur valide", @@ -44942,8 +44927,6 @@ "xpack.synthetics.stepDetailsRoute.timingsBreakdown.info": "Somme de tous les délais de requêtes réseau", "xpack.synthetics.stepDetailsRoute.title": "Détails de l'étape | {baseTitle}", "xpack.synthetics.synthetics.accountBlocked": "Le compte est bloqué.", - "xpack.synthetics.synthetics.executedStep.screenshot.success": "dernière vérification réussie", - "xpack.synthetics.synthetics.executedStep.screenshot.successfulLink": "Capture d'écran de {link}", "xpack.synthetics.synthetics.markers.explore": "Explorer", "xpack.synthetics.synthetics.markers.noFieldIcon.label": "Icône indiquant que ce marqueur ne possède aucun champ associé", "xpack.synthetics.synthetics.markers.openEmbeddableButton.label": "Utilisez ce bouton icône afin d'afficher les indicateurs pour ce marqueur d'annotation.", @@ -47276,7 +47259,6 @@ "xpack.uptime.synthetics.waterfallChart.labels.timings.ssl": "TLS", "xpack.uptime.synthetics.waterfallChart.labels.timings.wait": "En attente (TTFB)", "xpack.uptime.syntheticsFeatureCatalogueTitle": "Synthetics", - "xpack.uptime.title": "Uptime", "xpack.uptime.tls.ageExpression.description": "ou antérieur à (jours) : ", "xpack.uptime.tls.criteriaExpression.value": "le moniteur correspondant", "xpack.uptime.tls.expirationExpression.description": "possède un certificat expirant dans (jours) : ", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c112b137c2e2b..0517e2df3beb4 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -43942,7 +43942,6 @@ "xpack.synthetics.alerts.monitorStatus.removedLocation.status": "回復しました", "xpack.synthetics.alerts.monitorStatus.upCheck.reasonWithoutDuration": "モニターが再起動しました。{checkedAt}に正常に実行されました。", "xpack.synthetics.alerts.monitorStatus.upCheck.status": "現在起動しています", - "xpack.synthetics.alerts.searchPlaceholder.kql": "KQL構文を使用してフィルタリング", "xpack.synthetics.alerts.settings.addConnector": "コネクターの追加", "xpack.synthetics.alerts.syntheticsMonitorStatus.clientName": "監視ステータス", "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultActionMessage": "{locationName}の\"{monitorName}\"は{status}です - Elastic Synthetics\n\n詳細:\n\n- モニター名:{monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- モニタータイプ:{monitorType} \n- 確認日時:{checkedAt} \n- 開始場所:{locationName} \n- 受信したエラー:{lastErrorMessage} \n{linkMessage}", @@ -44082,8 +44081,6 @@ "xpack.synthetics.emptyState.enablement.contactAdministrator": "管理者のみがこの機能を有効化できます。", "xpack.synthetics.emptyState.enablement.disabledDescription": "実際のブラウザーシミュレーションと軽量のエンドポイントpingに基づいて自動チェックを実行し、世界中のあらゆる場所からユーザーのエクスペリエンスを測定します。", "xpack.synthetics.emptyState.enablement.title": "Syntheticsでサービスとアプリケーションのステータスを監視", - "xpack.synthetics.emptyStateError.notAuthorized": "アップタイムデータの表示が承認されていません。システム管理者にお問い合わせください。", - "xpack.synthetics.emptyStateError.title": "エラー", "xpack.synthetics.errorDetails.errorDuration": "エラー期間", "xpack.synthetics.errorDetails.errorDuration.days": "{value}日以内に期限切れになる", "xpack.synthetics.errorDetails.errorDuration.hours": "{value} 時間", @@ -44201,7 +44198,6 @@ "xpack.synthetics.management.noLabel": "キャンセル", "xpack.synthetics.management.yesLabel": "削除", "xpack.synthetics.manualTestRun.failedTest.name": "{name}の手動テスト実行が失敗しました", - "xpack.synthetics.millisecond.abbreviation.label": "ms", "xpack.synthetics.monitor.duration.label": "期間", "xpack.synthetics.monitor.result.label": "結果", "xpack.synthetics.monitor.result.lastSuccessful": "前回の成功", @@ -44478,13 +44474,8 @@ "xpack.synthetics.monitorList.redirects.openWindow": "リンクは新しいウィンドウで開きます。", "xpack.synthetics.monitorList.redirects.title": "リダイレクト", "xpack.synthetics.monitorList.runTest.label": "テストの実行", - "xpack.synthetics.monitorList.statusColumn.completeLabel": "完了", "xpack.synthetics.monitorList.statusColumn.downLabel": "ダウン", - "xpack.synthetics.monitorList.statusColumn.failedLabel": "失敗", "xpack.synthetics.monitorList.statusColumn.upLabel": "アップ", - "xpack.synthetics.monitorList.table.project.name": "プロジェクト ID", - "xpack.synthetics.monitorList.table.tags.name": "タグ", - "xpack.synthetics.monitorList.table.url.name": "Url", "xpack.synthetics.monitorList.testNow.AriaLabel": "クリックすると今すぐテストを実行します", "xpack.synthetics.monitorList.testNow.scheduled": "テストはすでにスケジュールされています", "xpack.synthetics.monitorList.testRunLogs": "テスト実行ログ", @@ -44629,7 +44620,6 @@ "xpack.synthetics.monitorManagement.viewZeroMonitors": "{name}はまだどのモニターでも使われていません。", "xpack.synthetics.monitorManagement.websiteUrlHelpText": "例:会社のホームページまたはhttps://elastic.co。", "xpack.synthetics.monitorManagement.websiteUrlLabel": "WebサイトのURL", - "xpack.synthetics.monitorManagement.websiteUrlPlaceholder": "WebサイトURLを入力", "xpack.synthetics.monitorManagementRoute.title": "シンセティック管理 | {baseTitle}", "xpack.synthetics.monitorNotFound.title": "Syntheticsモニターが見つかりません | {baseTitle}", "xpack.synthetics.monitorOverviewTab.title": "概要", @@ -44659,7 +44649,6 @@ "xpack.synthetics.monitorSummary.runTestManually": "手動でテストを実行", "xpack.synthetics.monitorSummary.selectMonitor": "詳細を表示するには、別のモニターを選択してください", "xpack.synthetics.monitorSummary.viewAlerts": "アラートを表示", - "xpack.synthetics.monitorSummary.viewErrors": "エラーを表示", "xpack.synthetics.monitorSummaryRoute.monitorBreadcrumb": "監視", "xpack.synthetics.monitorTestResult.screenshotImageLabel": "\"{stepName}\"、{stepNumber}/{totalSteps}", "xpack.synthetics.namespaceValidation.error": "無効な名前空間:{error}", @@ -44667,8 +44656,6 @@ "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedDescription": "Syntheticsモニターデータを表示するには、権限を更新する必要があります。詳細については、Kibana管理者に連絡してください。", "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedFooterMarkdown": "次のインデックスに必要なElasticsearchインデックス権限「読み取り」:", "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedTitle": "権限が必要です", - "xpack.synthetics.notFoundBody": "申し訳ございません。お探しのページは見つかりません。削除または名前変更されたか、存在していなかった可能性があります。", - "xpack.synthetics.notFoundTitle": "ページが見つかりません", "xpack.synthetics.overview.actions.cloneMonitor.name": "モニターを複製", "xpack.synthetics.overview.actions.disabledSuccessLabel": "モニター\"{name}\"は正常に無効にされました。", "xpack.synthetics.overview.actions.disabledSuccessLabel.alert": "モニター\"{name}\"に対するアラートが無効化されました。", @@ -44813,8 +44800,6 @@ "xpack.synthetics.rules.tls.validBeforeExpiredString": "{relativeDate}日前、{date}以降有効です。", "xpack.synthetics.rules.tls.validBeforeExpiringString": "今から{relativeDate}日間、{date}まで無効です。", "xpack.synthetics.runTest.failure": "手動でテストを実行できませんでした", - "xpack.synthetics.seconds.label": "秒", - "xpack.synthetics.seconds.shortForm.label": "秒", "xpack.synthetics.send": "送信", "xpack.synthetics.server.monitors.invalidConfigurationError": "無効な設定のため、モニターを保存または更新できませんでした。", "xpack.synthetics.server.monitors.invalidPayloadError": "ペイロードは有効なモニターオブジェクトではありません", @@ -44926,8 +44911,6 @@ "xpack.synthetics.stepDetailsRoute.timingsBreakdown.info": "すべてのネットワークリクエストタイミングの合計", "xpack.synthetics.stepDetailsRoute.title": "ステップ詳細 | {baseTitle}", "xpack.synthetics.synthetics.accountBlocked": "アカウントがブロックされています。", - "xpack.synthetics.synthetics.executedStep.screenshot.success": "前回成功したチェック", - "xpack.synthetics.synthetics.executedStep.screenshot.successfulLink": "{link}からのスクリーンショット", "xpack.synthetics.synthetics.markers.explore": "探索", "xpack.synthetics.synthetics.markers.noFieldIcon.label": "このマーカーにフィールドが関連付けられていないことを示すアイコン", "xpack.synthetics.synthetics.markers.openEmbeddableButton.label": "このアイコンボタンを使用して、この注釈マーカーのメトリックを表示します。", @@ -47258,7 +47241,6 @@ "xpack.uptime.synthetics.waterfallChart.labels.timings.ssl": "TLS", "xpack.uptime.synthetics.waterfallChart.labels.timings.wait": "待機中(TTFB)", "xpack.uptime.syntheticsFeatureCatalogueTitle": "Synthetics", - "xpack.uptime.title": "アップタイム", "xpack.uptime.tls.ageExpression.description": "または次の日数を経過:", "xpack.uptime.tls.criteriaExpression.value": "一致するモニター", "xpack.uptime.tls.expirationExpression.description": "次の日数以内に有効期限切れになる証明書があります:", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 30d822480bdff..243dbfe47dcfe 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -43990,7 +43990,6 @@ "xpack.synthetics.alerts.monitorStatus.removedLocation.status": "已恢复", "xpack.synthetics.alerts.monitorStatus.upCheck.reasonWithoutDuration": "监测现已再次启动。它于 {checkedAt}成功运行", "xpack.synthetics.alerts.monitorStatus.upCheck.status": "现已打开", - "xpack.synthetics.alerts.searchPlaceholder.kql": "使用 kql 语法筛选", "xpack.synthetics.alerts.settings.addConnector": "添加连接器", "xpack.synthetics.alerts.syntheticsMonitorStatus.clientName": "监测状态", "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultActionMessage": "来自 {locationName} 的“{monitorName}”为 {status}。- Elastic Synthetics\n\n详情:\n\n- 监测名称:{monitorName} \n- {monitorUrlLabel}:{monitorUrl} \n- 监测类型:{monitorType} \n- 检查时间:{checkedAt} \n- 来自:{locationName} \n- 收到错误:{lastErrorMessage} \n{linkMessage}", @@ -44130,8 +44129,6 @@ "xpack.synthetics.emptyState.enablement.contactAdministrator": "仅管理员可以启用此功能。", "xpack.synthetics.emptyState.enablement.disabledDescription": "基于真实浏览器模拟和轻量级终端 ping 运行自动检查,以从全球任何位置评估您用户的体验。", "xpack.synthetics.emptyState.enablement.title": "通过 Synthetics 监测服务和应用程序的状态", - "xpack.synthetics.emptyStateError.notAuthorized": "您无权查看 Uptime 数据,请联系系统管理员。", - "xpack.synthetics.emptyStateError.title": "错误", "xpack.synthetics.errorDetails.errorDuration": "错误持续时间", "xpack.synthetics.errorDetails.errorDuration.days": "{value} 天内过期的证书", "xpack.synthetics.errorDetails.errorDuration.hours": "{value} 小时", @@ -44249,7 +44246,6 @@ "xpack.synthetics.management.noLabel": "取消", "xpack.synthetics.management.yesLabel": "删除", "xpack.synthetics.manualTestRun.failedTest.name": "{name} 的手动测试运行失败", - "xpack.synthetics.millisecond.abbreviation.label": "ms", "xpack.synthetics.monitor.duration.label": "持续时间", "xpack.synthetics.monitor.result.label": "结果", "xpack.synthetics.monitor.result.lastSuccessful": "上次成功", @@ -44526,13 +44522,8 @@ "xpack.synthetics.monitorList.redirects.openWindow": "将在新窗口中打开链接。", "xpack.synthetics.monitorList.redirects.title": "重定向", "xpack.synthetics.monitorList.runTest.label": "运行测试", - "xpack.synthetics.monitorList.statusColumn.completeLabel": "已完成", "xpack.synthetics.monitorList.statusColumn.downLabel": "关闭", - "xpack.synthetics.monitorList.statusColumn.failedLabel": "失败", "xpack.synthetics.monitorList.statusColumn.upLabel": "运行", - "xpack.synthetics.monitorList.table.project.name": "项目 ID", - "xpack.synthetics.monitorList.table.tags.name": "标签", - "xpack.synthetics.monitorList.table.url.name": "URL", "xpack.synthetics.monitorList.testNow.AriaLabel": "单击以立即运行测试", "xpack.synthetics.monitorList.testNow.scheduled": "已计划测试", "xpack.synthetics.monitorList.testRunLogs": "测试运行日志", @@ -44677,7 +44668,6 @@ "xpack.synthetics.monitorManagement.viewZeroMonitors": "{name} 尚未用在任何监测中。", "xpack.synthetics.monitorManagement.websiteUrlHelpText": "例如,您公司的主页或 https://elastic.co。", "xpack.synthetics.monitorManagement.websiteUrlLabel": "网站 URL", - "xpack.synthetics.monitorManagement.websiteUrlPlaceholder": "输入网站 URL", "xpack.synthetics.monitorManagementRoute.title": "Synthetics 管理 | {baseTitle}", "xpack.synthetics.monitorNotFound.title": "找不到 Synthetics 监测 | {baseTitle}", "xpack.synthetics.monitorOverviewTab.title": "概览", @@ -44707,7 +44697,6 @@ "xpack.synthetics.monitorSummary.runTestManually": "手动运行测试", "xpack.synthetics.monitorSummary.selectMonitor": "选择不同监测以查看其详情", "xpack.synthetics.monitorSummary.viewAlerts": "查看告警", - "xpack.synthetics.monitorSummary.viewErrors": "查看错误", "xpack.synthetics.monitorSummaryRoute.monitorBreadcrumb": "监测", "xpack.synthetics.monitorTestResult.screenshotImageLabel": "“{stepName}”,第 {stepNumber} 步,共 {totalSteps} 步", "xpack.synthetics.namespaceValidation.error": "命名空间无效:{error}", @@ -44715,8 +44704,6 @@ "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedDescription": "要查看 Synthetics 监测数据,必须更新权限。有关详细信息,请联系您的 Kibana 管理员。", "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedFooterMarkdown": "以下索引所需的 Elasticsearch 索引权限 `read`:", "xpack.synthetics.noFindingsStates.unprivileged.unprivilegedTitle": "需要权限", - "xpack.synthetics.notFoundBody": "抱歉,找不到您要查找的页面。该页面可能已移除、重命名,或可能从不存在。", - "xpack.synthetics.notFoundTitle": "未找到页面", "xpack.synthetics.overview.actions.cloneMonitor.name": "克隆监测", "xpack.synthetics.overview.actions.disabledSuccessLabel": "已成功禁用监测“{name}”。", "xpack.synthetics.overview.actions.disabledSuccessLabel.alert": "现在已对监测“{name}”禁用告警。", @@ -44861,8 +44848,6 @@ "xpack.synthetics.rules.tls.validBeforeExpiredString": "自 {relativeDate} 天前,即 {date}开始生效。", "xpack.synthetics.rules.tls.validBeforeExpiringString": "从现在到 {date}的 {relativeDate} 天里无效。", "xpack.synthetics.runTest.failure": "无法手动运行测试", - "xpack.synthetics.seconds.label": "秒", - "xpack.synthetics.seconds.shortForm.label": "秒", "xpack.synthetics.send": "发送", "xpack.synthetics.server.monitors.invalidConfigurationError": "由于配置无效,无法保存或更新监测。", "xpack.synthetics.server.monitors.invalidPayloadError": "有效负载不是有效的监测对象", @@ -44974,8 +44959,6 @@ "xpack.synthetics.stepDetailsRoute.timingsBreakdown.info": "所有网络请求计时的总和", "xpack.synthetics.stepDetailsRoute.title": "步骤详情 | {baseTitle}", "xpack.synthetics.synthetics.accountBlocked": "帐户被阻止。", - "xpack.synthetics.synthetics.executedStep.screenshot.success": "上一成功检查", - "xpack.synthetics.synthetics.executedStep.screenshot.successfulLink": "来自 {link} 的屏幕截图", "xpack.synthetics.synthetics.markers.explore": "浏览", "xpack.synthetics.synthetics.markers.noFieldIcon.label": "一个图标,表示此标记没有与其关联的字段", "xpack.synthetics.synthetics.markers.openEmbeddableButton.label": "使用此图标按钮可显示该标注标记的指标。", @@ -47309,7 +47292,6 @@ "xpack.uptime.synthetics.waterfallChart.labels.timings.ssl": "TLS", "xpack.uptime.synthetics.waterfallChart.labels.timings.wait": "等待中 (TTFB)", "xpack.uptime.syntheticsFeatureCatalogueTitle": "Synthetics", - "xpack.uptime.title": "运行时间", "xpack.uptime.tls.ageExpression.description": "或早于以下天数:", "xpack.uptime.tls.criteriaExpression.value": "正在匹配监测", "xpack.uptime.tls.expirationExpression.description": "具有的证书将在以下天数内到期:", diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts index 000ff81d2d2dc..447a49bba4938 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts @@ -90,6 +90,44 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F return ruleResponse.body.id; } + async function createMaintenanceWindow({ + spaceId, + interval, + scopedQuery = null, + }: { + spaceId: string; + interval?: number; + scopedQuery?: { + filters: string[]; + kql: string; + dsl: string; + } | null; + }) { + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(spaceId)}/internal/alerting/rules/maintenance_window`) + .set('kbn-xsrf', 'foo') + .auth(Superuser.username, Superuser.password) + .send({ + title: 'test-maintenance-window', + duration: 60 * 60 * 1000, // 1 hr + r_rule: { + dtstart: new Date().toISOString(), + tzid: 'UTC', + freq: 0, + count: 1, + ...(interval ? { interval } : {}), + }, + category_ids: ['management'], + scoped_query: scopedQuery, + }); + + expect(response.status).to.equal(200); + + objectRemover.add(spaceId, response.body.id, 'rules/maintenance_window', 'alerting', true); + + return response.body.id; + } + async function setup() { // Create rules and connectors in multiple spaces for (const space of Spaces) { @@ -216,6 +254,18 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F actions: [], }, }); + // MW with both toggles off + await createMaintenanceWindow({ spaceId: space.id }); + // MW with 'Repeat' toggle on and 'Filter alerts' toggle on + await createMaintenanceWindow({ + spaceId: space.id, + interval: 1, + scopedQuery: { + filters: [], + kql: 'kibana.alert.job_errors_results.job_id : * ', + dsl: '{"bool":{"must":[],"filter":[{"bool":{"should":[{"exists":{"field":"kibana.alert.job_errors_results.job_id"}}],"minimum_should_match":1}}],"should":[],"must_not":[]}}', + }, + }); } } @@ -500,6 +550,11 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F expect(telemetry.count_rules_by_execution_status_per_day.failure > 0).to.be(true); expect(telemetry.count_rules_by_execution_status_per_day.success > 0).to.be(true); + + // maintenance window telemetry + expect(telemetry.count_mw_total).to.equal(6); + expect(telemetry.count_mw_with_filter_alert_toggle_on).to.equal(3); + expect(telemetry.count_mw_with_repeat_toggle_on).to.equal(3); } it('should retrieve telemetry data in the expected format', async () => { @@ -527,7 +582,7 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F let actionsTelemetry: any; await retry.try(async () => { const telemetryTask = await es.get({ - id: `task:Actions-actions_telemetry`, + id: 'task:Actions-actions_telemetry', index: '.kibana_task_manager', }); expect(telemetryTask!._source!.task?.status).to.be('idle'); @@ -550,7 +605,7 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F let alertingTelemetry: any; await retry.try(async () => { const telemetryTask = await es.get({ - id: `task:Alerting-alerting_telemetry`, + id: 'task:Alerting-alerting_telemetry', index: '.kibana_task_manager', }); expect(telemetryTask!._source!.task?.status).to.be('idle'); diff --git a/x-pack/test/api_integration/services/security_solution_api.gen.ts b/x-pack/test/api_integration/services/security_solution_api.gen.ts index 6a3d0cf8f3dce..5bf7ac87908d3 100644 --- a/x-pack/test/api_integration/services/security_solution_api.gen.ts +++ b/x-pack/test/api_integration/services/security_solution_api.gen.ts @@ -102,6 +102,7 @@ import { InitEntityStoreRequestBodyInput, } from '@kbn/security-solution-plugin/common/api/entity_analytics/entity_store/engine/init.gen'; import { InstallPrepackedTimelinesRequestBodyInput } from '@kbn/security-solution-plugin/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.gen'; +import { ListEntitiesRequestQueryInput } from '@kbn/security-solution-plugin/common/api/entity_analytics/entity_store/entities/list_entities.gen'; import { PatchRuleRequestBodyInput } from '@kbn/security-solution-plugin/common/api/detection_engine/rule_management/crud/patch_rule/patch_rule_route.gen'; import { PatchTimelineRequestBodyInput } from '@kbn/security-solution-plugin/common/api/timeline/patch_timelines/patch_timeline_route.gen'; import { @@ -236,7 +237,9 @@ after 30 days. It also deletes other artifacts specific to the migration impleme .send(props.body as object); }, /** - * Retrieves a clean draft timeline. If a draft timeline does not exist, it is created and returned. + * Create a clean draft Timeline or Timeline template for the current user. +> info +> If the user already has a draft Timeline, the existing draft Timeline is cleared and returned. */ cleanDraftTimelines(props: CleanDraftTimelinesProps) { @@ -289,6 +292,9 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Create a new Timeline or Timeline template. + */ createTimelines(props: CreateTimelinesProps) { return supertest .post('/api/timeline') @@ -333,6 +339,9 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Delete a note from a Timeline using the note ID. + */ deleteNote(props: DeleteNoteProps) { return supertest .delete('/api/note') @@ -352,6 +361,9 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Delete one or more Timelines or Timeline templates. + */ deleteTimelines(props: DeleteTimelinesProps) { return supertest .delete('/api/timeline') @@ -593,6 +605,9 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object) .query(props.query); }, + /** + * Export Timelines as an NDJSON file. + */ exportTimelines(props: ExportTimelinesProps) { return supertest .post('/api/timeline/_export') @@ -664,6 +679,9 @@ finalize it. .set(ELASTIC_HTTP_VERSION_HEADER, '1') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, + /** + * Get the details of the draft Timeline or Timeline template for the current user. If the user doesn't have a draft Timeline, an empty Timeline is returned. + */ getDraftTimelines(props: GetDraftTimelinesProps) { return supertest .get('/api/timeline/_draft') @@ -703,7 +721,7 @@ finalize it. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, /** - * Gets notes + * Get all notes for a given document. */ getNotes(props: GetNotesProps) { return supertest @@ -760,6 +778,9 @@ finalize it. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get the details of an existing saved Timeline or Timeline template. + */ getTimeline(props: GetTimelineProps) { return supertest .get('/api/timeline') @@ -768,6 +789,9 @@ finalize it. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get a list of all saved Timelines or Timeline templates. + */ getTimelines(props: GetTimelinesProps) { return supertest .get('/api/timelines') @@ -790,6 +814,9 @@ finalize it. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Import Timelines. + */ importTimelines(props: ImportTimelinesProps) { return supertest .post('/api/timeline/_import') @@ -826,6 +853,9 @@ finalize it. .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, + /** + * Install or update prepackaged Timelines. + */ installPrepackedTimelines(props: InstallPrepackedTimelinesProps) { return supertest .post('/api/timeline/_prepackaged') @@ -841,6 +871,17 @@ finalize it. .set(ELASTIC_HTTP_VERSION_HEADER, '1') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, + /** + * List entities records, paging, sorting and filtering as needed. + */ + listEntities(props: ListEntitiesProps) { + return supertest + .get('/api/entity_store/entities/list') + .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .query(props.query); + }, listEntityStoreEngines() { return supertest .get('/api/entity_store/engines') @@ -860,7 +901,7 @@ finalize it. .send(props.body as object); }, /** - * Updates an existing timeline. This API is used to update the title, description, date range, pinned events, pinned queries, and/or pinned saved queries of an existing timeline. + * Update an existing Timeline. You can update the title, description, date range, pinned events, pinned queries, and/or pinned saved queries of an existing Timeline. */ patchTimeline(props: PatchTimelineProps) { return supertest @@ -882,6 +923,9 @@ finalize it. .send(props.body as object) .query(props.query); }, + /** + * Favorite a Timeline or Timeline template for the current user. + */ persistFavoriteRoute(props: PersistFavoriteRouteProps) { return supertest .patch('/api/timeline/_favorite') @@ -890,6 +934,9 @@ finalize it. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Add a note to a Timeline or update an existing note. + */ persistNoteRoute(props: PersistNoteRouteProps) { return supertest .patch('/api/note') @@ -898,6 +945,9 @@ finalize it. .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Pin an event to an existing Timeline. + */ persistPinnedEventRoute(props: PersistPinnedEventRouteProps) { return supertest .patch('/api/pinned_event') @@ -1309,6 +1359,9 @@ export interface InitEntityStoreProps { export interface InstallPrepackedTimelinesProps { body: InstallPrepackedTimelinesRequestBodyInput; } +export interface ListEntitiesProps { + query: ListEntitiesRequestQueryInput; +} export interface PatchRuleProps { body: PatchRuleRequestBodyInput; } diff --git a/x-pack/test/api_integration/services/security_solution_exceptions_api.gen.ts b/x-pack/test/api_integration/services/security_solution_exceptions_api.gen.ts index e7426a737b39c..726f877898918 100644 --- a/x-pack/test/api_integration/services/security_solution_exceptions_api.gen.ts +++ b/x-pack/test/api_integration/services/security_solution_exceptions_api.gen.ts @@ -45,6 +45,12 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) const supertest = getService('supertest'); return { + /** + * An exception list groups exception items and can be associated with detection rules. You can assign detection rules with multiple exception lists. +> info +> All exception items added to the same list are evaluated using `OR` logic. That is, if any of the items in a list evaluate to `true`, the exception prevents the rule from generating an alert. Likewise, `OR` logic is used for evaluating exceptions when more than one exception list is assigned to a rule. To use the `AND` operator, you can define multiple clauses (`entries`) in a single exception item. + + */ createExceptionList(props: CreateExceptionListProps) { return supertest .post('/api/exception_lists') @@ -53,6 +59,12 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Create an exception item and associate it with the specified exception list. +> info +> Before creating exception items, you must create an exception list. + + */ createExceptionListItem(props: CreateExceptionListItemProps) { return supertest .post('/api/exception_lists/items') @@ -61,6 +73,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Create exception items that apply to a single detection rule. + */ createRuleExceptionListItems(props: CreateRuleExceptionListItemsProps) { return supertest .post(replaceParams('/api/detection_engine/rules/{id}/exceptions', props.params)) @@ -69,6 +84,12 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * An exception list groups exception items and can be associated with detection rules. A shared exception list can apply to multiple detection rules. +> info +> All exception items added to the same list are evaluated using `OR` logic. That is, if any of the items in a list evaluate to `true`, the exception prevents the rule from generating an alert. Likewise, `OR` logic is used for evaluating exceptions when more than one exception list is assigned to a rule. To use the `AND` operator, you can define multiple clauses (`entries`) in a single exception item. + + */ createSharedExceptionList(props: CreateSharedExceptionListProps) { return supertest .post('/api/exceptions/shared') @@ -77,6 +98,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Delete an exception list using the `id` or `list_id` field. + */ deleteExceptionList(props: DeleteExceptionListProps) { return supertest .delete('/api/exception_lists') @@ -85,6 +109,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Delete an exception list item using the `id` or `item_id` field. + */ deleteExceptionListItem(props: DeleteExceptionListItemProps) { return supertest .delete('/api/exception_lists/items') @@ -93,6 +120,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Duplicate an existing exception list. + */ duplicateExceptionList(props: DuplicateExceptionListProps) { return supertest .post('/api/exception_lists/_duplicate') @@ -102,7 +132,7 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .query(props.query); }, /** - * Exports an exception list and its associated items to an .ndjson file + * Export an exception list and its associated items to an NDJSON file. */ exportExceptionList(props: ExportExceptionListProps) { return supertest @@ -112,6 +142,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get a list of all exception list items in the specified list. + */ findExceptionListItems(props: FindExceptionListItemsProps) { return supertest .get('/api/exception_lists/items/_find') @@ -120,6 +153,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get a list of all exception lists. + */ findExceptionLists(props: FindExceptionListsProps) { return supertest .get('/api/exception_lists/_find') @@ -129,7 +165,7 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .query(props.query); }, /** - * Imports an exception list and associated items + * Import an exception list and its associated items from an NDJSON file. */ importExceptionList(props: ImportExceptionListProps) { return supertest @@ -139,6 +175,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get the details of an exception list using the `id` or `list_id` field. + */ readExceptionList(props: ReadExceptionListProps) { return supertest .get('/api/exception_lists') @@ -147,6 +186,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get the details of an exception list item using the `id` or `item_id` field. + */ readExceptionListItem(props: ReadExceptionListItemProps) { return supertest .get('/api/exception_lists/items') @@ -155,6 +197,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get a summary of the specified exception list. + */ readExceptionListSummary(props: ReadExceptionListSummaryProps) { return supertest .get('/api/exception_lists/summary') @@ -163,6 +208,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Update an exception list using the `id` or `list_id` field. + */ updateExceptionList(props: UpdateExceptionListProps) { return supertest .put('/api/exception_lists') @@ -171,6 +219,9 @@ export function SecuritySolutionApiProvider({ getService }: FtrProviderContext) .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Update an exception list item using the `id` or `item_id` field. + */ updateExceptionListItem(props: UpdateExceptionListItemProps) { return supertest .put('/api/exception_lists/items') diff --git a/x-pack/test/functional/apps/lens/group6/workspace_size.ts b/x-pack/test/functional/apps/lens/group6/workspace_size.ts index 9c5e7fec773f0..0ba44a5249c6e 100644 --- a/x-pack/test/functional/apps/lens/group6/workspace_size.ts +++ b/x-pack/test/functional/apps/lens/group6/workspace_size.ts @@ -268,14 +268,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await assertWorkspaceDimensions('600px', '375px'); }); - // Fails in chrome 128+ + // Fails in chrome 128+: https://github.com/elastic/kibana-operations/issues/199 it.skip('gauge size (absolute pixels) - major arc', async () => { await lens.openVisualOptions(); await lens.setGaugeShape('Major arc'); await assertWorkspaceDimensions('600px', '430px'); }); - it('gauge size (absolute pixels) - circle', async () => { + // Fails in chrome 129+: https://github.com/elastic/kibana-operations/issues/199 + it.skip('gauge size (absolute pixels) - circle', async () => { await lens.openVisualOptions(); await lens.setGaugeShape('Circle'); await assertWorkspaceDimensions('600px', '430px'); diff --git a/x-pack/test/functional/es_archives/security_solution/entity_store/data.json b/x-pack/test/functional/es_archives/security_solution/entity_store/data.json new file mode 100644 index 0000000000000..fdbf972691b84 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/entity_store/data.json @@ -0,0 +1,85 @@ +{ + "type": "doc", + "value": { + "id": "a4cf452c1e0375c3d4412cb550ad1783358468a3b3b777da4829d72c7d6fb74f", + "index": ".entities.v1.latest.ea_user_entity_store", + "source": { + "event": { + "ingested": "2024-09-11T11:26:49.706875Z" + }, + "user": { + "full_name": [], + "domain": [], + "roles": [], + "name": "hinamatsumoto", + "id": [], + "email": [], + "hash": [] + }, + "entity": { + "lastSeenTimestamp": "2024-09-11T11:24:15.588Z", + "schemaVersion": "v1", + "definitionVersion": "1.0.0", + "displayName": "hinamatsumoto", + "identityFields": [ + "user.name" + ], + "id": "LBQAgKHGmpup0Kg9nlKmeQ==", + "type": "node", + "firstSeenTimestamp": "2024-09-11T10:46:00.000Z", + "definitionId": "ea_user_entity_store" + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "a2cf452c1e0375c3d4412cb550bd1783358468a3b3b777da4829d72c7d6fb71f", + "index": ".entities.v1.latest.ea_host_entity_store", + "source": { + "event": { + "ingested": "2024-09-11T11:26:49.641707Z" + }, + "host": { + "hostname": [ + "ali-ubuntu-server" + ], + "domain": [], + "ip": [ + "1050::6:600:300c:326c", + "192.168.1.10", + "1050::5:700:400d:427c", + "10.142.2.222" + ], + "name": "ali-ubuntu-server", + "id": [ + "new_host_id", + "b123c1d92f3821b748a7218b4e78125f" + ], + "type": [], + "mac": [ + "42-2b-ff-8e-ac-2f", + "51-3c-ff-9e-ac-2g" + ], + "architecture": [ + "x86_64" + ] + }, + "entity": { + "lastSeenTimestamp": "2024-09-11T11:24:15.591Z", + "schemaVersion": "v1", + "definitionVersion": "1.0.0", + "displayName": "ali-ubuntu-server", + "identityFields": [ + "host.name" + ], + "id": "ZXKm6GEcUJY6NHkMgPPmGQ==", + "type": "node", + "firstSeenTimestamp": "2024-09-11T10:46:00.000Z", + "definitionId": "ea_host_entity_store" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/functional/es_archives/security_solution/entity_store/mappings.json b/x-pack/test/functional/es_archives/security_solution/entity_store/mappings.json new file mode 100644 index 0000000000000..d532521bca5fb --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/entity_store/mappings.json @@ -0,0 +1,303 @@ +{ + "type": "index", + "value": { + "index": ".entities.v1.latest.ea_host_entity_store", + "mappings": { + "date_detection": false, + "dynamic_templates": [ + { + "strings_as_keyword": { + "match_mapping_type": "string", + "mapping": { + "fields": { + "text": { + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + { + "entity_metrics": { + "path_match": "entity.metrics.*", + "match_mapping_type": [ + "long", + "double" + ], + "mapping": { + "type": "{dynamic_type}" + } + } + } + ], + "properties": { + "entity": { + "properties": { + "definitionId": { + "type": "keyword", + "ignore_above": 1024 + }, + "definitionVersion": { + "type": "keyword", + "ignore_above": 1024 + }, + "displayName": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "firstSeenTimestamp": { + "type": "date" + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "identityFields": { + "type": "keyword" + }, + "lastSeenTimestamp": { + "type": "date" + }, + "schemaVersion": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "event": { + "properties": { + "ingested": { + "type": "date" + } + } + }, + "host": { + "properties": { + "architecture": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "hostname": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "ip": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "mac": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "name": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + } + } + }, + "labels": { + "type": "object" + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} + +{ + "type": "index", + "value": { + "index": ".entities.v1.latest.ea_user_entity_store", + "mappings": { + "date_detection": false, + "dynamic_templates": [ + { + "strings_as_keyword": { + "match_mapping_type": "string", + "mapping": { + "fields": { + "text": { + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + { + "entity_metrics": { + "path_match": "entity.metrics.*", + "match_mapping_type": [ + "long", + "double" + ], + "mapping": { + "type": "{dynamic_type}" + } + } + } + ], + "properties": { + "entity": { + "properties": { + "definitionId": { + "type": "keyword", + "ignore_above": 1024 + }, + "definitionVersion": { + "type": "keyword", + "ignore_above": 1024 + }, + "displayName": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "firstSeenTimestamp": { + "type": "date" + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "identityFields": { + "type": "keyword" + }, + "lastSeenTimestamp": { + "type": "date" + }, + "schemaVersion": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "event": { + "properties": { + "ingested": { + "type": "date" + } + } + }, + "labels": { + "type": "object" + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "properties": { + "domain": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "email": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + }, + "name": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "text": { + "type": "text" + } + } + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts b/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts index f04d7e74d6068..6aa782ad260df 100644 --- a/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_concurrent_limit/cleanup.ts @@ -25,6 +25,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertestWithoutAuth'); + const esSupertest = getService('esSupertest'); const es = getService('es'); const security = getService('security'); const esDeleteAllIndices = getService('esDeleteAllIndices'); @@ -150,6 +151,15 @@ export default function ({ getService }: FtrProviderContext) { }); } + async function addESDebugLoggingSettings() { + const addLogging = { + persistent: { + 'logger.org.elasticsearch.xpack.security.authc': 'debug', + }, + }; + await esSupertest.put('/_cluster/settings').send(addLogging).expect(200); + } + describe('Session Concurrent Limit cleanup', () => { before(async () => { await security.user.create('anonymous_user', { @@ -166,6 +176,7 @@ export default function ({ getService }: FtrProviderContext) { beforeEach(async function () { this.timeout(120000); await es.cluster.health({ index: '.kibana_security_session*', wait_for_status: 'green' }); + await addESDebugLoggingSettings(); await esDeleteAllIndices('.kibana_security_session*'); }); diff --git a/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts b/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts index b0d65147b054a..df120e033377c 100644 --- a/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts +++ b/x-pack/test/security_api_integration/tests/session_concurrent_limit/global_limit.ts @@ -17,6 +17,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertestWithoutAuth'); + const esSupertest = getService('esSupertest'); const es = getService('es'); const security = getService('security'); const config = getService('config'); @@ -116,6 +117,15 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); } + async function addESDebugLoggingSettings() { + const addLogging = { + persistent: { + 'logger.org.elasticsearch.xpack.security.authc': 'debug', + }, + }; + await esSupertest.put('/_cluster/settings').send(addLogging).expect(200); + } + describe('Session Global Concurrent Limit', () => { before(async function () { this.timeout(120000); @@ -138,6 +148,7 @@ export default function ({ getService }: FtrProviderContext) { await security.testUser.setRoles(['kibana_admin']); await es.indices.refresh({ index: '.kibana_security_session*' }); await es.cluster.health({ index: '.kibana_security_session*', wait_for_status: 'green' }); + await addESDebugLoggingSettings(); await supertest .post('/api/security/session/_invalidate') .set('kbn-xsrf', 'xxx') diff --git a/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts b/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts index ab6cfdfb692ad..7c4d344a481d0 100644 --- a/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts +++ b/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts @@ -17,6 +17,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertestWithoutAuth'); + const esSupertest = getService('esSupertest'); const es = getService('es'); const security = getService('security'); const esDeleteAllIndices = getService('esDeleteAllIndices'); @@ -88,9 +89,19 @@ export default function ({ getService }: FtrProviderContext) { return cookie; } + async function addESDebugLoggingSettings() { + const addLogging = { + persistent: { + 'logger.org.elasticsearch.xpack.security.authc': 'debug', + }, + }; + await esSupertest.put('/_cluster/settings').send(addLogging).expect(200); + } + describe('Session Invalidate', () => { beforeEach(async () => { await es.cluster.health({ index: '.kibana_security_session*', wait_for_status: 'green' }); + await addESDebugLoggingSettings(); await esDeleteAllIndices('.kibana_security_session*'); await security.testUser.setRoles(['kibana_admin']); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/ess.config.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/ess.config.ts new file mode 100644 index 0000000000000..ba7a4c83e2ad7 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/ess.config.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 { FtrConfigProviderContext } from '@kbn/test'; +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.trial') + ); + + return { + ...functionalConfig.getAll(), + kbnTestServer: { + ...functionalConfig.get('kbnTestServer'), + serverArgs: [ + ...functionalConfig.get('kbnTestServer.serverArgs'), + `--xpack.securitySolution.enableExperimental=${JSON.stringify(['entityStoreEnabled'])}`, + ], + }, + testFiles: [require.resolve('..')], + junit: { + reportName: 'Entity Analytics - Entity Store Integration Tests - ESS Env - Trial License', + }, + }; +} diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/serverless.config.ts new file mode 100644 index 0000000000000..990bdd8778aeb --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/configs/serverless.config.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createTestConfig } from '../../../../../config/serverless/config.base'; + +export default createTestConfig({ + kbnTestServerArgs: [ + `--xpack.securitySolution.enableExperimental=${JSON.stringify(['entityStoreEnabled'])}`, + `--xpack.securitySolutionServerless.productTypes=${JSON.stringify([ + { product_line: 'security', product_tier: 'complete' }, + { product_line: 'endpoint', product_tier: 'complete' }, + { product_line: 'cloud', product_tier: 'complete' }, + ])}`, + ], + testFiles: [require.resolve('..')], + junit: { + reportName: + 'Entity Analytics - Entity Store Integration Tests - Serverless Env - Complete Tier', + }, +}); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entities_list.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entities_list.ts new file mode 100644 index 0000000000000..133f74a7a68c8 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entities_list.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; 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 }: FtrProviderContext) => { + const securitySolutionApi = getService('securitySolutionApi'); + + describe('@ess @serverless @skipInServerlessMKI Entity store - Entities list API', () => { + describe('when the entity store is disable', () => { + it("should return response with success status when the index doesn't exist", async () => { + const { body } = await securitySolutionApi.listEntities({ + query: { entities_types: ['host'] }, + }); + + expect(body).toEqual( + expect.objectContaining({ + total: 0, + records: [], + }) + ); + }); + }); + + describe('when the entity store is enable', () => { + const esArchiver = getService('esArchiver'); + + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/security_solution/entity_store'); + }); + + after(async () => { + await esArchiver.unload( + 'x-pack/test/functional/es_archives/security_solution/entity_store' + ); + }); + + it('should return hosts in the entity store index', async () => { + const { body } = await securitySolutionApi.listEntities({ + query: { entities_types: ['host'] }, + }); + + expect(body.total).toEqual(1); + expect(body.records.length).toEqual(1); + }); + + it('should return users in the entity store index', async () => { + const { body } = await securitySolutionApi.listEntities({ + query: { entities_types: ['user'] }, + }); + + expect(body.total).toEqual(1); + expect(body.records.length).toEqual(1); + }); + + it('should return all entities in the entity store index', async () => { + const { body } = await securitySolutionApi.listEntities({ + query: { entities_types: ['user', 'host'] }, + }); + + expect(body.total).toEqual(2); + expect(body.records.length).toEqual(2); + }); + }); + }); +}; diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/get_title.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/index.ts similarity index 50% rename from x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/get_title.ts rename to x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/index.ts index d2ad0dd3296b3..a043ea866d5eb 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/lib/helper/get_title.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/index.ts @@ -5,11 +5,10 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; -export const getTitle = (name?: string) => { - const appName = i18n.translate('xpack.uptime.title', { - defaultMessage: 'Uptime', +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Entity Analytics - Entity Store', function () { + loadTestFile(require.resolve('./entities_list')); }); - return `${appName} ${name ? '| ' + name : ''} - Kibana`; -}; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts index ec63653bef7c7..d5f04e692acfe 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts @@ -39,8 +39,7 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); let roleAdmin: RoleCredentials; - // Failing: See https://github.com/elastic/kibana/issues/193061 - describe.skip('Summary actions', function () { + describe('Summary actions', function () { const RULE_TYPE_ID = '.es-query'; const ALERT_ACTION_INDEX = 'alert-action-es-query'; const ALERT_INDEX = '.alerts-stack.alerts-default'; @@ -491,16 +490,13 @@ export default function ({ getService }: FtrProviderContext) { }); ruleId = createdRule.id; - const resp = await alertingApi.helpers.waitForDocumentInIndex({ + const resp = await alertingApi.helpers.waitForDocumentInIndexForTime({ esClient, indexName: ALERT_ACTION_INDEX, ruleId, num: 2, sort: 'asc', - retryOptions: { - retryCount: 20, - retryDelay: 10_000, - }, + timeout: 180_000, }); const resp2 = await alertingApi.helpers.waitForAlertInIndex({ diff --git a/x-pack/test_serverless/shared/services/alerting_api.ts b/x-pack/test_serverless/shared/services/alerting_api.ts index afed22fbe2c9a..86fcad5060cc6 100644 --- a/x-pack/test_serverless/shared/services/alerting_api.ts +++ b/x-pack/test_serverless/shared/services/alerting_api.ts @@ -102,6 +102,46 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { ); }, + async waitForDocumentInIndexForTime({ + esClient, + indexName, + ruleId, + num = 1, + sort = 'desc', + timeout = 1000, + }: { + esClient: Client; + indexName: string; + ruleId: string; + num?: number; + sort?: 'asc' | 'desc'; + timeout?: number; + }): Promise { + return await retry.tryForTime(timeout, async () => { + const response = await esClient.search({ + index: indexName, + sort: `date:${sort}`, + body: { + query: { + bool: { + must: [ + { + term: { + 'ruleId.keyword': ruleId, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length < num) { + throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); + } + return response; + }); + }, + async waitForDocumentInIndex({ esClient, indexName, diff --git a/yarn.lock b/yarn.lock index 13852c94782c1..d4c06d61f9a02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3994,6 +3994,30 @@ version "0.0.0" uid "" +"@kbn/core-feature-flags-browser-internal@link:packages/core/feature-flags/core-feature-flags-browser-internal": + version "0.0.0" + uid "" + +"@kbn/core-feature-flags-browser-mocks@link:packages/core/feature-flags/core-feature-flags-browser-mocks": + version "0.0.0" + uid "" + +"@kbn/core-feature-flags-browser@link:packages/core/feature-flags/core-feature-flags-browser": + version "0.0.0" + uid "" + +"@kbn/core-feature-flags-server-internal@link:packages/core/feature-flags/core-feature-flags-server-internal": + version "0.0.0" + uid "" + +"@kbn/core-feature-flags-server-mocks@link:packages/core/feature-flags/core-feature-flags-server-mocks": + version "0.0.0" + uid "" + +"@kbn/core-feature-flags-server@link:packages/core/feature-flags/core-feature-flags-server": + version "0.0.0" + uid "" + "@kbn/core-history-block-plugin@link:test/plugin_functional/plugins/core_history_block": version "0.0.0" uid "" @@ -5078,6 +5102,10 @@ version "0.0.0" uid "" +"@kbn/feature-flags-example-plugin@link:examples/feature_flags_example": + version "0.0.0" + uid "" + "@kbn/feature-usage-test-plugin@link:x-pack/test/plugin_api_integration/plugins/feature_usage_test": version "0.0.0" uid "" @@ -7331,6 +7359,11 @@ https-proxy-agent "^5.0.1" launchdarkly-eventsource "2.0.3" +"@launchdarkly/openfeature-node-server@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@launchdarkly/openfeature-node-server/-/openfeature-node-server-1.0.0.tgz#09abebb56608e729049c3ebbd2373ce0ea25121d" + integrity sha512-4O4bQSqM+9BUZo8L+rQkxUdrv3sqC8vGcC0U0yBvELXmd9Q8jJZkY+7+idcx/zJsInYwnfmS0TUA4YeOyQw89A== + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" @@ -7668,16 +7701,16 @@ express "^4.18.2" strict-event-emitter "^0.5.1" -"@mswjs/interceptors@^0.29.0": - version "0.29.1" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.29.1.tgz#e77fc58b5188569041d0440b25c9e9ebb1ccd60a" - integrity sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw== +"@mswjs/interceptors@^0.35.6": + version "0.35.6" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.35.6.tgz#66c522036bc01fa6be87b46b49cc378b837bf510" + integrity sha512-PpD687w7qLxVMK176bpQjbzU9O0VC75QnBK5U1lKd29s4hIuxfTItUD6raNKyQ6BN8b64/8HE34RuYTkwH9uPQ== dependencies: "@open-draft/deferred-promise" "^2.2.0" "@open-draft/logger" "^0.3.0" "@open-draft/until" "^2.0.0" is-node-process "^1.2.0" - outvariant "^1.2.1" + outvariant "^1.4.3" strict-event-emitter "^0.5.1" "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": @@ -7978,6 +8011,28 @@ resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== +"@openfeature/core@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@openfeature/core/-/core-1.4.0.tgz#07a929ef6f731903b210cdbaa58d76d4d2623a79" + integrity sha512-Cd5eeAouAYaj1RMgVq4gfasoAc4TSkN4fuhloZ3yCQA2t74IdVMAT0iadq1Seqy+G7PZoN2jy706ei9HT55PIg== + +"@openfeature/launchdarkly-client-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@openfeature/launchdarkly-client-provider/-/launchdarkly-client-provider-0.3.0.tgz#47ad29671529595314fdb9497d078be0a744e006" + integrity sha512-iFe27RbuUxv4hDGJDmWJnxs5gpzU2d1xTxrGu/8z0gcbtXUAaYM6s4kglf63V2QzWV/Grot6P6bwSLlqeSDwMw== + dependencies: + lodash.isempty "4.4.0" + +"@openfeature/server-sdk@^1.15.1": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@openfeature/server-sdk/-/server-sdk-1.15.1.tgz#7a20ca06297f947f6060852e072b0bc24e03f126" + integrity sha512-PaJETh/fr4N8BVQlgb5vBH8VdN25VhxaVvL0s4Wv3kAUC+MXi7B9hEVM1GUlI9CrjxRExlbAAYtLY7kzjE7SXg== + +"@openfeature/web-sdk@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@openfeature/web-sdk/-/web-sdk-1.2.3.tgz#5a248e8ae53c22397cde5e5324e69a833bf8fb21" + integrity sha512-vsqEvkY5Z78C5W1UW57uMN+a70UgaObzQ1QNIp0lV77aCQnGJi7FHeYmyrfLm8XjtJbj/5PAaclAyqudf+xgaA== + "@opentelemetry/api-metrics@0.31.0", "@opentelemetry/api-metrics@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api-metrics/-/api-metrics-0.31.0.tgz#0ed4cf4d7c731f968721c2b303eaf5e9fd42f736" @@ -8310,16 +8365,16 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@puppeteer/browsers@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.2.4.tgz#4307245d881aa5a79743050be66568bad0f6ffbb" - integrity sha512-BdG2qiI1dn89OTUUsx2GZSpUzW+DRffR1wlMJyKxVHYrhnKoELSDxDd+2XImUkuWPEKk76H5FcM/gPFrEK1Tfw== +"@puppeteer/browsers@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.4.0.tgz#a0dd0f4e381e53f509109ae83b891db5972750f5" + integrity sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g== dependencies: - debug "^4.3.5" + debug "^4.3.6" extract-zip "^2.0.1" progress "^2.0.3" proxy-agent "^6.4.0" - semver "^7.6.2" + semver "^7.6.3" tar-fs "^3.0.6" unbzip2-stream "^1.4.3" yargs "^17.7.2" @@ -12843,9 +12898,9 @@ async@^1.4.2: integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^3.2.0, async@^3.2.3, async@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -14199,10 +14254,10 @@ chromedriver@^128.0.1: proxy-from-env "^1.1.0" tcp-port-used "^1.0.2" -chromium-bidi@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.1.tgz#533612dd166b7b36a8ba8b90685ad2fa0c98d064" - integrity sha512-kSxJRj0VgtUKz6nmzc2JPfyfJGzwzt65u7PqhPHtgGQUZLF5oG+ST6l6e5ONfStUMAlhSutFCjaGKllXZa16jA== +chromium-bidi@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.5.tgz#31be98f9ee5c93fa99d240c680518c9293d8c6bb" + integrity sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA== dependencies: mitt "3.0.1" urlpattern-polyfill "10.0.0" @@ -14417,16 +14472,16 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@2.x, clone@^2.1.1, clone@^2.1.2, clone@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - clone@^1.0.2, clone@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.1, clone@^2.1.2, clone@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + cloneable-readable@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" @@ -15763,12 +15818,12 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@4.3.1: version "4.3.1" @@ -16229,10 +16284,10 @@ detective@^5.0.2: defined "^1.0.0" minimist "^1.1.1" -devtools-protocol@0.0.1299070: - version "0.0.1299070" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz#b3e4cf0b678a46f0f907ae6e07e03ad3a53c00df" - integrity sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg== +devtools-protocol@0.0.1330662: + version "0.0.1330662" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1330662.tgz#400fe703c2820d6b2d9ebdd1785934310152373e" + integrity sha512-pzh6YQ8zZfz3iKlCvgzVCu22NdpZ8hNmwU6WnQjNVquh0A9iVosPtNLWDwaWVGyrntQlltPFztTMK5Cg6lfCuw== dezalgo@^1.0.0, dezalgo@^1.0.4: version "1.0.4" @@ -19184,7 +19239,7 @@ graphql-tag@^2.12.6: dependencies: tslib "^2.1.0" -graphql@^16.6.0: +graphql@^16.6.0, graphql@^16.8.1: version "16.8.1" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== @@ -22079,11 +22134,6 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" -launchdarkly-eventsource@1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/launchdarkly-eventsource/-/launchdarkly-eventsource-1.4.4.tgz#fa595af8602e487c61520787170376c6a1104459" - integrity sha512-GL+r2Y3WccJlhFyL2buNKel+9VaMnYpbE/FfCkOST5jSNSFodahlxtGyrE8o7R+Qhobyq0Ree4a7iafJDQi9VQ== - launchdarkly-eventsource@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/launchdarkly-eventsource/-/launchdarkly-eventsource-2.0.3.tgz#8a7b8da5538153f438f7d452b1c87643d900f984" @@ -22106,19 +22156,6 @@ launchdarkly-js-sdk-common@5.3.0: fast-deep-equal "^2.0.1" uuid "^8.0.0" -launchdarkly-node-server-sdk@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/launchdarkly-node-server-sdk/-/launchdarkly-node-server-sdk-7.0.3.tgz#d7a8b996d992b0ca5d4972db5df1ae49332b094c" - integrity sha512-uSkBezAiQ9nwv8N6CmI7OmyJ9e3xpueJzYOso8+5vMf7VtBtPjz6RRsUkUsSzUDo7siclmW8USjCwqn9aX2EbQ== - dependencies: - async "^3.2.4" - launchdarkly-eventsource "1.4.4" - lru-cache "^6.0.0" - node-cache "^5.1.0" - semver "^7.5.4" - tunnel "0.0.6" - uuid "^8.3.2" - lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -22406,7 +22443,7 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== -lodash.isempty@^4.4.0: +lodash.isempty@4.4.0, lodash.isempty@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= @@ -23788,24 +23825,25 @@ msgpackr@^1.9.9: optionalDependencies: msgpackr-extract "^3.0.2" -msw@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.2.tgz#df8040975b2bf92ebc0a16d1c9e9f138c3c8765c" - integrity sha512-GImSQGhn19czhVpxPdiUDK8CMZ6jbBcvOhzfJd8KFErjEER2wDKWs1UYaetJs2GSNlAqt6heZYm7g3eLatTcog== +msw@^2.4.5: + version "2.4.8" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.8.tgz#306b6ba1ae09d0d09bac08009a83eeb622578d73" + integrity sha512-a+FUW1m5yT8cV9GBy0L/cbNg0EA4//SKEzgu3qFrpITrWYeZmqfo7dqtM74T2lAl69jjUjjCaEhZKaxG2Ns8DA== dependencies: "@bundled-es-modules/cookie" "^2.0.0" "@bundled-es-modules/statuses" "^1.0.1" "@bundled-es-modules/tough-cookie" "^0.1.6" "@inquirer/confirm" "^3.0.0" - "@mswjs/interceptors" "^0.29.0" + "@mswjs/interceptors" "^0.35.6" "@open-draft/until" "^2.1.0" "@types/cookie" "^0.6.0" "@types/statuses" "^2.0.4" chalk "^4.1.2" + graphql "^16.8.1" headers-polyfill "^4.0.2" is-node-process "^1.2.0" outvariant "^1.4.2" - path-to-regexp "^6.2.0" + path-to-regexp "^6.3.0" strict-event-emitter "^0.5.1" type-fest "^4.9.0" yargs "^17.7.2" @@ -24044,13 +24082,6 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-cache@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" - integrity sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg== - dependencies: - clone "2.x" - node-diff3@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/node-diff3/-/node-diff3-3.1.2.tgz#49df8d821dc9cbab87bfd6182171d90169613a97" @@ -24805,10 +24836,10 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= -outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" - integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== +outvariant@^1.4.0, outvariant@^1.4.2, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== p-all@^2.1.0: version "2.1.0" @@ -25195,10 +25226,10 @@ path-to-regexp@^2.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz" integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== -path-to-regexp@^6.2.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" - integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== +path-to-regexp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== path-type@^1.0.0: version "1.1.0" @@ -26273,26 +26304,29 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer-core@22.13.1: - version "22.13.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.13.1.tgz#3ba03e5ebd98bbbd86e465864cf00314e07309de" - integrity sha512-NmhnASYp51QPRCAf9n0OPxuPMmzkKd8+2sB9Q+BjwwCG25gz6iuNc3LQDWa+cH2tyivmJppLhNNFt6Q3HmoOpw== +puppeteer-core@23.3.1: + version "23.3.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.3.1.tgz#b93d825e586f5f7dc268128a31a31c62bbe378ae" + integrity sha512-m5gTpITEqqpSgAvPUI/Ch9igh5sNJV+BVVbqQMzqirRDVHDCkLGHaydEQZx2NZvSXdwCFrIV///cpSlX/uD0Sg== dependencies: - "@puppeteer/browsers" "2.2.4" - chromium-bidi "0.6.1" - debug "^4.3.5" - devtools-protocol "0.0.1299070" + "@puppeteer/browsers" "2.4.0" + chromium-bidi "0.6.5" + debug "^4.3.7" + devtools-protocol "0.0.1330662" + typed-query-selector "^2.12.0" ws "^8.18.0" -puppeteer@22.13.1: - version "22.13.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.13.1.tgz#f8e4217919b438f18adb754e9d8414fef58fb3de" - integrity sha512-PwXLDQK5u83Fm5A7TGMq+9BR7iHDJ8a3h21PSsh/E6VfhxiKYkU7+tvGZNSCap6k3pCNDd9oNteVBEctcBalmQ== +puppeteer@23.3.1: + version "23.3.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.3.1.tgz#830ac4b2c264ae4a610b79be77aff23bb13efa2c" + integrity sha512-BxkuJyCv46ZKW8KEHiVMHgHEC89jKK9FffReWjbw1IfBUmNx+6JIZyqOtaJeSwyolTdVqqb5fiPiXflKeH3dKQ== dependencies: - "@puppeteer/browsers" "2.2.4" + "@puppeteer/browsers" "2.4.0" + chromium-bidi "0.6.5" cosmiconfig "^9.0.0" - devtools-protocol "0.0.1299070" - puppeteer-core "22.13.1" + devtools-protocol "0.0.1330662" + puppeteer-core "23.3.1" + typed-query-selector "^2.12.0" pure-rand@^6.0.0: version "6.0.2" @@ -30757,7 +30791,7 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel@0.0.6, tunnel@^0.0.6: +tunnel@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== @@ -30878,6 +30912,11 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"