Skip to content

Commit 0b8404b

Browse files
committed
Merge remote-tracking branch 'upstream/main' into cwspr-inline-lang
2 parents 4af7a0a + 348c254 commit 0b8404b

File tree

41 files changed

+670
-360
lines changed

Some content is hidden

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

41 files changed

+670
-360
lines changed

.changes/3.29.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"date" : "2024-09-19",
3+
"version" : "3.29",
4+
"entries" : [ {
5+
"type" : "feature",
6+
"description" : "Support `@workspace` queries for specific files like \"`@workspace` what does test.ts do?\". "
7+
}, {
8+
"type" : "bugfix",
9+
"description" : "Amazon Q Feature Dev: fix iteration count messaging during code insertion"
10+
}, {
11+
"type" : "bugfix",
12+
"description" : "Fix UI slowdown when Amazon Q Inline Suggestions are enabled, but token cannot be refreshed (#4868)"
13+
}, {
14+
"type" : "bugfix",
15+
"description" : "Fix \"read access\" error that may occur when Amazon Q Inline Suggestion is building context (#4888) (#4848)"
16+
} ]
17+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Amazon Q Code Transformation: notify users when no JDK is set in Project Structure settings"
4+
}

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# _3.29_ (2024-09-19)
2+
- **(Feature)** Support `@workspace` queries for specific files like "`@workspace` what does test.ts do?".
3+
- **(Bug Fix)** Amazon Q Feature Dev: fix iteration count messaging during code insertion
4+
- **(Bug Fix)** Fix UI slowdown when Amazon Q Inline Suggestions are enabled, but token cannot be refreshed ([#4868](https://github.com/aws/aws-toolkit-jetbrains/issues/4868))
5+
- **(Bug Fix)** Fix "read access" error that may occur when Amazon Q Inline Suggestion is building context ([#4888](https://github.com/aws/aws-toolkit-jetbrains/issues/4888)) ([#4848](https://github.com/aws/aws-toolkit-jetbrains/issues/4848))
6+
17
# _3.28_ (2024-09-11)
28
- **(Feature)** Improve workspace indexing by only index files that are changed since last indexing
39
- **(Bug Fix)** Amazon Q Chat: Fixed inline code blocks are not vertically aligned with texts

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.29-SNAPSHOT
5+
toolkitVersion=3.30-SNAPSHOT
66

77
# Publish Settings
88
publishToken=

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,6 @@ class FeatureDevController(
335335
)
336336
)
337337

338-
// Ensure that chat input is enabled so that customers can iterate over code generation if they choose to do so
339-
messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = true)
340338
messenger.sendUpdatePlaceholder(
341339
tabId = tabId,
342340
newPlaceholder = message("amazonqFeatureDev.placeholder.additional_improvements")
@@ -353,7 +351,13 @@ class FeatureDevController(
353351
}
354352

355353
private suspend fun newTask(tabId: String) {
356-
closeSession(tabId)
354+
val session = getSessionInfo(tabId)
355+
val sessionLatency = System.currentTimeMillis() - session.sessionStartTime
356+
AmazonqTelemetry.endChat(
357+
amazonqConversationId = session.conversationId,
358+
amazonqEndOfTheConversationLatency = sessionLatency.toDouble(),
359+
credentialStartUrl = getStartUrl(project = context.project)
360+
)
357361
chatSessionStorage.deleteSession(tabId)
358362

359363
newTabOpened(tabId)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevControllerExtensions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,13 @@ suspend fun FeatureDevController.onCodeGeneration(session: Session, message: Str
100100
tabId = tabId,
101101
messageType = FeatureDevMessageType.Answer,
102102
message = if (remainingIterations == 0) {
103+
message("amazonqFeatureDev.code_generation.iteration_zero")
104+
} else {
103105
message(
104106
"amazonqFeatureDev.code_generation.iteration_counts",
105107
remainingIterations,
106108
totalIterations
107109
)
108-
} else {
109-
message("amazonqFeatureDev.code_generation.iteration_zero")
110110
}
111111
)
112112
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/messenger/ChatPromptHandler.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
9090
ChatMessage(tabId = tabId, triggerId = triggerId, messageId = requestId, messageType = ChatMessageType.Answer, followUps = followUps)
9191

9292
telemetryHelper.setResponseStreamTotalTime(tabId)
93+
telemetryHelper.setResponseHasProjectContext(
94+
requestId,
95+
telemetryHelper.getIsProjectContextEnabled() && data.useRelevantDocuments && data.relevantTextDocuments.isNotEmpty()
96+
)
9397
telemetryHelper.recordAddMessage(data, response, responseText.length, statusCode, countTotalNumberOfCodeBlocks(responseText))
9498
emit(response)
9599
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/telemetry/TelemetryHelper.kt

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
4343
private val responseStreamStartTime: MutableMap<String, Instant> = mutableMapOf()
4444
private val responseStreamTotalTime: MutableMap<String, Int> = mutableMapOf()
4545
private val responseStreamTimeForChunks: MutableMap<String, MutableList<Instant>> = mutableMapOf()
46+
private val responseHasProjectContext: MutableMap<String, Boolean> = mutableMapOf()
4647

4748
private val customization: CodeWhispererCustomization?
4849
get() = CodeWhispererModelConfigurator.getInstance().activeCustomization(context.project)
@@ -65,7 +66,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
6566
TriggerType.ContextMenu, TriggerType.Hotkeys -> CwsprChatTriggerInteraction.ContextMenu
6667
}
6768

68-
private fun getIsProjectContextEnabled() = CodeWhispererSettings.getInstance().isProjectContextEnabled()
69+
fun getIsProjectContextEnabled() = CodeWhispererSettings.getInstance().isProjectContextEnabled()
6970

7071
// When chat panel is focused
7172
fun recordEnterFocusChat() {
@@ -116,7 +117,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
116117
cwsprChatConversationType = CwsprChatConversationType.Chat,
117118
credentialStartUrl = getStartUrl(context.project),
118119
codewhispererCustomizationArn = data.customization?.arn,
119-
cwsprChatHasProjectContext = getIsProjectContextEnabled() && data.useRelevantDocuments && data.relevantTextDocuments.isNotEmpty()
120+
cwsprChatHasProjectContext = getMessageHasProjectContext(response.messageId)
120121
)
121122

122123
val programmingLanguage = data.activeFileContext.fileContext?.fileLanguage
@@ -135,7 +136,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
135136
data.message.length,
136137
responseLength,
137138
numberOfCodeBlocks,
138-
getIsProjectContextEnabled() && data.useRelevantDocuments && data.relevantTextDocuments.isNotEmpty(),
139+
getMessageHasProjectContext(response.messageId),
139140
data.customization
140141
).also {
141142
logger.debug {
@@ -173,7 +174,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
173174
else -> CwsprChatInteractionType.Unknown
174175
},
175176
credentialStartUrl = getStartUrl(context.project),
176-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
177+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
177178
)
178179
ChatInteractWithMessageEvent.builder().apply {
179180
conversationId(getConversationId(message.tabId).orEmpty())
@@ -185,6 +186,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
185186
else -> ChatMessageInteractionType.UNKNOWN_TO_SDK_VERSION
186187
}
187188
)
189+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
188190
}.build()
189191
}
190192

@@ -194,12 +196,13 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
194196
cwsprChatMessageId = message.messageId.orEmpty(),
195197
cwsprChatInteractionType = CwsprChatInteractionType.ClickFollowUp,
196198
credentialStartUrl = getStartUrl(context.project),
197-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
199+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId.orEmpty())
198200
)
199201
ChatInteractWithMessageEvent.builder().apply {
200202
conversationId(getConversationId(message.tabId).orEmpty())
201203
messageId(message.messageId.orEmpty())
202204
interactionType(ChatMessageInteractionType.CLICK_FOLLOW_UP)
205+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId.orEmpty()))
203206
}.build()
204207
}
205208

@@ -214,14 +217,15 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
214217
credentialStartUrl = getStartUrl(context.project),
215218
cwsprChatCodeBlockIndex = message.codeBlockIndex,
216219
cwsprChatTotalCodeBlocks = message.totalCodeBlocks,
217-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
220+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
218221
)
219222
ChatInteractWithMessageEvent.builder().apply {
220223
conversationId(getConversationId(message.tabId).orEmpty())
221224
messageId(message.messageId)
222225
interactionType(ChatMessageInteractionType.COPY_SNIPPET)
223226
interactionTarget(message.insertionTargetType)
224227
acceptedCharacterCount(message.code.length)
228+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
225229
}.build()
226230
}
227231

@@ -237,7 +241,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
237241
credentialStartUrl = getStartUrl(context.project),
238242
cwsprChatCodeBlockIndex = message.codeBlockIndex,
239243
cwsprChatTotalCodeBlocks = message.totalCodeBlocks,
240-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
244+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
241245
)
242246
ChatInteractWithMessageEvent.builder().apply {
243247
conversationId(getConversationId(message.tabId).orEmpty())
@@ -246,6 +250,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
246250
interactionTarget(message.insertionTargetType)
247251
acceptedCharacterCount(message.code.length)
248252
acceptedLineCount(message.code.lines().size)
253+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
249254
}.build()
250255
}
251256

@@ -265,7 +270,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
265270
cwsprChatInteractionTarget = message.link,
266271
cwsprChatHasReference = null,
267272
credentialStartUrl = getStartUrl(context.project),
268-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
273+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
269274
)
270275
ChatInteractWithMessageEvent.builder().apply {
271276
conversationId(getConversationId(message.tabId).orEmpty())
@@ -278,6 +283,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
278283
}
279284
)
280285
interactionTarget(message.link)
286+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
281287
}.build()
282288
}
283289

@@ -364,6 +370,12 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
364370
responseStreamTotalTime[tabId] = totalTime
365371
}
366372

373+
fun setResponseHasProjectContext(messageId: String, hasProjectContext: Boolean) {
374+
responseHasProjectContext[messageId] = hasProjectContext
375+
}
376+
377+
private fun getMessageHasProjectContext(messageId: String) = responseHasProjectContext.getOrDefault(messageId, false)
378+
367379
@VisibleForTesting
368380
fun getResponseStreamTimeToFirstChunk(tabId: String): Double {
369381
val chunkTimes = responseStreamTimeForChunks[tabId] ?: return 0.0

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/editor/context/project/manifest/ManifestManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import software.aws.toolkits.jetbrains.core.getTextFromUrl
1515

1616
class ManifestManager {
1717
private val cloudFrontUrl = "https://aws-toolkit-language-servers.amazonaws.com/q-context/manifest.json"
18-
val currentVersion = "0.1.6"
18+
val currentVersion = "0.1.9"
1919
val currentOs = getOs()
2020
private val arch = CpuArch.CURRENT
2121
private val mapper = jacksonObjectMapper()

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/TelemetryHelperTest.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ class TelemetryHelperTest {
331331
messageId(messageId)
332332
interactionType(ChatMessageInteractionType.UPVOTE)
333333
customizationArn(customizationArn)
334+
hasProjectLevelContext(false)
334335
}.build()
335336
)
336337
)
@@ -362,6 +363,7 @@ class TelemetryHelperTest {
362363
}
363364

364365
runBlocking {
366+
sut.setResponseHasProjectContext(messageId, true)
365367
sut.recordInteractWithMessage(IncomingCwcMessage.FollowupClicked(mock(), tabId, messageId, "command", "tabType"))
366368
}
367369

@@ -373,6 +375,7 @@ class TelemetryHelperTest {
373375
messageId(messageId)
374376
interactionType(ChatMessageInteractionType.CLICK_FOLLOW_UP)
375377
customizationArn(customizationArn)
378+
hasProjectLevelContext(true)
376379
}.build()
377380
)
378381
)
@@ -391,7 +394,7 @@ class TelemetryHelperTest {
391394
)
392395
.matches({ it.metadata["credentialStartUrl"] == mockUrl }, "startUrl doesn't match")
393396
.matches(
394-
{ it.metadata["cwsprChatHasProjectContext"] == CodeWhispererSettings.getInstance().isProjectContextEnabled().toString() },
397+
{ it.metadata["cwsprChatHasProjectContext"] == "true" },
395398
"hasProjectContext doesn't match"
396399
)
397400
}
@@ -429,6 +432,7 @@ class TelemetryHelperTest {
429432
interactionTarget("insertionTargetType")
430433
acceptedCharacterCount("println()".length)
431434
customizationArn(customizationArn)
435+
hasProjectLevelContext(false)
432436
}.build()
433437
)
434438
)
@@ -462,7 +466,6 @@ class TelemetryHelperTest {
462466
mockClient.stub {
463467
on { this.sendChatInteractWithMessageTelemetry(any<ChatInteractWithMessageEvent>()) } doReturn mockSteResponse
464468
}
465-
466469
val codeBlockIndex = 1
467470
val totalCodeBlocks = 10
468471
val inserTionTargetType = "insertionTargetType"
@@ -493,6 +496,7 @@ class TelemetryHelperTest {
493496
acceptedCharacterCount(code.length)
494497
acceptedLineCount(code.lines().size)
495498
customizationArn(customizationArn)
499+
hasProjectLevelContext(false)
496500
}.build()
497501
)
498502
)
@@ -552,6 +556,7 @@ class TelemetryHelperTest {
552556
interactionType(ChatMessageInteractionType.CLICK_LINK)
553557
interactionTarget(link)
554558
customizationArn(customizationArn)
559+
hasProjectLevelContext(false)
555560
}.build()
556561
)
557562
)

0 commit comments

Comments
 (0)