Skip to content

Commit d12b75a

Browse files
authored
feat(amazonq): builder id paid tier support (#5801)
1 parent 7228af1 commit d12b75a

File tree

7 files changed

+83
-16
lines changed

7 files changed

+83
-16
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Support for Amazon Q Builder ID paid tier"
4+
}

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 & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,12 @@ import com.intellij.openapi.project.Project
1212
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
1313
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1414
import software.aws.toolkits.jetbrains.core.credentials.actions.SsoLogoutAction
15-
import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection
1615
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1716
import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
18-
import software.aws.toolkits.jetbrains.services.amazonq.actions.QSwitchProfilesAction
1917
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
2018
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererConnectOnGithubAction
2119
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererLearnMoreAction
2220
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererProvideFeedbackAction
23-
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererShowSettingsAction
2421
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.actions.CodeWhispererCodeScanRunAction
2522
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.actions.ActionProvider
2623
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.actions.Customize
@@ -54,6 +51,7 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() {
5451

5552
override fun getChildren(e: AnActionEvent?) = e?.project?.let {
5653
val isPendingActiveProfile = QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(it)
54+
val actionManager = ActionManager.getInstance()
5755
buildList {
5856
if (!isPendingActiveProfile) {
5957
addAll(buildActionListForActiveProfileSelected(it, actionProvider))
@@ -64,15 +62,18 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() {
6462
addAll(buildActionListForConnectHelp(actionProvider))
6563

6664
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))
65+
add(actionManager.getAction("codewhisperer.settings"))
66+
67+
val connection = ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
68+
69+
if (connection != null) {
70+
if (!connection.isSono()) {
71+
add(actionManager.getAction("codewhisperer.switchProfiles"))
72+
} else {
73+
add(actionManager.getAction("q.manage.subscription"))
7574
}
75+
76+
add(SsoLogoutAction(connection))
7677
}
7778
}.toTypedArray()
7879
}.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
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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.QConnection
19+
import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
20+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
21+
22+
class ManageSubscription : AnAction(), DumbAware {
23+
override fun getActionUpdateThread() = ActionUpdateThread.BGT
24+
25+
override fun update(e: AnActionEvent) {
26+
val project = e.project
27+
// disable if user is IdC
28+
if (project == null) {
29+
e.presentation.isEnabledAndVisible = false
30+
} else {
31+
val connection = ToolkitConnectionManager.getInstance(project)
32+
.activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
33+
34+
e.presentation.isEnabledAndVisible = connection.isSono()
35+
}
36+
}
37+
38+
override fun actionPerformed(e: AnActionEvent) {
39+
val project = e.project ?: return
40+
currentThreadCoroutineScope().launch {
41+
AmazonQLspService.getInstance(project).execute { lsp ->
42+
lsp.workspaceService.executeCommand(
43+
ExecuteCommandParams().apply {
44+
this.command = "aws/chat/manageSubscription"
45+
}
46+
)
47+
}.handleAsync { _, ex ->
48+
if (ex != null) {
49+
LOG.error(ex) { "Failed aws/chat/manageSubscription" }
50+
}
51+
}.await()
52+
}
53+
}
54+
55+
companion object {
56+
private val LOG = getLogger<ManageSubscription>()
57+
}
58+
}

plugins/core/webview/src/q-ui/components/qOptions.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
:isSelected="selectedLoginOption === LoginOption.BUILDER_ID"
2727
:itemId="LoginOption.BUILDER_ID"
2828
:login-type="LoginOption.BUILDER_ID"
29-
:itemTitle="'Use for free'"
30-
:itemText="'No AWS account required'"
29+
:itemTitle="'Personal account'"
30+
:itemText="'Best for personal use. Free to start with a Builder ID'"
3131
class="font-amazon bottom-small-gap"
3232
></SelectableItem>
3333
<!-- TODO: IdC description undecided -->
@@ -37,7 +37,8 @@
3737
:isSelected="selectedLoginOption === LoginOption.ENTERPRISE_SSO"
3838
:itemId="LoginOption.ENTERPRISE_SSO"
3939
:login-type="LoginOption.ENTERPRISE_SSO"
40-
:itemTitle="'Use with Pro license'"
40+
:itemTitle="'Company account'"
41+
:itemText="'Best for individual teams or organizations'"
4142
class="font-amazon bottom-small-gap"
4243
></SelectableItem>
4344
<button

plugins/core/webview/src/q-ui/components/toolkitOptions.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
:isSelected="selectedLoginOption === LoginOption.BUILDER_ID"
2828
:itemId="LoginOption.BUILDER_ID"
2929
:login-type="LoginOption.BUILDER_ID"
30-
:itemTitle="'Use for free'"
31-
:itemText="'No AWS account required'"
30+
:itemTitle="'Personal account'"
31+
:itemText="'Best for personal use. Free to start with a Builder ID'"
3232
class="font-amazon bottom-small-gap"
3333
></SelectableItem>
3434
<!-- TODO: IdC description undecided -->

0 commit comments

Comments
 (0)