diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/ai_playground.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/ai_playground.test.tsx new file mode 100644 index 00000000000000..22b7dc0540dfa1 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/ai_playground.test.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { setMockValues } from '../../../__mocks__/kea_logic'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { AIPlayground } from './ai_playground'; +import { Chat } from './components/chat'; +import { EmptyIndex } from './components/empty_index'; + +describe('AI Playground', () => { + describe('Empty state', () => { + it('renders when Indices are empty', () => { + setMockValues({ + hasNoIndices: true, + }); + + const wrapper = shallow(); + + expect(wrapper.find(EmptyIndex)).toHaveLength(1); + }); + }); + + it('renders when indices are available', () => { + setMockValues({ + hasNoIndices: false, + }); + + const wrapper = shallow(); + + expect(wrapper.find(EmptyIndex)).toHaveLength(0); + expect(wrapper.find(Chat)).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/ai_playground.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/ai_playground.tsx new file mode 100644 index 00000000000000..49888ea6f3fff4 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/ai_playground.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect } from 'react'; + +import { useValues, useActions } from 'kea'; + +import { EuiPageTemplate } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { EnterpriseSearchContentPageTemplate } from '../layout/page_template'; + +import { IndicesLogic } from '../search_indices/indices_logic'; + +import { Chat } from './components/chat'; +import { EmptyIndex } from './components/empty_index'; + +export const AIPlayground: React.FC = () => { + const { fetchIndices } = useActions(IndicesLogic); + const { hasNoIndices, isLoading } = useValues(IndicesLogic); + + useEffect(() => { + fetchIndices({ + from: 0, + onlyShowSearchOptimizedIndices: false, + returnHiddenIndices: false, + size: 20, + }); + }, []); + + return ( + + {hasNoIndices ? ( + + ) : ( + + + + )} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/ai_playground.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/ai_playground.tsx deleted file mode 100644 index ea9a0dc0d66157..00000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/ai_playground.tsx +++ /dev/null @@ -1,48 +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 { i18n } from '@kbn/i18n'; - -import { EuiPageTemplate } from '@elastic/eui'; - -import { EnterpriseSearchContentPageTemplate } from '../../layout/page_template'; -import { Chat } from './chat'; - -export const AIPlayground: React.FC = () => { - return ( - - - - - - ); -}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat.tsx index 2fc3cf2ad3c359..1b75f6d0b3df6d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat.tsx @@ -1,12 +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. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiButtonIcon, EuiFlexGroup, @@ -15,13 +15,16 @@ import { EuiLink, useEuiTheme, } from '@elastic/eui'; -import React from 'react'; -import { QuestionInput } from './question_input'; + import { i18n } from '@kbn/i18n'; + +import { MessageRole } from '../types'; + import { ChatSidebar } from './chat_sidebar'; -import { TelegramIcon } from './telegram_icon'; import { MessageList } from './message_list/message_list'; -import { MessageRole } from '../types'; +import { QuestionInput } from './question_input'; + +import { TelegramIcon } from './telegram_icon'; export const Chat = () => { const { euiTheme } = useEuiTheme(); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat_sidebar.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat_sidebar.tsx index ac8460de3a6ba9..347c4fee3c4c9c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat_sidebar.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/chat_sidebar.tsx @@ -1,15 +1,14 @@ /* - * - * * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * * or more contributor license agreements. Licensed under the Elastic License - * * 2.0; you may not use this file except in compliance with the Elastic License - * * 2.0. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. */ import React from 'react'; -import { i18n } from '@kbn/i18n'; + import { EuiFormRow, EuiSwitch } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { InstructionsField } from './instructions_field'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/empty_index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/empty_index.test.tsx new file mode 100644 index 00000000000000..24adcc6475beb9 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/empty_index.test.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 { mockKibanaValues } from '../../../../__mocks__/kea_logic'; + +import React from 'react'; + +import { mount } from 'enzyme'; + +import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; + +import { NEW_INDEX_PATH } from '../../../routes'; + +import { EmptyIndex } from './empty_index'; + +describe('Empty state', () => { + it('renders the empty state component', () => { + const wrapper = mount(); + + expect(wrapper.find(EuiEmptyPrompt)).toHaveLength(1); + expect(wrapper.find(EuiButton)).toHaveLength(1); + }); + + it('clicking in navigates to new index page', () => { + const { navigateToUrl } = mockKibanaValues; + + const wrapper = mount(); + // @ts-ignore + wrapper.find(EuiButton).props().onClick(); + + expect(navigateToUrl).toHaveBeenCalledTimes(1); + expect(navigateToUrl).toHaveBeenCalledWith(NEW_INDEX_PATH); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/empty_index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/empty_index.tsx new file mode 100644 index 00000000000000..f2686e1e20a8a0 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/empty_index.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { EuiButton, EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { KibanaLogic } from '../../../../shared/kibana'; +import { NEW_INDEX_PATH } from '../../../routes'; + +export const EmptyIndex: React.FC = () => { + return ( + + + + + {i18n.translate( + 'xpack.enterpriseSearch.content.aiPlayground.emptyIndex.h2.addData', + { + defaultMessage: 'Add data', + } + )} + + } + iconType="plusInCircle" + titleSize="m" + body={ +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.aiPlayground.emptyIndex.p.addDataAndIndexLabel', + { + defaultMessage: 'To use the AI Playground, create an index and add some data.', + } + )} +

+ } + actions={ + KibanaLogic.values.navigateToUrl(NEW_INDEX_PATH)} + > + {i18n.translate( + 'xpack.enterpriseSearch.content.aiPlayground.emptyIndex.newIndexButtonLabel', + { + defaultMessage: 'Create an index', + } + )} + + } + /> +
+
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/instructions_field.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/instructions_field.tsx index 8649d64b60ff8d..959a78e60321b8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/instructions_field.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/instructions_field.tsx @@ -1,13 +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. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiFormRow, EuiIcon, EuiTextArea, EuiToolTip } from '@elastic/eui'; interface InstructionsFieldProps { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/assistant_message.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/assistant_message.tsx index a176feddba001f..c46a5b145c2a4a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/assistant_message.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/assistant_message.tsx @@ -1,20 +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. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 moment from 'moment'; + import { EuiComment, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { CopyActionButton } from './copy_action_button'; + import type { Message as MessageType } from '../../types'; -interface AssistantMessageProps extends Pick {} +import { CopyActionButton } from './copy_action_button'; + +type AssistantMessageProps = Pick; export const AssistantMessage: React.FC = ({ content, createdAt }) => { return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/copy_action_button.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/copy_action_button.tsx index 6dd523ace1b8e8..c55ac088c04e2d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/copy_action_button.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/copy_action_button.tsx @@ -1,13 +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. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiButtonIcon } from '@elastic/eui'; interface CopyActionButtonProps { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/message_list.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/message_list.tsx index 2dc0d7af007282..d853b15e7ae892 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/message_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/message_list.tsx @@ -1,18 +1,19 @@ /* - * - * * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * * or more contributor license agreements. Licensed under the Elastic License - * * 2.0; you may not use this file except in compliance with the Elastic License - * * 2.0. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiCommentList } from '@elastic/eui'; + import { Message, MessageRole } from '../../types'; + +import { AssistantMessage } from './assistant_message'; import { SystemMessage } from './system_message'; import { UserMessage } from './user_message'; -import { AssistantMessage } from './assistant_message'; interface MessageListProps { messages: Message[]; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/system_message.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/system_message.tsx index fdba5aa7e2d536..62677a40a6710e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/system_message.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/system_message.tsx @@ -1,13 +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. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiComment } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/user_message.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/user_message.tsx index 0ae530b54b0bc6..5663b2c30ecae1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/user_message.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/message_list/user_message.tsx @@ -1,23 +1,25 @@ /* - * - * * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * * or more contributor license agreements. Licensed under the Elastic License - * * 2.0; you may not use this file except in compliance with the Elastic License - * * 2.0. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 moment from 'moment'; + import { useValues } from 'kea'; +import moment from 'moment'; + import { EuiComment, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { UserAvatar, UserProfileWithAvatar } from '@kbn/user-profile-components'; -import { CopyActionButton } from './copy_action_button'; -import type { Message as MessageType } from '../../types'; + import { KibanaLogic } from '../../../../../shared/kibana'; +import type { Message as MessageType } from '../../types'; + +import { CopyActionButton } from './copy_action_button'; -interface UserMessageProps extends Pick {} +type UserMessageProps = Pick; export const UserMessage: React.FC = ({ content, createdAt }) => { const { security } = useValues(KibanaLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/question_input.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/question_input.tsx index ba89b75b1142bf..9529f928489f29 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/question_input.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/question_input.tsx @@ -1,16 +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. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + import { css } from '@emotion/react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + interface QuestionInputProps { placeholder: string; value: string; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/telegram_icon.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/telegram_icon.tsx index 038b3b9a1971d5..749f6e102df849 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/telegram_icon.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/components/telegram_icon.tsx @@ -1,10 +1,8 @@ /* - * - * * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * * or more contributor license agreements. Licensed under the Elastic License - * * 2.0; you may not use this file except in compliance with the Elastic License - * * 2.0. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/index.tsx index 8e944aaa7be0f3..f6b9c77d5c78a2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/index.tsx @@ -1,11 +1,8 @@ /* - * - * * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * * or more contributor license agreements. Licensed under the Elastic License - * * 2.0; you may not use this file except in compliance with the Elastic License - * * 2.0. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. */ -export * from "./components/ai_playground"; - +export * from './ai_playground'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/types.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/types.ts index 17f74d339b0493..71a46c5c9a1bc3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/ai_playground/types.ts @@ -1,10 +1,8 @@ /* - * - * * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * * or more contributor license agreements. Licensed under the Elastic License - * * 2.0; you may not use this file except in compliance with the Elastic License - * * 2.0. - * + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 enum MessageRole { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx index 4bf5f9396a0240..24d5694ff68d5d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx @@ -20,11 +20,11 @@ import { HttpLogic } from '../shared/http'; import { KibanaLogic } from '../shared/kibana'; import { VersionMismatchPage } from '../shared/version_mismatch'; +import { AIPlayground } from './components/ai_playground'; import { Connectors } from './components/connectors/connectors'; import { NotFound } from './components/not_found'; import { SearchIndicesRouter } from './components/search_indices'; import { Settings } from './components/settings'; -import { AIPlayground } from './components/ai_playground'; import { CONNECTORS_PATH, CRAWLERS_PATH,