Skip to content

Commit 21b5d4a

Browse files
committed
feat(amazonq): expose 'Manage Subscriptions' action for builder id paid tier
1 parent 535b8e2 commit 21b5d4a

File tree

4 files changed

+72
-8
lines changed

4 files changed

+72
-8
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/resources/META-INF/plugin-codewhisperer.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,7 @@
139139
class="software.aws.toolkits.jetbrains.services.cwc.commands.codescan.actions.CodeScanCompleteAction" />
140140
</group>
141141

142+
<action id="q.manage.subscription"
143+
class="software.aws.toolkits.jetbrains.services.codewhisperer.actions.ManageSubscription"/>
142144
</actions>
143145
</idea-plugin>

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() {
5454

5555
override fun getChildren(e: AnActionEvent?) = e?.project?.let {
5656
val isPendingActiveProfile = QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(it)
57+
val actionManager = ActionManager.getInstance()
5758
buildList {
5859
if (!isPendingActiveProfile) {
5960
addAll(buildActionListForActiveProfileSelected(it, actionProvider))
@@ -64,15 +65,18 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() {
6465
addAll(buildActionListForConnectHelp(actionProvider))
6566

6667
add(Separator.create())
67-
add(CodeWhispererShowSettingsAction())
68-
(
69-
ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
70-
)?.takeIf { !it.isSono() }
71-
?.let { add(QSwitchProfilesAction()) }
72-
ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(CodeWhispererConnection.getInstance())?.let { c ->
73-
(c as? AwsBearerTokenConnection)?.let { connection ->
74-
add(SsoLogoutAction(connection))
68+
add(actionManager.getAction("codewhisperer.settings"))
69+
70+
val connection = ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
71+
72+
if (connection != null) {
73+
if (!connection.isSono()) {
74+
add(actionManager.getAction("codewhisperer.switchProfiles"))
75+
} else {
76+
add(actionManager.getAction("q.manage.subscription"))
7577
}
78+
79+
add(SsoLogoutAction(connection))
7680
}
7781
}.toTypedArray()
7882
}.orEmpty()

plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ amazonqInlineChat.popup.title=Enter Instructions for Q
99
amazonq.refresh.panel=Refresh Chat Session
1010
amazonq.title=Amazon Q
1111
amazonq.workspace.settings.open.prompt=Workspace index is now enabled. You can disable it from Amazon Q settings.
12+
action.q.manage.subscription.text=Manage Subscription
1213
action.q.profile.usage.text=You changed your profile
1314
action.q.profile.usage=You''re using the ''<b>{0}</b>'' profile for Amazon Q.
1415
action.q.switchProfiles.text=Change Profile
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.actions
5+
6+
import com.intellij.openapi.actionSystem.ActionUpdateThread
7+
import com.intellij.openapi.actionSystem.AnAction
8+
import com.intellij.openapi.actionSystem.AnActionEvent
9+
import com.intellij.openapi.progress.currentThreadCoroutineScope
10+
import com.intellij.openapi.project.DumbAware
11+
import kotlinx.coroutines.future.await
12+
import kotlinx.coroutines.launch
13+
import org.eclipse.lsp4j.ExecuteCommandParams
14+
import software.aws.toolkits.core.utils.error
15+
import software.aws.toolkits.core.utils.getLogger
16+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
17+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
18+
import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection
19+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
20+
import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
21+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
22+
23+
class ManageSubscription : AnAction(), DumbAware {
24+
override fun getActionUpdateThread() = ActionUpdateThread.BGT
25+
26+
override fun update(e: AnActionEvent) {
27+
val project = e.project
28+
// disable if user is IdC
29+
30+
if (project == null) {
31+
e.presentation.isEnabledAndVisible = false
32+
} else {
33+
e.presentation.isEnabledAndVisible = (ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection).isSono()
34+
}
35+
}
36+
37+
override fun actionPerformed(e: AnActionEvent) {
38+
val project = e.project ?: return
39+
currentThreadCoroutineScope().launch {
40+
AmazonQLspService.getInstance(project).execute { lsp ->
41+
lsp.workspaceService.executeCommand(
42+
ExecuteCommandParams().apply {
43+
this.command = "aws/chat/manageSubscription"
44+
}
45+
)
46+
}.handleAsync { _, ex ->
47+
if (ex != null) {
48+
LOG.error(ex) { "Failed aws/chat/manageSubscription" }
49+
}
50+
}.await()
51+
}
52+
}
53+
54+
companion object {
55+
private val LOG = getLogger<ManageSubscription>()
56+
}
57+
}

0 commit comments

Comments
 (0)