Skip to content

Commit 18d8355

Browse files
[9.0][Security Assistant] Add space id provider (#225033)
## Summary #224127 Steps to reproduce: ([env](https://p.elstc.co/paste/dCC00dnn#LuamGjJXtPsgm8c0vixEsUsEifVy6RT21CsTv17YpNh)) 1. Visit app/management/kibana/securityAiAssistantManagement?tab=knowledge_base 2. Observe that the knowledge base is not showed due to a client side error: <img width="2557" alt="Screenshot 2025-06-24 at 09 56 13" src="https://github.com/user-attachments/assets/e69673cb-5f5b-4a8a-a729-05c82d48f9e1" /> Expected: https://www.elastic.co/docs/solutions/security/ai/ai-assistant-knowledge-base#_option_2_enable_knowledge_base_from_the_security_ai_settings <img width="2558" alt="Screenshot 2025-06-24 at 11 15 23" src="https://github.com/user-attachments/assets/2b6e2614-038d-43b3-b18a-4554cba4ccce" /> ### Checklist Check the PR satisfies following conditions. Reviewers should verify this PR satisfies this list as well. - [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: kibanamachine <[email protected]>
1 parent d46be1a commit 18d8355

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

x-pack/solutions/security/plugins/security_solution/public/assistant/stack_management/management_settings.test.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
import { useKibana } from '../../common/lib/kibana';
1919
import { useConversation } from '@kbn/elastic-assistant/impl/assistant/use_conversation';
2020
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
21+
import { useSpaceId } from '../../common/hooks/use_space_id';
2122

2223
// Mock the necessary hooks and components
2324
jest.mock('@kbn/elastic-assistant', () => ({
@@ -35,11 +36,15 @@ jest.mock('@kbn/elastic-assistant/impl/assistant/use_conversation', () => ({
3536
jest.mock('../../common/lib/kibana', () => ({
3637
useKibana: jest.fn(),
3738
}));
39+
jest.mock('../../common/hooks/use_space_id', () => ({
40+
useSpaceId: jest.fn(),
41+
}));
3842

3943
const useAssistantContextMock = useAssistantContext as jest.Mock;
4044
const useFetchCurrentUserConversationsMock = useFetchCurrentUserConversations as jest.Mock;
4145
const useKibanaMock = useKibana as jest.Mock;
4246
const useConversationMock = useConversation as jest.Mock;
47+
const useSpaceIdMock = useSpaceId as jest.Mock;
4348

4449
describe('ManagementSettings', () => {
4550
const queryClient = new QueryClient();
@@ -55,9 +60,11 @@ describe('ManagementSettings', () => {
5560
const renderComponent = ({
5661
isAssistantEnabled = true,
5762
conversations,
63+
spaceId,
5864
}: {
5965
isAssistantEnabled?: boolean;
6066
conversations: Record<string, Conversation>;
67+
spaceId?: string;
6168
}) => {
6269
useAssistantContextMock.mockReturnValue({
6370
baseConversations,
@@ -101,6 +108,8 @@ describe('ManagementSettings', () => {
101108
getDefaultConversation,
102109
});
103110

111+
useSpaceIdMock.mockReturnValue(spaceId);
112+
104113
return render(
105114
<MemoryRouter>
106115
<QueryClientProvider client={queryClient}>
@@ -117,14 +126,23 @@ describe('ManagementSettings', () => {
117126
it('navigates to home if securityAIAssistant is disabled', () => {
118127
renderComponent({
119128
conversations: mockConversations,
129+
spaceId: 'default',
120130
});
121131
expect(navigateToApp).toHaveBeenCalledWith('home');
122132
});
123133

124-
it('renders AssistantSettingsManagement when conversations are available and securityAIAssistant is enabled', () => {
134+
it('renders AssistantSettingsManagement when spaceId, conversations are available and securityAIAssistant is enabled', () => {
125135
renderComponent({
126136
conversations: mockConversations,
137+
spaceId: 'default',
127138
});
128139
expect(screen.getByTestId('AssistantSettingsManagement')).toBeInTheDocument();
129140
});
141+
142+
it('does not render AssistantSettingsManagement when spaceId is not available', () => {
143+
renderComponent({
144+
conversations: mockConversations,
145+
});
146+
expect(screen.queryByTestId('AssistantSettingsManagement')).not.toBeInTheDocument();
147+
});
130148
});

x-pack/solutions/security/plugins/security_solution/public/assistant/stack_management/management_settings.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ import {
1616
useFetchCurrentUserConversations,
1717
WELCOME_CONVERSATION_TITLE,
1818
} from '@kbn/elastic-assistant';
19+
import { AssistantSpaceIdProvider } from '@kbn/elastic-assistant/impl/assistant/use_space_aware_context';
1920
import { useConversation } from '@kbn/elastic-assistant/impl/assistant/use_conversation';
2021
import type { FetchConversationsResponse } from '@kbn/elastic-assistant/impl/assistant/api';
2122
import { SECURITY_AI_SETTINGS } from '@kbn/elastic-assistant/impl/assistant/settings/translations';
2223
import { CONVERSATIONS_TAB } from '@kbn/elastic-assistant/impl/assistant/settings/const';
2324
import type { SettingsTabs } from '@kbn/elastic-assistant/impl/assistant/settings/types';
2425

2526
import { useKibana } from '../../common/lib/kibana';
27+
import { useSpaceId } from '../../common/hooks/use_space_id';
2628

2729
const defaultSelectedConversationId = WELCOME_CONVERSATION_TITLE;
2830

@@ -32,7 +34,7 @@ export const ManagementSettings = React.memo(() => {
3234
http,
3335
assistantAvailability: { isAssistantEnabled },
3436
} = useAssistantContext();
35-
37+
const spaceId = useSpaceId();
3638
const {
3739
application: {
3840
navigateToApp,
@@ -131,14 +133,16 @@ export const ManagementSettings = React.memo(() => {
131133
}
132134

133135
if (conversations) {
134-
return (
135-
<AssistantSettingsManagement
136-
selectedConversation={currentConversation}
137-
dataViews={dataViews}
138-
onTabChange={handleTabChange}
139-
currentTab={currentTab}
140-
/>
141-
);
136+
return spaceId ? (
137+
<AssistantSpaceIdProvider spaceId={spaceId}>
138+
<AssistantSettingsManagement
139+
selectedConversation={currentConversation}
140+
dataViews={dataViews}
141+
onTabChange={handleTabChange}
142+
currentTab={currentTab}
143+
/>
144+
</AssistantSpaceIdProvider>
145+
) : null;
142146
}
143147

144148
return <></>;

0 commit comments

Comments
 (0)