Skip to content

Commit 03a4f03

Browse files
authored
Merge branch 'main' into finding-telemetry
2 parents 9832d9e + 06e8c47 commit 03a4f03

36 files changed

+1132
-1404
lines changed

.changes/3.59.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"date" : "2025-03-13",
3+
"version" : "3.59",
4+
"entries" : [ {
5+
"type" : "feature",
6+
"description" : "AmazonQ /dev and /doc: Add support for complex workspaces."
7+
}, {
8+
"type" : "bugfix",
9+
"description" : "/review: normalize relative file path before unzipping"
10+
}, {
11+
"type" : "bugfix",
12+
"description" : "fix Q chat request timeout"
13+
} ]
14+
}

.changes/next-release/bugfix-d14f113a-e931-4247-aecb-26e8dd713467.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

.changes/next-release/bugfix-fd9065e5-2661-4250-852c-ec51deedd10f.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

.changes/next-release/feature-2c04c975-cdbf-4361-94e6-4010e68af8d9.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# _3.59_ (2025-03-13)
2+
- **(Feature)** AmazonQ /dev and /doc: Add support for complex workspaces.
3+
- **(Bug Fix)** /review: normalize relative file path before unzipping
4+
- **(Bug Fix)** fix Q chat request timeout
5+
16
# _3.58_ (2025-03-06)
27
- **(Bug Fix)** Amazon Q: Fix data isolation between tabs to prevent interference when using /doc in multiple tabs
38
- **(Removal)** The Amazon Q inline suggestion popup goes back to being under the suggestions and is always showing.

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# Toolkit Version
5-
toolkitVersion=3.59-SNAPSHOT
5+
toolkitVersion=3.60-SNAPSHOT
66

77
# Publish Settings
88
publishToken=

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanIssueDetailsPanel.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import com.intellij.ui.components.JBScrollPane
1717
import com.intellij.util.Alarm
1818
import kotlinx.coroutines.CoroutineScope
1919
import kotlinx.coroutines.launch
20+
import software.aws.toolkits.core.utils.getLogger
21+
import software.aws.toolkits.core.utils.warn
2022
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.context.CodeScanIssueDetailsDisplayType
2123
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.utils.additionBackgroundColor
2224
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.utils.additionForegroundColor
@@ -55,6 +57,7 @@ import javax.swing.ScrollPaneConstants
5557
import javax.swing.event.HyperlinkEvent
5658
import javax.swing.text.html.HTMLEditorKit
5759

60+
private val logger = getLogger<CodeWhispererCodeScanIssueDetailsPanel>()
5861
internal class CodeWhispererCodeScanIssueDetailsPanel(
5962
private val project: Project,
6063
issue: CodeWhispererCodeScanIssue,
@@ -66,6 +69,10 @@ internal class CodeWhispererCodeScanIssueDetailsPanel(
6669
private val codeScanManager = CodeWhispererCodeScanManager.getInstance(project)
6770

6871
private suspend fun handleGenerateFix(issue: CodeWhispererCodeScanIssue, isRegenerate: Boolean = false) {
72+
if (issue.ruleId == "sbom-software-assurance-services") {
73+
logger.warn { "GenerateFix is not available for SAS findings." }
74+
return
75+
}
6976
editorPane.text = getCodeScanIssueDetailsHtml(
7077
issue, CodeScanIssueDetailsDisplayType.DetailsPane, CodeWhispererConstants.FixGenerationState.GENERATING,
7178
project = project
@@ -235,6 +242,7 @@ internal class CodeWhispererCodeScanIssueDetailsPanel(
235242
}
236243
private val generateFixButton = JButton(message("codewhisperer.codescan.generate_fix_button_label")).apply {
237244
putClientProperty(DarculaButtonUI.DEFAULT_STYLE_KEY, true)
245+
isEnabled = issue.ruleId != "sbom-software-assurance-services"
238246
addActionListener {
239247
defaultScope.launch {
240248
handleGenerateFix(issue)

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ import kotlinx.coroutines.launch
5252
import kotlinx.coroutines.time.withTimeout
5353
import kotlinx.coroutines.withContext
5454
import org.jetbrains.annotations.TestOnly
55-
import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException
5655
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException
5756
import software.amazon.awssdk.services.codewhispererruntime.model.ThrottlingException
5857
import software.aws.toolkits.core.utils.WaiterTimeoutException
@@ -592,7 +591,7 @@ class CodeWhispererCodeScanManager(val project: Project) {
592591
}
593592
fun handleException(coroutineContext: CoroutineContext, e: Exception, scope: CodeWhispererConstants.CodeAnalysisScope): String {
594593
val errorMessage = when (e) {
595-
is CodeWhispererException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error")
594+
is CodeWhispererRuntimeException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error")
596595
is CodeWhispererCodeScanException -> getCodeScanExceptionMessage(e)
597596
is CodeWhispererCodeScanServerException -> getCodeScanServerExceptionMessage(e)
598597
is WaiterTimeoutException, is TimeoutCancellationException -> message("codewhisperer.codescan.scan_timed_out")
@@ -601,8 +600,8 @@ class CodeWhispererCodeScanManager(val project: Project) {
601600
else -> null
602601
} ?: message("codewhisperer.codescan.run_scan_error")
603602

604-
val errorCode = (e as? CodeWhispererException)?.awsErrorDetails()?.errorCode()
605-
val requestId = if (e is CodeWhispererException) e.requestId() else null
603+
val errorCode = (e as? CodeWhispererRuntimeException)?.awsErrorDetails()?.errorCode()
604+
val requestId = if (e is CodeWhispererRuntimeException) e.requestId() else null
606605

607606
if (!coroutineContext.isActive) {
608607
codeScanResultsPanel.setDefaultUI()
@@ -627,7 +626,7 @@ class CodeWhispererCodeScanManager(val project: Project) {
627626
}
628627

629628
val telemetryErrorMessage = when (e) {
630-
is CodeWhispererException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error_telemetry")
629+
is CodeWhispererRuntimeException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error_telemetry")
631630
is CodeWhispererCodeScanException -> when (e.message) {
632631
message("codewhisperer.codescan.no_file_open") -> message("codewhisperer.codescan.no_file_open_telemetry")
633632
message("codewhisperer.codescan.unsupported_language_error") -> message("codewhisperer.codescan.unsupported_language_error_telemetry")

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ import kotlinx.coroutines.ensureActive
1717
import kotlinx.coroutines.isActive
1818
import kotlinx.coroutines.time.withTimeout
1919
import kotlinx.coroutines.withContext
20-
import software.amazon.awssdk.services.codewhisperer.model.ArtifactType
21-
import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema
22-
import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus
23-
import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException
24-
import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanRequest
25-
import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse
26-
import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanRequest
27-
import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse
28-
import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest
29-
import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse
20+
import software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType
21+
import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema
22+
import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisStatus
23+
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException
3024
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlResponse
25+
import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisRequest
26+
import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse
27+
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest
28+
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse
3129
import software.amazon.awssdk.services.codewhispererruntime.model.Reference
30+
import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest
31+
import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse
3232
import software.aws.toolkits.core.utils.Waiters.waitUntil
3333
import software.aws.toolkits.core.utils.debug
3434
import software.aws.toolkits.core.utils.getLogger
@@ -146,7 +146,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
146146
}
147147
}
148148
var codeScanStatus = createCodeScanResponse.status()
149-
if (codeScanStatus == CodeScanStatus.FAILED) {
149+
if (codeScanStatus == CodeAnalysisStatus.FAILED) {
150150
if (isProjectScope()) {
151151
LOG.debug {
152152
"CodeWhisperer service error occurred. Something went wrong when creating a code review: $createCodeScanResponse " +
@@ -166,7 +166,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
166166

167167
// 5. Keep polling the API GetCodeScan to wait for results for a given timeout period.
168168
waitUntil(
169-
succeedOn = { codeScanStatus == CodeScanStatus.COMPLETED },
169+
succeedOn = { codeScanStatus == CodeAnalysisStatus.COMPLETED },
170170
maxDuration = Duration.ofSeconds(sessionContext.sessionConfig.overallJobTimeoutInSeconds())
171171
) {
172172
currentCoroutineContext.ensureActive()
@@ -183,7 +183,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
183183
}
184184
}
185185
delay(CODE_SCAN_POLLING_INTERVAL_IN_SECONDS * TOTAL_MILLIS_IN_SECOND)
186-
if (codeScanStatus == CodeScanStatus.FAILED) {
186+
if (codeScanStatus == CodeAnalysisStatus.FAILED) {
187187
if (isProjectScope()) {
188188
LOG.debug {
189189
"CodeWhisperer service error occurred. Something went wrong fetching results for code review: $getCodeScanResponse " +
@@ -206,12 +206,12 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
206206
)
207207

208208
val documents = mutableListOf<String>()
209-
documents.add(listCodeScanFindingsResponse.codeScanFindings())
209+
documents.add(listCodeScanFindingsResponse.codeAnalysisFindings())
210210
// coroutineContext helps to actively cancel the bigger projects quickly
211211
withContext(currentCoroutineContext) {
212212
while (listCodeScanFindingsResponse.nextToken() != null && currentCoroutineContext.isActive) {
213213
listCodeScanFindingsResponse = listCodeScanFindings(jobId, listCodeScanFindingsResponse.nextToken())
214-
documents.add(listCodeScanFindingsResponse.codeScanFindings())
214+
documents.add(listCodeScanFindingsResponse.codeAnalysisFindings())
215215
}
216216
}
217217

@@ -230,7 +230,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
230230
codeScanResponseContext = codeScanResponseContext.copy(reason = "Succeeded")
231231
return CodeScanResponse.Success(issues, codeScanResponseContext)
232232
} catch (e: Exception) {
233-
val exception = e as? CodeWhispererException
233+
val exception = e as? CodeWhispererRuntimeException
234234
val awsError = exception?.awsErrorDetails()
235235

236236
if (awsError != null) {
@@ -254,7 +254,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
254254
}
255255
}
256256

257-
fun createCodeScan(language: String, codeScanName: String): CreateCodeScanResponse {
257+
fun createCodeScan(language: String, codeScanName: String): StartCodeAnalysisResponse {
258258
val artifactsMap = mapOf(
259259
ArtifactType.SOURCE_CODE to urlResponse[ArtifactType.SOURCE_CODE]?.uploadId(),
260260
ArtifactType.BUILT_JARS to urlResponse[ArtifactType.BUILT_JARS]?.uploadId()
@@ -268,7 +268,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
268268

269269
try {
270270
return clientAdaptor.createCodeScan(
271-
CreateCodeScanRequest.builder()
271+
StartCodeAnalysisRequest.builder()
272272
.clientToken(clientToken.toString())
273273
.programmingLanguage { it.languageName(language) }
274274
.artifacts(artifactsMap)
@@ -283,9 +283,9 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
283283
}
284284
}
285285

286-
fun getCodeScan(jobId: String): GetCodeScanResponse = try {
286+
fun getCodeScan(jobId: String): GetCodeAnalysisResponse = try {
287287
clientAdaptor.getCodeScan(
288-
GetCodeScanRequest.builder()
288+
GetCodeAnalysisRequest.builder()
289289
.jobId(jobId)
290290
.build()
291291
)
@@ -295,11 +295,11 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
295295
throw codeScanServerException("GetCodeReviewException: $errorMessage")
296296
}
297297

298-
fun listCodeScanFindings(jobId: String, nextToken: String?): ListCodeScanFindingsResponse = try {
298+
fun listCodeScanFindings(jobId: String, nextToken: String?): ListCodeAnalysisFindingsResponse = try {
299299
clientAdaptor.listCodeScanFindings(
300-
ListCodeScanFindingsRequest.builder()
300+
ListCodeAnalysisFindingsRequest.builder()
301301
.jobId(jobId)
302-
.codeScanFindingsSchema(CodeScanFindingsSchema.CODESCAN_FINDINGS_1_0)
302+
.codeAnalysisFindingsSchema(CodeAnalysisFindingsSchema.CODEANALYSIS_FINDINGS_1_0)
303303
.nextToken(nextToken)
304304
.build()
305305
)

0 commit comments

Comments
 (0)