33
44package software.aws.toolkits.jetbrains.services.amazonqDoc.controller
55
6- import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
76import com.intellij.diff.DiffContentFactory
87import com.intellij.diff.DiffManager
98import com.intellij.diff.contents.EmptyContent
109import com.intellij.diff.requests.SimpleDiffRequest
1110import com.intellij.diff.util.DiffUserDataKeys
1211import com.intellij.ide.BrowserUtil
1312import 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
1813import com.intellij.openapi.vfs.VfsUtil
1914import com.intellij.openapi.wm.ToolWindowManager
2015import kotlinx.coroutines.withContext
2116import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationFolderLevel
2217import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationInteractionType
2318import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationUserDecision
24- import software.amazon.awssdk.services.toolkittelemetry.model.Sentiment
2519import software.aws.toolkits.core.utils.debug
2620import software.aws.toolkits.core.utils.error
2721import software.aws.toolkits.core.utils.getLogger
@@ -37,7 +31,6 @@ import software.aws.toolkits.jetbrains.services.amazonqDoc.DEFAULT_RETRY_LIMIT
3731import software.aws.toolkits.jetbrains.services.amazonqDoc.DocException
3832import software.aws.toolkits.jetbrains.services.amazonqDoc.FEATURE_NAME
3933import software.aws.toolkits.jetbrains.services.amazonqDoc.InboundAppMessagesHandler
40- import software.aws.toolkits.jetbrains.services.amazonqDoc.ModifySourceFolderErrorReason
4134import software.aws.toolkits.jetbrains.services.amazonqDoc.ZipFileError
4235import software.aws.toolkits.jetbrains.services.amazonqDoc.cancellingProgressField
4336import software.aws.toolkits.jetbrains.services.amazonqDoc.createUserFacingErrorMessage
@@ -74,13 +67,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Delete
7467import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.NewFileZipInfo
7568import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.SessionStatePhase
7669import 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
8170import software.aws.toolkits.resources.message
82- import software.aws.toolkits.telemetry.AmazonqTelemetry
83- import software.aws.toolkits.telemetry.Result
8471import java.util.UUID
8572
8673enum class DocGenerationStep {
@@ -343,84 +330,13 @@ class DocController(
343330 }
344331 }
345332
346- override suspend fun processChatItemVotedMessage (message : IncomingDocMessage .ChatItemVotedMessage ) {
347- logger.debug { " $FEATURE_NAME : Processing ChatItemVotedMessage: $message " }
348-
349- val session = chatSessionStorage.getSession(message.tabId, context.project)
350- when (message.vote) {
351- " upvote" -> {
352- AmazonqTelemetry .codeGenerationThumbsUp(
353- amazonqConversationId = session.conversationId,
354- credentialStartUrl = getStartUrl(project = context.project)
355- )
356- }
357-
358- " downvote" -> {
359- AmazonqTelemetry .codeGenerationThumbsDown(
360- amazonqConversationId = session.conversationId,
361- credentialStartUrl = getStartUrl(project = context.project)
362- )
363- }
364- }
365- }
366-
367- override suspend fun processChatItemFeedbackMessage (message : IncomingDocMessage .ChatItemFeedbackMessage ) {
368- logger.debug { " $FEATURE_NAME : Processing ChatItemFeedbackMessage: ${message.comment} " }
369-
370- val session = getSessionInfo(message.tabId)
371-
372- val comment = FeedbackComment (
373- conversationId = session.conversationId,
374- userComment = message.comment.orEmpty(),
375- reason = message.selectedOption,
376- messageId = message.messageId,
377- type = " doc-chat-answer-feedback"
378- )
379-
380- try {
381- TelemetryService .getInstance().sendFeedback(
382- sentiment = Sentiment .NEGATIVE ,
383- comment = objectMapper.writeValueAsString(comment),
384- )
385- logger.info { " $FEATURE_NAME answer feedback sent: \" Negative\" " }
386- } catch (e: Throwable ) {
387- e.notifyError(message(" feedback.submit_failed" , e))
388- logger.warn(e) { " Failed to submit feedback" }
389- return
390- }
391- }
392-
393333 override suspend fun processLinkClick (message : IncomingDocMessage .ClickedLink ) {
394334 BrowserUtil .browse(message.link)
395335 }
396336
397- override suspend fun processInsertCodeAtCursorPosition (message : IncomingDocMessage .InsertCodeAtCursorPosition ) {
398- logger.debug { " $FEATURE_NAME : Processing InsertCodeAtCursorPosition: $message " }
399-
400- withContext(EDT ) {
401- val editor: Editor = FileEditorManager .getInstance(context.project).selectedTextEditor ? : return @withContext
402-
403- val caret: Caret = editor.caretModel.primaryCaret
404- val offset: Int = caret.offset
405-
406- WriteCommandAction .runWriteCommandAction(context.project) {
407- if (caret.hasSelection()) {
408- editor.document.deleteString(caret.selectionStart, caret.selectionEnd)
409- }
410- editor.document.insertString(offset, message.code)
411- }
412- }
413- }
414-
415337 override suspend fun processOpenDiff (message : IncomingDocMessage .OpenDiff ) {
416338 val session = getSessionInfo(message.tabId)
417339
418- AmazonqTelemetry .isReviewedChanges(
419- amazonqConversationId = session.conversationId,
420- enabled = true ,
421- credentialStartUrl = getStartUrl(project = context.project)
422- )
423-
424340 val project = context.project
425341 val sessionState = session.sessionState
426342
@@ -528,13 +444,6 @@ class DocController(
528444 }
529445 }
530446
531- AmazonqTelemetry .isAcceptedCodeChanges(
532- amazonqNumberOfFilesAccepted = (filePaths.filterNot { it.rejected }.size + deletedFiles.filterNot { it.rejected }.size) * 1.0 ,
533- amazonqConversationId = session.conversationId,
534- enabled = true ,
535- credentialStartUrl = getStartUrl(project = context.project)
536- )
537-
538447 session.insertChanges(
539448 filePaths = filePaths.filterNot { it.rejected },
540449 deletedFiles = deletedFiles.filterNot { it.rejected }
@@ -572,14 +481,7 @@ class DocController(
572481 }
573482
574483 private suspend fun newTask (tabId : String ) {
575- val session = getSessionInfo(tabId)
576- val sessionLatency = System .currentTimeMillis() - session.sessionStartTime
577484 docGenerationTask = DocGenerationTask ()
578- AmazonqTelemetry .endChat(
579- amazonqConversationId = session.conversationId,
580- amazonqEndOfTheConversationLatency = sessionLatency.toDouble(),
581- credentialStartUrl = getStartUrl(project = context.project)
582- )
583485 chatSessionStorage.deleteSession(tabId)
584486
585487 messenger.sendAnswer(
@@ -627,25 +529,9 @@ class DocController(
627529
628530 messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false )
629531 docGenerationTask.reset()
630-
631- val session = getSessionInfo(tabId)
632- val sessionLatency = System .currentTimeMillis() - session.sessionStartTime
633- AmazonqTelemetry .endChat(
634- amazonqConversationId = session.conversationId,
635- amazonqEndOfTheConversationLatency = sessionLatency.toDouble(),
636- credentialStartUrl = getStartUrl(project = context.project)
637- )
638532 }
639533
640534 private suspend fun provideFeedbackAndRegenerateCode (tabId : String ) {
641- val session = getSessionInfo(tabId)
642-
643- AmazonqTelemetry .isProvideFeedbackForCodeGen(
644- amazonqConversationId = session.conversationId,
645- enabled = true ,
646- credentialStartUrl = getStartUrl(project = context.project)
647- )
648-
649535 // Unblock the message button
650536 messenger.sendAsyncEventProgress(tabId = tabId, inProgress = false )
651537
@@ -1007,16 +893,11 @@ class DocController(
1007893 val currentSourceFolder = session.context.selectedSourceFolder
1008894 val projectRoot = session.context.projectRoot
1009895
1010- var result: Result = Result .Failed
1011- var reason: ModifySourceFolderErrorReason ? = null
1012-
1013896 withContext(EDT ) {
1014897 val selectedFolder = selectFolder(context.project, currentSourceFolder)
1015898 // No folder was selected
1016899 if (selectedFolder == null ) {
1017900 logger.info { " Cancelled dialog and not selected any folder" }
1018-
1019- reason = ModifySourceFolderErrorReason .ClosedBeforeSelection
1020901 return @withContext
1021902 }
1022903
@@ -1029,8 +910,6 @@ class DocController(
1029910 messageType = DocMessageType .Answer ,
1030911 message = message(" amazonqFeatureDev.follow_up.incorrect_source_folder" ),
1031912 )
1032-
1033- reason = ModifySourceFolderErrorReason .NotInWorkspaceFolder
1034913 return @withContext
1035914 }
1036915 if (selectedFolder.path == projectRoot.path) {
@@ -1042,21 +921,13 @@ class DocController(
1042921 logger.info { " Selected correct folder inside workspace: ${selectedFolder.path} " }
1043922
1044923 session.context.selectedSourceFolder = selectedFolder
1045- result = Result .Succeeded
1046924
1047925 promptForDocTarget(tabId)
1048926
1049927 messenger.sendChatInputEnabledMessage(tabId, enabled = false )
1050928
1051929 messenger.sendUpdatePlaceholder(tabId = tabId, newPlaceholder = message(" amazonqDoc.prompt.placeholder" ))
1052930 }
1053-
1054- AmazonqTelemetry .modifySourceFolder(
1055- amazonqConversationId = session.conversationId,
1056- credentialStartUrl = getStartUrl(project = context.project),
1057- result = result,
1058- reason = reason?.toString()
1059- )
1060931 }
1061932
1062933 private fun sendDocGenerationTelemetry (tabId : String ) {
@@ -1086,7 +957,5 @@ class DocController(
1086957
1087958 companion object {
1088959 private val logger = getLogger<DocController >()
1089-
1090- private val objectMapper = jacksonObjectMapper()
1091960 }
1092961}
0 commit comments