Skip to content

Commit 115830e

Browse files
authored
chore(compass-assistant): warn about non-genuine hosts COMPASS-9675 (#7280)
1 parent 20515ba commit 115830e

13 files changed

+235
-38
lines changed

package-lock.json

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compass-assistant/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
"types": "./dist/index.d.ts",
3333
"scripts": {
3434
"bootstrap": "npm run compile",
35+
"clean": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\" || true",
36+
"precompile": "npm run clean",
3537
"compile": "tsc -p tsconfig.json",
3638
"typecheck": "tsc -p tsconfig-lint.json --noEmit",
3739
"eslint": "eslint-compass",
@@ -53,13 +55,13 @@
5355
"@mongodb-js/atlas-service": "^0.56.0",
5456
"@mongodb-js/compass-app-registry": "^9.4.20",
5557
"@mongodb-js/compass-components": "^1.49.0",
58+
"@mongodb-js/compass-generative-ai": "^0.51.0",
59+
"@mongodb-js/compass-logging": "^1.7.12",
5660
"@mongodb-js/compass-telemetry": "^1.14.0",
5761
"@mongodb-js/connection-info": "^0.17.1",
58-
"@mongodb-js/compass-logging": "^1.7.12",
59-
"@mongodb-js/compass-generative-ai": "^0.51.0",
60-
"mongodb-connection-string-url": "^3.0.1",
6162
"ai": "^5.0.26",
6263
"compass-preferences-model": "^2.51.0",
64+
"mongodb-connection-string-url": "^3.0.1",
6365
"react": "^17.0.2",
6466
"throttleit": "^2.1.0",
6567
"use-sync-external-store": "^1.5.0"

packages/compass-assistant/src/assistant-chat.spec.tsx

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import { AssistantChat } from './assistant-chat';
99
import { expect } from 'chai';
1010
import { createMockChat } from '../test/utils';
11+
import type { ConnectionInfo } from '@mongodb-js/connection-info';
1112
import {
1213
AssistantActionsContext,
1314
type AssistantMessage,
@@ -36,13 +37,14 @@ describe('AssistantChat', function () {
3637
function renderWithChat(
3738
messages: AssistantMessage[],
3839
{
40+
connections,
3941
status,
4042
}: {
43+
connections?: ConnectionInfo[];
4144
status?: 'submitted' | 'streaming';
4245
} = {}
4346
) {
4447
const chat = createMockChat({ messages, status });
45-
4648
// The chat component does not use chat.sendMessage() directly, it uses
4749
// ensureOptInAndSend() via the AssistantActionsContext.
4850
const ensureOptInAndSendStub = sinon
@@ -59,8 +61,11 @@ describe('AssistantChat', function () {
5961
};
6062
const result = render(
6163
<AssistantActionsContext.Provider value={assistantActionsContext as any}>
62-
<AssistantChat chat={chat} />
63-
</AssistantActionsContext.Provider>
64+
<AssistantChat chat={chat} hasNonGenuineConnections={false} />
65+
</AssistantActionsContext.Provider>,
66+
{
67+
connections,
68+
}
6469
);
6570
return {
6671
result,
@@ -180,8 +185,58 @@ describe('AssistantChat', function () {
180185
);
181186
});
182187

183-
it('calls ensureOptInAndSend when form is submitted', async function () {
184-
const { ensureOptInAndSendStub, result } = renderWithChat([]);
188+
describe('non-genuine MongoDB host handling', function () {
189+
it('shows warning message in chat when connected to non-genuine MongoDB', function () {
190+
const chat = createMockChat({ messages: [] });
191+
render(<AssistantChat chat={chat} hasNonGenuineConnections={true} />);
192+
193+
expect(chat.messages).to.have.length(1);
194+
expect(chat.messages[0].id).to.equal('non-genuine-warning');
195+
196+
const warningMessage = screen.getByText(
197+
/MongoDB Assistant will not provide accurate guidance for non-genuine hosts/
198+
);
199+
expect(warningMessage).to.exist;
200+
});
201+
202+
it('does not show warning message when all connections are genuine', function () {
203+
const chat = createMockChat({ messages: [] });
204+
render(<AssistantChat chat={chat} hasNonGenuineConnections={false} />, {
205+
connections: [],
206+
});
207+
208+
const warningMessage = screen.queryByText(
209+
/MongoDB Assistant will not provide accurate guidance for non-genuine hosts/
210+
);
211+
expect(warningMessage).to.not.exist;
212+
});
213+
214+
it('warning message is removed when all active connections are changed to genuine', async function () {
215+
const chat = createMockChat({ messages: [] });
216+
const { rerender } = render(
217+
<AssistantChat chat={chat} hasNonGenuineConnections={true} />,
218+
{}
219+
);
220+
221+
expect(
222+
screen.getByText(
223+
/MongoDB Assistant will not provide accurate guidance for non-genuine hosts/
224+
)
225+
).to.exist;
226+
227+
rerender(<AssistantChat chat={chat} hasNonGenuineConnections={false} />);
228+
229+
await waitFor(() => {
230+
const warningMessage = screen.queryByText(
231+
/MongoDB Assistant will not provide accurate guidance for non-genuine hosts/
232+
);
233+
expect(warningMessage).to.not.exist;
234+
});
235+
});
236+
});
237+
238+
it('calls sendMessage when form is submitted', async function () {
239+
const { result, ensureOptInAndSendStub } = renderWithChat([]);
185240
const { track } = result;
186241
const inputField = screen.getByPlaceholderText(
187242
'Ask MongoDB Assistant a question'

packages/compass-assistant/src/assistant-chat.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useContext } from 'react';
1+
import React, { useCallback, useEffect, useContext } from 'react';
22
import type { AssistantMessage } from './compass-assistant-provider';
33
import { AssistantActionsContext } from './compass-assistant-provider';
44
import type { Chat } from './@ai-sdk/react/chat-react';
@@ -20,6 +20,7 @@ import {
2020
Link,
2121
} from '@mongodb-js/compass-components';
2222
import { useTelemetry } from '@mongodb-js/compass-telemetry/provider';
23+
import { NON_GENUINE_WARNING_MESSAGE } from './preset-messages';
2324

2425
const { DisclaimerText } = LgChatChatDisclaimer;
2526
const { ChatWindow } = LgChatChatWindow;
@@ -32,6 +33,7 @@ const GEN_AI_FAQ_LINK = 'https://www.mongodb.com/docs/generative-ai-faq/';
3233

3334
interface AssistantChatProps {
3435
chat: Chat<AssistantMessage>;
36+
hasNonGenuineConnections: boolean;
3537
}
3638

3739
const assistantChatStyles = css({
@@ -127,11 +129,13 @@ const errorBannerWrapperStyles = css({
127129

128130
export const AssistantChat: React.FunctionComponent<AssistantChatProps> = ({
129131
chat,
132+
hasNonGenuineConnections,
130133
}) => {
131134
const track = useTelemetry();
132135
const darkMode = useDarkMode();
136+
133137
const { ensureOptInAndSend } = useContext(AssistantActionsContext);
134-
const { messages, status, error, clearError } = useChat({
138+
const { messages, status, error, clearError, setMessages } = useChat({
135139
chat,
136140
onError: (error) => {
137141
track('Assistant Response Failed', () => ({
@@ -140,6 +144,23 @@ export const AssistantChat: React.FunctionComponent<AssistantChatProps> = ({
140144
},
141145
});
142146

147+
useEffect(() => {
148+
const hasExistingNonGenuineWarning = chat.messages.some(
149+
(message) => message.id === 'non-genuine-warning'
150+
);
151+
if (hasNonGenuineConnections && !hasExistingNonGenuineWarning) {
152+
setMessages((messages) => {
153+
return [NON_GENUINE_WARNING_MESSAGE, ...messages];
154+
});
155+
} else if (hasExistingNonGenuineWarning && !hasNonGenuineConnections) {
156+
setMessages((messages) => {
157+
return messages.filter(
158+
(message) => message.id !== 'non-genuine-warning'
159+
);
160+
});
161+
}
162+
}, [hasNonGenuineConnections, chat, setMessages]);
163+
143164
// Transform AI SDK messages to LeafyGreen chat format and reverse the order of the messages
144165
// for displaying it correctly with flex-direction: column-reverse.
145166
const lgMessages = messages

packages/compass-assistant/src/compass-assistant-drawer.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ const assistantTitleTextStyles = css({
3333
*/
3434
export const CompassAssistantDrawer: React.FunctionComponent<{
3535
autoOpen?: boolean;
36-
}> = ({ autoOpen }) => {
36+
hasNonGenuineConnections?: boolean;
37+
}> = ({ autoOpen, hasNonGenuineConnections = false }) => {
3738
const chat = useContext(AssistantContext);
3839
const { clearChat } = useContext(AssistantActionsContext);
3940

@@ -88,7 +89,10 @@ export const CompassAssistantDrawer: React.FunctionComponent<{
8889
glyph="Sparkle"
8990
autoOpen={autoOpen}
9091
>
91-
<AssistantChat chat={chat} />
92+
<AssistantChat
93+
chat={chat}
94+
hasNonGenuineConnections={hasNonGenuineConnections}
95+
/>
9296
</DrawerSection>
9397
);
9498
};

0 commit comments

Comments
 (0)