@@ -14,6 +14,10 @@ import { useSearch, SearchContextValue } from '../utils/use_search';
1414
1515const SearchContext = React . createContext < SearchContextValue > ( { } as SearchContextValue ) ;
1616
17+ // NOOP fallback used when the contextProvider plugin is not available
18+ // (e.g. AI features disabled). Keeps the hook call unconditional.
19+ const NOOP_PAGE_CONTEXT_HOOK = ( _options ?: any ) : string => '' ;
20+
1721// eslint-disable-next-line import/no-default-export
1822export default function DiscoverContext ( { children } : React . PropsWithChildren < ViewProps > ) {
1923 const { services : deServices } = useOpenSearchDashboards < DataExplorerServices > ( ) ;
@@ -23,6 +27,24 @@ export default function DiscoverContext({ children }: React.PropsWithChildren<Vi
2327 ...services ,
2428 } ) ;
2529
30+ // Register page context so the AI chatbot is aware of the current query,
31+ // language, dataset and time range in classic Discover. Classic Discover
32+ // stores the query one level deeper under `_q.query` (vs `_q` in Explore).
33+ const usePageContext = services . contextProvider ?. hooks ?. usePageContext || NOOP_PAGE_CONTEXT_HOOK ;
34+ usePageContext ( {
35+ description : 'Discover application page context' ,
36+ convert : ( urlState : any ) => ( {
37+ appId : 'discover' ,
38+ timeRange : urlState ?. _g ?. time ,
39+ query : {
40+ query : urlState ?. _q ?. query ?. query || '' ,
41+ language : urlState ?. _q ?. query ?. language || 'kuery' ,
42+ } ,
43+ dataset : urlState ?. _q ?. query ?. dataset ,
44+ } ) ,
45+ categories : [ 'page' , 'static' ] ,
46+ } ) ;
47+
2648 return (
2749 < OpenSearchDashboardsContextProvider services = { services } >
2850 < SearchContext . Provider value = { searchParams } > { children } </ SearchContext . Provider >
0 commit comments