Skip to content

Commit c904a51

Browse files
authored
Merge branch 'main' into API-refactor
2 parents 3871952 + 3f3726b commit c904a51

File tree

61 files changed

+1861
-622
lines changed

Some content is hidden

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

61 files changed

+1861
-622
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.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "/review: normalize relative file path before unzipping"
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "fix Q chat request timeout"
4+
}

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

-4
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "AmazonQ /dev and /doc: Add support for complex workspaces."
4+
}

.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

buildspec/linuxIntegrationTests.yml

-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ phases:
1515
install:
1616
commands:
1717
- startDocker.sh
18-
# login to DockerHub so we don't get throttled
19-
- export DOCKER_USERNAME=`echo $DOCKER_HUB_TOKEN | jq -r '.username'`
20-
- export DOCKER_PASSWORD=`echo $DOCKER_HUB_TOKEN | jq -r '.password'`
21-
- docker login --username $DOCKER_USERNAME --password $DOCKER_PASSWORD || true
2218
# should probably be managed as an extension/rule in any tests that need a screen available
2319
- /usr/bin/Xvfb :22 -screen 0 1920x1080x24 &
2420

buildspec/linuxUiTests.yml

-5
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@ phases:
2121
commands:
2222
- dnf install -y marco mate-media e2fsprogs
2323
- startDesktop.sh
24-
25-
# login to DockerHub so we don't get throttled
26-
- export DOCKER_USERNAME=`echo $DOCKER_HUB_TOKEN | jq -r '.username'`
27-
- export DOCKER_PASSWORD=`echo $DOCKER_HUB_TOKEN | jq -r '.password'`
28-
- docker login --username $DOCKER_USERNAME --password $DOCKER_PASSWORD || true
2924
- export PATH="$PATH:$HOME/.dotnet/tools"
3025
- dotnet codeartifact-creds install
3126

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/common/session/SessionStateTypes.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package software.aws.toolkits.jetbrains.common.session
55

66
import software.aws.toolkits.jetbrains.common.util.AmazonQCodeGenService
7-
import software.aws.toolkits.jetbrains.services.amazonq.FeatureDevSessionContext
7+
import software.aws.toolkits.jetbrains.services.amazonq.project.FeatureDevSessionContext
88

99
open class SessionStateConfig(
1010
open val conversationId: String,

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

+19-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import software.aws.toolkits.core.utils.debug
3030
import software.aws.toolkits.core.utils.error
3131
import software.aws.toolkits.core.utils.getLogger
3232
import software.aws.toolkits.core.utils.info
33+
import software.aws.toolkits.jetbrains.core.credentials.sono.isInternalUser
3334
import software.aws.toolkits.jetbrains.services.amazonq.clients.AmazonQStreamingClient
3435
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.controller.CodeTestChatHelper
3536
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.messages.Button
@@ -55,6 +56,7 @@ import software.aws.toolkits.jetbrains.utils.isQConnected
5556
import software.aws.toolkits.resources.message
5657
import software.aws.toolkits.telemetry.AmazonqTelemetry
5758
import software.aws.toolkits.telemetry.MetricResult
59+
import software.aws.toolkits.telemetry.Status
5860
import java.io.ByteArrayInputStream
5961
import java.io.ByteArrayOutputStream
6062
import java.io.File
@@ -500,12 +502,25 @@ Please see the unit tests generated below. Click 'View Diff' to review the chang
500502
e is JsonParseException -> message("testgen.error.generic_technical_error_message")
501503
else -> message("testgen.error.generic_error_message")
502504
}
503-
505+
val buttonList = mutableListOf<Button>()
506+
if (isInternalUser(getStartUrl(project))) {
507+
buttonList.add(
508+
Button(
509+
"utg_feedback",
510+
message("testgen.button.feedback"),
511+
keepCardAfterClick = true,
512+
position = "outside",
513+
status = "info",
514+
icon = "comment"
515+
),
516+
)
517+
}
504518
codeTestChatHelper.addAnswer(
505519
CodeTestChatMessageContent(
506520
message = errorMessage,
507521
type = ChatMessageType.Answer,
508-
canBeVoted = false
522+
canBeVoted = false,
523+
buttons = buttonList
509524
)
510525
)
511526

@@ -525,7 +540,8 @@ Please see the unit tests generated below. Click 'View Diff' to review the chang
525540
artifactsUploadDuration = session.artifactUploadDuration,
526541
buildPayloadBytes = session.srcPayloadSize,
527542
buildZipFileBytes = session.srcZipFileSize,
528-
requestId = session.startTestGenerationRequestId
543+
requestId = session.startTestGenerationRequestId,
544+
status = if (e.message == message("testgen.message.cancelled")) Status.CANCELLED else Status.FAILED,
529545
)
530546
session.isGeneratingTests = false
531547
} finally {

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

+51-12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.intellij.diff.DiffManagerEx
99
import com.intellij.diff.requests.SimpleDiffRequest
1010
import com.intellij.ide.BrowserUtil
1111
import com.intellij.openapi.application.ApplicationManager
12+
import com.intellij.openapi.application.runInEdt
1213
import com.intellij.openapi.fileEditor.FileEditorManager
1314
import com.intellij.openapi.project.Project
1415
import com.intellij.openapi.project.guessProjectDir
@@ -53,6 +54,7 @@ import software.aws.toolkits.jetbrains.core.AwsClientManager
5354
import software.aws.toolkits.jetbrains.core.coroutines.EDT
5455
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
5556
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
57+
import software.aws.toolkits.jetbrains.core.credentials.sono.isInternalUser
5658
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
5759
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
5860
import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument
@@ -92,12 +94,14 @@ import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTri
9294
import software.aws.toolkits.jetbrains.services.cwc.editor.context.file.FileContext
9395
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
9496
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
97+
import software.aws.toolkits.jetbrains.ui.feedback.TestGenFeedbackDialog
9598
import software.aws.toolkits.jetbrains.utils.notifyError
9699
import software.aws.toolkits.resources.message
97100
import software.aws.toolkits.telemetry.AmazonqTelemetry
98101
import software.aws.toolkits.telemetry.FeatureId
99102
import software.aws.toolkits.telemetry.InteractionType
100103
import software.aws.toolkits.telemetry.MetricResult
104+
import software.aws.toolkits.telemetry.Status
101105
import software.aws.toolkits.telemetry.UiTelemetry
102106
import java.io.File
103107
import java.nio.file.Files
@@ -167,13 +171,14 @@ class CodeTestChatController(
167171
override suspend fun processStartTestGen(message: IncomingCodeTestMessage.StartTestGen) {
168172
codeTestChatHelper.setActiveCodeTestTabId(message.tabId)
169173
val session = codeTestChatHelper.getActiveSession()
174+
if (session.isGeneratingTests) {
175+
return
176+
}
177+
sessionCleanUp(session.tabId)
170178
// check if IDE has active file open, yes return (fileName and filePath) else return null
171179
val project = context.project
172180
val fileInfo = checkActiveFileInIDE(project, message) ?: return
173181
session.programmingLanguage = fileInfo.fileLanguage
174-
if (session.isGeneratingTests === true) {
175-
return
176-
}
177182
session.startTimeOfTestGeneration = Instant.now().toEpochMilli().toDouble()
178183
session.isGeneratingTests = true
179184

@@ -310,7 +315,8 @@ class CodeTestChatController(
310315
credentialStartUrl = getStartUrl(project),
311316
result = MetricResult.Succeeded,
312317
perfClientLatency = (Instant.now().toEpochMilli() - session.startTimeOfTestGeneration),
313-
requestId = id
318+
requestId = id,
319+
status = Status.ACCEPTED,
314320
)
315321
}
316322
session.isGeneratingTests = false
@@ -563,7 +569,7 @@ class CodeTestChatController(
563569
session.linesOfCodeGenerated = lineDifference.coerceAtLeast(0)
564570
session.charsOfCodeGenerated = charDifference.coerceAtLeast(0)
565571
session.latencyOfTestGeneration = (Instant.now().toEpochMilli() - session.startTimeOfTestGeneration)
566-
UiTelemetry.click(null as Project?, "unitTestGeneration_viewDiff")
572+
UiTelemetry.click(context.project, "unitTestGeneration_viewDiff")
567573

568574
val buttonList = mutableListOf<Button>()
569575
buttonList.add(
@@ -661,7 +667,7 @@ class CodeTestChatController(
661667
testGenerationEventResponse.responseMetadata().requestId()}"
662668
}
663669

664-
UiTelemetry.click(null as Project?, "unitTestGeneration_acceptDiff")
670+
UiTelemetry.click(context.project, "unitTestGeneration_acceptDiff")
665671

666672
AmazonqTelemetry.utgGenerateTests(
667673
cwsprChatProgrammingLanguage = session.programmingLanguage.languageId,
@@ -683,16 +689,17 @@ class CodeTestChatController(
683689
artifactsUploadDuration = session.artifactUploadDuration,
684690
buildPayloadBytes = session.srcPayloadSize,
685691
buildZipFileBytes = session.srcZipFileSize,
686-
requestId = session.startTestGenerationRequestId
692+
requestId = session.startTestGenerationRequestId,
693+
status = Status.ACCEPTED,
687694
)
688695
codeTestChatHelper.addAnswer(
689696
CodeTestChatMessageContent(
690697
message = message("testgen.message.success"),
691698
type = ChatMessageType.Answer,
692-
canBeVoted = false
699+
canBeVoted = false,
700+
buttons = this.showFeedbackButton()
693701
)
694702
)
695-
sessionCleanUp(session.tabId)
696703
codeTestChatHelper.updateUI(
697704
promptInputDisabledState = false,
698705
promptInputPlaceholder = message("testgen.placeholder.enter_slash_quick_actions"),
@@ -838,7 +845,8 @@ class CodeTestChatController(
838845
CodeTestChatMessageContent(
839846
message = message("testgen.message.success"),
840847
type = ChatMessageType.Answer,
841-
canBeVoted = false
848+
canBeVoted = false,
849+
buttons = this.showFeedbackButton()
842850
)
843851
)
844852
val testGenerationEventResponse = client.sendTestGenerationEvent(
@@ -879,9 +887,13 @@ class CodeTestChatController(
879887
artifactsUploadDuration = session.artifactUploadDuration,
880888
buildPayloadBytes = session.srcPayloadSize,
881889
buildZipFileBytes = session.srcZipFileSize,
882-
requestId = session.startTestGenerationRequestId
890+
requestId = session.startTestGenerationRequestId,
891+
status = Status.REJECTED,
883892
)
884-
sessionCleanUp(message.tabId)
893+
}
894+
"utg_feedback" -> {
895+
sendFeedback()
896+
UiTelemetry.click(context.project, "unitTestGeneration_provideFeedback")
885897
}
886898
"utg_skip_and_finish" -> {
887899
codeTestChatHelper.addAnswer(
@@ -1370,6 +1382,33 @@ class CodeTestChatController(
13701382
println(message)
13711383
}
13721384

1385+
private fun sendFeedback() {
1386+
runInEdt {
1387+
TestGenFeedbackDialog(
1388+
context.project,
1389+
codeTestChatHelper.getActiveSession().startTestGenerationRequestId,
1390+
codeTestChatHelper.getActiveSession().testGenerationJob
1391+
).show()
1392+
}
1393+
}
1394+
1395+
private fun showFeedbackButton(): MutableList<Button> {
1396+
val buttonList = mutableListOf<Button>()
1397+
if (isInternalUser(getStartUrl(context.project))) {
1398+
buttonList.add(
1399+
Button(
1400+
"utg_feedback",
1401+
message("testgen.button.feedback"),
1402+
keepCardAfterClick = true,
1403+
position = "outside",
1404+
status = "info",
1405+
icon = "comment"
1406+
),
1407+
)
1408+
}
1409+
return buttonList
1410+
}
1411+
13731412
companion object {
13741413
private val LOG = getLogger<CodeTestChatController>()
13751414

0 commit comments

Comments
 (0)