Skip to content

Commit 02cbac6

Browse files
authored
Merge branch 'main' into lsp0.1.13
2 parents 2706ca3 + 7e4f6e3 commit 02cbac6

File tree

10 files changed

+139
-46
lines changed

10 files changed

+139
-46
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/mynah-ui/src/mynah-ui/ui/apps/cwChatConnector.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import { ChatItem, ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui-chat'
6+
import { ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui-chat'
77
import { ExtensionMessage } from '../commands'
88
import { CodeReference } from './amazonqCommonsConnector'
99
import { TabOpenType, TabsStorage } from '../storages/tabsStorage'
1010
import { FollowUpGenerator } from '../followUps/generator'
11+
import { CWCChatItem } from "../connector";
1112

1213
interface ChatPayload {
1314
chatMessage: string
@@ -17,8 +18,8 @@ interface ChatPayload {
1718
export interface ConnectorProps {
1819
sendMessageToExtension: (message: ExtensionMessage) => void
1920
onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void
20-
onChatAnswerReceived?: (tabID: string, message: ChatItem) => void
21-
onCWCContextCommandMessage: (message: ChatItem, command?: string) => string | undefined
21+
onChatAnswerReceived?: (tabID: string, message: CWCChatItem) => void
22+
onCWCContextCommandMessage: (message: CWCChatItem, command?: string) => string | undefined
2223
onError: (tabID: string, message: string, title: string) => void
2324
onWarning: (tabID: string, message: string, title: string) => void
2425
onOpenSettingsMessage: (tabID: string) => void
@@ -98,7 +99,8 @@ export class Connector {
9899
codeReference?: CodeReference[],
99100
eventId?: string,
100101
codeBlockIndex?: number,
101-
totalCodeBlocks?: number
102+
totalCodeBlocks?: number,
103+
userIntent?: string,
102104
): void => {
103105
this.sendMessageToExtension({
104106
tabID: tabID,
@@ -111,6 +113,7 @@ export class Connector {
111113
eventId,
112114
codeBlockIndex,
113115
totalCodeBlocks,
116+
userIntent
114117
})
115118
}
116119

@@ -122,7 +125,8 @@ export class Connector {
122125
codeReference?: CodeReference[],
123126
eventId?: string,
124127
codeBlockIndex?: number,
125-
totalCodeBlocks?: number
128+
totalCodeBlocks?: number,
129+
userIntent?: string,
126130
): void => {
127131
this.sendMessageToExtension({
128132
tabID: tabID,
@@ -135,6 +139,7 @@ export class Connector {
135139
eventId,
136140
codeBlockIndex,
137141
totalCodeBlocks,
142+
userIntent
138143
})
139144
}
140145

@@ -258,13 +263,14 @@ export class Connector {
258263
}
259264
: undefined
260265

261-
const answer: ChatItem = {
266+
const answer: CWCChatItem = {
262267
type: messageData.messageType,
263268
messageId: messageData.messageId ?? messageData.triggerID,
264269
body: messageData.message,
265270
followUp: followUps,
266271
canBeVoted: true,
267272
codeReference: messageData.codeReference,
273+
userIntent: messageData.userIntent,
268274
}
269275

270276
// If it is not there we will not set it
@@ -291,12 +297,13 @@ export class Connector {
291297
return
292298
}
293299
if (messageData.messageType === ChatItemType.ANSWER) {
294-
const answer: ChatItem = {
300+
const answer: CWCChatItem = {
295301
type: messageData.messageType,
296302
body: undefined,
297303
relatedContent: undefined,
298304
messageId: messageData.messageId,
299305
codeReference: messageData.codeReference,
306+
userIntent: messageData.userIntent,
300307
followUp:
301308
messageData.followUps !== undefined && messageData.followUps.length > 0
302309
? {

plugins/amazonq/mynah-ui/src/mynah-ui/ui/connector.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ export interface ChatPayload {
3030
chatCommand?: string
3131
}
3232

33+
export interface CWCChatItem extends ChatItem {
34+
userIntent?: string
35+
}
36+
3337
export interface ConnectorProps {
3438
sendMessageToExtension: (message: ExtensionMessage) => void
3539
onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void
@@ -230,7 +234,8 @@ export class Connector {
230234
codeReference?: CodeReference[],
231235
eventId?: string,
232236
codeBlockIndex?: number,
233-
totalCodeBlocks?: number
237+
totalCodeBlocks?: number,
238+
userIntent?: string
234239
): void => {
235240
switch (this.tabsStorage.getTab(tabID)?.type) {
236241
case 'cwc':
@@ -242,7 +247,8 @@ export class Connector {
242247
codeReference,
243248
eventId,
244249
codeBlockIndex,
245-
totalCodeBlocks
250+
totalCodeBlocks,
251+
userIntent
246252
)
247253
break
248254
case 'featuredev':
@@ -259,7 +265,8 @@ export class Connector {
259265
codeReference?: CodeReference[],
260266
eventId?: string,
261267
codeBlockIndex?: number,
262-
totalCodeBlocks?: number
268+
totalCodeBlocks?: number,
269+
userIntent?: string
263270
): void => {
264271
switch (this.tabsStorage.getTab(tabID)?.type) {
265272
case 'cwc':
@@ -271,7 +278,8 @@ export class Connector {
271278
codeReference,
272279
eventId,
273280
codeBlockIndex,
274-
totalCodeBlocks
281+
totalCodeBlocks,
282+
userIntent
275283
)
276284
break
277285
case 'featuredev':

0 commit comments

Comments
 (0)