diff --git a/package-lock.json b/package-lock.json index f165e509ea6..b5fee62c049 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24755,15 +24755,6 @@ "node": ">=0.4.x" } }, - "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -46761,8 +46752,9 @@ "@mongodb-js/atlas-service": "^0.56.0", "@mongodb-js/compass-app-registry": "^9.4.20", "@mongodb-js/compass-components": "^1.49.0", + "@mongodb-js/compass-logging": "^1.7.12", "@mongodb-js/connection-info": "^0.17.1", - "ai": "^5.0.5", + "ai": "^5.0.26", "compass-preferences-model": "^2.51.0", "mongodb-connection-string-url": "^3.0.1", "react": "^17.0.2", @@ -46794,13 +46786,30 @@ } }, "packages/compass-assistant/node_modules/@ai-sdk/gateway": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.4.tgz", - "integrity": "sha512-1roLdgMbFU3Nr4MC97/te7w6OqxsWBkDUkpbCcvxF3jz/ku91WVaJldn/PKU8feMKNyI5W9wnqhbjb1BqbExOQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.15.tgz", + "integrity": "sha512-xySXoQ29+KbGuGfmDnABx+O6vc7Gj7qugmj1kGpn0rW0rQNn6UKUuvscKMzWyv1Uv05GyC1vqHq8ZhEOLfXscQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.1" + "@ai-sdk/provider-utils": "3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "packages/compass-assistant/node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.7.tgz", + "integrity": "sha512-o3BS5/t8KnBL3ubP8k3w77AByOypLm+pkIL/DCw0qKkhDbvhCy+L3hRTGPikpdb8WHcylAeKsjgwOxhj4cqTUA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" }, "engines": { "node": ">=18" @@ -46885,14 +46894,14 @@ } }, "packages/compass-assistant/node_modules/ai": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.10.tgz", - "integrity": "sha512-oPvaifsnHZzT3I07qI9jgWDOGpXDAFSXJ54rgpeHSq6qKQlQ3vwaCgQz861wb+5iJ/kk+B/qm3i5Yfghc/+XSw==", + "version": "5.0.26", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.26.tgz", + "integrity": "sha512-bGNtG+nYQ2U+5mzuLbxIg9WxGQJ2u5jv2gYgP8C+CJ1YI4qqIjvjOgGEZWzvNet8jiOGIlqstsht9aQefKzmBw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "1.0.4", + "@ai-sdk/gateway": "1.0.15", "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.1", + "@ai-sdk/provider-utils": "3.0.7", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -46902,6 +46911,32 @@ "zod": "^3.25.76 || ^4" } }, + "packages/compass-assistant/node_modules/ai/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.7.tgz", + "integrity": "sha512-o3BS5/t8KnBL3ubP8k3w77AByOypLm+pkIL/DCw0qKkhDbvhCy+L3hRTGPikpdb8WHcylAeKsjgwOxhj4cqTUA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "packages/compass-assistant/node_modules/eventsource-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", + "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "packages/compass-assistant/node_modules/just-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", @@ -60037,6 +60072,7 @@ "@mongodb-js/atlas-service": "^0.56.0", "@mongodb-js/compass-app-registry": "^9.4.20", "@mongodb-js/compass-components": "^1.49.0", + "@mongodb-js/compass-logging": "^1.7.12", "@mongodb-js/connection-info": "^0.17.1", "@mongodb-js/eslint-config-compass": "^1.4.7", "@mongodb-js/mocha-config-compass": "^1.7.0", @@ -60049,7 +60085,7 @@ "@types/react": "^17.0.5", "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", - "ai": "^5.0.5", + "ai": "^5.0.26", "autoevals": "^0.0.130", "braintrust": "^0.2.4", "chai": "^4.3.6", @@ -60068,12 +60104,24 @@ }, "dependencies": { "@ai-sdk/gateway": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.4.tgz", - "integrity": "sha512-1roLdgMbFU3Nr4MC97/te7w6OqxsWBkDUkpbCcvxF3jz/ku91WVaJldn/PKU8feMKNyI5W9wnqhbjb1BqbExOQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.15.tgz", + "integrity": "sha512-xySXoQ29+KbGuGfmDnABx+O6vc7Gj7qugmj1kGpn0rW0rQNn6UKUuvscKMzWyv1Uv05GyC1vqHq8ZhEOLfXscQ==", "requires": { "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.1" + "@ai-sdk/provider-utils": "3.0.7" + }, + "dependencies": { + "@ai-sdk/provider-utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.7.tgz", + "integrity": "sha512-o3BS5/t8KnBL3ubP8k3w77AByOypLm+pkIL/DCw0qKkhDbvhCy+L3hRTGPikpdb8WHcylAeKsjgwOxhj4cqTUA==", + "requires": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + } + } } }, "@ai-sdk/openai": { @@ -60133,16 +60181,33 @@ } }, "ai": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.10.tgz", - "integrity": "sha512-oPvaifsnHZzT3I07qI9jgWDOGpXDAFSXJ54rgpeHSq6qKQlQ3vwaCgQz861wb+5iJ/kk+B/qm3i5Yfghc/+XSw==", + "version": "5.0.26", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.26.tgz", + "integrity": "sha512-bGNtG+nYQ2U+5mzuLbxIg9WxGQJ2u5jv2gYgP8C+CJ1YI4qqIjvjOgGEZWzvNet8jiOGIlqstsht9aQefKzmBw==", "requires": { - "@ai-sdk/gateway": "1.0.4", + "@ai-sdk/gateway": "1.0.15", "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.1", + "@ai-sdk/provider-utils": "3.0.7", "@opentelemetry/api": "1.9.0" + }, + "dependencies": { + "@ai-sdk/provider-utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.7.tgz", + "integrity": "sha512-o3BS5/t8KnBL3ubP8k3w77AByOypLm+pkIL/DCw0qKkhDbvhCy+L3hRTGPikpdb8WHcylAeKsjgwOxhj4cqTUA==", + "requires": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + } + } } }, + "eventsource-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", + "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==" + }, "just-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", @@ -76724,11 +76789,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" }, - "eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==" - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", diff --git a/packages/compass-assistant/package.json b/packages/compass-assistant/package.json index 44c1c9fe9eb..81f317e653b 100644 --- a/packages/compass-assistant/package.json +++ b/packages/compass-assistant/package.json @@ -54,8 +54,9 @@ "@mongodb-js/compass-app-registry": "^9.4.20", "@mongodb-js/compass-components": "^1.49.0", "@mongodb-js/connection-info": "^0.17.1", + "@mongodb-js/compass-logging": "^1.7.12", "mongodb-connection-string-url": "^3.0.1", - "ai": "^5.0.5", + "ai": "^5.0.26", "compass-preferences-model": "^2.51.0", "react": "^17.0.2", "throttleit": "^2.1.0", diff --git a/packages/compass-assistant/src/@ai-sdk/react/use-chat.ts b/packages/compass-assistant/src/@ai-sdk/react/use-chat.ts index 6dfb36fda40..486ac1064f0 100644 --- a/packages/compass-assistant/src/@ai-sdk/react/use-chat.ts +++ b/packages/compass-assistant/src/@ai-sdk/react/use-chat.ts @@ -43,6 +43,7 @@ export type UseChatHelpers = { | 'addToolResult' | 'status' | 'messages' + | 'clearError' >; export type UseChatOptions = @@ -116,6 +117,7 @@ export function useChat({ setMessages, sendMessage: chatRef.current.sendMessage, regenerate: chatRef.current.regenerate, + clearError: chatRef.current.clearError, stop: chatRef.current.stop, error, resumeStream: chatRef.current.resumeStream, diff --git a/packages/compass-assistant/src/assistant-chat.tsx b/packages/compass-assistant/src/assistant-chat.tsx index 5f1a04ac201..78198e16ece 100644 --- a/packages/compass-assistant/src/assistant-chat.tsx +++ b/packages/compass-assistant/src/assistant-chat.tsx @@ -10,6 +10,7 @@ import { LgChatInputBar, spacing, css, + Banner, } from '@mongodb-js/compass-components'; const { ChatWindow } = LgChatChatWindow; @@ -36,10 +37,19 @@ const chatWindowFixesStyles = css({ height: '100%', }); +function makeErrorMessage(message: string) { + message = message || 'An error occurred'; + return `${message}. Try clearing the chat if the error persists.`; +} + +const errorBannerWrapperStyles = css({ + margin: spacing[400], +}); + export const AssistantChat: React.FunctionComponent = ({ chat, }) => { - const { messages, sendMessage, status } = useChat({ + const { messages, sendMessage, status, error, clearError } = useChat({ chat, }); @@ -94,6 +104,13 @@ export const AssistantChat: React.FunctionComponent = ({ /> )} + {error && ( +
+ + {makeErrorMessage(error.message)} + +
+ )} {children}; }, - activate: (initialProps, { atlasService }) => { + activate: (initialProps, { atlasService, logger }) => { const chat = new Chat({ transport: new DocsProviderTransport({ baseUrl: atlasService.assistantApiEndpoint(), }), + onError: (err: any) => { + logger.log.error( + logger.mongoLogId(1_001_000_370), + 'Assistant', + 'Failed to send a message', + { err } + ); + }, }); return { store: { state: { chat } }, @@ -165,5 +174,6 @@ export const CompassAssistantProvider = registerCompassPlugin( }, { atlasService: atlasServiceLocator, + logger: createLoggerLocator('COMPASS-ASSISTANT'), } );