Skip to content

Commit eae2fc6

Browse files
committed
Revert to 3.62
1 parent 1d94b45 commit eae2fc6

File tree

76 files changed

+171
-814
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+171
-814
lines changed

CHANGELOG.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
# _3.63_ (2025-04-08)
2-
- **(Feature)** Enterprise users can choose their preferred Amazon Q profile to improve personalization and workflow across different business regions
3-
- **(Bug Fix)** Amazon Q /doc: close diff tab and open README file in preview mode after user accept changes
4-
51
# _3.62_ (2025-04-03)
62
- **(Feature)** /review: automatically generate fix without clicking Generate Fix button
73
- **(Bug Fix)** /transform: prompt user to re-authenticate if credentials expire during transformation

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/common/clients/AmazonQCodeGenerateClient.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ import software.aws.toolkits.core.utils.error
3131
import software.aws.toolkits.core.utils.getLogger
3232
import software.aws.toolkits.core.utils.info
3333
import software.aws.toolkits.jetbrains.common.session.Intent
34+
import software.aws.toolkits.jetbrains.core.awsClient
3435
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
3536
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
3637
import software.aws.toolkits.jetbrains.services.amazonq.clients.AmazonQStreamingClient
37-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
3838
import software.aws.toolkits.jetbrains.services.amazonqDoc.FEATURE_EVALUATION_PRODUCT_NAME
3939
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.calculateTotalLatency
4040
import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata
@@ -72,7 +72,7 @@ class AmazonQCodeGenerateClient(private val project: Project) {
7272
fun connection() = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())
7373
?: error("Attempted to use connection while one does not exist")
7474

75-
fun bearerClient() = QRegionProfileManager.getInstance().getQClient<CodeWhispererRuntimeClient>(project)
75+
fun bearerClient() = connection().getConnectionSettings().awsClient<CodeWhispererRuntimeClient>()
7676

7777
private val amazonQStreamingClient
7878
get() = AmazonQStreamingClient.getInstance(project)
@@ -88,7 +88,6 @@ class AmazonQCodeGenerateClient(private val project: Project) {
8888
}
8989
requestBuilder.optOutPreference(getTelemetryOptOutPreference())
9090
requestBuilder.userContext(docUserContext)
91-
requestBuilder.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn)
9291
}
9392

9493
fun sendDocMetricData(operationName: String, result: String): SendTelemetryEventResponse =
@@ -119,9 +118,7 @@ class AmazonQCodeGenerateClient(private val project: Project) {
119118
}
120119

121120
fun createTaskAssistConversation(): CreateTaskAssistConversationResponse = bearerClient().createTaskAssistConversation(
122-
CreateTaskAssistConversationRequest.builder()
123-
.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn)
124-
.build()
121+
CreateTaskAssistConversationRequest.builder().build()
125122
)
126123

127124
fun createTaskAssistUploadUrl(conversationId: String, contentChecksumSha256: String, contentLength: Long): CreateUploadUrlResponse =
@@ -140,7 +137,6 @@ class AmazonQCodeGenerateClient(private val project: Project) {
140137
)
141138
.build()
142139
)
143-
.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn)
144140
}
145141

146142
fun startTaskAssistCodeGeneration(conversationId: String, uploadId: String, userMessage: String, intent: Intent): StartTaskAssistCodeGenerationResponse =
@@ -159,7 +155,6 @@ class AmazonQCodeGenerateClient(private val project: Project) {
159155
.uploadId(uploadId)
160156
}
161157
.intent(intent.name)
162-
.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn)
163158
}
164159

165160
fun getTaskAssistCodeGeneration(conversationId: String, codeGenerationId: String): GetTaskAssistCodeGenerationResponse = bearerClient()

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package software.aws.toolkits.jetbrains.services.amazonq
66
import com.intellij.openapi.Disposable
77
import com.intellij.openapi.actionSystem.AnActionEvent
88
import com.intellij.openapi.actionSystem.DataContext
9-
import com.intellij.openapi.application.ApplicationManager
109
import com.intellij.openapi.application.runInEdt
1110
import com.intellij.openapi.components.Service
1211
import com.intellij.openapi.components.service
@@ -34,16 +33,11 @@ import software.aws.toolkits.jetbrains.core.webview.BrowserState
3433
import software.aws.toolkits.jetbrains.core.webview.LoginBrowser
3534
import software.aws.toolkits.jetbrains.core.webview.WebviewResourceHandlerFactory
3635
import software.aws.toolkits.jetbrains.isDeveloperMode
37-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileSwitchIntent
38-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
39-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
4036
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
4137
import software.aws.toolkits.jetbrains.utils.isQConnected
4238
import software.aws.toolkits.jetbrains.utils.isQExpired
4339
import software.aws.toolkits.jetbrains.utils.isQWebviewsAvailable
4440
import software.aws.toolkits.telemetry.FeatureId
45-
import software.aws.toolkits.telemetry.MetricResult
46-
import software.aws.toolkits.telemetry.Telemetry
4741
import software.aws.toolkits.telemetry.UiTelemetry
4842
import software.aws.toolkits.telemetry.WebviewTelemetry
4943
import java.awt.event.ActionListener
@@ -210,18 +204,6 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos
210204
UiTelemetry.click(project, signInOption)
211205
}
212206
}
213-
214-
is BrowserMessage.SwitchProfile -> {
215-
QRegionProfileManager.getInstance().switchProfile(
216-
project,
217-
QRegionProfile(profileName = message.profileName, arn = message.arn),
218-
intent = QProfileSwitchIntent.Auth
219-
)
220-
}
221-
222-
is BrowserMessage.PublishWebviewTelemetry -> {
223-
publishTelemetry(message)
224-
}
225207
}
226208
}
227209

@@ -262,35 +244,13 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos
262244
}
263245

264246
// TODO: pass "REAUTH" if connection expires
265-
// Perform the potentially blocking AWS call outside the EDT to fetch available region profiles.
266-
ApplicationManager.getApplication().executeOnPooledThread {
267-
var errorMessage: String? = null
268-
val profiles: List<QRegionProfile> = try {
269-
QRegionProfileManager.getInstance().listRegionProfiles(project).orEmpty()
270-
} catch (e: Exception) {
271-
errorMessage = e.message
272-
LOG.warn { "Failed to call listRegionProfiles API" }
273-
val qConn = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())
274-
Telemetry.amazonq.didSelectProfile.use { span ->
275-
span.source(QProfileSwitchIntent.Auth.value)
276-
.amazonQProfileRegion(QRegionProfileManager.getInstance().activeProfile(project)?.region ?: "not-set")
277-
.ssoRegion((qConn as? AwsBearerTokenConnection)?.region)
278-
.credentialStartUrl((qConn as? AwsBearerTokenConnection)?.startUrl)
279-
.result(MetricResult.Failed)
280-
.reason(e.message)
281-
}
282-
emptyList()
283-
}
284-
285-
val stage = if (isQExpired(project)) {
286-
"REAUTH"
287-
} else if (isQConnected(project) && QRegionProfileManager.getInstance().isPendingProfileSelection(project)) {
288-
"PROFILE_SELECT"
289-
} else {
290-
"START"
291-
}
247+
val stage = if (isQExpired(project)) {
248+
"REAUTH"
249+
} else {
250+
"START"
251+
}
292252

293-
val jsonData = """
253+
val jsonData = """
294254
{
295255
stage: '$stage',
296256
regions: $regions,
@@ -301,16 +261,10 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos
301261
},
302262
cancellable: ${state.browserCancellable},
303263
feature: '${state.feature}',
304-
existConnections: ${writeValueAsString(selectionSettings.values.map { it.currentSelection }.toList())},
305-
profiles: ${writeValueAsString(profiles)},
306-
errorMessage: ${errorMessage?.let { "\"$it\"" } ?: "null"}
264+
existConnections: ${writeValueAsString(selectionSettings.values.map { it.currentSelection }.toList())}
307265
}
308-
""".trimIndent()
309-
310-
runInEdt {
311-
executeJS("window.ideClient.prepareUi($jsonData)")
312-
}
313-
}
266+
""".trimIndent()
267+
executeJS("window.ideClient.prepareUi($jsonData)")
314268
}
315269

316270
override fun loginIAM(profileName: String, accessKey: String, secretKey: String) {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1919
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
2020
import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState
2121
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
22-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
2322
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
2423
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
2524
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
@@ -53,9 +52,6 @@ class AmazonQStartupActivity : ProjectActivity {
5352
CodeWhispererExplorerActionManager.getInstance().setIsFirstRestartAfterQInstall(false)
5453
}
5554
}
56-
57-
QRegionProfileManager.getInstance().validateProfile(project)
58-
5955
startLsp(project)
6056
if (runOnce.get()) return
6157
emitUserState(project)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
2424
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector
2525
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction
2626
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType
27-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
2827
import software.aws.toolkits.jetbrains.services.amazonq.util.highlightCommand
2928
import software.aws.toolkits.jetbrains.services.amazonq.webview.BrowserConnector
3029
import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter
@@ -128,8 +127,7 @@ class AmazonQToolWindow private constructor(
128127
isCodeScanAvailable = isCodeScanAvailable(project),
129128
isCodeTestAvailable = isCodeTestAvailable(project),
130129
isDocAvailable = isDocAvailable(project),
131-
highlightCommand = highlightCommand(),
132-
activeProfile = QRegionProfileManager.getInstance().takeIf { it.shouldDisplayProfileInfo(project) }?.activeProfile(project)
130+
highlightCommand = highlightCommand()
133131
)
134132

135133
scope.launch {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ import com.intellij.ui.components.panels.Wrapper
1414
import com.intellij.util.ui.components.BorderLayoutPanel
1515
import software.aws.toolkits.core.utils.debug
1616
import software.aws.toolkits.core.utils.getLogger
17+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
1718
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
1819
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1920
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
2021
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
22+
import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
2123
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
2224
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
2325
import software.aws.toolkits.jetbrains.core.notifications.NotificationPanel
@@ -26,9 +28,6 @@ import software.aws.toolkits.jetbrains.core.webview.BrowserState
2628
import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
2729
import software.aws.toolkits.jetbrains.services.amazonq.RefreshQChatPanelButtonPressedListener
2830
import software.aws.toolkits.jetbrains.services.amazonq.gettingstarted.openMeetQPage
29-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
30-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
31-
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
3231
import software.aws.toolkits.jetbrains.utils.isQConnected
3332
import software.aws.toolkits.jetbrains.utils.isQExpired
3433
import software.aws.toolkits.jetbrains.utils.isQWebviewsAvailable
@@ -63,11 +62,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
6362
ToolkitConnectionManagerListener.TOPIC,
6463
object : ToolkitConnectionManagerListener {
6564
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
66-
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let { qConn ->
67-
openMeetQPage(project)
68-
QRegionProfileManager.getInstance().validateProfile(project)
69-
}
70-
prepareChatContent(project, qPanel)
65+
onConnectionChanged(project, newConnection, qPanel)
7166
}
7267
}
7368
)
@@ -76,7 +71,9 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
7671
RefreshQChatPanelButtonPressedListener.TOPIC,
7772
object : RefreshQChatPanelButtonPressedListener {
7873
override fun onRefresh() {
79-
prepareChatContent(project, qPanel)
74+
runInEdt {
75+
prepareChatContent(project, qPanel)
76+
}
8077
}
8178
}
8279
)
@@ -86,19 +83,12 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
8683
object : BearerTokenProviderListener {
8784
override fun onChange(providerId: String, newScopes: List<String>?) {
8885
if (ToolkitConnectionManager.getInstance(project).connectionStateForFeature(QConnection.getInstance()) == BearerTokenAuthState.AUTHORIZED) {
89-
prepareChatContent(project, qPanel)
90-
}
91-
}
92-
}
93-
)
86+
val qComponent = AmazonQToolWindow.getInstance(project).component
9487

95-
project.messageBus.connect(toolWindow.disposable).subscribe(
96-
QRegionProfileSelectedListener.TOPIC,
97-
object : QRegionProfileSelectedListener {
98-
override fun onProfileSelected(project: Project, profile: QRegionProfile?) {
99-
if (project.isDisposed) return
100-
AmazonQToolWindow.getInstance(project).disposeAndRecreate()
101-
prepareChatContent(project, qPanel)
88+
runInEdt {
89+
qPanel.setContent(qComponent)
90+
}
91+
}
10292
}
10393
}
10494
)
@@ -117,21 +107,13 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
117107
project: Project,
118108
qPanel: Wrapper,
119109
) {
120-
/**
121-
* only render Q Chat when
122-
* 1. There is a Q connection
123-
* 2. Q connection is not expired
124-
* 3. User is not pending region profile selection
125-
*/
126-
val component = if (isQConnected(project) && !isQExpired(project) && !QRegionProfileManager.getInstance().isPendingProfileSelection(project)) {
110+
val component = if (isQConnected(project) && !isQExpired(project)) {
127111
AmazonQToolWindow.getInstance(project).component
128112
} else {
129113
QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ))
130114
QWebviewPanel.getInstance(project).component
131115
}
132-
runInEdt {
133-
qPanel.setContent(component)
134-
}
116+
qPanel.setContent(component)
135117
}
136118

137119
override fun init(toolWindow: ToolWindow) {
@@ -152,6 +134,36 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
152134

153135
override fun shouldBeAvailable(project: Project): Boolean = isQWebviewsAvailable()
154136

137+
private fun onConnectionChanged(project: Project, newConnection: ToolkitConnection?, qPanel: Wrapper) {
138+
val isNewConnectionForQ = newConnection?.let {
139+
(it as? AwsBearerTokenConnection)?.let { conn ->
140+
val scopeShouldHave = Q_SCOPES
141+
142+
LOG.debug { "newConnection: ${conn.id}; scope: ${conn.scopes}; scope must-have: $scopeShouldHave" }
143+
144+
scopeShouldHave.all { s -> s in conn.scopes }
145+
} ?: false
146+
} ?: false
147+
148+
if (isNewConnectionForQ) {
149+
openMeetQPage(project)
150+
}
151+
152+
QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ))
153+
154+
// isQConnected alone is not robust and there is race condition (read/update connection states)
155+
val component = if (isNewConnectionForQ || (isQConnected(project) && !isQExpired(project))) {
156+
LOG.debug { "returning Q-chat window; isQConnection=$isNewConnectionForQ; hasPinnedConnection=$isNewConnectionForQ" }
157+
AmazonQToolWindow.getInstance(project).component
158+
} else {
159+
LOG.debug { "returning login window; no Q connection found" }
160+
QWebviewPanel.getInstance(project).component
161+
}
162+
runInEdt {
163+
qPanel.setContent(component)
164+
}
165+
}
166+
155167
companion object {
156168
private val LOG = getLogger<AmazonQToolWindowFactory>()
157169
const val WINDOW_ID = AMAZON_Q_WINDOW_ID

0 commit comments

Comments
 (0)