@@ -9,7 +9,6 @@ import com.intellij.diff.contents.EmptyContent
99import com.intellij.diff.requests.SimpleDiffRequest
1010import com.intellij.diff.util.DiffUserDataKeys
1111import com.intellij.ide.BrowserUtil
12- import com.intellij.notification.NotificationAction
1312import com.intellij.openapi.application.runInEdt
1413import com.intellij.openapi.command.WriteCommandAction
1514import com.intellij.openapi.editor.Caret
@@ -49,19 +48,19 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendA
4948import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendAuthNeededException
5049import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendAuthenticationInProgressMessage
5150import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendChatInputEnabledMessage
52- import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendCodeResult
5351import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendError
5452import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendSystemPrompt
5553import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendUpdatePlaceholder
54+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.updateFileComponent
5655import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.DeletedFileInfo
5756import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.NewFileZipInfo
5857import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.PrepareCodeGenerationState
5958import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Session
6059import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.SessionStatePhase
6160import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.storage.ChatSessionStorage
61+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.getFollowUpOptions
6262import software.aws.toolkits.jetbrains.services.cwc.messages.CodeReference
6363import software.aws.toolkits.jetbrains.ui.feedback.FeatureDevFeedbackDialog
64- import software.aws.toolkits.jetbrains.utils.notifyInfo
6564import software.aws.toolkits.resources.message
6665import software.aws.toolkits.telemetry.AmazonqTelemetry
6766import java.util.UUID
@@ -72,8 +71,8 @@ class FeatureDevController(
7271 private val authController : AuthController = AuthController ()
7372) : InboundAppMessagesHandler {
7473
75- private val messenger = context.messagesFromAppToUi
76- private val toolWindow = ToolWindowManager .getInstance(context.project).getToolWindow(AmazonQToolWindowFactory .WINDOW_ID )
74+ val messenger = context.messagesFromAppToUi
75+ val toolWindow = ToolWindowManager .getInstance(context.project).getToolWindow(AmazonQToolWindowFactory .WINDOW_ID )
7776
7877 override suspend fun processPromptChatMessage (message : IncomingFeatureDevMessage .ChatPrompt ) {
7978 handleChat(
@@ -225,12 +224,7 @@ class FeatureDevController(
225224 filePaths.find { it.zipFilePath == fileToUpdate }?.let { it.rejected = ! it.rejected }
226225 deletedFiles.find { it.zipFilePath == fileToUpdate }?.let { it.rejected = ! it.rejected }
227226
228- session.updateFilesPaths(
229- messenger = messenger,
230- tabId = message.tabId,
231- filePaths = filePaths,
232- deletedFiles = deletedFiles
233- )
227+ messenger.updateFileComponent(message.tabId, filePaths, deletedFiles)
234228 }
235229
236230 private suspend fun newTabOpened (tabId : String ) {
@@ -292,13 +286,18 @@ class FeatureDevController(
292286 references = state.references
293287 }
294288 }
289+
295290 AmazonqTelemetry .isAcceptedCodeChanges(
296- project = null ,
297291 amazonqNumberOfFilesAccepted = (filePaths.filterNot { it.rejected }.size + deletedFiles.filterNot { it.rejected }.size) * 1.0 ,
298292 amazonqConversationId = session.conversationId,
299293 enabled = true
300294 )
301- session.insertChanges(filePaths = filePaths, deletedFiles = deletedFiles, references = references)
295+
296+ session.insertChanges(
297+ filePaths = filePaths.filterNot { it.rejected },
298+ deletedFiles = deletedFiles.filterNot { it.rejected },
299+ references = references
300+ )
302301
303302 messenger.sendAnswer(
304303 tabId = tabId,
@@ -502,124 +501,6 @@ class FeatureDevController(
502501 messenger.sendAsyncEventProgress(tabId = tabId, inProgress = false )
503502 }
504503
505- private suspend fun onCodeGeneration (session : Session , message : String , tabId : String ) {
506- messenger.sendAsyncEventProgress(
507- tabId = tabId,
508- inProgress = true ,
509- message = message(" amazonqFeatureDev.chat_message.start_code_generation" ),
510- )
511-
512- try {
513- messenger.sendAnswer(
514- tabId = tabId,
515- message = message(" amazonqFeatureDev.chat_message.requesting_changes" ),
516- messageType = FeatureDevMessageType .AnswerStream ,
517- )
518-
519- messenger.sendUpdatePlaceholder(tabId = tabId, newPlaceholder = message(" amazonqFeatureDev.placeholder.generating_code" ))
520-
521- session.send(message) // Trigger code generation
522-
523- val state = session.sessionState
524-
525- var filePaths: List <NewFileZipInfo > = emptyList()
526- var deletedFiles: List <DeletedFileInfo > = emptyList()
527- var references: List <CodeReference > = emptyList()
528- var uploadId = " "
529-
530- when (state) {
531- is PrepareCodeGenerationState -> {
532- filePaths = state.filePaths
533- deletedFiles = state.deletedFiles
534- references = state.references
535- uploadId = state.uploadId
536- }
537- }
538-
539- // Atm this is the only possible path as codegen is mocked to return empty.
540- if (filePaths.size or deletedFiles.size == 0 ) {
541- messenger.sendAnswer(
542- tabId = tabId,
543- messageType = FeatureDevMessageType .Answer ,
544- message = message(" amazonqFeatureDev.code_generation.no_file_changes" )
545- )
546- messenger.sendSystemPrompt(
547- tabId = tabId,
548- followUp = if (retriesRemaining(session) > 0 ) {
549- listOf (
550- FollowUp (
551- pillText = message(" amazonqFeatureDev.follow_up.retry" ),
552- type = FollowUpTypes .RETRY ,
553- status = FollowUpStatusType .Warning
554- )
555- )
556- } else {
557- emptyList()
558- }
559- )
560- messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false ) // Lock chat input until retry is clicked.
561- return
562- }
563-
564- messenger.sendCodeResult(tabId = tabId, uploadId = uploadId, filePaths = filePaths, deletedFiles = deletedFiles, references = references)
565-
566- messenger.sendSystemPrompt(tabId = tabId, followUp = getFollowUpOptions(session.sessionState.phase, interactionSucceeded = true ))
567-
568- messenger.sendUpdatePlaceholder(tabId = tabId, newPlaceholder = message(" amazonqFeatureDev.placeholder.after_code_generation" ))
569- } finally {
570- messenger.sendAsyncEventProgress(tabId = tabId, inProgress = false ) // Finish processing the event
571- messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false ) // Lock chat input until a follow-up is clicked.
572-
573- if (toolWindow != null && ! toolWindow.isVisible) {
574- notifyInfo(
575- title = message(" amazonqFeatureDev.code_generation.notification_title" ),
576- content = message(" amazonqFeatureDev.code_generation.notification_message" ),
577- project = context.project,
578- notificationActions = listOf (openChatNotificationAction())
579- )
580- }
581- }
582- }
583-
584- private fun openChatNotificationAction () = NotificationAction .createSimple(message(" amazonqFeatureDev.code_generation.notification_open_link" )) {
585- toolWindow?.show()
586- }
587-
588- private fun getFollowUpOptions (phase : SessionStatePhase ? , interactionSucceeded : Boolean ): List <FollowUp > {
589- when (phase) {
590- SessionStatePhase .APPROACH -> {
591- return when (interactionSucceeded) {
592- true -> listOf (
593- FollowUp (
594- pillText = message(" amazonqFeatureDev.follow_up.generate_code" ),
595- type = FollowUpTypes .GENERATE_CODE ,
596- status = FollowUpStatusType .Info ,
597- )
598- )
599-
600- false -> emptyList()
601- }
602- }
603- SessionStatePhase .CODEGEN -> {
604- return listOf (
605- FollowUp (
606- pillText = message(" amazonqFeatureDev.follow_up.insert_code" ),
607- type = FollowUpTypes .INSERT_CODE ,
608- icon = FollowUpIcons .Ok ,
609- status = FollowUpStatusType .Success
610- ),
611- FollowUp (
612- pillText = message(" amazonqFeatureDev.follow_up.provide_feedback_and_regenerate" ),
613- type = FollowUpTypes .PROVIDE_FEEDBACK_AND_REGENERATE_CODE ,
614- icon = FollowUpIcons .Refresh ,
615- status = FollowUpStatusType .Info
616- )
617- )
618- }
619- else -> return emptyList()
620- }
621- }
622-
623504 private suspend fun retryRequests (tabId : String ) {
624505 var session: Session ? = null
625506 try {
@@ -728,9 +609,11 @@ class FeatureDevController(
728609 }
729610 }
730611
612+ fun getProject () = context.project
613+
731614 private fun getSessionInfo (tabId : String ) = chatSessionStorage.getSession(tabId, context.project)
732615
733- private fun retriesRemaining (session : Session ? ): Int = session?.retries ? : DEFAULT_RETRY_LIMIT
616+ fun retriesRemaining (session : Session ? ): Int = session?.retries ? : DEFAULT_RETRY_LIMIT
734617
735618 companion object {
736619 private val logger = getLogger<FeatureDevController >()
0 commit comments