Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "feature",
"description" : "Support for Amazon Q Builder ID paid tier"
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,5 +139,7 @@
class="software.aws.toolkits.jetbrains.services.cwc.commands.codescan.actions.CodeScanCompleteAction" />
</group>

<action id="q.manage.subscription"
class="software.aws.toolkits.jetbrains.services.codewhisperer.actions.ManageSubscription"/>
</actions>
</idea-plugin>
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,12 @@ import com.intellij.openapi.project.Project
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
import software.aws.toolkits.jetbrains.core.credentials.actions.SsoLogoutAction
import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection
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.actions.QSwitchProfilesAction
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererConnectOnGithubAction
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererLearnMoreAction
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererProvideFeedbackAction
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererShowSettingsAction
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.actions.CodeWhispererCodeScanRunAction
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.actions.ActionProvider
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.actions.Customize
Expand Down Expand Up @@ -54,6 +51,7 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() {

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

add(Separator.create())
add(CodeWhispererShowSettingsAction())
(
ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
)?.takeIf { !it.isSono() }
?.let { add(QSwitchProfilesAction()) }
ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(CodeWhispererConnection.getInstance())?.let { c ->
(c as? AwsBearerTokenConnection)?.let { connection ->
add(SsoLogoutAction(connection))
add(actionManager.getAction("codewhisperer.settings"))

val connection = ToolkitConnectionManager.getInstance(it).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection

if (connection != null) {
if (!connection.isSono()) {
add(actionManager.getAction("codewhisperer.switchProfiles"))
} else {
add(actionManager.getAction("q.manage.subscription"))
}

add(SsoLogoutAction(connection))
}
}.toTypedArray()
}.orEmpty()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ amazonqInlineChat.popup.title=Enter Instructions for Q
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 Subscription
action.q.profile.usage.text=You changed your profile
action.q.profile.usage=You''re using the ''<b>{0}</b>'' profile for Amazon Q.
action.q.switchProfiles.text=Change Profile
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// 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 ManageSubscription : AnAction(), DumbAware {
override fun getActionUpdateThread() = ActionUpdateThread.BGT

override fun update(e: AnActionEvent) {
val project = e.project
// disable if user is IdC
if (project == null) {
e.presentation.isEnabledAndVisible = false
} else {
val connection = ToolkitConnectionManager.getInstance(project)
.activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection

e.presentation.isEnabledAndVisible = connection.isSono()
}
}

override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return
currentThreadCoroutineScope().launch {

Check warning on line 40 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/ManageSubscription.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'currentThreadCoroutineScope()' is declared in unstable 'com.intellij.openapi.progress.CoroutinesKt' marked with @ApiStatus.Experimental

Check warning

Code scanning / QDJVMC

Unstable API Usage Warning

'currentThreadCoroutineScope()' is declared in unstable 'com.intellij.openapi.progress.CoroutinesKt' marked with @ApiStatus.Experimental
AmazonQLspService.getInstance(project).execute { lsp ->
lsp.workspaceService.executeCommand(
ExecuteCommandParams().apply {
this.command = "aws/chat/manageSubscription"
}
)
}.handleAsync { _, ex ->
if (ex != null) {
LOG.error(ex) { "Failed aws/chat/manageSubscription" }
}
}.await()
}
}

companion object {
private val LOG = getLogger<ManageSubscription>()
}
}
7 changes: 4 additions & 3 deletions plugins/core/webview/src/q-ui/components/qOptions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
:isSelected="selectedLoginOption === LoginOption.BUILDER_ID"
:itemId="LoginOption.BUILDER_ID"
:login-type="LoginOption.BUILDER_ID"
:itemTitle="'Use for free'"
:itemText="'No AWS account required'"
:itemTitle="'Personal account'"
:itemText="'Best for personal use. Free to start with a Builder ID'"
class="font-amazon bottom-small-gap"
></SelectableItem>
<!-- TODO: IdC description undecided -->
Expand All @@ -37,7 +37,8 @@
:isSelected="selectedLoginOption === LoginOption.ENTERPRISE_SSO"
:itemId="LoginOption.ENTERPRISE_SSO"
:login-type="LoginOption.ENTERPRISE_SSO"
:itemTitle="'Use with Pro license'"
:itemTitle="'Company account'"
:itemText="'Best for individual teams or organizations'"
class="font-amazon bottom-small-gap"
></SelectableItem>
<button
Expand Down
4 changes: 2 additions & 2 deletions plugins/core/webview/src/q-ui/components/toolkitOptions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
:isSelected="selectedLoginOption === LoginOption.BUILDER_ID"
:itemId="LoginOption.BUILDER_ID"
:login-type="LoginOption.BUILDER_ID"
:itemTitle="'Use for free'"
:itemText="'No AWS account required'"
:itemTitle="'Personal account'"
:itemText="'Best for personal use. Free to start with a Builder ID'"
class="font-amazon bottom-small-gap"
></SelectableItem>
<!-- TODO: IdC description undecided -->
Expand Down
Loading