diff --git a/x-pack/platform/plugins/shared/streams_app/.storybook/get_mock_streams_app_context.tsx b/x-pack/platform/plugins/shared/streams_app/.storybook/get_mock_streams_app_context.tsx index a910f7f841493..83634949c853d 100644 --- a/x-pack/platform/plugins/shared/streams_app/.storybook/get_mock_streams_app_context.tsx +++ b/x-pack/platform/plugins/shared/streams_app/.storybook/get_mock_streams_app_context.tsx @@ -19,6 +19,7 @@ import { LicensingPluginStart } from '@kbn/licensing-plugin/public'; import { IndexManagementPluginStart } from '@kbn/index-management-shared-types'; import { IngestPipelinesPluginStart } from '@kbn/ingest-pipelines-plugin/public'; import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public'; +import { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public'; import type { StreamsAppKibanaContext } from '../public/hooks/use_kibana'; import { StreamsTelemetryService } from '../public/telemetry/service'; @@ -47,6 +48,7 @@ export function getMockStreamsAppContext(): StreamsAppKibanaContext { indexManagement: {} as unknown as IndexManagementPluginStart, ingestPipelines: {} as unknown as IngestPipelinesPluginStart, discoverShared: {} as unknown as DiscoverSharedPublicStart, + observabilityAIAssistant: {} as unknown as ObservabilityAIAssistantPublicStart, }, }, services: { diff --git a/x-pack/platform/plugins/shared/streams_app/kibana.jsonc b/x-pack/platform/plugins/shared/streams_app/kibana.jsonc index dcdd5ccea5bc3..e75758995ff19 100644 --- a/x-pack/platform/plugins/shared/streams_app/kibana.jsonc +++ b/x-pack/platform/plugins/shared/streams_app/kibana.jsonc @@ -10,26 +10,23 @@ "browser": true, "configPath": ["xpack", "streamsApp"], "requiredPlugins": [ - "streams", "data", + "datasetQuality", "dataViews", "discoverShared", - "unifiedSearch", - "share", - "savedObjectsTagging", - "navigation", "fieldsMetadata", - "datasetQuality", "licensing", "indexManagement", "ingestPipelines", + "navigation", + "observabilityAIAssistant", + "savedObjectsTagging", + "share", + "streams", + "unifiedSearch", ], "requiredBundles": [ "kibanaReact" ], - "optionalPlugins": [ - "observabilityAIAssistant" - ], - "extraPublicDirs": [] } } diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/index.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/index.tsx index d6886a7f3a8c6..2f0cf5b859040 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/index.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/index.tsx @@ -16,7 +16,7 @@ const StreamDetailEnrichmentContent = dynamic(() => ); interface StreamDetailEnrichmentProps { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; refreshDefinition: () => void; } @@ -24,8 +24,6 @@ export function StreamDetailEnrichment({ definition, refreshDefinition, }: StreamDetailEnrichmentProps) { - if (!definition) return null; - if (isRootStreamDefinition(definition.stream)) { return ; } diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/processors/grok/grok_ai_suggestions.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/processors/grok/grok_ai_suggestions.tsx index 6df68970463ef..3813405f6d737 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/processors/grok/grok_ai_suggestions.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_enrichment/processors/grok/grok_ai_suggestions.tsx @@ -24,11 +24,12 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useWatch, useFormContext } from 'react-hook-form'; -import { FlattenRecord, IngestStreamGetResponse } from '@kbn/streams-schema'; +import { FlattenRecord } from '@kbn/streams-schema'; import type { FindActionResult } from '@kbn/actions-plugin/server'; import { UseGenAIConnectorsResult } from '@kbn/observability-ai-assistant-plugin/public/hooks/use_genai_connectors'; import { useAbortController, useBoolean } from '@kbn/react-hooks'; import useObservable from 'react-use/lib/useObservable'; +import { isEmpty } from 'lodash'; import { css } from '@emotion/css'; import { useStreamDetail } from '../../../../../hooks/use_stream_detail'; import { useKibana } from '../../../../../hooks/use_kibana'; @@ -128,15 +129,16 @@ const RefreshButton = ({ ); }; -function useAiEnabled() { +function useAIFeatures() { const { dependencies, core } = useKibana(); const { observabilityAIAssistant, licensing } = dependencies.start; - const aiAssistantEnabled = observabilityAIAssistant?.service.isEnabled(); + const aiAssistantEnabled = observabilityAIAssistant.service.isEnabled(); - const genAiConnectors = observabilityAIAssistant?.useGenAIConnectors(); + const genAiConnectors = observabilityAIAssistant.useGenAIConnectors(); - const aiEnabled = aiAssistantEnabled && (genAiConnectors?.connectors || []).length > 0; + const aiEnabled = + aiAssistantEnabled && genAiConnectors.connectors && !isEmpty(genAiConnectors.connectors); const currentLicense = useObservable(licensing.license$); @@ -146,15 +148,16 @@ function useAiEnabled() { return { enabled: aiEnabled, couldBeEnabled, + genAiConnectors, }; } function InnerGrokAiSuggestions({ previewDocuments, - definition, + genAiConnectors, }: { previewDocuments: FlattenRecord[]; - definition: IngestStreamGetResponse; + genAiConnectors: UseGenAIConnectorsResult; }) { const { dependencies, @@ -162,13 +165,12 @@ function InnerGrokAiSuggestions({ } = useKibana(); const { streams: { streamsRepositoryClient }, - observabilityAIAssistant, } = dependencies.start; + const { definition } = useStreamDetail(); const fieldValue = useWatch({ name: 'field' }); const form = useFormContext(); - const genAiConnectors = observabilityAIAssistant?.useGenAIConnectors(); const currentConnector = genAiConnectors?.selectedConnector; const [isLoadingSuggestions, setSuggestionsLoading] = useState(false); @@ -387,8 +389,7 @@ export function GrokAiSuggestions() { const { core: { http }, } = useKibana(); - const { enabled: isAiEnabled, couldBeEnabled } = useAiEnabled(); - const { definition } = useStreamDetail(); + const { enabled: isAiEnabled, couldBeEnabled, genAiConnectors } = useAIFeatures(); const previewDocuments = useSimulatorSelector((snapshot) => selectPreviewDocuments(snapshot.context) ); @@ -412,18 +413,18 @@ export function GrokAiSuggestions() { > {i18n.translate( 'xpack.streams.streamDetailView.managementTab.enrichment.processorFlyout.aiAssistantNotEnabled', - { - defaultMessage: 'Enable AI Assistant features', - } + { defaultMessage: 'Enable AI Assistant features' } )} ); } - if (!isAiEnabled || !definition) { + if (!isAiEnabled) { return null; } - return ; + return ( + + ); } diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_data_stream_stats.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_data_stream_stats.tsx index e82d370f6a41d..5b05a1d9d216a 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_data_stream_stats.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_data_stream_stats.tsx @@ -16,16 +16,12 @@ export type DataStreamStats = DataStreamStatServiceResponse['dataStreamsStats'][ bytesPerDay: number; }; -export const useDataStreamStats = ({ definition }: { definition?: IngestStreamGetResponse }) => { +export const useDataStreamStats = ({ definition }: { definition: IngestStreamGetResponse }) => { const { services: { dataStreamsClient }, } = useKibana(); const statsFetch = useStreamsAppFetch(async () => { - if (!definition) { - return; - } - const client = await dataStreamsClient; const { dataStreamsStats: [dsStats], diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_ingestion_rate.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_ingestion_rate.tsx index 05dd9a6b6ce3d..3e7c1b978328b 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_ingestion_rate.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/hooks/use_ingestion_rate.tsx @@ -47,7 +47,7 @@ export const useIngestionRate = ({ stats, timeRange, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; stats?: DataStreamStats; timeRange: TimeRange; }) => { @@ -60,7 +60,7 @@ export const useIngestionRate = ({ const ingestionRateFetch = useStreamsAppFetch( async ({ signal }) => { - if (!definition || !stats) { + if (!stats) { return; } @@ -146,7 +146,7 @@ export const useIngestionRatePerTier = ({ stats, timeRange, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; stats?: DataStreamStats; timeRange: TimeRange; }) => { @@ -164,7 +164,7 @@ export const useIngestionRatePerTier = ({ const ingestionRateFetch = useStreamsAppFetch( async ({ signal }) => { - if (!definition || !stats) { + if (!stats) { return; } diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ilm_summary.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ilm_summary.tsx index ae45e44269261..0906ed7fe4b3d 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ilm_summary.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ilm_summary.tsx @@ -55,8 +55,6 @@ export function IlmSummary({ const { value, loading, error } = useStreamsAppFetch( ({ signal }) => { - if (!definition) return; - return streamsRepositoryClient.fetch('GET /internal/streams/{name}/lifecycle/_stats', { params: { path: { name: definition.stream.name } }, signal, diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/index.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/index.tsx index 89113c8cb562e..8f2d774d4d8a9 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/index.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/index.tsx @@ -36,15 +36,13 @@ function useLifecycleState({ definition, isServerless, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; isServerless: boolean; }) { const [updateInProgress, setUpdateInProgress] = useState(false); const [openEditModal, setOpenEditModal] = useState('none'); const lifecycleActions = useMemo(() => { - if (!definition) return []; - const actions: Array<{ name: string; action: LifecycleEditAction }> = []; const isWired = isWiredStreamGetResponse(definition); const isUnwired = isUnwiredStreamGetResponse(definition); @@ -93,7 +91,7 @@ export function StreamDetailLifecycle({ definition, refreshDefinition, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; refreshDefinition: () => void; }) { const { @@ -124,10 +122,6 @@ export function StreamDetailLifecycle({ const { signal } = useAbortController(); - if (!definition) { - return null; - } - const ilmLocator = share.url.locators.get(ILM_LOCATOR_ID); const getIlmPolicies = () => diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ingestion_rate.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ingestion_rate.tsx index 7a4fb7a476948..d36dec649b17c 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ingestion_rate.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_lifecycle/ingestion_rate.tsx @@ -42,7 +42,7 @@ export function IngestionRate({ isLoadingStats, refreshStats, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; stats?: DataStreamStats; isLoadingStats: boolean; refreshStats: () => void; @@ -100,7 +100,7 @@ export function IngestionRate({ direction="column" gutterSize="xs" > - {!definition ? null : isIlmLifecycle(definition?.effective_lifecycle) ? ( + {isIlmLifecycle(definition.effective_lifecycle) ? ( ) : ( <> @@ -191,7 +191,7 @@ function ChartBarSeries({ timeRange, isLoadingStats, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; stats?: DataStreamStats; timeRange: TimeRange; isLoadingStats: boolean; @@ -206,7 +206,7 @@ function ChartBarSeries({ return ingestionRateError ? ( 'Failed to load ingestion rate' - ) : !definition || isLoadingStats || isLoadingIngestionRate || !ingestionRate ? ( + ) : isLoadingStats || isLoadingIngestionRate || !ingestionRate ? ( ) : ( <> diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/index.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/index.tsx index 42336d0955cb4..5ec4ad3451229 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/index.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/index.tsx @@ -13,13 +13,9 @@ export function StreamDetailManagement({ definition, refreshDefinition, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; refreshDefinition: () => void; }) { - if (!definition) { - return null; - } - if (isWiredStreamGetResponse(definition)) { return ( diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/wired.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/wired.tsx index 5793bfb07b255..f99d805d8ade4 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/wired.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_management/wired.tsx @@ -25,7 +25,7 @@ export function WiredStreamDetailManagement({ definition, refreshDefinition, }: { - definition?: WiredStreamGetResponse; + definition: WiredStreamGetResponse; refreshDefinition: () => void; }) { const { diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/hooks/routing_state.ts b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/hooks/routing_state.ts index 0a110a73eedf4..829a868568578 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/hooks/routing_state.ts +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/hooks/routing_state.ts @@ -20,7 +20,7 @@ export function useRoutingState({ definition, toasts, }: { - definition?: WiredStreamGetResponse; + definition: WiredStreamGetResponse; toasts: IToasts; }) { const [lastDisplayedToast, setLastDisplayedToast] = React.useState(); @@ -40,14 +40,14 @@ export function useRoutingState({ // Child streams: either represents the child streams as they are, or the new order from drag and drop. const [childStreams, setChildStreams] = React.useState< WiredStreamGetResponse['stream']['ingest']['wired']['routing'] - >(definition?.stream.ingest.wired.routing ?? []); + >(definition.stream.ingest.wired.routing ?? []); useEffect(() => { - setChildStreams(definition?.stream.ingest.wired.routing ?? []); + setChildStreams(definition.stream.ingest.wired.routing ?? []); }, [definition]); // Note: just uses reference equality to check if the order has changed as onChildStreamReorder will create a new array. - const hasChildStreamsOrderChanged = childStreams !== definition?.stream.ingest.wired.routing; + const hasChildStreamsOrderChanged = childStreams !== definition.stream.ingest.wired.routing; // Child stream currently being dragged const [draggingChildStream, setDraggingChildStream] = React.useState(); @@ -73,8 +73,8 @@ export function useRoutingState({ const cancelChanges = useCallback(() => { setChildUnderEdit(undefined); - setChildStreams(definition?.stream.ingest.wired.routing ?? []); - }, [definition?.stream.ingest.wired.routing]); + setChildStreams(definition.stream.ingest.wired.routing); + }, [definition.stream.ingest.wired.routing]); const debouncedChildUnderEdit = useDebounced(childUnderEdit, 300); diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/index.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/index.tsx index e330b9ff21d32..ae6cdd80a5aea 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/index.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_routing/index.tsx @@ -27,7 +27,7 @@ export function StreamDetailRouting({ definition, refreshDefinition, }: { - definition?: WiredStreamGetResponse; + definition: WiredStreamGetResponse; refreshDefinition: () => void; }) { const { appParams, core } = useKibana(); @@ -61,10 +61,6 @@ export function StreamDetailRouting({ openConfirm: core.overlays.openConfirm, }); - if (!definition) { - return null; - } - const closeModal = () => routingAppState.setShowDeleteModal(false); return ( diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_schema_editor/index.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_schema_editor/index.tsx index 8a13a0fde8a16..1ae584fec92e3 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_schema_editor/index.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/data_management/stream_detail_schema_editor/index.tsx @@ -11,16 +11,11 @@ import { SchemaEditor } from '../schema_editor'; import { useSchemaFields } from '../schema_editor/hooks/use_schema_fields'; interface SchemaEditorProps { - definition?: WiredStreamGetResponse; + definition: WiredStreamGetResponse; refreshDefinition: () => void; } -export function StreamDetailSchemaEditor(props: SchemaEditorProps) { - if (!props.definition) return null; - return ; -} - -const Content = ({ definition, refreshDefinition }: Required) => { +export const StreamDetailSchemaEditor = ({ definition, refreshDefinition }: SchemaEditorProps) => { const { loading } = useStreamDetail(); const { fields, isLoadingUnmappedFields, refreshFields, unmapField, updateField } = diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_dashboards_view/index.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_dashboards_view/index.tsx index bd72877a70657..1aceaeefa6e66 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_dashboards_view/index.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_dashboards_view/index.tsx @@ -17,7 +17,7 @@ import { useDashboardsFetch } from '../../hooks/use_dashboards_fetch'; export function StreamDetailDashboardsView({ definition, }: { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; }) { const [query, setQuery] = useState(''); diff --git a/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_overview/stream_detail_overview.tsx b/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_overview/stream_detail_overview.tsx index a8cd597ea0482..bd373e2aa53e6 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_overview/stream_detail_overview.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/components/stream_detail_overview/stream_detail_overview.tsx @@ -23,7 +23,7 @@ import { StreamStatsPanel } from './components/stream_stats_panel'; import { StreamChartPanel } from './components/stream_chart_panel'; import { TabsPanel } from './components/tabs_panel'; -export function StreamDetailOverview({ definition }: { definition?: IngestStreamGetResponse }) { +export function StreamDetailOverview({ definition }: { definition: IngestStreamGetResponse }) { const { dependencies: { start: { diff --git a/x-pack/platform/plugins/shared/streams_app/public/hooks/use_stream_detail.tsx b/x-pack/platform/plugins/shared/streams_app/public/hooks/use_stream_detail.tsx index 2c889da6e6de7..8bdfe21dcd280 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/hooks/use_stream_detail.tsx +++ b/x-pack/platform/plugins/shared/streams_app/public/hooks/use_stream_detail.tsx @@ -12,6 +12,7 @@ import { isWiredStreamGetResponse, isUnwiredStreamGetResponse, } from '@kbn/streams-schema'; +import { EuiFlexGroup, EuiLoadingSpinner } from '@elastic/eui'; import { useStreamsAppFetch } from './use_streams_app_fetch'; export interface StreamDetailContextProviderProps { @@ -20,7 +21,7 @@ export interface StreamDetailContextProviderProps { } export interface StreamDetailContextValue { - definition?: IngestStreamGetResponse; + definition: IngestStreamGetResponse; loading: boolean; refresh: () => void; } @@ -59,10 +60,24 @@ export function StreamDetailContextProvider({ ); const context = React.useMemo( - () => ({ definition, loading, refresh }), + // useMemo cannot be used conditionally after the definition narrowing, the assertion is to narrow correctly the context value + () => ({ definition, loading, refresh } as StreamDetailContextValue), [definition, loading, refresh] ); + // Display loading spinner for first data-fetching only to have SWR-like behaviour + if (!definition && loading) { + return ( + + + + ); + } + + if (!definition) { + return null; + } + return {children}; } diff --git a/x-pack/platform/plugins/shared/streams_app/public/types.ts b/x-pack/platform/plugins/shared/streams_app/public/types.ts index 94688679a8bab..5b19784538044 100644 --- a/x-pack/platform/plugins/shared/streams_app/public/types.ts +++ b/x-pack/platform/plugins/shared/streams_app/public/types.ts @@ -39,29 +39,29 @@ export interface StreamsApplicationProps { export type StreamsApplicationComponentType = React.FC; export interface StreamsAppSetupDependencies { - streams: StreamsPluginSetup; data: DataPublicPluginSetup; dataViews: DataViewsPublicPluginSetup; discoverShared: DiscoverSharedPublicSetup; - unifiedSearch: {}; + observabilityAIAssistant: ObservabilityAIAssistantPublicSetup; share: SharePublicSetup; - observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup; + streams: StreamsPluginSetup; + unifiedSearch: {}; } export interface StreamsAppStartDependencies { - streams: StreamsPluginStart; data: DataPublicPluginStart; dataViews: DataViewsPublicPluginStart; - unifiedSearch: UnifiedSearchPublicPluginStart; - share: SharePublicStart; - savedObjectsTagging: SavedObjectTaggingPluginStart; - navigation: NavigationPublicStart; - fieldsMetadata: FieldsMetadataPublicStart; discoverShared: DiscoverSharedPublicStart; - observabilityAIAssistant?: ObservabilityAIAssistantPublicStart; + fieldsMetadata: FieldsMetadataPublicStart; licensing: LicensingPluginStart; indexManagement: IndexManagementPluginStart; ingestPipelines: IngestPipelinesPluginStart; + navigation: NavigationPublicStart; + observabilityAIAssistant: ObservabilityAIAssistantPublicStart; + savedObjectsTagging: SavedObjectTaggingPluginStart; + share: SharePublicStart; + streams: StreamsPluginStart; + unifiedSearch: UnifiedSearchPublicPluginStart; } export interface StreamsAppPublicSetup {}