Skip to content

Commit 98b6508

Browse files
authored
Merge branch 'main' into fix/cancel-button
2 parents ab1301e + b02e022 commit 98b6508

File tree

7 files changed

+20
-207
lines changed

7 files changed

+20
-207
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 - update messaging for /doc agent"
4+
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/DocApp.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,7 @@ class DocApp : AmazonQApp {
8383
is IncomingDocMessage.TabRemoved -> inboundAppMessagesHandler.processTabRemovedMessage(message)
8484
is IncomingDocMessage.AuthFollowUpWasClicked -> inboundAppMessagesHandler.processAuthFollowUpClick(message)
8585
is IncomingDocMessage.FollowupClicked -> inboundAppMessagesHandler.processFollowupClickedMessage(message)
86-
is IncomingDocMessage.ChatItemVotedMessage -> inboundAppMessagesHandler.processChatItemVotedMessage(message)
87-
is IncomingDocMessage.ChatItemFeedbackMessage -> inboundAppMessagesHandler.processChatItemFeedbackMessage(message)
8886
is IncomingDocMessage.ClickedLink -> inboundAppMessagesHandler.processLinkClick(message)
89-
is IncomingDocMessage.InsertCodeAtCursorPosition -> inboundAppMessagesHandler.processInsertCodeAtCursorPosition(message)
9087
is IncomingDocMessage.OpenDiff -> inboundAppMessagesHandler.processOpenDiff(message)
9188
is IncomingDocMessage.FileClicked -> inboundAppMessagesHandler.processFileClicked(message)
9289
is IncomingDocMessage.StopDocGeneration -> inboundAppMessagesHandler.processStopDocGeneration(message)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/InboundAppMessagesHandler.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ interface InboundAppMessagesHandler {
1111
suspend fun processTabRemovedMessage(message: IncomingDocMessage.TabRemoved)
1212
suspend fun processAuthFollowUpClick(message: IncomingDocMessage.AuthFollowUpWasClicked)
1313
suspend fun processFollowupClickedMessage(message: IncomingDocMessage.FollowupClicked)
14-
suspend fun processChatItemVotedMessage(message: IncomingDocMessage.ChatItemVotedMessage)
15-
suspend fun processChatItemFeedbackMessage(message: IncomingDocMessage.ChatItemFeedbackMessage)
1614
suspend fun processLinkClick(message: IncomingDocMessage.ClickedLink)
17-
suspend fun processInsertCodeAtCursorPosition(message: IncomingDocMessage.InsertCodeAtCursorPosition)
1815
suspend fun processOpenDiff(message: IncomingDocMessage.OpenDiff)
1916
suspend fun processFileClicked(message: IncomingDocMessage.FileClicked)
2017
suspend fun processStopDocGeneration(message: IncomingDocMessage.StopDocGeneration)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/controller/DocController.kt

Lines changed: 0 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,19 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonqDoc.controller
55

6-
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
76
import com.intellij.diff.DiffContentFactory
87
import com.intellij.diff.DiffManager
98
import com.intellij.diff.contents.EmptyContent
109
import com.intellij.diff.requests.SimpleDiffRequest
1110
import com.intellij.diff.util.DiffUserDataKeys
1211
import com.intellij.ide.BrowserUtil
1312
import com.intellij.openapi.application.runInEdt
14-
import com.intellij.openapi.command.WriteCommandAction
15-
import com.intellij.openapi.editor.Caret
16-
import com.intellij.openapi.editor.Editor
17-
import com.intellij.openapi.fileEditor.FileEditorManager
1813
import com.intellij.openapi.vfs.VfsUtil
1914
import com.intellij.openapi.wm.ToolWindowManager
2015
import kotlinx.coroutines.withContext
2116
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationFolderLevel
2217
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationInteractionType
2318
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationUserDecision
24-
import software.amazon.awssdk.services.toolkittelemetry.model.Sentiment
2519
import software.aws.toolkits.core.utils.debug
2620
import software.aws.toolkits.core.utils.error
2721
import software.aws.toolkits.core.utils.getLogger
@@ -37,7 +31,6 @@ import software.aws.toolkits.jetbrains.services.amazonqDoc.DEFAULT_RETRY_LIMIT
3731
import software.aws.toolkits.jetbrains.services.amazonqDoc.DocException
3832
import software.aws.toolkits.jetbrains.services.amazonqDoc.FEATURE_NAME
3933
import software.aws.toolkits.jetbrains.services.amazonqDoc.InboundAppMessagesHandler
40-
import software.aws.toolkits.jetbrains.services.amazonqDoc.ModifySourceFolderErrorReason
4134
import software.aws.toolkits.jetbrains.services.amazonqDoc.ZipFileError
4235
import software.aws.toolkits.jetbrains.services.amazonqDoc.cancellingProgressField
4336
import software.aws.toolkits.jetbrains.services.amazonqDoc.createUserFacingErrorMessage
@@ -74,13 +67,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Delete
7467
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.NewFileZipInfo
7568
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.SessionStatePhase
7669
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.CancellationTokenSource
77-
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.FeedbackComment
78-
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
79-
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
80-
import software.aws.toolkits.jetbrains.utils.notifyError
8170
import software.aws.toolkits.resources.message
82-
import software.aws.toolkits.telemetry.AmazonqTelemetry
83-
import software.aws.toolkits.telemetry.Result
8471
import java.util.UUID
8572

8673
enum class DocGenerationStep {
@@ -346,84 +333,13 @@ class DocController(
346333
}
347334
}
348335

349-
override suspend fun processChatItemVotedMessage(message: IncomingDocMessage.ChatItemVotedMessage) {
350-
logger.debug { "$FEATURE_NAME: Processing ChatItemVotedMessage: $message" }
351-
352-
val session = chatSessionStorage.getSession(message.tabId, context.project)
353-
when (message.vote) {
354-
"upvote" -> {
355-
AmazonqTelemetry.codeGenerationThumbsUp(
356-
amazonqConversationId = session.conversationId,
357-
credentialStartUrl = getStartUrl(project = context.project)
358-
)
359-
}
360-
361-
"downvote" -> {
362-
AmazonqTelemetry.codeGenerationThumbsDown(
363-
amazonqConversationId = session.conversationId,
364-
credentialStartUrl = getStartUrl(project = context.project)
365-
)
366-
}
367-
}
368-
}
369-
370-
override suspend fun processChatItemFeedbackMessage(message: IncomingDocMessage.ChatItemFeedbackMessage) {
371-
logger.debug { "$FEATURE_NAME: Processing ChatItemFeedbackMessage: ${message.comment}" }
372-
373-
val session = getSessionInfo(message.tabId)
374-
375-
val comment = FeedbackComment(
376-
conversationId = session.conversationId,
377-
userComment = message.comment.orEmpty(),
378-
reason = message.selectedOption,
379-
messageId = message.messageId,
380-
type = "doc-chat-answer-feedback"
381-
)
382-
383-
try {
384-
TelemetryService.getInstance().sendFeedback(
385-
sentiment = Sentiment.NEGATIVE,
386-
comment = objectMapper.writeValueAsString(comment),
387-
)
388-
logger.info { "$FEATURE_NAME answer feedback sent: \"Negative\"" }
389-
} catch (e: Throwable) {
390-
e.notifyError(message("feedback.submit_failed", e))
391-
logger.warn(e) { "Failed to submit feedback" }
392-
return
393-
}
394-
}
395-
396336
override suspend fun processLinkClick(message: IncomingDocMessage.ClickedLink) {
397337
BrowserUtil.browse(message.link)
398338
}
399339

400-
override suspend fun processInsertCodeAtCursorPosition(message: IncomingDocMessage.InsertCodeAtCursorPosition) {
401-
logger.debug { "$FEATURE_NAME: Processing InsertCodeAtCursorPosition: $message" }
402-
403-
withContext(EDT) {
404-
val editor: Editor = FileEditorManager.getInstance(context.project).selectedTextEditor ?: return@withContext
405-
406-
val caret: Caret = editor.caretModel.primaryCaret
407-
val offset: Int = caret.offset
408-
409-
WriteCommandAction.runWriteCommandAction(context.project) {
410-
if (caret.hasSelection()) {
411-
editor.document.deleteString(caret.selectionStart, caret.selectionEnd)
412-
}
413-
editor.document.insertString(offset, message.code)
414-
}
415-
}
416-
}
417-
418340
override suspend fun processOpenDiff(message: IncomingDocMessage.OpenDiff) {
419341
val session = getSessionInfo(message.tabId)
420342

421-
AmazonqTelemetry.isReviewedChanges(
422-
amazonqConversationId = session.conversationId,
423-
enabled = true,
424-
credentialStartUrl = getStartUrl(project = context.project)
425-
)
426-
427343
val project = context.project
428344
val sessionState = session.sessionState
429345

@@ -531,13 +447,6 @@ class DocController(
531447
}
532448
}
533449

534-
AmazonqTelemetry.isAcceptedCodeChanges(
535-
amazonqNumberOfFilesAccepted = (filePaths.filterNot { it.rejected }.size + deletedFiles.filterNot { it.rejected }.size) * 1.0,
536-
amazonqConversationId = session.conversationId,
537-
enabled = true,
538-
credentialStartUrl = getStartUrl(project = context.project)
539-
)
540-
541450
session.insertChanges(
542451
filePaths = filePaths.filterNot { it.rejected },
543452
deletedFiles = deletedFiles.filterNot { it.rejected }
@@ -575,14 +484,7 @@ class DocController(
575484
}
576485

577486
private suspend fun newTask(tabId: String) {
578-
val session = getSessionInfo(tabId)
579-
val sessionLatency = System.currentTimeMillis() - session.sessionStartTime
580487
docGenerationTask = DocGenerationTask()
581-
AmazonqTelemetry.endChat(
582-
amazonqConversationId = session.conversationId,
583-
amazonqEndOfTheConversationLatency = sessionLatency.toDouble(),
584-
credentialStartUrl = getStartUrl(project = context.project)
585-
)
586488
chatSessionStorage.deleteSession(tabId)
587489

588490
messenger.sendAnswer(
@@ -632,25 +534,9 @@ class DocController(
632534

633535
messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false)
634536
docGenerationTask.reset()
635-
636-
val session = getSessionInfo(tabId)
637-
val sessionLatency = System.currentTimeMillis() - session.sessionStartTime
638-
AmazonqTelemetry.endChat(
639-
amazonqConversationId = session.conversationId,
640-
amazonqEndOfTheConversationLatency = sessionLatency.toDouble(),
641-
credentialStartUrl = getStartUrl(project = context.project)
642-
)
643537
}
644538

645539
private suspend fun provideFeedbackAndRegenerateCode(tabId: String) {
646-
val session = getSessionInfo(tabId)
647-
648-
AmazonqTelemetry.isProvideFeedbackForCodeGen(
649-
amazonqConversationId = session.conversationId,
650-
enabled = true,
651-
credentialStartUrl = getStartUrl(project = context.project)
652-
)
653-
654540
// Unblock the message button
655541
messenger.sendAsyncEventProgress(tabId = tabId, inProgress = false)
656542

@@ -1014,16 +900,11 @@ class DocController(
1014900
val currentSourceFolder = session.context.selectedSourceFolder
1015901
val projectRoot = session.context.projectRoot
1016902

1017-
var result: Result = Result.Failed
1018-
var reason: ModifySourceFolderErrorReason? = null
1019-
1020903
withContext(EDT) {
1021904
val selectedFolder = selectFolder(context.project, currentSourceFolder)
1022905
// No folder was selected
1023906
if (selectedFolder == null) {
1024907
logger.info { "Cancelled dialog and not selected any folder" }
1025-
1026-
reason = ModifySourceFolderErrorReason.ClosedBeforeSelection
1027908
return@withContext
1028909
}
1029910

@@ -1036,8 +917,6 @@ class DocController(
1036917
messageType = DocMessageType.Answer,
1037918
message = message("amazonqFeatureDev.follow_up.incorrect_source_folder"),
1038919
)
1039-
1040-
reason = ModifySourceFolderErrorReason.NotInWorkspaceFolder
1041920
return@withContext
1042921
}
1043922
if (selectedFolder.path == projectRoot.path) {
@@ -1049,21 +928,13 @@ class DocController(
1049928
logger.info { "Selected correct folder inside workspace: ${selectedFolder.path}" }
1050929

1051930
session.context.selectedSourceFolder = selectedFolder
1052-
result = Result.Succeeded
1053931

1054932
promptForDocTarget(tabId)
1055933

1056934
messenger.sendChatInputEnabledMessage(tabId, enabled = false)
1057935

1058936
messenger.sendUpdatePlaceholder(tabId = tabId, newPlaceholder = message("amazonqDoc.prompt.placeholder"))
1059937
}
1060-
1061-
AmazonqTelemetry.modifySourceFolder(
1062-
amazonqConversationId = session.conversationId,
1063-
credentialStartUrl = getStartUrl(project = context.project),
1064-
result = result,
1065-
reason = reason?.toString()
1066-
)
1067938
}
1068939

1069940
private fun sendDocGenerationTelemetry(tabId: String) {
@@ -1093,7 +964,5 @@ class DocController(
1093964

1094965
companion object {
1095966
private val logger = getLogger<DocController>()
1096-
1097-
private val objectMapper = jacksonObjectMapper()
1098967
}
1099968
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/session/DocGenerationState.kt

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Sessio
2626
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.registerDeletedFiles
2727
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.registerNewFiles
2828
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.CancellationTokenSource
29-
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
3029
import software.aws.toolkits.resources.message
31-
import software.aws.toolkits.telemetry.AmazonqTelemetry
32-
import software.aws.toolkits.telemetry.MetricResult
3330

3431
private val logger = getLogger<DocGenerationState>()
3532

@@ -39,20 +36,13 @@ class DocGenerationState(
3936
val config: SessionStateConfig,
4037
val uploadId: String,
4138
val currentIteration: Int,
42-
val repositorySize: Double,
4339
val messenger: MessagePublisher,
4440
var codeGenerationRemainingIterationCount: Int? = null,
4541
var codeGenerationTotalIterationCount: Int? = null,
4642
override val phase: SessionStatePhase?,
4743
override var token: CancellationTokenSource?,
4844
) : SessionState {
4945
override suspend fun interact(action: SessionStateAction): SessionStateInteraction<SessionState> {
50-
val startTime = System.currentTimeMillis()
51-
var result: MetricResult = MetricResult.Succeeded
52-
var failureReason: String? = null
53-
var codeGenerationWorkflowStatus: CodeGenerationWorkflowStatus = CodeGenerationWorkflowStatus.COMPLETE
54-
var numberOfReferencesGenerated: Int? = null
55-
var numberOfFilesGenerated: Int? = null
5646
try {
5747
val response = config.amazonQCodeGenService.startTaskAssistCodeGeneration(
5848
conversationId = config.conversationId,
@@ -62,8 +52,6 @@ class DocGenerationState(
6252
)
6353
val mode = if (action.msg == message("amazonqDoc.session.create")) Mode.CREATE else null
6454
val codeGenerationResult = generateCode(codeGenerationId = response.codeGenerationId(), mode, token)
65-
numberOfReferencesGenerated = codeGenerationResult.references.size
66-
numberOfFilesGenerated = codeGenerationResult.newFiles.size
6755
codeGenerationRemainingIterationCount = codeGenerationResult.codeGenerationRemainingIterationCount
6856
codeGenerationTotalIterationCount = codeGenerationResult.codeGenerationTotalIterationCount
6957

@@ -90,25 +78,7 @@ class DocGenerationState(
9078
)
9179
} catch (e: Exception) {
9280
logger.warn(e) { "$FEATURE_NAME: Code generation failed: ${e.message}" }
93-
result = MetricResult.Failed
94-
failureReason = e.javaClass.simpleName
95-
codeGenerationWorkflowStatus = CodeGenerationWorkflowStatus.FAILED
96-
9781
throw e
98-
} finally {
99-
AmazonqTelemetry.codeGenerationInvoke(
100-
amazonqConversationId = config.conversationId,
101-
amazonqCodeGenerationResult = codeGenerationWorkflowStatus.toString(),
102-
amazonqGenerateCodeIteration = currentIteration.toDouble(),
103-
amazonqNumberOfReferences = numberOfReferencesGenerated?.toDouble(),
104-
amazonqGenerateCodeResponseLatency = (System.currentTimeMillis() - startTime).toDouble(),
105-
amazonqNumberOfFilesGenerated = numberOfFilesGenerated?.toDouble(),
106-
amazonqRepositorySize = repositorySize,
107-
result = result,
108-
reason = failureReason,
109-
duration = (System.currentTimeMillis() - startTime).toDouble(),
110-
credentialStartUrl = getStartUrl(config.amazonQCodeGenService.project)
111-
)
11282
}
11383
}
11484
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/session/PrepareDocGenerationState.kt

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Sessio
1717
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.CancellationTokenSource
1818
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.deleteUploadArtifact
1919
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.uploadArtifactToS3
20-
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
21-
import software.aws.toolkits.telemetry.AmazonqTelemetry
22-
import software.aws.toolkits.telemetry.AmazonqUploadIntent
23-
import software.aws.toolkits.telemetry.Result
2420

2521
private val logger = getLogger<PrepareDocGenerationState>()
2622

@@ -40,10 +36,6 @@ class PrepareDocGenerationState(
4036
) : SessionState {
4137
override val phase = SessionStatePhase.CODEGEN
4238
override suspend fun interact(action: SessionStateAction): SessionStateInteraction<SessionState> {
43-
val startTime = System.currentTimeMillis()
44-
var result: Result = Result.Succeeded
45-
var failureReason: String? = null
46-
var failureReasonDesc: String? = null
4739
var zipFileLength: Long? = null
4840
val nextState: SessionState
4941
try {
@@ -76,30 +68,14 @@ class PrepareDocGenerationState(
7668
config = this.config,
7769
uploadId = this.uploadId,
7870
currentIteration = this.currentIteration,
79-
repositorySize = zipFileLength.toDouble(),
8071
messenger = messenger,
8172
phase = phase,
8273
token = this.token
8374
)
8475
} catch (e: Exception) {
85-
result = Result.Failed
86-
failureReason = e.javaClass.simpleName
87-
failureReasonDesc = e.message
8876
logger.warn(e) { "$FEATURE_NAME: Code uploading failed: ${e.message}" }
8977
throw e
90-
} finally {
91-
AmazonqTelemetry.createUpload(
92-
amazonqConversationId = config.conversationId,
93-
amazonqRepositorySize = zipFileLength?.toDouble(),
94-
amazonqUploadIntent = AmazonqUploadIntent.TASKASSISTPLANNING,
95-
result = result,
96-
reason = failureReason,
97-
reasonDesc = failureReasonDesc,
98-
duration = (System.currentTimeMillis() - startTime).toDouble(),
99-
credentialStartUrl = getStartUrl(config.amazonQCodeGenService.project)
100-
)
10178
}
102-
// It is essential to interact with the next state outside of try-catch block for the telemetry to capture events for the states separately
10379
return nextState.interact(action)
10480
}
10581
}

0 commit comments

Comments
 (0)