Skip to content

Commit 83c52fc

Browse files
Merge branch 'main' into API-refactor
2 parents 8d8742e + 6d1f868 commit 83c52fc

File tree

15 files changed

+137
-95
lines changed

15 files changed

+137
-95
lines changed

.changes/3.58.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"date" : "2025-03-06",
3+
"version" : "3.58",
4+
"entries" : [ {
5+
"type" : "bugfix",
6+
"description" : "Amazon Q: Fix data isolation between tabs to prevent interference when using /doc in multiple tabs"
7+
}, {
8+
"type" : "removal",
9+
"description" : "The Amazon Q inline suggestion popup goes back to being under the suggestions and is always showing."
10+
} ]
11+
}

.changes/next-release/bugfix-79596dfc-37a0-44c8-adf2-a6c87ba806ac.json

-4
This file was deleted.

.changes/next-release/feature-0b164167-b04b-4a26-a59b-5ac41a717975.json

-4
This file was deleted.

.changes/next-release/removal-5b5b9cf3-701c-48b5-b232-96e726a9a860.json

-4
This file was deleted.

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# _3.58_ (2025-03-06)
2+
- **(Bug Fix)** Amazon Q: Fix data isolation between tabs to prevent interference when using /doc in multiple tabs
3+
- **(Removal)** The Amazon Q inline suggestion popup goes back to being under the suggestions and is always showing.
4+
15
# _3.57_ (2025-02-28)
26
- **(Bug Fix)** Fix suggestion not visible in remote for 2024.3
37
- **(Bug Fix)** /test: update capability card text

gradle.properties

+1-1
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.58-SNAPSHOT
5+
toolkitVersion=3.59-SNAPSHOT
66

77
# Publish Settings
88
publishToken=

gradle/libs.versions.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ kotlin = "2.0.0"
2424
kotlinCoroutines = "1.8.0"
2525
mockito = "5.12.0"
2626
mockitoKotlin = "5.4.0"
27-
mockk = "1.13.10"
27+
mockk = "1.13.17"
2828
nimbus-jose-jwt = "9.40"
2929
node-gradle = "7.0.2"
30-
telemetryGenerator = "1.0.301"
30+
telemetryGenerator = "1.0.307"
3131
testLogger = "4.0.0"
3232
testRetry = "1.5.10"
3333
# test-only; platform provides slf4j transitively at runtime

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class BrowserConnector(
6767
it.elementId(source.asText())
6868
}
6969
} else if (module != null && trigger != null) {
70-
Telemetry.toolkit.openModule.use {
70+
Telemetry.toolkit.willOpenModule.use {
7171
it.module(module.asText())
7272
it.source(trigger.asText())
7373
}

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import software.aws.toolkits.jetbrains.utils.isQConnected
5757
import software.aws.toolkits.resources.message
5858
import software.aws.toolkits.telemetry.AmazonqTelemetry
5959
import software.aws.toolkits.telemetry.MetricResult
60+
import software.aws.toolkits.telemetry.Status
6061
import java.io.ByteArrayInputStream
6162
import java.io.ByteArrayOutputStream
6263
import java.io.File
@@ -608,7 +609,8 @@ class CodeWhispererUTGChatManager(val project: Project, private val cs: Coroutin
608609
artifactsUploadDuration = session.artifactUploadDuration,
609610
buildPayloadBytes = session.srcPayloadSize,
610611
buildZipFileBytes = session.srcZipFileSize,
611-
requestId = session.startTestGenerationRequestId
612+
requestId = session.startTestGenerationRequestId,
613+
status = if (e.message == message("testgen.message.cancelled")) Status.CANCELLED else Status.FAILED,
612614
)
613615
session.isGeneratingTests = false
614616
} finally {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt

+7-3
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ import software.aws.toolkits.telemetry.AmazonqTelemetry
9898
import software.aws.toolkits.telemetry.FeatureId
9999
import software.aws.toolkits.telemetry.InteractionType
100100
import software.aws.toolkits.telemetry.MetricResult
101+
import software.aws.toolkits.telemetry.Status
101102
import software.aws.toolkits.telemetry.UiTelemetry
102103
import java.io.File
103104
import java.nio.file.Files
@@ -310,7 +311,8 @@ class CodeTestChatController(
310311
credentialStartUrl = getStartUrl(project),
311312
result = MetricResult.Succeeded,
312313
perfClientLatency = (Instant.now().toEpochMilli() - session.startTimeOfTestGeneration),
313-
requestId = id
314+
requestId = id,
315+
status = Status.ACCEPTED,
314316
)
315317
}
316318
session.isGeneratingTests = false
@@ -682,7 +684,8 @@ class CodeTestChatController(
682684
artifactsUploadDuration = session.artifactUploadDuration,
683685
buildPayloadBytes = session.srcPayloadSize,
684686
buildZipFileBytes = session.srcZipFileSize,
685-
requestId = session.startTestGenerationRequestId
687+
requestId = session.startTestGenerationRequestId,
688+
status = Status.ACCEPTED,
686689
)
687690
codeTestChatHelper.addAnswer(
688691
CodeTestChatMessageContent(
@@ -878,7 +881,8 @@ class CodeTestChatController(
878881
artifactsUploadDuration = session.artifactUploadDuration,
879882
buildPayloadBytes = session.srcPayloadSize,
880883
buildZipFileBytes = session.srcZipFileSize,
881-
requestId = session.startTestGenerationRequestId
884+
requestId = session.startTestGenerationRequestId,
885+
status = Status.REJECTED,
882886
)
883887
sessionCleanUp(message.tabId)
884888
}

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

+12-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ open class CodeWhispererCodeScanException(override val message: String?) : Runti
99

1010
open class CodeWhispererCodeFixException(override val message: String?) : RuntimeException()
1111

12-
open class CodeWhispererCodeScanServerException(override val message: String?) : RuntimeException()
12+
open class CodeWhispererCodeScanServerException(
13+
override val message: String?,
14+
val requestId: String?,
15+
val requestServiceType: String?,
16+
val httpStatusCode: String?,
17+
) : RuntimeException()
1318

1419
internal fun noFileOpenError(): Nothing =
1520
throw CodeWhispererCodeScanException(message("codewhisperer.codescan.no_file_open"))
@@ -29,8 +34,12 @@ internal fun fileFormatNotSupported(format: String): Nothing =
2934
internal fun fileTooLarge(): Nothing =
3035
throw CodeWhispererCodeScanException(message("codewhisperer.codescan.file_too_large"))
3136

32-
internal fun codeScanServerException(errorMessage: String): Nothing =
33-
throw CodeWhispererCodeScanServerException(errorMessage)
37+
internal fun codeScanServerException(
38+
errorMessage: String,
39+
requestId: String? = null,
40+
requestServiceType: String? = null,
41+
httpStatusCode: String? = null,
42+
): Nothing = throw CodeWhispererCodeScanServerException(errorMessage, requestId, requestServiceType, httpStatusCode)
3443

3544
internal fun invalidSourceZipError(): Nothing =
3645
throw CodeWhispererCodeScanException(message("codewhisperer.codescan.invalid_source_zip_telemetry"))

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

+4-33
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,16 @@ import com.fasterxml.jackson.databind.DeserializationFeature
77
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
88
import com.fasterxml.jackson.module.kotlin.readValue
99
import com.intellij.openapi.application.ApplicationInfo
10-
import com.intellij.openapi.application.ApplicationManager
1110
import com.intellij.openapi.application.runInEdt
1211
import com.intellij.openapi.application.runReadAction
1312
import com.intellij.openapi.fileEditor.FileDocumentManager
1413
import com.intellij.openapi.project.Project
15-
import com.intellij.openapi.project.modules
16-
import com.intellij.openapi.roots.ModuleRootManager
1714
import com.intellij.openapi.vfs.LocalFileSystem
1815
import kotlinx.coroutines.delay
1916
import kotlinx.coroutines.ensureActive
2017
import kotlinx.coroutines.isActive
2118
import kotlinx.coroutines.time.withTimeout
2219
import kotlinx.coroutines.withContext
23-
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
24-
import org.apache.commons.codec.digest.DigestUtils
2520
import software.amazon.awssdk.services.codewhisperer.model.ArtifactType
2621
import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema
2722
import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus
@@ -38,14 +33,12 @@ import software.aws.toolkits.core.utils.Waiters.waitUntil
3833
import software.aws.toolkits.core.utils.debug
3934
import software.aws.toolkits.core.utils.getLogger
4035
import software.aws.toolkits.core.utils.info
41-
import software.aws.toolkits.core.utils.toHexString
4236
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig
4337
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.PayloadContext
4438
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
4539
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
4640
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CodeScanResponseContext
4741
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CreateUploadUrlServiceInvocationContext
48-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryService
4942
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
5043
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_POLLING_INTERVAL_IN_SECONDS
5144
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.FILE_SCANS_THROTTLING_MESSAGE
@@ -59,14 +52,12 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
5952
import software.aws.toolkits.jetbrains.services.codewhisperer.util.getTelemetryErrorMessage
6053
import software.aws.toolkits.jetbrains.utils.assertIsNonDispatchThread
6154
import software.aws.toolkits.resources.message
62-
import software.aws.toolkits.telemetry.CodewhispererCodeScanScope
6355
import software.aws.toolkits.telemetry.CodewhispererLanguage
6456
import java.nio.file.Path
6557
import java.time.Duration
6658
import java.time.Instant
6759
import java.util.UUID
6860
import kotlin.coroutines.coroutineContext
69-
import kotlin.io.path.pathString
7061

7162
class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
7263
private val clientToken: UUID = UUID.randomUUID()
@@ -112,12 +103,12 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
112103
// 2 & 3. CreateUploadURL and upload the context.
113104
currentCoroutineContext.ensureActive()
114105
val artifactsUploadStartTime = now()
115-
val codeScanName = generateScanName()
106+
val codeScanName = UUID.randomUUID().toString()
116107

117-
val taskType = if (sessionContext.codeAnalysisScope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
118-
CodeWhispererConstants.UploadTaskType.SCAN_PROJECT
119-
} else {
108+
val taskType = if (isAutoScan()) {
120109
CodeWhispererConstants.UploadTaskType.SCAN_FILE
110+
} else {
111+
CodeWhispererConstants.UploadTaskType.SCAN_PROJECT
121112
}
122113

123114
val sourceZipUploadResponse =
@@ -375,26 +366,6 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
375366
private fun isAutoScan(): Boolean =
376367
sessionContext.codeAnalysisScope == CodeWhispererConstants.CodeAnalysisScope.FILE && !sessionContext.sessionConfig.isInitiatedByChat()
377368

378-
private fun generateScanName(): String {
379-
val clientId = AwsSettings.getInstance().clientId
380-
val filePath = sessionContext.sessionConfig.getSelectedFile()?.toNioPath()?.pathString
381-
val scope = CodeWhispererTelemetryService.getInstance().mapToTelemetryScope(
382-
sessionContext.codeAnalysisScope,
383-
sessionContext.sessionConfig.isInitiatedByChat()
384-
)
385-
val projectId = if (scope != CodewhispererCodeScanScope.PROJECT && filePath != null) {
386-
filePath
387-
} else {
388-
ApplicationManager.getApplication().runReadAction<String> {
389-
sessionContext.project.modules.map { module ->
390-
ModuleRootManager.getInstance(module).contentRoots.firstOrNull()?.path
391-
}.joinToString(",")
392-
}
393-
}
394-
395-
return DigestUtils.sha256("$clientId::$projectId::$scope").toHexString()
396-
}
397-
398369
companion object {
399370
private val LOG = getLogger<CodeWhispererCodeScanSession>()
400371
private val MAPPER = jacksonObjectMapper()

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererTelemetryService.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ class CodeWhispererTelemetryService {
285285
)
286286
}
287287

288-
fun mapToTelemetryScope(codeAnalysisScope: CodeWhispererConstants.CodeAnalysisScope, initiatedByChat: Boolean): CodewhispererCodeScanScope =
288+
private fun mapToTelemetryScope(codeAnalysisScope: CodeWhispererConstants.CodeAnalysisScope, initiatedByChat: Boolean): CodewhispererCodeScanScope =
289289
when (codeAnalysisScope) {
290290
CodeWhispererConstants.CodeAnalysisScope.FILE -> {
291291
if (initiatedByChat) {

0 commit comments

Comments
 (0)