Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
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,15 @@
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

Check warning on line 15 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
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

Check warning on line 18 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
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

Check warning on line 23 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
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 +54,7 @@

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 +65,18 @@
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"))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not keep using add(QSwitchProfilesAction())?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

marginally saves some GC cycles because we dont need to construct/gc

} 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,57 @@
// 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.CodeWhispererConnection

Check warning on line 18 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

Unused import directive

Unused import directive
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 {
e.presentation.isEnabledAndVisible = (ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection).isSono()
}
}

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

Check warning on line 39 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"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

confirming if this works even if auth is not migrated to Flare? Is there any step that would require regular builder id auth?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

auth is not involved at all
the upgrade flow is in the browser. the flow is

extension to Flare: workspace/executeCommand (aws/chat/manageSubscription)
Flare: does some logic
Flare to extension: window/showDocument (isExternal)

}
)
}.handleAsync { _, ex ->
if (ex != null) {
LOG.error(ex) { "Failed aws/chat/manageSubscription" }
}
}.await()
}
}

companion object {
private val LOG = getLogger<ManageSubscription>()
}
}
Loading