Skip to content

Commit d8bcbcb

Browse files
authored
Merge branch 'main' into manodnyb/addSourceToMetrics
2 parents 3668c49 + 7e4f6e3 commit d8bcbcb

File tree

27 files changed

+591
-72
lines changed

27 files changed

+591
-72
lines changed
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 Feature Dev: Add error messages when the upload URL expires"
4+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ class CodeIterationLimitError(override val message: String, override val cause:
1616

1717
class MonthlyConversationLimitError(override val message: String, override val cause: Throwable?) : RuntimeException()
1818

19+
class UploadURLExpired(
20+
override val message: String = message(
21+
"amazonqFeatureDev.exception.upload_url_expiry"
22+
),
23+
override val cause: Throwable? = null,
24+
) : FeatureDevException(message, cause)
25+
1926
internal fun featureDevServiceError(message: String?): Nothing =
2027
throw FeatureDevException(message)
2128

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FeatureDevExce
3636
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.InboundAppMessagesHandler
3737
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ModifySourceFolderErrorReason
3838
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MonthlyConversationLimitError
39+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.UploadURLExpired
3940
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ZipFileError
4041
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.createUserFacingErrorMessage
4142
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.denyListedErrors
@@ -444,6 +445,12 @@ class FeatureDevController(
444445
messenger.sendMonthlyLimitError(tabId = tabId)
445446
messenger.sendChatInputEnabledMessage(tabId, enabled = false)
446447
}
448+
is UploadURLExpired -> messenger.sendAnswer(
449+
tabId = tabId,
450+
message = err.message,
451+
messageType = FeatureDevMessageType.Answer,
452+
canBeVoted = true
453+
)
447454
is FeatureDevException -> {
448455
messenger.sendError(
449456
tabId = tabId,
@@ -471,7 +478,6 @@ class FeatureDevController(
471478
),
472479
)
473480
}
474-
475481
else -> {
476482
var msg = createUserFacingErrorMessage("$FEATURE_NAME request failed: ${err.message ?: err.cause?.message}")
477483
val isDenyListedError = denyListedErrors.any { msg?.contains(it) ?: false }

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/util/UploadArtifact.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.CONTENT_SHA256
1414
import software.aws.toolkits.jetbrains.services.amazonq.SERVER_SIDE_ENCRYPTION
1515
import software.aws.toolkits.jetbrains.services.amazonq.SERVER_SIDE_ENCRYPTION_AWS_KMS_KEY_ID
1616
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FEATURE_NAME
17+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.UploadURLExpired
1718
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.clients.FeatureDevClient
1819
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.uploadCodeError
1920
import java.io.File
@@ -36,9 +37,13 @@ fun uploadArtifactToS3(url: String, fileToUpload: File, checksumSha256: String,
3637
connection.setFixedLengthStreamingMode(fileToUpload.length())
3738
IoUtils.copy(fileToUpload.inputStream(), connection.outputStream)
3839
}
39-
} catch (err: Exception) {
40+
} catch (err: HttpRequests.HttpStatusException) {
4041
logger.warn(err) { "$FEATURE_NAME: Failed to upload code to S3" }
41-
uploadCodeError()
42+
43+
when (err.statusCode) {
44+
403 -> throw UploadURLExpired()
45+
else -> uploadCodeError()
46+
}
4247
}
4348
}
4449

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

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,14 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
5858
.onStart {
5959
// The first thing we always send back is an AnswerStream message to indicate the beginning of a streaming answer
6060
val response =
61-
ChatMessage(tabId = tabId, triggerId = triggerId, messageId = requestId, messageType = ChatMessageType.AnswerStream, message = "")
61+
ChatMessage(
62+
tabId = tabId,
63+
triggerId = triggerId,
64+
messageId = requestId,
65+
messageType = ChatMessageType.AnswerStream,
66+
message = "",
67+
userIntent = data.userIntent,
68+
)
6269

6370
telemetryHelper.setResponseStreamStartTime(tabId)
6471
emit(response)
@@ -81,13 +88,20 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
8188
messageType = ChatMessageType.AnswerPart,
8289
message = responseText.toString(),
8390
relatedSuggestions = relatedSuggestions,
91+
userIntent = data.userIntent,
8492
)
8593
emit(suggestionMessage)
8694
}
8795

8896
// Send the Answer message to indicate the end of the response stream
89-
val response =
90-
ChatMessage(tabId = tabId, triggerId = triggerId, messageId = requestId, messageType = ChatMessageType.Answer, followUps = followUps)
97+
val response = ChatMessage(
98+
tabId = tabId,
99+
triggerId = triggerId,
100+
messageId = requestId,
101+
messageType = ChatMessageType.Answer,
102+
followUps = followUps,
103+
userIntent = data.userIntent,
104+
)
91105

92106
telemetryHelper.setResponseStreamTotalTime(tabId)
93107
telemetryHelper.setResponseHasProjectContext(
@@ -119,11 +133,23 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
119133
}
120134
}
121135
.collect { responseEvent ->
122-
processChatEvent(tabId, triggerId, responseEvent, shouldAddIndexInProgressMessage)?.let { emit(it) }
136+
processChatEvent(
137+
tabId,
138+
triggerId,
139+
data,
140+
responseEvent,
141+
shouldAddIndexInProgressMessage
142+
)?.let { emit(it) }
123143
}
124144
}
125145

126-
private fun processChatEvent(tabId: String, triggerId: String, event: ChatResponseEvent, shouldAddIndexInProgressMessage: Boolean): ChatMessage? {
146+
private fun processChatEvent(
147+
tabId: String,
148+
triggerId: String,
149+
data: ChatRequestData,
150+
event: ChatResponseEvent,
151+
shouldAddIndexInProgressMessage: Boolean,
152+
): ChatMessage? {
127153
requestId = event.requestId
128154
statusCode = event.statusCode
129155

@@ -190,6 +216,7 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
190216
messageType = ChatMessageType.AnswerPart,
191217
message = message,
192218
codeReference = codeReferences,
219+
userIntent = data.userIntent,
193220
)
194221
} else {
195222
null

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/messages/CwcMessage.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ data class ChatMessage(
213213
val followUpsHeader: String? = null,
214214
val relatedSuggestions: List<Suggestion>? = null,
215215
val codeReference: List<CodeReference>? = null,
216+
val userIntent: UserIntent? = null,
216217
) : UiMessage(
217218
tabId = tabId,
218219
type = "chatMessage",

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/CodeWhispererLanguageManager.kt

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,31 @@ import com.intellij.psi.PsiFile
1010
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererC
1111
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererCpp
1212
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererCsharp
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererDart
1314
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererGo
1415
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJava
1516
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJavaScript
1617
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJson
1718
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJsx
1819
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererKotlin
20+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererLua
1921
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPhp
2022
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPlainText
23+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPowershell
2124
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPython
25+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererR
2226
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererRuby
2327
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererRust
2428
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererScala
2529
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererShell
2630
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererSql
31+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererSwift
32+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererSystemVerilog
2733
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererTf
2834
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererTsx
2935
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererTypeScript
3036
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererUnknownLanguage
37+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererVue
3138
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererYaml
3239

3340
@Service
@@ -73,8 +80,15 @@ class CodeWhispererLanguageManager {
7380
fileTypeName.contains("php") -> CodeWhispererPhp.INSTANCE
7481
fileTypeName.contains("sql") -> CodeWhispererSql.INSTANCE
7582
fileTypeName.contains("go") -> CodeWhispererGo.INSTANCE
76-
fileTypeName.contains("shell") -> CodeWhispererShell.INSTANCE
7783
fileTypeName.contains("rust") -> CodeWhispererRust.INSTANCE
84+
fileTypeName.contains("swift") -> CodeWhispererSwift.INSTANCE
85+
fileTypeName.contains("lua") -> CodeWhispererLua.INSTANCE
86+
fileTypeName.contains("dart") -> CodeWhispererDart.INSTANCE
87+
fileTypeName.contains("vue") -> CodeWhispererVue.INSTANCE
88+
fileTypeName.contains("systemverilog") -> CodeWhispererSystemVerilog.INSTANCE
89+
fileTypeName.contains("powershell") -> CodeWhispererPowershell.INSTANCE
90+
fileTypeName.contains("shell") -> CodeWhispererShell.INSTANCE
91+
fileTypeName == "r" -> CodeWhispererR.INSTANCE
7892
// fileTypeName.contains("plain_text") -> CodeWhispererPlainText.INSTANCE // This needs to be removed because Hcl files are recognised as plain_text by JB
7993
else -> null
8094
}
@@ -125,7 +139,14 @@ class CodeWhispererLanguageManager {
125139
listOf("go") to CodeWhispererGo.INSTANCE,
126140
listOf("php") to CodeWhispererPhp.INSTANCE,
127141
listOf("sql") to CodeWhispererSql.INSTANCE,
128-
listOf("txt") to CodeWhispererPlainText.INSTANCE
142+
listOf("txt") to CodeWhispererPlainText.INSTANCE,
143+
listOf("sv", "svh", "vh") to CodeWhispererSystemVerilog.INSTANCE,
144+
listOf("dart") to CodeWhispererDart.INSTANCE,
145+
listOf("lua", "wlua") to CodeWhispererLua.INSTANCE,
146+
listOf("swift") to CodeWhispererSwift.INSTANCE,
147+
listOf("vue") to CodeWhispererVue.INSTANCE,
148+
listOf("ps1", "psm1") to CodeWhispererPowershell.INSTANCE,
149+
listOf("r") to CodeWhispererR.INSTANCE,
129150
).map {
130151
val exts = it.first
131152
val lang = it.second
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.language.languages
5+
6+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7+
import software.aws.toolkits.telemetry.CodewhispererLanguage
8+
9+
class CodeWhispererDart private constructor() : CodeWhispererProgrammingLanguage() {
10+
override val languageId: String = ID
11+
12+
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Dart
13+
14+
override fun isCodeCompletionSupported(): Boolean = true
15+
16+
companion object {
17+
// TODO: confirm with service team language id
18+
const val ID = "dart"
19+
20+
val INSTANCE = CodeWhispererDart()
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.language.languages
5+
6+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7+
import software.aws.toolkits.telemetry.CodewhispererLanguage
8+
9+
class CodeWhispererLua private constructor() : CodeWhispererProgrammingLanguage() {
10+
override val languageId: String = ID
11+
12+
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Lua
13+
14+
override fun isCodeCompletionSupported(): Boolean = true
15+
16+
companion object {
17+
// TODO: confirm with service team language id
18+
const val ID = "lua"
19+
20+
val INSTANCE = CodeWhispererLua()
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.language.languages
5+
6+
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7+
import software.aws.toolkits.telemetry.CodewhispererLanguage
8+
9+
class CodeWhispererPowershell private constructor() : CodeWhispererProgrammingLanguage() {
10+
override val languageId: String = ID
11+
12+
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Powershell
13+
14+
override fun isCodeCompletionSupported(): Boolean = true
15+
16+
companion object {
17+
// TODO: confirm with service team language id
18+
const val ID = "powershell"
19+
20+
val INSTANCE = CodeWhispererPowershell()
21+
}
22+
}

0 commit comments

Comments
 (0)