From 605f375579a089098ac7e1ee23e02414727d7cbc Mon Sep 17 00:00:00 2001 From: Lokesh Dogga Date: Tue, 22 Jul 2025 17:28:35 -0700 Subject: [PATCH 1/3] feat(amazonq): adding account details options for users --- .../META-INF/plugin-codewhisperer.xml | 2 + .../explorer/QStatusBarLoggedInActionGroup.kt | 1 + .../resources/AmazonQBundle.properties | 1 + .../amazonq/lsp/AmazonQLanguageClient.kt | 4 ++ .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 10 ++++ .../lsp/model/ExtendedClientMetadata.kt | 2 + .../lsp/model/aws/chat/FlareChatCommands.kt | 1 + .../codewhisperer/actions/AccountDetails.kt | 59 +++++++++++++++++++ 8 files changed, 80 insertions(+) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/AccountDetails.kt diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/resources/META-INF/plugin-codewhisperer.xml b/plugins/amazonq/codewhisperer/jetbrains-community/resources/META-INF/plugin-codewhisperer.xml index 24de37b55d9..d097e9c8bd8 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/resources/META-INF/plugin-codewhisperer.xml +++ b/plugins/amazonq/codewhisperer/jetbrains-community/resources/META-INF/plugin-codewhisperer.xml @@ -117,5 +117,7 @@ + diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt index 53f6fe82b2d..a587f495e59 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt @@ -69,6 +69,7 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() { if (connection != null) { if (!connection.isSono()) { add(actionManager.getAction("codewhisperer.switchProfiles")) + add(actionManager.getAction("q.account.details")) } else { add(actionManager.getAction("q.manage.subscription")) } diff --git a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties index e780cdb6154..2045d7ad16c 100644 --- a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties +++ b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties @@ -10,6 +10,7 @@ amazonq.refresh.panel=Refresh Chat Session amazonq.title=Amazon Q amazonq.workspace.settings.open.prompt=Workspace index is now enabled. You can disable it from Amazon Q settings. action.q.manage.subscription.text=Manage Q Developer Pro Subscription +action.q.account.details.text=Account Details action.q.profile.usage.text=You changed your profile action.q.profile.usage=You''re using the ''{0}'' profile for Amazon Q. action.q.switchProfiles.text=Change Profile diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt index e52d1e33296..6ff21c6dcba 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt @@ -31,6 +31,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowO import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SUBSCRIPTION_DETAILS import java.util.concurrent.CompletableFuture /** @@ -88,4 +89,7 @@ interface AmazonQLanguageClient : LanguageClient { @JsonNotification(CHAT_OPTIONS_UPDATE_NOTIFICATION) fun sendChatOptionsUpdate(params: LSPAny) + + @JsonNotification(CHAT_SUBSCRIPTION_DETAILS) + fun sendSubscriptionDetails(params: LSPAny) } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 4b105142484..35de046760a 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -55,6 +55,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_CONTEXT_COMMANDS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_PINNED_CONTEXT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SUBSCRIPTION_DETAILS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyFileParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD @@ -499,6 +500,15 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC ) } + override fun sendSubscriptionDetails(params: LSPAny) { + chatManager.notifyUi( + FlareUiMessage( + command = CHAT_SUBSCRIPTION_DETAILS, + params = params, + ) + ) + } + override fun sendPinnedContext(params: LSPAny) { // Send the active text file path with pinned context val editor = FileEditorManager.getInstance(project).selectedTextEditor diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt index 8168645d829..2405e7d4f6d 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt @@ -27,6 +27,7 @@ data class DeveloperProfiles( val pinnedContextEnabled: Boolean, val imageContextEnabled: Boolean, val reroute: Boolean, + val subscriptionDetails: Boolean, val workspaceFilePath: String?, ) @@ -70,6 +71,7 @@ fun createExtendedClientMetadata(project: Project): ExtendedClientMetadata { pinnedContextEnabled = true, imageContextEnabled = true, reroute = true, + subscriptionDetails = true, workspaceFilePath = project.workspaceFile?.path, ), window = WindowSettings( diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt index 9f5b87ae870..903b9abc950 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt @@ -35,6 +35,7 @@ const val CHAT_TAB_ADD = "aws/chat/tabAdd" const val CHAT_TAB_BAR_ACTIONS = "aws/chat/tabBarAction" const val CHAT_TAB_CHANGE = "aws/chat/tabChange" const val CHAT_TAB_REMOVE = "aws/chat/tabRemove" +const val CHAT_SUBSCRIPTION_DETAILS = "aws/chat/subscription/details" const val DID_COPY_FILE = "aws/didCopyFile" const val DID_WRITE_FILE = "aws/didWriteFile" diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/AccountDetails.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/AccountDetails.kt new file mode 100644 index 00000000000..e3f0becc2d0 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/AccountDetails.kt @@ -0,0 +1,59 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.codewhisperer.actions + +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.progress.currentThreadCoroutineScope +import com.intellij.openapi.project.DumbAware +import kotlinx.coroutines.future.await +import kotlinx.coroutines.launch +import org.eclipse.lsp4j.ExecuteCommandParams +import software.aws.toolkits.core.utils.error +import software.aws.toolkits.core.utils.getLogger +import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection +import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager +import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection +import software.aws.toolkits.jetbrains.core.credentials.sono.isSono +import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService + +class AccountDetails : AnAction(), DumbAware { + override fun getActionUpdateThread() = ActionUpdateThread.BGT + + override fun update(e: AnActionEvent) { + val project = e.project + if (project == null) { + e.presentation.isEnabledAndVisible = false + } else { + val connection = ToolkitConnectionManager.getInstance(project) + .activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection + + // Show for IDC users + e.presentation.isEnabledAndVisible = !connection.isSono() + } + } + + override fun actionPerformed(e: AnActionEvent) { + val project = e.project ?: return + currentThreadCoroutineScope().launch { + AmazonQLspService.getInstance(project).execute { lsp -> + lsp.workspaceService.executeCommand( + ExecuteCommandParams().apply { + this.command = SHOW_SUBSCRIPTION_COMMAND + } + ) + }.handleAsync { _, ex -> + if (ex != null) { + LOG.error(ex) { "Failed $SHOW_SUBSCRIPTION_COMMAND" } + } + }.await() + } + } + + companion object { + private val LOG = getLogger() + private const val SHOW_SUBSCRIPTION_COMMAND = "aws/chat/subscription/show" + } +} From b77ff2f5d831fa9f1a1b0cf07494ec31f017f0b1 Mon Sep 17 00:00:00 2001 From: Lokesh Dogga Date: Fri, 25 Jul 2025 11:35:35 -0700 Subject: [PATCH 2/3] Adding account details options for builderid and enterprise users --- .../codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt index a587f495e59..6df4d246d63 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt @@ -69,11 +69,10 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() { if (connection != null) { if (!connection.isSono()) { add(actionManager.getAction("codewhisperer.switchProfiles")) - add(actionManager.getAction("q.account.details")) } else { add(actionManager.getAction("q.manage.subscription")) } - + add(actionManager.getAction("q.account.details")) add(SsoLogoutAction(connection)) } }.toTypedArray() From ea7486528dd5f0a1c829655531c83942f67992a0 Mon Sep 17 00:00:00 2001 From: Lokesh Dogga Date: Fri, 25 Jul 2025 16:12:51 -0700 Subject: [PATCH 3/3] Fixing detekt --- .../jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt index 6ff21c6dcba..0f92932b426 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt @@ -14,6 +14,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_CONTEXT_COMMANDS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_PINNED_CONTEXT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SUBSCRIPTION_DETAILS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyFileParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_APPEND_FILE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_COPY_FILE @@ -31,7 +32,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowO import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SUBSCRIPTION_DETAILS import java.util.concurrent.CompletableFuture /**