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 {
@@ -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}
0 commit comments