diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ae66e6fd5c..321e017b9fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,3 @@ -# _3.63_ (2025-04-08) -- **(Feature)** Enterprise users can choose their preferred Amazon Q profile to improve personalization and workflow across different business regions -- **(Bug Fix)** Amazon Q /doc: close diff tab and open README file in preview mode after user accept changes - # _3.62_ (2025-04-03) - **(Feature)** /review: automatically generate fix without clicking Generate Fix button - **(Bug Fix)** /transform: prompt user to re-authenticate if credentials expire during transformation diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/common/clients/AmazonQCodeGenerateClient.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/common/clients/AmazonQCodeGenerateClient.kt index 3957d9fdf46..2c28c3240f3 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/common/clients/AmazonQCodeGenerateClient.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/common/clients/AmazonQCodeGenerateClient.kt @@ -31,10 +31,10 @@ import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.jetbrains.common.session.Intent +import software.aws.toolkits.jetbrains.core.awsClient import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.services.amazonq.clients.AmazonQStreamingClient -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonqDoc.FEATURE_EVALUATION_PRODUCT_NAME import software.aws.toolkits.jetbrains.services.codemodernizer.utils.calculateTotalLatency import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata @@ -72,7 +72,7 @@ class AmazonQCodeGenerateClient(private val project: Project) { fun connection() = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) ?: error("Attempted to use connection while one does not exist") - fun bearerClient() = QRegionProfileManager.getInstance().getQClient(project) + fun bearerClient() = connection().getConnectionSettings().awsClient() private val amazonQStreamingClient get() = AmazonQStreamingClient.getInstance(project) @@ -88,7 +88,6 @@ class AmazonQCodeGenerateClient(private val project: Project) { } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(docUserContext) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun sendDocMetricData(operationName: String, result: String): SendTelemetryEventResponse = @@ -119,9 +118,7 @@ class AmazonQCodeGenerateClient(private val project: Project) { } fun createTaskAssistConversation(): CreateTaskAssistConversationResponse = bearerClient().createTaskAssistConversation( - CreateTaskAssistConversationRequest.builder() - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) - .build() + CreateTaskAssistConversationRequest.builder().build() ) fun createTaskAssistUploadUrl(conversationId: String, contentChecksumSha256: String, contentLength: Long): CreateUploadUrlResponse = @@ -140,7 +137,6 @@ class AmazonQCodeGenerateClient(private val project: Project) { ) .build() ) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun startTaskAssistCodeGeneration(conversationId: String, uploadId: String, userMessage: String, intent: Intent): StartTaskAssistCodeGenerationResponse = @@ -159,7 +155,6 @@ class AmazonQCodeGenerateClient(private val project: Project) { .uploadId(uploadId) } .intent(intent.name) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun getTaskAssistCodeGeneration(conversationId: String, codeGenerationId: String): GetTaskAssistCodeGenerationResponse = bearerClient() diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt index ceda1545ea1..bc594209fba 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt @@ -6,7 +6,6 @@ package software.aws.toolkits.jetbrains.services.amazonq import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.runInEdt import com.intellij.openapi.components.Service import com.intellij.openapi.components.service @@ -34,16 +33,11 @@ import software.aws.toolkits.jetbrains.core.webview.BrowserState import software.aws.toolkits.jetbrains.core.webview.LoginBrowser import software.aws.toolkits.jetbrains.core.webview.WebviewResourceHandlerFactory import software.aws.toolkits.jetbrains.isDeveloperMode -import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileSwitchIntent -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser import software.aws.toolkits.jetbrains.utils.isQConnected import software.aws.toolkits.jetbrains.utils.isQExpired import software.aws.toolkits.jetbrains.utils.isQWebviewsAvailable import software.aws.toolkits.telemetry.FeatureId -import software.aws.toolkits.telemetry.MetricResult -import software.aws.toolkits.telemetry.Telemetry import software.aws.toolkits.telemetry.UiTelemetry import software.aws.toolkits.telemetry.WebviewTelemetry import java.awt.event.ActionListener @@ -210,18 +204,6 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos UiTelemetry.click(project, signInOption) } } - - is BrowserMessage.SwitchProfile -> { - QRegionProfileManager.getInstance().switchProfile( - project, - QRegionProfile(profileName = message.profileName, arn = message.arn), - intent = QProfileSwitchIntent.Auth - ) - } - - is BrowserMessage.PublishWebviewTelemetry -> { - publishTelemetry(message) - } } } @@ -262,35 +244,13 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos } // TODO: pass "REAUTH" if connection expires - // Perform the potentially blocking AWS call outside the EDT to fetch available region profiles. - ApplicationManager.getApplication().executeOnPooledThread { - var errorMessage: String? = null - val profiles: List = try { - QRegionProfileManager.getInstance().listRegionProfiles(project).orEmpty() - } catch (e: Exception) { - errorMessage = e.message - LOG.warn { "Failed to call listRegionProfiles API" } - val qConn = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) - Telemetry.amazonq.didSelectProfile.use { span -> - span.source(QProfileSwitchIntent.Auth.value) - .amazonQProfileRegion(QRegionProfileManager.getInstance().activeProfile(project)?.region ?: "not-set") - .ssoRegion((qConn as? AwsBearerTokenConnection)?.region) - .credentialStartUrl((qConn as? AwsBearerTokenConnection)?.startUrl) - .result(MetricResult.Failed) - .reason(e.message) - } - emptyList() - } - - val stage = if (isQExpired(project)) { - "REAUTH" - } else if (isQConnected(project) && QRegionProfileManager.getInstance().isPendingProfileSelection(project)) { - "PROFILE_SELECT" - } else { - "START" - } + val stage = if (isQExpired(project)) { + "REAUTH" + } else { + "START" + } - val jsonData = """ + val jsonData = """ { stage: '$stage', regions: $regions, @@ -301,16 +261,10 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos }, cancellable: ${state.browserCancellable}, feature: '${state.feature}', - existConnections: ${writeValueAsString(selectionSettings.values.map { it.currentSelection }.toList())}, - profiles: ${writeValueAsString(profiles)}, - errorMessage: ${errorMessage?.let { "\"$it\"" } ?: "null"} + existConnections: ${writeValueAsString(selectionSettings.values.map { it.currentSelection }.toList())} } - """.trimIndent() - - runInEdt { - executeJS("window.ideClient.prepareUi($jsonData)") - } - } + """.trimIndent() + executeJS("window.ideClient.prepareUi($jsonData)") } override fun loginIAM(profileName: String, accessKey: String, secretKey: String) { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt index f3995104fd1..f114ae98239 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt @@ -19,7 +19,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory @@ -53,9 +52,6 @@ class AmazonQStartupActivity : ProjectActivity { CodeWhispererExplorerActionManager.getInstance().setIsFirstRestartAfterQInstall(false) } } - - QRegionProfileManager.getInstance().validateProfile(project) - startLsp(project) if (runOnce.get()) return emitUserState(project) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt index 8a1d6378565..15a533d1191 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt @@ -24,7 +24,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonq.util.highlightCommand import software.aws.toolkits.jetbrains.services.amazonq.webview.BrowserConnector import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter @@ -128,8 +127,7 @@ class AmazonQToolWindow private constructor( isCodeScanAvailable = isCodeScanAvailable(project), isCodeTestAvailable = isCodeTestAvailable(project), isDocAvailable = isDocAvailable(project), - highlightCommand = highlightCommand(), - activeProfile = QRegionProfileManager.getInstance().takeIf { it.shouldDisplayProfileInfo(project) }?.activeProfile(project) + highlightCommand = highlightCommand() ) scope.launch { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt index 0985d88b8ab..3435075caaf 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt @@ -14,10 +14,12 @@ import com.intellij.ui.components.panels.Wrapper import com.intellij.util.ui.components.BorderLayoutPanel import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger +import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection +import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener import software.aws.toolkits.jetbrains.core.notifications.NotificationPanel @@ -26,9 +28,6 @@ import software.aws.toolkits.jetbrains.core.webview.BrowserState import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel import software.aws.toolkits.jetbrains.services.amazonq.RefreshQChatPanelButtonPressedListener import software.aws.toolkits.jetbrains.services.amazonq.gettingstarted.openMeetQPage -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.utils.isQConnected import software.aws.toolkits.jetbrains.utils.isQExpired import software.aws.toolkits.jetbrains.utils.isQWebviewsAvailable @@ -63,11 +62,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { ToolkitConnectionManagerListener.TOPIC, object : ToolkitConnectionManagerListener { override fun activeConnectionChanged(newConnection: ToolkitConnection?) { - ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let { qConn -> - openMeetQPage(project) - QRegionProfileManager.getInstance().validateProfile(project) - } - prepareChatContent(project, qPanel) + onConnectionChanged(project, newConnection, qPanel) } } ) @@ -76,7 +71,9 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { RefreshQChatPanelButtonPressedListener.TOPIC, object : RefreshQChatPanelButtonPressedListener { override fun onRefresh() { - prepareChatContent(project, qPanel) + runInEdt { + prepareChatContent(project, qPanel) + } } } ) @@ -86,19 +83,12 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { object : BearerTokenProviderListener { override fun onChange(providerId: String, newScopes: List?) { if (ToolkitConnectionManager.getInstance(project).connectionStateForFeature(QConnection.getInstance()) == BearerTokenAuthState.AUTHORIZED) { - prepareChatContent(project, qPanel) - } - } - } - ) + val qComponent = AmazonQToolWindow.getInstance(project).component - project.messageBus.connect(toolWindow.disposable).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - if (project.isDisposed) return - AmazonQToolWindow.getInstance(project).disposeAndRecreate() - prepareChatContent(project, qPanel) + runInEdt { + qPanel.setContent(qComponent) + } + } } } ) @@ -117,21 +107,13 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { project: Project, qPanel: Wrapper, ) { - /** - * only render Q Chat when - * 1. There is a Q connection - * 2. Q connection is not expired - * 3. User is not pending region profile selection - */ - val component = if (isQConnected(project) && !isQExpired(project) && !QRegionProfileManager.getInstance().isPendingProfileSelection(project)) { + val component = if (isQConnected(project) && !isQExpired(project)) { AmazonQToolWindow.getInstance(project).component } else { QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ)) QWebviewPanel.getInstance(project).component } - runInEdt { - qPanel.setContent(component) - } + qPanel.setContent(component) } override fun init(toolWindow: ToolWindow) { @@ -152,6 +134,36 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { override fun shouldBeAvailable(project: Project): Boolean = isQWebviewsAvailable() + private fun onConnectionChanged(project: Project, newConnection: ToolkitConnection?, qPanel: Wrapper) { + val isNewConnectionForQ = newConnection?.let { + (it as? AwsBearerTokenConnection)?.let { conn -> + val scopeShouldHave = Q_SCOPES + + LOG.debug { "newConnection: ${conn.id}; scope: ${conn.scopes}; scope must-have: $scopeShouldHave" } + + scopeShouldHave.all { s -> s in conn.scopes } + } ?: false + } ?: false + + if (isNewConnectionForQ) { + openMeetQPage(project) + } + + QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ)) + + // isQConnected alone is not robust and there is race condition (read/update connection states) + val component = if (isNewConnectionForQ || (isQConnected(project) && !isQExpired(project))) { + LOG.debug { "returning Q-chat window; isQConnection=$isNewConnectionForQ; hasPinnedConnection=$isNewConnectionForQ" } + AmazonQToolWindow.getInstance(project).component + } else { + LOG.debug { "returning login window; no Q connection found" } + QWebviewPanel.getInstance(project).component + } + runInEdt { + qPanel.setContent(component) + } + } + companion object { private val LOG = getLogger() const val WINDOW_ID = AMAZON_Q_WINDOW_ID diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt index 7dd41c795f1..cc39985dd36 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt @@ -8,7 +8,6 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.util.Disposer import com.intellij.ui.jcef.JBCefJSQuery import org.cef.CefApp -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser import software.aws.toolkits.jetbrains.settings.MeetQSettings @@ -29,7 +28,6 @@ class Browser(parent: Disposable) : Disposable { isCodeScanAvailable: Boolean, isCodeTestAvailable: Boolean, highlightCommand: HighlightCommand?, - activeProfile: QRegionProfile?, ) { // register the scheme handler to route http://mynah/ URIs to the resources/assets directory on classpath CefApp.getInstance() @@ -39,7 +37,7 @@ class Browser(parent: Disposable) : Disposable { AssetResourceHandler.AssetResourceHandlerFactory(), ) - loadWebView(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand, activeProfile) + loadWebView(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand) } override fun dispose() { @@ -61,22 +59,13 @@ class Browser(parent: Disposable) : Disposable { isCodeScanAvailable: Boolean, isCodeTestAvailable: Boolean, highlightCommand: HighlightCommand?, - activeProfile: QRegionProfile?, ) { // setup empty state. The message request handlers use this for storing state // that's persistent between page loads. jcefBrowser.setProperty("state", "") // load the web app jcefBrowser.loadHTML( - getWebviewHTML( - isCodeTransformAvailable, - isFeatureDevAvailable, - isDocAvailable, - isCodeScanAvailable, - isCodeTestAvailable, - highlightCommand, - activeProfile - ) + getWebviewHTML(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand) ) } @@ -91,7 +80,6 @@ class Browser(parent: Disposable) : Disposable { isCodeScanAvailable: Boolean, isCodeTestAvailable: Boolean, highlightCommand: HighlightCommand?, - activeProfile: QRegionProfile?, ): String { val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)") @@ -112,8 +100,7 @@ class Browser(parent: Disposable) : Disposable { $isDocAvailable, // whether /doc is available $isCodeScanAvailable, // whether /scan is available $isCodeTestAvailable, // whether /test is available - ${OBJECT_MAPPER.writeValueAsString(highlightCommand)}, - "${activeProfile?.profileName.orEmpty()}" + ${OBJECT_MAPPER.writeValueAsString(highlightCommand)} ); } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/CodeScanChatApp.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/CodeScanChatApp.kt index 0aa8dc42b04..166223d623a 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/CodeScanChatApp.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/CodeScanChatApp.kt @@ -21,8 +21,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQApp import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonqCodeScan.auth.isCodeScanAvailable import software.aws.toolkits.jetbrains.services.amazonqCodeScan.commands.CodeScanActionMessage import software.aws.toolkits.jetbrains.services.amazonqCodeScan.commands.CodeScanMessageListener @@ -143,15 +141,6 @@ class CodeScanChatApp(private val scope: CoroutineScope) : AmazonQApp { } } ) - - context.project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - chatSessionStorage.deleteAllSessions() - } - } - ) } private fun getQTokenProvider(project: Project) = ( diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/storage/ChatSessionStorage.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/storage/ChatSessionStorage.kt index 57dcb85f44a..fb05a7beda8 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/storage/ChatSessionStorage.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/storage/ChatSessionStorage.kt @@ -30,8 +30,4 @@ class ChatSessionStorage { fun changeAuthenticationNeededNotified(authNeededNotified: Boolean) { sessions.keys.forEach { sessions[it]?.authNeededNotified = authNeededNotified } } - - fun deleteAllSessions() { - sessions.clear() - } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeTestChatApp.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeTestChatApp.kt index 7972e45fb9c..9da12272cdc 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeTestChatApp.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeTestChatApp.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.amazonqCodeTest import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.project.Project import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection @@ -12,8 +11,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQApp import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonqCodeScan.auth.isCodeScanAvailable import software.aws.toolkits.jetbrains.services.amazonqCodeTest.auth.isCodeTestAvailable import software.aws.toolkits.jetbrains.services.amazonqCodeTest.controller.CodeTestChatController @@ -74,15 +71,6 @@ class CodeTestChatApp(private val scope: CoroutineScope) : AmazonQApp { } } ) - - context.project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - chatSessionStorage.deleteAllSessions() - } - } - ) } private suspend fun handleMessage(message: AmazonQMessage, inboundAppMessagesHandler: InboundAppMessagesHandler) { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeWhispererUTGChatManager.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeWhispererUTGChatManager.kt index aecede14c15..dc60a60e747 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeWhispererUTGChatManager.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeWhispererUTGChatManager.kt @@ -541,8 +541,8 @@ Please see the unit tests generated below. Click 'View Diff' to review the chang jobGroup = session.testGenerationJobGroupName, jobId = session.testGenerationJob, result = if (e.message == message("testgen.message.cancelled")) MetricResult.Cancelled else MetricResult.Failed, - reason = (e as? CodeTestException)?.code ?: "DefaultError", - reasonDesc = if (e.message == message("testgen.message.cancelled")) "${(e as? CodeTestException)?.code}: ${e.message}" else e.message, + reason = (e as CodeTestException).code ?: "DefaultError", + reasonDesc = if (e.message == message("testgen.message.cancelled")) "${e.code}: ${e.message}" else e.message, perfClientLatency = (Instant.now().toEpochMilli() - session.startTimeOfTestGeneration), isCodeBlockSelected = session.isCodeBlockSelected, artifactsUploadDuration = session.artifactUploadDuration, diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt index f2906970f20..3604ebd3549 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt @@ -50,11 +50,13 @@ import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.core.utils.warn +import software.aws.toolkits.jetbrains.core.AwsClientManager import software.aws.toolkits.jetbrains.core.coroutines.EDT +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.isInternalUser import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument import software.aws.toolkits.jetbrains.services.amazonqCodeTest.CodeWhispererUTGChatManager import software.aws.toolkits.jetbrains.services.amazonqCodeTest.ConversationState @@ -275,6 +277,9 @@ class CodeTestChatController( promptInputDisabledState = true, ) // Send Request to Sync UTG API + val connection = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) + // this should never happen because it should have been handled upstream by [AuthController] + ?: error("connection was found to be null") val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) val activeFileContext = ActiveFileContext( fileContext = FileContext( @@ -296,7 +301,7 @@ class CodeTestChatController( useRelevantDocuments = false, ) - val client = QRegionProfileManager.getInstance().getQClient(project) + val client = AwsClientManager.getInstance().getClient(connection.getConnectionSettings()) val request = requestData.toChatRequest() client.generateAssistantResponse(request, responseHandler).await() // TODO: Need to send isCodeBlockSelected field diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/storage/ChatSessionStorage.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/storage/ChatSessionStorage.kt index 295bd9abe15..0e38f06c6de 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/storage/ChatSessionStorage.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/storage/ChatSessionStorage.kt @@ -17,8 +17,4 @@ class ChatSessionStorage { // Find all sessions that are currently waiting to be authenticated fun getAuthenticatingSessions(): List = this.sessions.values.filter { it.isAuthenticating } - - fun deleteAllSessions() { - sessions.clear() - } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/DocApp.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/DocApp.kt index ed913374e08..0e55a655579 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/DocApp.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/DocApp.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.amazonqDoc import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.project.Project import kotlinx.coroutines.launch import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection @@ -12,8 +11,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQApp import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonqCodeScan.auth.isCodeScanAvailable import software.aws.toolkits.jetbrains.services.amazonqCodeTest.auth.isCodeTestAvailable import software.aws.toolkits.jetbrains.services.amazonqDoc.auth.isDocAvailable @@ -77,15 +74,6 @@ class DocApp : AmazonQApp { } } ) - - context.project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - chatSessionStorage.deleteAllSessions() - } - } - ) } private suspend fun handleMessage(message: AmazonQMessage, inboundAppMessagesHandler: InboundAppMessagesHandler) { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/controller/DocController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/controller/DocController.kt index 9984b7142a0..cd3c37b450a 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/controller/DocController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/controller/DocController.kt @@ -13,8 +13,6 @@ import com.intellij.diff.util.DiffUserDataKeys import com.intellij.ide.BrowserUtil import com.intellij.openapi.application.runInEdt import com.intellij.openapi.fileEditor.FileEditorManager -import com.intellij.openapi.fileEditor.TextEditorWithPreview -import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.wm.ToolWindowManager import com.intellij.testFramework.LightVirtualFile @@ -300,11 +298,8 @@ class DocController( messenger.sendChatInputEnabledMessage(message.tabId, false) } - private val diffVirtualFiles = mutableMapOf() - private suspend fun acceptChanges(message: IncomingDocMessage.FollowupClicked) { insertCode(message.tabId) - previewReadmeFile(message.tabId) } private suspend fun promptForDocTarget(tabId: String) { @@ -425,8 +420,6 @@ class DocController( request.putUserData(DiffUserDataKeys.FORCE_READ_ONLY, true) val newDiff = ChainDiffVirtualFile(SimpleDiffRequestChain(request), message.filePath) - - diffVirtualFiles[message.filePath] = newDiff DiffEditorTabFilesManager.getInstance(context.project).showDiffFile(newDiff, true) } } @@ -1054,34 +1047,6 @@ class DocController( session.sendDocTelemetryEvent(null, docAcceptanceEvent) } - private fun previewReadmeFile(tabId: String) { - val session = getSessionInfo(tabId) - var filePaths: List = emptyList() - - when (val state = session.sessionState) { - is PrepareDocGenerationState -> { - filePaths = state.filePaths - } - } - - if (filePaths.isNotEmpty()) { - val filePath = filePaths[0].zipFilePath - val existingDiff = diffVirtualFiles[filePath] - - val newFilePath = session.context.addressableRoot.toNioPath().resolve(filePath) - val readmeVirtualFile = LocalFileSystem.getInstance().refreshAndFindFileByPath(newFilePath.toString()) - - runInEdt { - if (existingDiff != null) { - FileEditorManager.getInstance(getProject()).closeFile(existingDiff) - } - if (readmeVirtualFile != null) { - TextEditorWithPreview.openPreviewForFile(getProject(), readmeVirtualFile) - } - } - } - } - fun getProject() = context.project private fun getSessionInfo(tabId: String) = chatSessionStorage.getSession(tabId, context.project) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/storage/ChatSessionStorage.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/storage/ChatSessionStorage.kt index e54a6b1d7fb..2344dac5c94 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/storage/ChatSessionStorage.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/storage/ChatSessionStorage.kt @@ -23,11 +23,4 @@ class ChatSessionStorage { // Find all sessions that are currently waiting to be authenticated fun getAuthenticatingSessions(): List = this.sessions.values.filter { it.isAuthenticating } - - fun deleteAllSessions() { - sessions.values.forEach { session -> - session.sessionState.token?.cancel() - } - sessions.clear() - } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevApp.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevApp.kt index c9fe08efc64..7169e391507 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevApp.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevApp.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.amazonqFeatureDev import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.project.Project import kotlinx.coroutines.launch import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection @@ -12,8 +11,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQApp import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonqCodeScan.auth.isCodeScanAvailable import software.aws.toolkits.jetbrains.services.amazonqCodeTest.auth.isCodeTestAvailable import software.aws.toolkits.jetbrains.services.amazonqDoc.auth.isDocAvailable @@ -78,15 +75,6 @@ class FeatureDevApp : AmazonQApp { } } ) - - context.project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - chatSessionStorage.deleteAllSessions() - } - } - ) } private suspend fun handleMessage(message: AmazonQMessage, inboundAppMessagesHandler: InboundAppMessagesHandler) { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/clients/FeatureDevClient.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/clients/FeatureDevClient.kt index 7b25fb3b00e..2d73f5fb4ba 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/clients/FeatureDevClient.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/clients/FeatureDevClient.kt @@ -28,8 +28,10 @@ import software.amazon.awssdk.services.codewhispererstreaming.model.ExportIntent import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info +import software.aws.toolkits.jetbrains.core.awsClient +import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager +import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.services.amazonq.clients.AmazonQStreamingClient -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FEATURE_EVALUATION_PRODUCT_NAME import software.aws.toolkits.jetbrains.services.codemodernizer.utils.calculateTotalLatency import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata @@ -68,7 +70,11 @@ class FeatureDevClient( .build() } - private fun bearerClient() = QRegionProfileManager.getInstance().getQClient(project) + private fun connection() = + ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) + ?: error("Attempted to use connection while one does not exist") + + private fun bearerClient() = connection().getConnectionSettings().awsClient() private val amazonQStreamingClient get() = AmazonQStreamingClient.getInstance(project) @@ -82,7 +88,6 @@ class FeatureDevClient( } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(featureDevUserContext) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun sendFeatureDevMetricData(operationName: String, result: String): SendTelemetryEventResponse = @@ -110,7 +115,6 @@ class FeatureDevClient( } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(featureDevUserContext) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun sendFeatureDevCodeGenerationEvent( @@ -129,7 +133,6 @@ class FeatureDevClient( } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(featureDevUserContext) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun sendFeatureDevCodeAcceptanceEvent( @@ -148,14 +151,11 @@ class FeatureDevClient( } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(featureDevUserContext) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun createTaskAssistConversation(): CreateTaskAssistConversationResponse = bearerClient().createTaskAssistConversation( - CreateTaskAssistConversationRequest.builder() - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) - .build(), + CreateTaskAssistConversationRequest.builder().build(), ) fun createTaskAssistUploadUrl( @@ -182,7 +182,6 @@ class FeatureDevClient( .build(), ).build(), ) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun startTaskAssistCodeGeneration( @@ -206,7 +205,6 @@ class FeatureDevClient( .uploadId(uploadId) }.codeGenerationId(codeGenerationId.toString()) .currentCodeGenerationId(currentCodeGenerationId) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } fun getTaskAssistCodeGeneration( @@ -218,7 +216,6 @@ class FeatureDevClient( it .conversationId(conversationId) .codeGenerationId(codeGenerationId) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } suspend fun exportTaskAssistResultArchive(conversationId: String): MutableList = diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt index 75abc80ebf1..5481b28b76e 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt @@ -32,8 +32,6 @@ import software.aws.toolkits.jetbrains.core.coroutines.EDT import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonq.project.RepoSizeError import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeIterationLimitException @@ -96,17 +94,6 @@ class FeatureDevController( private val authController: AuthController = AuthController(), ) : InboundAppMessagesHandler { - init { - context.project.messageBus.connect().subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - chatSessionStorage.deleteAllSessions() - } - } - ) - } - val messenger = context.messagesFromAppToUi val toolWindow = ToolWindowManager.getInstance(context.project).getToolWindow(AmazonQToolWindowFactory.WINDOW_ID) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/storage/ChatSessionStorage.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/storage/ChatSessionStorage.kt index ed0f7eab7be..216d9cd1c8b 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/storage/ChatSessionStorage.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/storage/ChatSessionStorage.kt @@ -23,11 +23,4 @@ class ChatSessionStorage { // Find all sessions that are currently waiting to be authenticated fun getAuthenticatingSessions(): List = this.sessions.values.filter { it.isAuthenticating } - - fun deleteAllSessions() { - sessions.values.forEach { session -> - session.sessionState.token?.cancel() - } - sessions.clear() - } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/App.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/App.kt index 34bb6bca614..b206595f9e8 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/App.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/App.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.cwc import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.merge import kotlinx.coroutines.launch import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope @@ -13,8 +12,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQApp import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonq.util.highlightCommand import software.aws.toolkits.jetbrains.services.cwc.commands.ActionRegistrar import software.aws.toolkits.jetbrains.services.cwc.commands.CodeScanIssueActionMessage @@ -78,15 +75,6 @@ class App : AmazonQApp { } } ) - - ApplicationManager.getApplication().messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - inboundAppMessagesHandler.processSessionClear() - } - } - ) } private suspend fun handleMessage(message: AmazonQMessage, inboundAppMessagesHandler: InboundAppMessagesHandler) { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/InboundAppMessagesHandler.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/InboundAppMessagesHandler.kt index bbcddd84552..ff8a12e70ec 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/InboundAppMessagesHandler.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/InboundAppMessagesHandler.kt @@ -34,6 +34,4 @@ interface InboundAppMessagesHandler { suspend fun processCodeScanIssueAction(message: CodeScanIssueActionMessage) suspend fun processLinkClick(message: IncomingCwcMessage.ClickedLink) - - fun processSessionClear() } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt index 8b563e24b32..a55d9cc2075 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt @@ -36,8 +36,10 @@ import software.amazon.awssdk.services.codewhispererstreaming.model.UserInputMes import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info +import software.aws.toolkits.jetbrains.core.AwsClientManager import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager +import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager +import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument import software.aws.toolkits.jetbrains.services.cwc.ChatConstants import software.aws.toolkits.jetbrains.services.cwc.clients.chat.ChatSession @@ -168,7 +170,11 @@ class ChatSessionV1( try { withTimeout(ChatConstants.REQUEST_TIMEOUT_MS.toLong()) { - val client = QRegionProfileManager.getInstance().getQClient(project) + val connection = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) + // this should never happen because it should have been handled upstream by [AuthController] + ?: error("connection was found to be null") + + val client = AwsClientManager.getInstance().getClient(connection.getConnectionSettings()) val request = data.toChatRequest() logger.info { "Request from tab: ${data.tabId}, conversationId: $conversationId, request: $request" } client.generateAssistantResponse(request, responseHandler).await() diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/SendToQActionGroup.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/SendToQActionGroup.kt index d903f842020..d3e77515cd1 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/SendToQActionGroup.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/SendToQActionGroup.kt @@ -8,7 +8,6 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.DefaultActionGroup import com.intellij.openapi.project.DumbAware import com.intellij.openapi.wm.ToolWindowManager -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory class SendToQActionGroup : DefaultActionGroup(), DumbAware { @@ -17,7 +16,6 @@ class SendToQActionGroup : DefaultActionGroup(), DumbAware { override fun update(e: AnActionEvent) { val project = e.project ?: return val amazonQWindow = ToolWindowManager.getInstance(project).getToolWindow(AmazonQToolWindowFactory.WINDOW_ID) - e.presentation.isEnabledAndVisible = (amazonQWindow?.isAvailable == true) && - !QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(project) + e.presentation.isEnabledAndVisible = amazonQWindow?.isAvailable ?: false } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt index 800d7f5dea4..25630d63bab 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt @@ -541,10 +541,6 @@ class ChatController private constructor( .map { it.tabId } .first() - override fun processSessionClear() { - chatSessionStorage.deleteAllSessions() - } - companion object { private val logger = getLogger() diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatController.kt index bf468976a2f..1a6f8d2d10f 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatController.kt @@ -55,8 +55,6 @@ import software.aws.toolkits.jetbrains.core.gettingstarted.requestCredentialsFor import software.aws.toolkits.jetbrains.core.webview.BrowserState import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AMAZON_Q_WINDOW_ID import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.codewhisperer.model.CaretPosition @@ -103,14 +101,6 @@ class InlineChatController( init { Disposer.register(this, listener) project.messageBus.connect(this).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener) - project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - sessionStorage.deleteAllSessions() - } - } - ) } data class InlineChatMetrics( diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/OpenChatInputAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/OpenChatInputAction.kt index f581a217226..ebc6b53cd13 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/OpenChatInputAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/OpenChatInputAction.kt @@ -3,12 +3,10 @@ package software.aws.toolkits.jetbrains.services.cwc.inline -import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.util.Key -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager class OpenChatInputAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { @@ -26,9 +24,4 @@ class OpenChatInputAction : AnAction() { val inlineChatController = InlineChatController.getInstance(project) inlineChatController.initPopup(editor) } - override fun update(e: AnActionEvent) { - val project = e.project ?: return - e.presentation.isEnabledAndVisible = !QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(project) - } - override fun getActionUpdateThread() = ActionUpdateThread.BGT } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/storage/ChatSessionStorage.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/storage/ChatSessionStorage.kt index e11d0693b7c..231cdd21d5f 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/storage/ChatSessionStorage.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/storage/ChatSessionStorage.kt @@ -26,8 +26,4 @@ class ChatSessionStorage( fun deleteSession(tabId: String) { sessions.remove(tabId)?.scope?.cancel() } - - fun deleteAllSessions() { - sessions.clear() - } } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt index 9b2db462a41..a827a4bab8d 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt @@ -32,8 +32,6 @@ import software.aws.toolkits.core.utils.warn import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_MVN_FAILURE import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_PROJECT_SIZE -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformMessageListener import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_POM_FILE_NAME @@ -132,23 +130,6 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo init { CodeModernizerSessionState.getInstance(project).setDefaults() - initQRegionProfileSelectedListener() - } - - private fun initQRegionProfileSelectedListener() { - project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - stopModernize() - codeTransformationSession?.let { - Disposer.dispose(it) - } - managerState = CodeModernizerState() - codeTransformationSession = null - } - } - ) } fun validate(project: Project, transformationType: CodeTransformType): ValidationResult { @@ -278,7 +259,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo fun runModernize(copyResult: MavenCopyCommandsResult? = null) { initStopParameters() - val session = codeTransformationSession ?: return + val session = codeTransformationSession as CodeModernizerSession initModernizationJobUI(true, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile)) launchModernizationJob(session, copyResult) } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt index 921a9ac0f2c..9ba17c22cb1 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt @@ -5,7 +5,6 @@ package software.aws.toolkits.jetbrains.services.codemodernizer import com.intellij.openapi.Disposable import com.intellij.openapi.application.runInEdt -import com.intellij.openapi.util.Disposer import com.intellij.serviceContainer.AlreadyDisposedException import com.intellij.util.io.HttpRequests import kotlinx.coroutines.delay @@ -150,9 +149,6 @@ class CodeModernizerSession( * Based on [CodeWhispererCodeScanSession] */ suspend fun createModernizationJob(copyResult: MavenCopyCommandsResult?): CodeModernizerStartJobResult { - if (this.isDisposed.get()) { - return CodeModernizerStartJobResult.Cancelled - } LOG.info { "Compressing local project" } val payload: File? var payloadSize = 0 @@ -186,9 +182,6 @@ class CodeModernizerSession( payloadSize = payload.length().toInt() LOG.info { "Uploading zip file with size: $payloadSize bytes" } - if (this.isDisposed.get()) { - return CodeModernizerStartJobResult.Cancelled - } if (payloadSize > MAX_ZIP_SIZE) { telemetryErrorMessage = "Project exceeds max upload size" @@ -217,7 +210,7 @@ class CodeModernizerSession( telemetryErrorMessage = "Credential expired before uploading project" return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.CREDENTIALS_EXPIRED) } - if (shouldStop.get() || this.isDisposed.get()) { + if (shouldStop.get()) { LOG.warn { "Job was cancelled by user before upload was called" } telemetryErrorMessage = "Cancelled when about to upload project" return CodeModernizerStartJobResult.Cancelled @@ -292,7 +285,7 @@ class CodeModernizerSession( CodeTransformMessageListener.instance.onUploadResult() return try { - if (shouldStop.get() || this.isDisposed.get()) { + if (shouldStop.get()) { LOG.warn { "Job was cancelled by user before start job was called" } return CodeModernizerStartJobResult.Cancelled } @@ -632,8 +625,6 @@ class CodeModernizerSession( override fun dispose() { isDisposed.set(true) - shouldStop.set(true) - Disposer.dispose(sessionContext) } fun getActiveJobId() = state.currentJobId diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt index b102d348d11..1c32f2f07c5 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.codemodernizer import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.merge import kotlinx.coroutines.launch import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope @@ -16,8 +15,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQApp import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener import software.aws.toolkits.jetbrains.services.amazonqCodeScan.auth.isCodeScanAvailable import software.aws.toolkits.jetbrains.services.amazonqCodeTest.auth.isCodeTestAvailable import software.aws.toolkits.jetbrains.services.amazonqDoc.auth.isDocAvailable @@ -164,15 +161,6 @@ class CodeTransformChatApp : AmazonQApp { } } ) - - context.project.messageBus.connect(this).subscribe( - QRegionProfileSelectedListener.TOPIC, - object : QRegionProfileSelectedListener { - override fun onProfileSelected(project: Project, profile: QRegionProfile?) { - chatSessionStorage.deleteAllSessions() - } - } - ) } private suspend fun handleMessage(message: AmazonQMessage, inboundAppMessagesHandler: InboundAppMessagesHandler) { diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/client/GumbyClient.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/client/GumbyClient.kt index 6134e69ca22..097b9231d4a 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/client/GumbyClient.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/client/GumbyClient.kt @@ -38,6 +38,9 @@ import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.jetbrains.core.AwsClientManager +import software.aws.toolkits.jetbrains.core.awsClient +import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager +import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.services.amazonq.APPLICATION_ZIP import software.aws.toolkits.jetbrains.services.amazonq.AWS_KMS import software.aws.toolkits.jetbrains.services.amazonq.CONTENT_SHA256 @@ -45,7 +48,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.SERVER_SIDE_ENCRYPTION import software.aws.toolkits.jetbrains.services.amazonq.SERVER_SIDE_ENCRYPTION_AWS_KMS_KEY_ID import software.aws.toolkits.jetbrains.services.amazonq.clients.AmazonQStreamingClient import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerMetrics import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId import software.aws.toolkits.jetbrains.services.codemodernizer.utils.calculateTotalLatency @@ -56,7 +58,10 @@ import java.time.Instant @Service(Service.Level.PROJECT) class GumbyClient(private val project: Project) { - private fun bearerClient() = QRegionProfileManager.getInstance().getQClient(project) + private fun connection() = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) + ?: error("Attempted to use connection while one does not exist") + + private fun bearerClient() = connection().getConnectionSettings().awsClient() private val amazonQStreamingClient get() = AmazonQStreamingClient.getInstance(project) @@ -66,7 +71,6 @@ class GumbyClient(private val project: Project) { .contentChecksumType(ContentChecksumType.SHA_256) .contentChecksum(sha256Checksum) .uploadIntent(UploadIntent.TRANSFORMATION) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() return callApi({ bearerClient().createUploadUrl(request) }, apiName = "CreateUploadUrl") } @@ -88,16 +92,12 @@ class GumbyClient(private val project: Project) { ) .build() ) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() return callApi({ bearerClient().createUploadUrl(request) }, apiName = "CreateUploadUrl") } fun getCodeModernizationJob(jobId: String): GetTransformationResponse { - val request = GetTransformationRequest.builder() - .transformationJobId(jobId) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) - .build() + val request = GetTransformationRequest.builder().transformationJobId(jobId).build() return callApi({ bearerClient().getTransformation(request) }, apiName = "GetTransformation") } @@ -116,7 +116,6 @@ class GumbyClient(private val project: Project) { .source { it.language(sourceLanguage) } .target { it.language(targetLanguage) } } - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() return callApi({ bearerClient().startTransformation(request) }, apiName = "StartTransformation") } @@ -128,22 +127,17 @@ class GumbyClient(private val project: Project) { val request = ResumeTransformationRequest.builder() .transformationJobId(jobId.id) .userActionStatus(userActionStatus) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() return callApi({ bearerClient().resumeTransformation(request) }, apiName = "ResumeTransformation") } fun getCodeModernizationPlan(jobId: JobId): GetTransformationPlanResponse { - val request = GetTransformationPlanRequest.builder() - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) - .transformationJobId(jobId.id).build() + val request = GetTransformationPlanRequest.builder().transformationJobId(jobId.id).build() return callApi({ bearerClient().getTransformationPlan(request) }, apiName = "GetTransformationPlan") } fun stopTransformation(transformationJobId: String): StopTransformationResponse { - val request = StopTransformationRequest.builder().transformationJobId(transformationJobId) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) - .build() + val request = StopTransformationRequest.builder().transformationJobId(transformationJobId).build() return callApi({ bearerClient().stopTransformation(request) }, apiName = "StopTransformation") } @@ -238,7 +232,6 @@ class GumbyClient(private val project: Project) { } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/MavenRunnerUtils.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/MavenRunnerUtils.kt index 6629b8c2d34..74ec6aeae3d 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/MavenRunnerUtils.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/MavenRunnerUtils.kt @@ -16,7 +16,6 @@ import org.slf4j.Logger import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.info import software.aws.toolkits.jetbrains.services.codemodernizer.CodeTransformTelemetryManager -import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenDependencyReportCommandsResult import software.aws.toolkits.telemetry.CodeTransformBuildCommand @@ -26,7 +25,6 @@ import java.nio.file.Files import java.nio.file.Path fun runHilMavenCopyDependency( - context: CodeModernizerSessionContext, sourceFolder: File, destinationDir: File, logBuilder: StringBuilder, @@ -37,7 +35,6 @@ fun runHilMavenCopyDependency( try { // Create shared parameters val transformMvnRunner = TransformMavenRunner(project) - context.mavenRunnerQueue.add(transformMvnRunner) val mvnSettings = MavenRunner.getInstance(project).settings.clone() // clone required to avoid editing user settings // run copy dependencies @@ -60,14 +57,7 @@ fun runHilMavenCopyDependency( return MavenCopyCommandsResult.Success(destinationDir) } -fun runMavenCopyCommands( - context: CodeModernizerSessionContext, - sourceFolder: File, - logBuilder: StringBuilder, - logger: Logger, - project: Project, - shouldSkipTests: Boolean, -): MavenCopyCommandsResult { +fun runMavenCopyCommands(sourceFolder: File, logBuilder: StringBuilder, logger: Logger, project: Project, shouldSkipTests: Boolean): MavenCopyCommandsResult { val currentTimestamp = System.currentTimeMillis() val destinationDir = Files.createTempDirectory("transformation_dependencies_temp_$currentTimestamp") val telemetry = CodeTransformTelemetryManager.getInstance(project) @@ -78,7 +68,6 @@ fun runMavenCopyCommands( try { // Create shared parameters val transformMvnRunner = TransformMavenRunner(project) - context.mavenRunnerQueue.add(transformMvnRunner) val mvnSettings = MavenRunner.getInstance(project).settings.clone() // clone required to avoid editing user settings val sourceVirtualFile = LocalFileSystem.getInstance().findFileByIoFile(sourceFolder) @@ -293,17 +282,10 @@ private fun runMavenDependencyUpdatesReport( return dependencyUpdatesReportRunnable } -fun runDependencyReportCommands( - context: CodeModernizerSessionContext, - sourceFolder: File, - logBuilder: StringBuilder, - logger: Logger, - project: Project, -): MavenDependencyReportCommandsResult { +fun runDependencyReportCommands(sourceFolder: File, logBuilder: StringBuilder, logger: Logger, project: Project): MavenDependencyReportCommandsResult { logger.info { "Executing IntelliJ bundled Maven" } val transformMvnRunner = TransformMavenRunner(project) - context.mavenRunnerQueue.add(transformMvnRunner) val mvnSettings = MavenRunner.getInstance(project).settings.clone() // clone required to avoid editing user settings val runnable = runMavenDependencyUpdatesReport(sourceFolder, logBuilder, mvnSettings, transformMvnRunner, logger) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/TransformMavenRunner.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/TransformMavenRunner.kt index a68c659ba6f..f202cf6896f 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/TransformMavenRunner.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ideMaven/TransformMavenRunner.kt @@ -5,7 +5,6 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven import com.intellij.execution.process.ProcessAdapter import com.intellij.execution.process.ProcessEvent -import com.intellij.execution.process.ProcessHandler import com.intellij.execution.process.ProcessOutputTypes import com.intellij.execution.runners.ProgramRunner import com.intellij.execution.ui.RunContentDescriptor @@ -17,13 +16,11 @@ import org.jetbrains.idea.maven.execution.MavenRunnerParameters import org.jetbrains.idea.maven.execution.MavenRunnerSettings class TransformMavenRunner(val project: Project) { - private var handler: ProcessHandler? = null fun run(parameters: MavenRunnerParameters, settings: MavenRunnerSettings, onComplete: TransformRunnable) { FileDocumentManager.getInstance().saveAllDocuments() val callback = ProgramRunner.Callback { descriptor: RunContentDescriptor -> val handler = descriptor.processHandler - this.handler = handler if (handler == null) { // add log error here onComplete.setExitCode(-1) @@ -53,8 +50,4 @@ class TransformMavenRunner(val project: Project) { // Setting isDelegateBuild = true allows us to set the JRE used by Maven during runtime MavenRunConfigurationType.runConfiguration(project, parameters, null, settings, callback, false) } - - fun cancel() { - this.handler?.destroyProcess() - } } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt index a0da0824a76..6a1a75b9d8a 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.model import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper -import com.intellij.openapi.Disposable import com.intellij.openapi.application.runInEdt import com.intellij.openapi.application.runReadAction import com.intellij.openapi.project.Project @@ -20,7 +19,6 @@ import software.aws.toolkits.core.utils.putNextEntry import software.aws.toolkits.jetbrains.services.codemodernizer.EXPLAINABILITY_V1 import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_DEPENDENCIES_ROOT_NAME import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_MANIFEST_FILE_NAME -import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.TransformMavenRunner import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runDependencyReportCommands import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runHilMavenCopyDependency import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runMavenCopyCommands @@ -61,7 +59,6 @@ const val INVALID_SUFFIX_REPOSITORIES = "repositories" const val ORACLE_DB = "ORACLE" const val AURORA_DB = "AURORA_POSTGRESQL" const val RDS_DB = "POSTGRESQL" - data class CodeModernizerSessionContext( val project: Project, var configurationFile: VirtualFile? = null, // used to ZIP module @@ -74,11 +71,9 @@ data class CodeModernizerSessionContext( val sourceServerName: String? = null, var schema: String? = null, val sqlMetadataZip: File? = null, -) : Disposable { +) { private val mapper = jacksonObjectMapper() private val ignoredDependencyFileExtensions = setOf(INVALID_SUFFIX_SHA, INVALID_SUFFIX_REPOSITORIES) - private var isDisposed = false - val mavenRunnerQueue: MutableList = mutableListOf() private fun File.isMavenTargetFolder(): Boolean { val hasPomSibling = this.resolveSibling(MAVEN_CONFIGURATION_FILE_NAME).exists() @@ -105,22 +100,19 @@ data class CodeModernizerSessionContext( } fun executeMavenCopyCommands(sourceFolder: File, buildLogBuilder: StringBuilder): MavenCopyCommandsResult { - if (isDisposed) return MavenCopyCommandsResult.Cancelled val shouldSkipTests = customBuildCommand == MAVEN_BUILD_SKIP_UNIT_TESTS - return runMavenCopyCommands(this, sourceFolder, buildLogBuilder, LOG, project, shouldSkipTests) + return runMavenCopyCommands(sourceFolder, buildLogBuilder, LOG, project, shouldSkipTests) } private fun executeHilMavenCopyDependency(sourceFolder: File, destinationFolder: File, buildLogBuilder: StringBuilder) = runHilMavenCopyDependency( - this, sourceFolder, destinationFolder, buildLogBuilder, LOG, - project, + project ) fun copyHilDependencyUsingMaven(hilTepDirPath: Path): MavenCopyCommandsResult { - if (isDisposed) return MavenCopyCommandsResult.Cancelled val sourceFolder = File(getPathToHilArtifactPomFolder(hilTepDirPath).pathString) val destinationFolder = Files.createDirectories(getPathToHilDependenciesRootDir(hilTepDirPath)).toFile() val buildLogBuilder = StringBuilder("Starting Build Log...\n") @@ -129,7 +121,6 @@ data class CodeModernizerSessionContext( } fun getDependenciesUsingMaven(): MavenCopyCommandsResult { - if (isDisposed) return MavenCopyCommandsResult.Cancelled val root = configurationFile?.parent val sourceFolder = File(root?.path) val buildLogBuilder = StringBuilder("Starting Build Log...\n") @@ -137,16 +128,14 @@ data class CodeModernizerSessionContext( } fun createDependencyReportUsingMaven(hilTempPomPath: Path): MavenDependencyReportCommandsResult { - if (isDisposed) return MavenDependencyReportCommandsResult.Cancelled val sourceFolder = File(hilTempPomPath.pathString) val buildLogBuilder = StringBuilder("Starting Build Log...\n") return executeDependencyVersionReportUsingMaven(sourceFolder, buildLogBuilder) } - private fun executeDependencyVersionReportUsingMaven( sourceFolder: File, buildLogBuilder: StringBuilder, - ) = runDependencyReportCommands(this, sourceFolder, buildLogBuilder, LOG, project) + ) = runDependencyReportCommands(sourceFolder, buildLogBuilder, LOG, project) fun createZipForHilUpload(hilTempPath: Path, manifest: CodeTransformHilDownloadManifest?, targetVersion: String): ZipCreationResult = runReadAction { @@ -337,13 +326,6 @@ data class CodeModernizerSessionContext( CodeModernizerBottomWindowPanelManager.getInstance(project).setJobStartingUI() } - override fun dispose() { - isDisposed = true - this.mavenRunnerQueue.forEach { - it.cancel() - } - } - companion object { private val LOG = getLogger() } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/session/ChatSessionStorage.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/session/ChatSessionStorage.kt index 99198a56550..807e5dcbe1b 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/session/ChatSessionStorage.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/session/ChatSessionStorage.kt @@ -28,8 +28,4 @@ class ChatSessionStorage { fun changeAuthenticationNeededNotified(authNeededNotified: Boolean) { sessions.keys.forEach { sessions[it]?.authNeededNotified = authNeededNotified } } - - fun deleteAllSessions() { - sessions.clear() - } } 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 f8a2de49534..07d8f29e713 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 @@ -32,7 +32,6 @@ - - diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererRecommendationAction.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererRecommendationAction.kt index 7eae90e6af0..97fcc101b8a 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererRecommendationAction.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererRecommendationAction.kt @@ -11,7 +11,6 @@ import com.intellij.openapi.project.DumbAware import com.intellij.openapi.util.Key import kotlinx.coroutines.Job import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.model.LatencyContext import software.aws.toolkits.jetbrains.services.codewhisperer.model.TriggerTypeInfo import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutomatedTriggerType @@ -29,10 +28,6 @@ class CodeWhispererRecommendationAction : AnAction(message("codewhisperer.trigge } override fun actionPerformed(e: AnActionEvent) { - val project = e.project ?: return - if (QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(project)) { - return - } val latencyContext = LatencyContext() latencyContext.codewhispererPreprocessingStart = System.nanoTime() latencyContext.codewhispererEndToEndStart = System.nanoTime() diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/AmazonQCodeFixSession.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/AmazonQCodeFixSession.kt index 7ed08eb511f..899fbd030a7 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/AmazonQCodeFixSession.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/AmazonQCodeFixSession.kt @@ -25,7 +25,6 @@ import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.core.utils.putNextEntry -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererZipUploadManager @@ -149,7 +148,6 @@ class AmazonQCodeFixSession(val project: Project) { .artifactType(artifactType) .uploadIntent(UploadIntent.CODE_FIX_GENERATION) .uploadContext(UploadContext.fromCodeFixUploadContext(CodeFixUploadContext.builder().codeFixName(codeFixName).build())) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() ) } catch (e: Exception) { @@ -178,7 +176,6 @@ class AmazonQCodeFixSession(val project: Project) { .ruleId(ruleId) .description(description) .referenceTrackerConfiguration { it.recommendationsWithReferences(includeCodeWithReference) } - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() return try { @@ -203,7 +200,6 @@ class AmazonQCodeFixSession(val project: Project) { val request = GetCodeFixJobRequest.builder() .jobId(jobId) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() val response = clientAdaptor.getCodeFixJob(request) @@ -230,11 +226,7 @@ class AmazonQCodeFixSession(val project: Project) { } private fun getCodeFixJob(jobId: String): GetCodeFixJobResponse { - val response = clientAdaptor.getCodeFixJob( - GetCodeFixJobRequest.builder() - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) - .jobId(jobId).build() - ) + val response = clientAdaptor.getCodeFixJob(GetCodeFixJobRequest.builder().jobId(jobId).build()) return response } private fun zipFile(file: Path): File = createTemporaryZipFile { diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt index 27e50d5351b..0a7bb0aea62 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt @@ -33,7 +33,6 @@ import software.aws.toolkits.core.utils.Waiters.waitUntil import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.PayloadContext import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor @@ -273,7 +272,6 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { .artifacts(artifactsMap) .scope(scope.value) .codeScanName(codeScanName) - .profileArn(QRegionProfileManager.getInstance().activeProfile(sessionContext.project)?.arn) .build() ) } catch (e: Exception) { @@ -287,7 +285,6 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { clientAdaptor.getCodeScan( GetCodeAnalysisRequest.builder() .jobId(jobId) - .profileArn(QRegionProfileManager.getInstance().activeProfile(sessionContext.project)?.arn) .build() ) } catch (e: Exception) { @@ -302,7 +299,6 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { .jobId(jobId) .codeAnalysisFindingsSchema(CodeAnalysisFindingsSchema.CODEANALYSIS_FINDINGS_1_0) .nextToken(nextToken) - .profileArn(QRegionProfileManager.getInstance().activeProfile(sessionContext.project)?.arn) .build() ) } catch (e: Exception) { diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt index aabefda3365..36e60c6aa9f 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt @@ -37,8 +37,10 @@ import software.amazon.awssdk.services.codewhispererruntime.model.TargetCode import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger +import software.aws.toolkits.jetbrains.core.awsClient +import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager +import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage import software.aws.toolkits.jetbrains.services.codewhisperer.model.SessionContextNew @@ -255,8 +257,11 @@ interface CodeWhispererClientAdaptor { } } -open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeWhispererClientAdaptor { - fun bearerClient() = QRegionProfileManager.getInstance().getQClient(project) +class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeWhispererClientAdaptor { + fun bearerClient(): CodeWhispererRuntimeClient = + ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.getConnectionSettings() + ?.awsClient() + ?: throw Exception("attempt to get bearer client while there is no valid credential") override fun generateCompletionsPaginator(firstRequest: GenerateCompletionsRequest) = sequence { var nextToken: String? = firstRequest.nextToken() @@ -283,9 +288,7 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW // DO NOT directly use this method to fetch customizations, use wrapper [CodeWhispererModelConfigurator.listCustomization()] instead override fun listAvailableCustomizations(): List = - bearerClient().listAvailableCustomizationsPaginator( - ListAvailableCustomizationsRequest.builder().profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn).build() - ) + bearerClient().listAvailableCustomizationsPaginator(ListAvailableCustomizationsRequest.builder().build()) .stream() .toList() .flatMap { resp -> @@ -308,7 +311,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW builder.uploadId(uploadId) builder.targetCodeList(targetCode) builder.userInput(userInput) - builder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) // TODO: client token } @@ -316,7 +318,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW bearerClient().getTestGeneration { builder -> builder.testGenerationJobId(jobId) builder.testGenerationJobGroupName(jobGroupName) - builder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendUserTriggerDecisionTelemetry( @@ -362,7 +363,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } } @@ -409,7 +409,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } } @@ -436,7 +435,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendUserModificationTelemetry( @@ -464,7 +462,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendCodeScanTelemetry( @@ -484,7 +481,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendCodeScanSucceededTelemetry( @@ -507,7 +503,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendCodeScanFailedTelemetry( @@ -527,7 +522,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendCodeFixGenerationTelemetry( @@ -554,7 +548,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendCodeFixAcceptanceTelemetry( @@ -581,7 +574,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendCodeScanRemediationTelemetry( @@ -613,7 +605,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendTestGenerationEvent( @@ -647,12 +638,10 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun listFeatureEvaluations(): ListFeatureEvaluationsResponse = bearerClient().listFeatureEvaluations { it.userContext(codeWhispererUserContext()) - it.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendMetricDataTelemetry(eventName: String, metadata: Map): SendTelemetryEventResponse = @@ -667,7 +656,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendChatAddMessageTelemetry( @@ -706,7 +694,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendChatInteractWithMessageTelemetry( @@ -736,7 +723,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendChatUserModificationTelemetry( @@ -761,7 +747,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } override fun sendInlineChatTelemetry( @@ -797,7 +782,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } requestBuilder.optOutPreference(getTelemetryOptOutPreference()) requestBuilder.userContext(codeWhispererUserContext()) - requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } companion object { 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 3dd88d45d22..4f7833a1fc0 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 @@ -8,15 +8,10 @@ import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.DefaultActionGroup import com.intellij.openapi.actionSystem.Separator -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 @@ -53,11 +48,18 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() { } override fun getChildren(e: AnActionEvent?) = e?.project?.let { - val isPendingActiveProfile = QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(it) buildList { - if (!isPendingActiveProfile) { - addAll(buildActionListForActiveProfileSelected(it, actionProvider)) - } + add(Separator.create()) + add(Separator.create(message("codewhisperer.statusbar.sub_menu.inline.title"))) + addAll(buildActionListForInlineSuggestions(it, actionProvider)) + + add(Separator.create()) + add(Separator.create(message("codewhisperer.statusbar.sub_menu.security_scans.title"))) + addAll(buildActionListForCodeScan(it, actionProvider)) + + add(Separator.create()) + add(Separator.create(message("codewhisperer.statusbar.sub_menu.other_features.title"))) + addAll(buildActionListForOtherFeatures(it, actionProvider)) add(Separator.create()) add(Separator.create(message("codewhisperer.statusbar.sub_menu.connect_help.title"))) @@ -65,10 +67,6 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() { 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)) @@ -76,21 +74,4 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() { } }.toTypedArray() }.orEmpty() - - private fun buildActionListForActiveProfileSelected( - project: Project, - actionProvider: ActionProvider, - ): List = buildList { - add(Separator.create()) - add(Separator.create(message("codewhisperer.statusbar.sub_menu.inline.title"))) - addAll(buildActionListForInlineSuggestions(project, actionProvider)) - - add(Separator.create()) - add(Separator.create(message("codewhisperer.statusbar.sub_menu.security_scans.title"))) - addAll(buildActionListForCodeScan(project, actionProvider)) - - add(Separator.create()) - add(Separator.create(message("codewhisperer.statusbar.sub_menu.other_features.title"))) - addAll(buildActionListForOtherFeatures(project, actionProvider)) - } } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererAutoTriggerHandler.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererAutoTriggerHandler.kt index 73b9f59be6f..fe73ff91e48 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererAutoTriggerHandler.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererAutoTriggerHandler.kt @@ -7,7 +7,6 @@ import com.intellij.openapi.editor.Editor import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.model.LatencyContext import software.aws.toolkits.jetbrains.services.codewhisperer.model.TriggerTypeInfo import software.aws.toolkits.telemetry.CodewhispererTriggerType @@ -18,10 +17,6 @@ interface CodeWhispererAutoTriggerHandler { automatedTriggerType: CodeWhispererAutomatedTriggerType, latencyContext: LatencyContext, ) { - val project = editor.project ?: return - if (QRegionProfileManager.getInstance().hasValidConnectionButNoActiveProfile(project)) { - return - } val triggerTypeInfo = TriggerTypeInfo(CodewhispererTriggerType.AutoTrigger, automatedTriggerType) LOG.debug { "autotriggering CodeWhisperer with type ${automatedTriggerType.telemetryType}" } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index e0d19aa2910..111ccdc509f 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -53,7 +53,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection import software.aws.toolkits.jetbrains.services.amazonq.SUPPLEMENTAL_CONTEXT_TIMEOUT -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManager @@ -232,8 +231,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { buildCodeWhispererRequest( requestContext.fileContextInfo, requestContext.awaitSupplementalContext(), - requestContext.customizationArn, - requestContext.profileArn + requestContext.customizationArn ) ) @@ -668,12 +666,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { // 5. customization val customizationArn = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn - val profileArn = QRegionProfileManager.getInstance().activeProfile(project)?.arn - - return RequestContext( - project, editor, triggerTypeInfo, caretPosition, fileContext, - supplementalContext, connection, latencyContext, customizationArn, profileArn - ) + return RequestContext(project, editor, triggerTypeInfo, caretPosition, fileContext, supplementalContext, connection, latencyContext, customizationArn) } fun validateResponse(response: GenerateCompletionsResponse): GenerateCompletionsResponse { @@ -807,7 +800,6 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { fileContextInfo: FileContextInfo, supplementalContext: SupplementalContextInfo?, customizationArn: String?, - profileArn: String?, ): GenerateCompletionsRequest { val programmingLanguage = ProgrammingLanguage.builder() .languageName(fileContextInfo.programmingLanguage.toCodeWhispererRuntimeLanguage().languageId) @@ -836,7 +828,6 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { .referenceTrackerConfiguration { it.recommendationsWithReferences(includeCodeWithReference) } .customizationArn(customizationArn) .optOutPreference(getTelemetryOptOutPreference()) - .profileArn(profileArn) .build() } } @@ -852,7 +843,6 @@ data class RequestContext( val connection: ToolkitConnection?, val latencyContext: LatencyContext, val customizationArn: String?, - val profileArn: String?, ) { // TODO: should make the entire getRequestContext() suspend function instead of making supplemental context only var supplementalContext: SupplementalContextInfo? = null diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt index 633a20ac0f9..c79ff7c0123 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt @@ -53,7 +53,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection import software.aws.toolkits.jetbrains.services.amazonq.SUPPLEMENTAL_CONTEXT_TIMEOUT -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManagerNew @@ -244,8 +243,7 @@ class CodeWhispererServiceNew(private val cs: CoroutineScope) : Disposable { buildCodeWhispererRequest( requestContext.fileContextInfo, requestContext.awaitSupplementalContext(), - requestContext.customizationArn, - requestContext.profileArn + requestContext.customizationArn ) ) @@ -709,9 +707,7 @@ class CodeWhispererServiceNew(private val cs: CoroutineScope) : Disposable { // 5. customization val customizationArn = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn - val profileArn = QRegionProfileManager.getInstance().activeProfile(project)?.arn - - return RequestContextNew(project, editor, triggerTypeInfo, caretPosition, fileContext, supplementalContext, connection, customizationArn, profileArn) + return RequestContextNew(project, editor, triggerTypeInfo, caretPosition, fileContext, supplementalContext, connection, customizationArn) } fun validateResponse(response: GenerateCompletionsResponse): GenerateCompletionsResponse { @@ -829,7 +825,6 @@ class CodeWhispererServiceNew(private val cs: CoroutineScope) : Disposable { fileContextInfo: FileContextInfo, supplementalContext: SupplementalContextInfo?, customizationArn: String?, - profileArn: String?, ): GenerateCompletionsRequest { val programmingLanguage = ProgrammingLanguage.builder() .languageName(fileContextInfo.programmingLanguage.toCodeWhispererRuntimeLanguage().languageId) @@ -858,7 +853,6 @@ class CodeWhispererServiceNew(private val cs: CoroutineScope) : Disposable { .referenceTrackerConfiguration { it.recommendationsWithReferences(includeCodeWithReference) } .customizationArn(customizationArn) .optOutPreference(getTelemetryOptOutPreference()) - .profileArn(profileArn) .build() } } @@ -873,7 +867,6 @@ data class RequestContextNew( private val supplementalContextDeferred: Deferred, val connection: ToolkitConnection?, val customizationArn: String?, - val profileArn: String?, ) { // TODO: should make the entire getRequestContext() suspend function instead of making supplemental context only var supplementalContext: SupplementalContextInfo? = null diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt index 9e328c54b81..1e36ceddc5d 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt @@ -6,6 +6,7 @@ package software.aws.toolkits.jetbrains.services.codewhisperer.util import com.intellij.openapi.actionSystem.DataKey import com.intellij.openapi.editor.markup.EffectType import com.intellij.openapi.editor.markup.TextAttributes +import com.intellij.openapi.util.registry.Registry import com.intellij.ui.JBColor import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.codewhispererruntime.model.AccessDeniedException @@ -153,8 +154,12 @@ object CodeWhispererConstants { } object Config { + val CODEWHISPERER_ENDPOINT + get() = System.getenv("__CODEWHISPERER_ENDPOINT") ?: Registry.get("amazon.q.endpoint").asString() + const val CODEWHISPERER_IDPOOL_ID = "us-east-1:70717e99-906f-4add-908c-bd9074a2f5b9" val Sigv4ClientRegion = Region.US_EAST_1 + val BearerClientRegion = Region.US_EAST_1 } object Customization { diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt index 8d74ecca7e0..004181a6ec5 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt @@ -17,12 +17,9 @@ import software.amazon.awssdk.core.retry.RetryPolicy import software.amazon.awssdk.http.SdkHttpRequest import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient import software.amazon.awssdk.http.nio.netty.ProxyConfiguration -import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClientBuilder import software.amazon.awssdk.services.codewhispererstreaming.CodeWhispererStreamingAsyncClientBuilder import software.aws.toolkits.core.ToolkitClientCustomizer -import software.aws.toolkits.core.utils.tryOrNull -import software.aws.toolkits.jetbrains.services.amazonq.profile.QEndpoints import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings import java.net.Proxy import java.net.URI @@ -40,12 +37,10 @@ class CodeWhispererEndpointCustomizer : ToolkitClientCustomizer { clientOverrideConfiguration: ClientOverrideConfiguration.Builder, ) { if (builder is CodeWhispererRuntimeClientBuilder || builder is CodeWhispererStreamingAsyncClientBuilder) { - val endpoint = tryOrNull { QEndpoints.getQEndpointWithRegion(regionId) } - ?.let { URI.create(it) } - ?: URI.create(QEndpoints.Q_DEFAULT_SERVICE_CONFIG.ENDPOINT) + val endpoint = URI.create(CodeWhispererConstants.Config.CODEWHISPERER_ENDPOINT) builder .endpointOverride(endpoint) - .region(Region.of(regionId)) + .region(CodeWhispererConstants.Config.BearerClientRegion) clientOverrideConfiguration.retryPolicy(RetryPolicy.none()) clientOverrideConfiguration.addExecutionInterceptor( object : ExecutionInterceptor { diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt index f964092a8d5..8d997645a14 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt @@ -22,7 +22,6 @@ import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.jetbrains.core.AwsClientManager import software.aws.toolkits.jetbrains.services.amazonq.RetryableOperation -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanServerException import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanSession.Companion.APPLICATION_ZIP import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanSession.Companion.AWS_KMS @@ -203,7 +202,6 @@ class CodeWhispererZipUploadManager(private val project: Project) { UploadContext.fromCodeAnalysisUploadContext(CodeAnalysisUploadContext.builder().codeScanName(taskName).build()) } ) - .profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) .build() ) }, diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt index 1d959b50c57..a82f8700eb4 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt @@ -176,7 +176,6 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov }, null, mock(), - aString(), aString() ) val responseContext = ResponseContext("sessionId") diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererFeatureConfigServiceTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererFeatureConfigServiceTest.kt index 378e2703756..56f6f66b517 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererFeatureConfigServiceTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererFeatureConfigServiceTest.kt @@ -3,7 +3,6 @@ package software.aws.toolkits.jetbrains.services.codewhisperer -import com.intellij.openapi.project.Project import com.intellij.testFramework.ApplicationRule import com.intellij.testFramework.DisposableRule import com.intellij.testFramework.ProjectRule @@ -35,7 +34,6 @@ 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.SONO_URL import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import kotlin.reflect.full.memberFunctions import kotlin.test.Test @@ -64,7 +62,7 @@ class CodeWhispererFeatureConfigServiceTest { @Test fun `test highlightCommand returns non-empty`() { - val mockClient = mockClientManagerRule.create().stub { + mockClientManagerRule.create().stub { on { listFeatureEvaluations(any()) } doReturn ListFeatureEvaluationsResponse.builder().featureEvaluations( listOf( FeatureEvaluation.builder() @@ -76,16 +74,9 @@ class CodeWhispererFeatureConfigServiceTest { ).build() } - projectRule.project.replaceService( - QRegionProfileManager::class.java, - mock { on { getQClient(any(), eq(CodeWhispererRuntimeClient::class)) } doReturn mockClient }, - disposableRule.disposable - ) - val mockTokenSettings = mock { on { providerId } doReturn "mock" on { region } doReturn AwsRegion.GLOBAL - on { withRegion(any()) } doReturn this.mock } val mockSsoConnection = mock { diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt index 962806f6327..1d5646d3869 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt @@ -212,8 +212,7 @@ class CodeWhispererServiceTest { supplementalContextDeferred = async { mockSupContext }, connection = ToolkitConnectionManager.getInstance(projectRule.project).activeConnection(), latencyContext = LatencyContext(), - customizationArn = "fake-arn", - profileArn = "fake-arn" + customizationArn = "fake-arn" ) ) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt index e000bbaeafc..a3e97f60c38 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt @@ -37,7 +37,6 @@ import software.aws.toolkits.jetbrains.core.credentials.MockCredentialManagerRul import software.aws.toolkits.jetbrains.core.credentials.MockToolkitAuthManagerRule import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.codeWhispererRecommendationActionId import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonFileName import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonResponse @@ -89,7 +88,6 @@ open class CodeWhispererTestBase { protected lateinit var settingsManager: CodeWhispererSettings private lateinit var originalExplorerActionState: CodeWhispererExploreActionState private lateinit var originalSettings: CodeWhispererConfiguration - private lateinit var qRegionProfileManagerSpy: QRegionProfileManager @Before open fun setUp() { @@ -171,16 +169,6 @@ open class CodeWhispererTestBase { val conn = authManagerRule.createConnection(ManagedSsoProfile("us-east-1", "url", Q_SCOPES)) ToolkitConnectionManager.getInstance(projectRule.project).switchConnection(conn) - - qRegionProfileManagerSpy = spy(QRegionProfileManager.getInstance()) - qRegionProfileManagerSpy.stub { - onGeneric { - hasValidConnectionButNoActiveProfile(any()) - } doAnswer { - false - } - } - ApplicationManager.getApplication().replaceService(QRegionProfileManager::class.java, qRegionProfileManagerSpy, disposableRule.disposable) } @After diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt index 172afa6fcf9..330ce9a092e 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt @@ -257,8 +257,7 @@ fun aRequestContext( Random.nextLong(), aString() ), - customizationArn = null, - profileArn = null + customizationArn = null ) } diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts index 1d033f1cc65..1be8f151a72 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts @@ -42,7 +42,6 @@ export const createMynahUI = ( codeScanEnabled: boolean, codeTestEnabled: boolean, highlightCommand?: QuickActionCommand, - profileName?: string ) => { let disclaimerCardActive = !disclaimerAcknowledged @@ -89,8 +88,7 @@ export const createMynahUI = ( isDocEnabled, isCodeScanEnabled, isCodeTestEnabled, - highlightCommand, - profileName + highlightCommand }) // eslint-disable-next-line prefer-const diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts index f94eb193c98..63682d596e7 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {ChatItemType, MynahUIDataModel, QuickActionCommandGroup, QuickActionCommand, ChatItem} from '@aws/mynah-ui-chat' +import { ChatItemType, MynahUIDataModel, QuickActionCommandGroup, QuickActionCommand } from '@aws/mynah-ui-chat' import { TabType } from '../storages/tabsStorage' import { FollowUpGenerator } from '../followUps/generator' import { QuickActionGenerator } from '../quickActions/generator' @@ -16,14 +16,12 @@ export interface TabDataGeneratorProps { isCodeScanEnabled: boolean isCodeTestEnabled: boolean highlightCommand?: QuickActionCommand - profileName?: string } export class TabDataGenerator { private followUpsGenerator: FollowUpGenerator public quickActionsGenerator: QuickActionGenerator public highlightCommand?: QuickActionCommand - profileName?: string private tabTitle: Map = new Map([ ['unknown', 'Chat'], @@ -93,20 +91,6 @@ What would you like to work on?`, isCodeTestEnabled: props.isCodeTestEnabled, }) this.highlightCommand = props.highlightCommand - this.profileName = props.profileName - } - - private get regionProfileCard(): ChatItem | undefined { - console.log('[DEBUG] Received profileName:', this.profileName) - if (!this.profileName) { - return undefined - } - return { - type: ChatItemType.ANSWER, - body: `You are using the ${this.profileName} profile for this chat period`, - status: 'info', - messageId: 'regionProfile', - } } public getTabData(tabType: TabType, needWelcomeMessages: boolean, taskName?: string): MynahUIDataModel { @@ -119,8 +103,7 @@ What would you like to work on?`, contextCommands: this.getContextCommands(tabType), chatItems: needWelcomeMessages ? [ - ...(this.regionProfileCard ? [this.regionProfileCard] : []), - { + { type: ChatItemType.ANSWER, body: this.tabWelcomeMessage.get(tabType), }, @@ -129,7 +112,7 @@ What would you like to work on?`, followUp: this.followUpsGenerator.generateWelcomeBlockForTab(tabType), }, ] - : [...(this.regionProfileCard ? [this.regionProfileCard] : [])], + : [], } } diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/welcome.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/welcome.ts index feb879d34f5..e5fe67fdd7b 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/welcome.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/welcome.ts @@ -14,14 +14,6 @@ export const welcomeScreenTabData = (tabs: TabDataGenerator): MynahUITabStoreTab tabTitle: 'Welcome to Q', tabBackground: true, chatItems: [ - ...(tabs.profileName - ? [{ - type: ChatItemType.ANSWER, - icon: MynahIcons.INFO, - messageId: 'profile-info', - body: `You're using the ${tabs.profileName} profile for this chat period.`, - }] - : []), { type: ChatItemType.ANSWER, icon: MynahIcons.ASTERISK, 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 79ecca81754..fab9733aa8d 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,13 +10,4 @@ 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.profile.usage.text=You changed profile -action.q.profile.usage=You're using the '{0}' profile for Amazon Q. -action.q.switchProfiles.text=Change profile -action.q.switchProfiles.dialog.text=Amazon Q Developer Profile -action.q.switchProfiles.dialog.account.label=Account: {0} -action.q.switchProfiles.dialog.panel.text=Change your Q Developer profile -action.q.switchProfiles.dialog.panel.description=Choose the profile that meets your current working needs. -action.q.switchProfiles.dialog.panel.warning=When you change profiles, you will no longer have access to your current customizations, chats, code reviews, or any other code or content being generated by Amazon Q. -general.ok=OK -general.cancel=Cancel +q.hello=Hello diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/CodeWhispererFeatureConfigService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/CodeWhispererFeatureConfigService.kt index d77663430fb..667e8e8f844 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/CodeWhispererFeatureConfigService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/CodeWhispererFeatureConfigService.kt @@ -12,9 +12,9 @@ import software.amazon.awssdk.services.codewhispererruntime.model.FeatureValue import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger +import software.aws.toolkits.jetbrains.core.awsClient import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.utils.isQExpired @Service @@ -32,9 +32,8 @@ class CodeWhispererFeatureConfigService { LOG.debug { "Fetching feature configs" } try { - val response = QRegionProfileManager.getInstance().getQClient(project).listFeatureEvaluations { + val response = connection.getConnectionSettings().awsClient().listFeatureEvaluations { it.userContext(codeWhispererUserContext()) - it.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn) } ?: return // Simply force overwrite feature configs from server response, no needed to check existing values. @@ -114,8 +113,7 @@ class CodeWhispererFeatureConfigService { val availableCustomizations = calculateIfIamIdentityCenterConnection(project) { try { - QRegionProfileManager.getInstance().getQClient(project) - .listAvailableCustomizationsPaginator {} + connection.getConnectionSettings().awsClient().listAvailableCustomizationsPaginator {} .flatMap { resp -> resp.customizations().map { it.arn() diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/clients/AmazonQStreamingClient.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/clients/AmazonQStreamingClient.kt index bfba92510f2..43c6e85c8b1 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/clients/AmazonQStreamingClient.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/clients/AmazonQStreamingClient.kt @@ -16,15 +16,20 @@ import software.amazon.awssdk.services.codewhispererstreaming.model.ThrottlingEx import software.amazon.awssdk.services.codewhispererstreaming.model.ValidationException import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn +import software.aws.toolkits.jetbrains.core.awsClient +import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager +import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.services.amazonq.RetryableOperation -import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import java.time.Instant import java.util.concurrent.TimeoutException import java.util.concurrent.atomic.AtomicReference @Service(Service.Level.PROJECT) class AmazonQStreamingClient(private val project: Project) { - private fun streamingBearerClient() = QRegionProfileManager.getInstance().getQClient(project) + private fun connection() = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) + ?: error("Attempted to use connection while one does not exist") + + private fun streamingBearerClient() = connection().getConnectionSettings().awsClient() suspend fun exportResultArchive( exportId: String, diff --git a/plugins/amazonq/src/main/resources/META-INF/plugin.xml b/plugins/amazonq/src/main/resources/META-INF/plugin.xml index 527df280cb8..05385174cfe 100644 --- a/plugins/amazonq/src/main/resources/META-INF/plugin.xml +++ b/plugins/amazonq/src/main/resources/META-INF/plugin.xml @@ -85,11 +85,7 @@ - + defaultValue="https://codewhisperer.us-east-1.amazonaws.com/" restartRequired="true"/> diff --git a/plugins/core/jetbrains-community/resources/telemetryOverride.json b/plugins/core/jetbrains-community/resources/telemetryOverride.json index d0f27341496..5ad09ab9c0e 100644 --- a/plugins/core/jetbrains-community/resources/telemetryOverride.json +++ b/plugins/core/jetbrains-community/resources/telemetryOverride.json @@ -1,20 +1,5 @@ { "types": [ - { - "name": "amazonQProfileRegion", - "type": "string", - "description": "Region of the Q Profile associated with a metric\n- \"n/a\" if metric is not associated with a profile or region.\n- \"not-set\" if metric is associated with a profile, but profile is unknown." - }, - { - "name": "ssoRegion", - "type": "string", - "description": "Region of the current SSO connection. Typically associated with credentialStartUrl\n- \"n/a\" if metric is not associated with a region.\n- \"not-set\" if metric is associated with a region, but region is unknown." - }, - { - "name": "profileCount", - "type": "int", - "description": "The number of profiles that were available to choose from" - }, { "name": "amazonqIndexFileSizeInMB", "type": "int", @@ -120,31 +105,6 @@ } ], "metrics": [ - { - "name": "amazonq_didSelectProfile", - "description": "Emitted after the user's Q Profile has been set, whether the user was prompted with a dialog, or a profile was automatically assigned after signing in.", - "metadata": [ - { "type": "source" }, - { "type": "amazonQProfileRegion" }, - { "type": "result" }, - { "type": "ssoRegion", "required": false }, - { "type": "credentialStartUrl", "required": false }, - { "type": "profileCount", "required": false } - ], - "passive": true - }, - { - "name": "amazonq_profileState", - "description": "Indicates a change in the user's Q Profile state", - "metadata": [ - { "type": "source" }, - { "type": "amazonQProfileRegion" }, - { "type": "result" }, - { "type": "ssoRegion", "required": false }, - { "type": "credentialStartUrl", "required": false } - ], - "passive": true - }, { "name": "amazonq_indexWorkspace", "description": "Indexing of local workspace", diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/help/HelpIds.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/help/HelpIds.kt index 73bf084b04b..1188db0a60c 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/help/HelpIds.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/help/HelpIds.kt @@ -125,12 +125,6 @@ enum class HelpIds(shortId: String, val url: String) { "ToolkitAddConnectionsDialog", "https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/setup-credentials.html" ), - - // TODO: update this - Q_SWITCH_PROFILES_DIALOG( - "QSwitchProfilesDialog", - "https://aws.amazon.com/q/developer/" - ), ; val id = "$HELP_ID_PREFIX.$shortId" diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt index 32f0a0e1576..01cc00c48fa 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt @@ -25,9 +25,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo JsonSubTypes.Type(value = BrowserMessage.CancelLogin::class, name = "cancelLogin"), JsonSubTypes.Type(value = BrowserMessage.Signout::class, name = "signout"), JsonSubTypes.Type(value = BrowserMessage.Reauth::class, name = "reauth"), - JsonSubTypes.Type(value = BrowserMessage.SendUiClickTelemetry::class, name = "sendUiClickTelemetry"), - JsonSubTypes.Type(value = BrowserMessage.SwitchProfile::class, name = "switchProfile"), - JsonSubTypes.Type(value = BrowserMessage.PublishWebviewTelemetry::class, name = "webviewTelemetry") + JsonSubTypes.Type(value = BrowserMessage.SendUiClickTelemetry::class, name = "sendUiClickTelemetry") ) sealed interface BrowserMessage { @@ -59,14 +57,5 @@ sealed interface BrowserMessage { object Reauth : BrowserMessage - data class SwitchProfile( - val profileName: String, - val accountId: String, - val region: String, - val arn: String, - ) : BrowserMessage - data class SendUiClickTelemetry(val signInOptionClicked: String?) : BrowserMessage - - data class PublishWebviewTelemetry(val event: String) : BrowserMessage } diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/LoginBrowser.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/LoginBrowser.kt index 2c9049f5b72..86970a2dfd2 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/LoginBrowser.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/LoginBrowser.kt @@ -406,26 +406,6 @@ abstract class LoginBrowser( return false } - // TODO: should test via handleMessage, however because we can't initiate Q/ToolkitLoginBrowser in test due to jcef not supported in test env - // plus handleMessage is abstract so as a interim, exposing it for testing purpose - @VisibleForTesting - fun publishTelemetry(message: BrowserMessage.PublishWebviewTelemetry) { - val jsonNode = this.objectMapper.readTree(message.event) ?: return - if (jsonNode["metricName"].asText() == "toolkit_didLoadModule") { - val moduleNode = jsonNode["module"] ?: return - val resultNode = jsonNode["result"] ?: return - val result = MetricResult.from(resultNode.asText()) - val reasonNode = jsonNode["reason"] - val durationNode = jsonNode["duration"] - Telemetry.toolkit.didLoadModule.use { span -> - span.module(moduleNode.asText()) - span.result(result) - span.reason(reasonNode?.asText()) - span.duration(durationNode?.asDouble()) - } - } - } - companion object { private val LOG = getLogger() fun getWebviewHTML(webScriptUri: String, query: JBCefJSQuery): String { diff --git a/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt b/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt index 883945535d4..0ee085f52e6 100644 --- a/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt +++ b/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt @@ -161,19 +161,6 @@ class BrowserMessageTest { signInOptionClicked = null ) ) - - assertDeserializedInstanceOf( - """ - { - "command": "webviewTelemetry", - "event": "{ \"metricName\": \"foo\" }" - } - """.trimIndent() - ).isEqualTo( - BrowserMessage.PublishWebviewTelemetry( - event = "{ \"metricName\": \"foo\" }" - ) - ) } @Test diff --git a/plugins/core/sdk-codegen/codegen-resources/codewhispererruntime/paginators-1.json b/plugins/core/sdk-codegen/codegen-resources/codewhispererruntime/paginators-1.json index 381687933c1..c0860a2f5a5 100644 --- a/plugins/core/sdk-codegen/codegen-resources/codewhispererruntime/paginators-1.json +++ b/plugins/core/sdk-codegen/codegen-resources/codewhispererruntime/paginators-1.json @@ -11,21 +11,9 @@ "limit_key": "maxResults", "result_key": "customizations" }, - "ListAvailableProfiles": { - "input_token": "nextToken", - "output_token": "nextToken", - "limit_key": "maxResults", - "result_key": "profiles" - }, "ListCodeAnalysisFindings": { "input_token": "nextToken", "output_token": "nextToken" - }, - "ListWorkspaceMetadata": { - "input_token": "nextToken", - "output_token": "nextToken", - "limit_key": "maxResults", - "result_key": "workspaces" } } } diff --git a/plugins/core/webview/src/ideClient.ts b/plugins/core/webview/src/ideClient.ts index 902e854d33f..0abed7d8527 100644 --- a/plugins/core/webview/src/ideClient.ts +++ b/plugins/core/webview/src/ideClient.ts @@ -2,8 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import {Store} from "vuex"; -import {IdcInfo, Region, Stage, State, BrowserSetupData, AwsBearerTokenConnection, Profile} from "./model"; -import {WebviewTelemetry} from './webviewTelemetry' +import {IdcInfo, Region, Stage, State, BrowserSetupData, AwsBearerTokenConnection} from "./model"; export class IdeClient { constructor(private readonly store: Store) {} @@ -11,18 +10,13 @@ export class IdeClient { // TODO: design and improve the API here prepareUi(state: BrowserSetupData) { - WebviewTelemetry.instance.reset() console.log('browser is preparing UI with state ', state) this.store.commit('setStage', state.stage) - // hack as window.onerror don't have access to vuex store - void ((window as any).uiState = state.stage) - WebviewTelemetry.instance.willShowPage(state.stage) this.store.commit('setSsoRegions', state.regions) this.updateLastLoginIdcInfo(state.idcInfo) this.store.commit("setCancellable", state.cancellable) this.store.commit("setFeature", state.feature) - this.store.commit('setProfiles', state.profiles); - this.store.commit("setErrorMessage", state.errorMessage) + const existConnections = state.existConnections.map(it => { return { sessionName: it.sessionName, @@ -37,13 +31,6 @@ export class IdeClient { this.updateAuthorization(undefined) } - handleProfiles(profilesData: { profiles: Profile[] }) { - this.store.commit('setStage', 'PROFILE_SELECT') - console.debug("received profile data") - const availableProfiles: Profile[] = profilesData.profiles; - this.store.commit('setProfiles', availableProfiles); - } - updateAuthorization(code: string | undefined) { this.store.commit('setAuthorizationCode', code) // TODO: mutage stage to AUTHing here probably makes life easier diff --git a/plugins/core/webview/src/model.ts b/plugins/core/webview/src/model.ts index d30f7f85eb7..424628e011b 100644 --- a/plugins/core/webview/src/model.ts +++ b/plugins/core/webview/src/model.ts @@ -7,9 +7,7 @@ export type BrowserSetupData = { idcInfo: IdcInfo, cancellable: boolean, feature: string, - existConnections: AwsBearerTokenConnection[], - profiles: Profile[], - errorMessage: string + existConnections: AwsBearerTokenConnection[] } // plugin interface [AwsBearerTokenConnection] @@ -28,8 +26,7 @@ export type Stage = 'CONNECTED' | 'AUTHENTICATING' | 'AWS_PROFILE' | - 'REAUTH' | - 'PROFILE_SELECT' + 'REAUTH' export type Feature = 'Q' | 'codecatalyst' | 'awsExplorer' @@ -53,10 +50,7 @@ export interface State { lastLoginIdcInfo: IdcInfo, feature: Feature, cancellable: boolean, - existingConnections: AwsBearerTokenConnection[], - profiles: Profile[], - selectedProfile: Profile | undefined, - errorMessage: string | undefined + existingConnections: AwsBearerTokenConnection[] } export enum LoginIdentifier { @@ -73,15 +67,6 @@ export interface LoginOption { requiresBrowser(): boolean } -export interface Profile { - profileName: string - accountId: string - region: string - arn: String -} - -export const GENERIC_PROFILE_LOAD_ERROR = "We couldn't load your Q Developer profiles. Please try again."; - export class LongLivedIAM implements LoginOption { id: LoginIdentifier = LoginIdentifier.IAM_CREDENTIAL diff --git a/plugins/core/webview/src/q-ui/components/login.vue b/plugins/core/webview/src/q-ui/components/login.vue index 6b31e1efe4d..260c44e6e95 100644 --- a/plugins/core/webview/src/q-ui/components/login.vue +++ b/plugins/core/webview/src/q-ui/components/login.vue @@ -4,7 +4,8 @@