diff --git a/package-lock.json b/package-lock.json index 84225f223d9..d3e866ff89e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15034,23 +15034,23 @@ } }, "node_modules/@aws/chat-client-ui-types": { - "version": "0.1.47", - "resolved": "https://registry.npmjs.org/@aws/chat-client-ui-types/-/chat-client-ui-types-0.1.47.tgz", - "integrity": "sha512-Pu6UnAImpweLMcAmhNdw/NrajB25Ymzp1Om1V9NEVQJRMO/KJCDiErmbOYTYBXvgNoR10kObqiL1P/Tk/Fpu3g==", + "version": "0.1.55", + "resolved": "https://registry.npmjs.org/@aws/chat-client-ui-types/-/chat-client-ui-types-0.1.55.tgz", + "integrity": "sha512-oATgl33TgOVZ/eBvA+V725km2VRqfuS4imtthSiS4r3Qfi2AlMkQDzhVgRvqdO9IAJ0yxSNY2Ep5iLji+bMxSg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes-types": "^0.1.41" + "@aws/language-server-runtimes-types": "^0.1.49" } }, "node_modules/@aws/language-server-runtimes": { - "version": "0.2.111", - "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.111.tgz", - "integrity": "sha512-eIHKzWkLTTb3qUCeT2nIrpP99dEv/OiUOcPB00MNCsOPWBBO/IoZhfGRNrE8+stgZMQkKLFH2ZYxn3ByB6OsCQ==", + "version": "0.2.113", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.113.tgz", + "integrity": "sha512-mIsf9N8AEB/JRybISswssmcYxecuOJRcuxFNGNGsJOMj9NLxWapncIke4VPKfxSo5yEwcbrPipNlDi9kdQtBQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes-types": "^0.1.47", + "@aws/language-server-runtimes-types": "^0.1.49", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/core": "^2.0.0", @@ -15077,9 +15077,9 @@ } }, "node_modules/@aws/language-server-runtimes-types": { - "version": "0.1.47", - "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes-types/-/language-server-runtimes-types-0.1.47.tgz", - "integrity": "sha512-l5dOdx/MR3SO0HYXkSL9fcR05f4Aw7qRMuASMdWOK93LOSZeANPVOGIWblRnoJejfYiPXcufCFyjLnGpATExag==", + "version": "0.1.49", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes-types/-/language-server-runtimes-types-0.1.49.tgz", + "integrity": "sha512-wGK3GTPzDWj831vKdQPB5gfuRwSgQuTkfHkOAVOV0s+hkZFGmFnkXwjPAAZYBi5tp53Y36bzwRFfLnOgNq+enA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -30062,9 +30062,9 @@ "devDependencies": { "@aws-sdk/types": "^3.13.1", "@aws/chat-client": "^0.1.4", - "@aws/chat-client-ui-types": "^0.1.47", - "@aws/language-server-runtimes": "^0.2.111", - "@aws/language-server-runtimes-types": "^0.1.47", + "@aws/chat-client-ui-types": "^0.1.55", + "@aws/language-server-runtimes": "^0.2.112", + "@aws/language-server-runtimes-types": "^0.1.49", "@cspotcode/source-map-support": "^0.8.1", "@sinonjs/fake-timers": "^10.0.2", "@types/adm-zip": "^0.4.34", diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 58161b6ffdb..342b737664b 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -388,20 +388,25 @@ "when": "view == aws.amazonq.AmazonQChatView", "group": "0_topAmazonQ@1" }, + { + "command": "aws.amazonq.accountDetails", + "when": "(view == aws.amazonq.AmazonQChatView) && aws.codewhisperer.connected", + "group": "1_amazonQ@1" + }, { "command": "aws.amazonq.selectRegionProfile", "when": "view == aws.amazonq.AmazonQChatView && aws.amazonq.connectedSsoIdc == true", - "group": "1_amazonQ@1" + "group": "1_amazonQ@2" }, { "command": "aws.amazonq.manageSubscription", "when": "(view == aws.amazonq.AmazonQChatView) && aws.codewhisperer.connected", - "group": "1_amazonQ@2" + "group": "1_amazonQ@3" }, { "command": "aws.amazonq.learnMore", "when": "view =~ /^aws\\.amazonq/", - "group": "1_amazonQ@3" + "group": "1_amazonQ@4" }, { "command": "aws.amazonq.signout", @@ -729,6 +734,11 @@ "title": "%AWS.amazonq.learnMore%", "category": "%AWS.amazonq.title%" }, + { + "command": "aws.amazonq.accountDetails", + "title": "%AWS.amazonq.accountDetails%", + "category": "%AWS.amazonq.title%" + }, { "command": "amazonq.dev.openMenu", "title": "Open Developer Menu", diff --git a/packages/amazonq/src/lsp/chat/activation.ts b/packages/amazonq/src/lsp/chat/activation.ts index 90a0adbc61f..a42f688b990 100644 --- a/packages/amazonq/src/lsp/chat/activation.ts +++ b/packages/amazonq/src/lsp/chat/activation.ts @@ -17,6 +17,7 @@ import { activate as registerLegacyChatListeners } from '../../app/chat/activati import { DefaultAmazonQAppInitContext } from 'aws-core-vscode/amazonq' import { AuthUtil, getSelectedCustomization } from 'aws-core-vscode/codewhisperer' import { pushConfigUpdate } from '../config' +import { SUBSCRIPTION_SHOW_COMMAND_METHOD } from '@aws/language-server-runtimes/server-interface' export async function activate(languageClient: LanguageClient, encryptionKey: Buffer, mynahUIPath: string) { const disposables = globals.context.subscriptions @@ -90,6 +91,22 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu getLogger('amazonqLsp').error('failed request: aws/chat/manageSubscription: %O', e) }) }), + /* + Forward the subscription details request to language server directly + This triggers the onShowSubscription() method in the language server + */ + Commands.register('aws.amazonq.accountDetails', () => { + getLogger('amazonqLsp').info( + `[VSCode Client]: Sending subscription details [${SUBSCRIPTION_SHOW_COMMAND_METHOD}] event notification` + ) + languageClient + .sendRequest('workspace/executeCommand', { + command: SUBSCRIPTION_SHOW_COMMAND_METHOD, + }) + .catch((e) => { + getLogger('amazonqLsp').error('Failed to send subscription details request: : %O', e) + }) + }), globals.logOutputChannel.onDidChangeLogLevel((logLevel) => { getLogger('amazonqLsp').info(`Local log level changed to ${logLevel}, notifying LSP`) void pushConfigUpdate(languageClient, { diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index a95b99b442c..c93035c1286 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -66,6 +66,8 @@ import { ShowOpenDialogParams, openFileDialogRequestType, OpenFileDialogResult, + subscriptionDetailsNotificationType, + subscriptionUpgradeNotificationType, } from '@aws/language-server-runtimes/protocol' import { v4 as uuidv4 } from 'uuid' import * as vscode from 'vscode' @@ -102,7 +104,7 @@ import { isValidResponseError } from './error' import { decryptResponse, encryptRequest } from '../encryption' import { getCursorState } from '../utils' import { focusAmazonQPanel } from './commands' -import { ChatMessage } from '@aws/language-server-runtimes/server-interface' +import { ChatMessage, SUBSCRIPTION_UPGRADE_NOTIFICATION_METHOD } from '@aws/language-server-runtimes/server-interface' import { CommentUtils } from 'aws-core-vscode/utils' export function registerActiveEditorChangeListener(languageClient: LanguageClient) { @@ -256,6 +258,18 @@ export function registerMessageListeners( } break } + case SUBSCRIPTION_UPGRADE_NOTIFICATION_METHOD: { + languageClient.info('[VSCode Client] Subscription upgrade clicked') + try { + // Forward the upgrade request to Flare + languageClient.sendNotification(subscriptionUpgradeNotificationType.method, message.params) + } catch (e) { + languageClient.error( + `[VSCode Client] Failed to send subscription upgrade notification: ${(e as Error).message}` + ) + } + break + } case DISCLAIMER_ACKNOWLEDGED: { void AmazonQPromptSettings.instance.update('amazonQChatDisclaimer', true) break @@ -704,6 +718,46 @@ export function registerMessageListeners( params: params, }) }) + + // Handle subscription details response from Flare + languageClient.onNotification(subscriptionDetailsNotificationType.method, (params) => { + languageClient.info(`[VSCode Client] Received subscription details: ${JSON.stringify(params)}`) + // Forward the subscription details to the Chat UI + void provider.webview?.postMessage({ + command: subscriptionDetailsNotificationType.method, + params: params, + }) + }) + // TODO: After implementing the "Upgrade" feature, test its functionality in the Account Details tab. + // Handle window/showDocument requests from Flare for subscription upgrade + languageClient.onRequest( + ShowDocumentRequest.method, + async (params: ShowDocumentParams): Promise> => { + try { + const uri = vscode.Uri.parse(params.uri) + + if (params.external) { + languageClient.info(`[VSCode Client] Opening external URL for subscription upgrade: ${params.uri}`) + // Open the URL in the external browser + await vscode.env.openExternal(uri) + + // Return success to indicate the URL was opened + return params + } + + // If not external, handle as a regular document + const doc = await vscode.workspace.openTextDocument(uri) + await vscode.window.showTextDocument(doc, { preview: false }) + return params + } catch (e) { + languageClient.error(`[VSCode Client] Failed to open subscription upgrade URL: ${(e as Error).message}`) + return new ResponseError( + LSPErrorCodes.RequestFailed, + `Failed to open subscription upgrade URL: ${(e as Error).message}` + ) + } + } + ) } function isServerEvent(command: string) { diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index fa89f5f2ba4..a5d250cfa61 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -179,6 +179,7 @@ export async function startLanguageServer( reroute: true, modelSelection: true, workspaceFilePath: vscode.workspace.workspaceFile?.fsPath, + subscriptionDetails: false, codeReviewInChat: false, }, window: { diff --git a/packages/core/package.json b/packages/core/package.json index d446a1bdf41..db1aeca393a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -470,9 +470,9 @@ "devDependencies": { "@aws-sdk/types": "^3.13.1", "@aws/chat-client": "^0.1.4", - "@aws/chat-client-ui-types": "^0.1.47", - "@aws/language-server-runtimes": "^0.2.111", - "@aws/language-server-runtimes-types": "^0.1.47", + "@aws/chat-client-ui-types": "^0.1.55", + "@aws/language-server-runtimes": "^0.2.112", + "@aws/language-server-runtimes-types": "^0.1.49", "@cspotcode/source-map-support": "^0.8.1", "@sinonjs/fake-timers": "^10.0.2", "@types/adm-zip": "^0.4.34", diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index 498a3583a00..8a82711da4b 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -354,6 +354,7 @@ "AWS.amazonq.security": "Code Issues", "AWS.amazonq.login": "Login", "AWS.amazonq.learnMore": "Learn More About Amazon Q", + "AWS.amazonq.accountDetails": "Account details", "AWS.amazonq.welcomeWalkthrough": "Welcome Walkthrough", "AWS.amazonq.codewhisperer.title": "Amazon Q", "AWS.amazonq.toggleCodeSuggestion": "Toggle Auto-Suggestions",