@@ -132,9 +132,8 @@ class DocController(
132
132
private val authController : AuthController = AuthController (),
133
133
) : InboundAppMessagesHandler {
134
134
val messenger = context.messagesFromAppToUi
135
- var mode: Mode = Mode .CREATE
136
135
val toolWindow = ToolWindowManager .getInstance(context.project).getToolWindow(AmazonQToolWindowFactory .WINDOW_ID )
137
- var docGenerationTask = DocGenerationTask ()
136
+ private val docGenerationTasks = DocGenerationTasks ()
138
137
139
138
override suspend fun processPromptChatMessage (message : IncomingDocMessage .ChatPrompt ) {
140
139
handleChat(
@@ -148,7 +147,7 @@ class DocController(
148
147
}
149
148
150
149
override suspend fun processTabRemovedMessage (message : IncomingDocMessage .TabRemoved ) {
151
- docGenerationTask.reset( )
150
+ docGenerationTasks.deleteTask(message.tabId )
152
151
chatSessionStorage.deleteSession(message.tabId)
153
152
}
154
153
@@ -160,6 +159,7 @@ class DocController(
160
159
161
160
override suspend fun processFollowupClickedMessage (message : IncomingDocMessage .FollowupClicked ) {
162
161
val session = getSessionInfo(message.tabId)
162
+ val docGenerationTask = docGenerationTasks.getTask(message.tabId)
163
163
164
164
session.preloader(message.followUp.pillText, messenger) // also stores message in session history
165
165
@@ -173,7 +173,7 @@ class DocController(
173
173
FollowUpTypes .CLOSE_SESSION -> closeSession(message.tabId)
174
174
FollowUpTypes .CREATE_DOCUMENTATION -> {
175
175
docGenerationTask.interactionType = DocInteractionType .GENERATE_README
176
- mode = Mode .CREATE
176
+ docGenerationTask. mode = Mode .CREATE
177
177
promptForDocTarget(message.tabId)
178
178
}
179
179
@@ -183,19 +183,19 @@ class DocController(
183
183
}
184
184
185
185
FollowUpTypes .CANCEL_FOLDER_SELECTION -> {
186
- docGenerationTask.folderLevel = DocFolderLevel . ENTIRE_WORKSPACE
186
+ docGenerationTask.reset()
187
187
newTask(message.tabId)
188
188
}
189
189
190
- FollowUpTypes .PROCEED_FOLDER_SELECTION -> if (mode == Mode .EDIT ) makeChanges(message.tabId) else onDocsGeneration(message)
190
+ FollowUpTypes .PROCEED_FOLDER_SELECTION -> if (docGenerationTask. mode == Mode .EDIT ) makeChanges(message.tabId) else onDocsGeneration(message)
191
191
FollowUpTypes .ACCEPT_CHANGES -> {
192
192
docGenerationTask.userDecision = DocUserDecision .ACCEPT
193
193
sendDocAcceptanceTelemetry(message.tabId)
194
194
acceptChanges(message)
195
195
}
196
196
197
197
FollowUpTypes .MAKE_CHANGES -> {
198
- mode = Mode .EDIT
198
+ docGenerationTask. mode = Mode .EDIT
199
199
makeChanges(message.tabId)
200
200
}
201
201
@@ -206,12 +206,12 @@ class DocController(
206
206
}
207
207
208
208
FollowUpTypes .SYNCHRONIZE_DOCUMENTATION -> {
209
- mode = Mode .SYNC
209
+ docGenerationTask. mode = Mode .SYNC
210
210
promptForDocTarget(message.tabId)
211
211
}
212
212
213
213
FollowUpTypes .EDIT_DOCUMENTATION -> {
214
- mode = Mode .EDIT
214
+ docGenerationTask. mode = Mode .EDIT
215
215
docGenerationTask.interactionType = DocInteractionType .EDIT_README
216
216
promptForDocTarget(message.tabId)
217
217
}
@@ -241,7 +241,6 @@ class DocController(
241
241
session.sessionState.token?.cancel()
242
242
}
243
243
244
- docGenerationTask.reset()
245
244
newTask(message.tabId)
246
245
}
247
246
@@ -307,13 +306,14 @@ class DocController(
307
306
308
307
private suspend fun promptForDocTarget (tabId : String ) {
309
308
val session = getSessionInfo(tabId)
309
+ val docGenerationTask = docGenerationTasks.getTask(tabId)
310
310
311
311
val currentSourceFolder = session.context.selectedSourceFolder
312
312
313
313
try {
314
314
messenger.sendFolderConfirmationMessage(
315
315
tabId = tabId,
316
- message = if (mode == Mode .CREATE ) message(" amazonqDoc.prompt.create.confirmation" ) else message(" amazonqDoc.prompt.update" ),
316
+ message = if (docGenerationTask. mode == Mode .CREATE ) message(" amazonqDoc.prompt.create.confirmation" ) else message(" amazonqDoc.prompt.update" ),
317
317
folderPath = currentSourceFolder.name,
318
318
followUps = listOf (
319
319
FollowUp (
@@ -452,6 +452,9 @@ class DocController(
452
452
var session: DocSession ? = null
453
453
try {
454
454
session = getSessionInfo(tabId)
455
+ val docGenerationTask = docGenerationTasks.getTask(tabId)
456
+ docGenerationTask.mode = Mode .NONE
457
+
455
458
logger.debug { " $FEATURE_NAME : Session created with id: ${session.tabID} " }
456
459
457
460
val credentialState = authController.getAuthNeededStates(context.project).amazonQ
@@ -528,7 +531,7 @@ class DocController(
528
531
}
529
532
530
533
private suspend fun newTask (tabId : String ) {
531
- docGenerationTask = DocGenerationTask ( )
534
+ docGenerationTasks.deleteTask(tabId )
532
535
chatSessionStorage.deleteSession(tabId)
533
536
534
537
messenger.sendAnswer(
@@ -577,7 +580,7 @@ class DocController(
577
580
)
578
581
579
582
messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false )
580
- docGenerationTask.reset( )
583
+ docGenerationTasks.deleteTask(tabId )
581
584
}
582
585
583
586
private suspend fun provideFeedbackAndRegenerateCode (tabId : String ) {
@@ -728,6 +731,7 @@ class DocController(
728
731
message : String ,
729
732
) {
730
733
var session: DocSession ? = null
734
+ val docGenerationTask = docGenerationTasks.getTask(tabId)
731
735
try {
732
736
logger.debug { " $FEATURE_NAME : Processing message: $message " }
733
737
session = getSessionInfo(tabId)
@@ -746,7 +750,7 @@ class DocController(
746
750
747
751
when (session.sessionState.phase) {
748
752
SessionStatePhase .CODEGEN -> {
749
- onCodeGeneration(session, message, tabId, mode)
753
+ onCodeGeneration(session, message, tabId, docGenerationTask. mode)
750
754
}
751
755
752
756
else -> null
@@ -756,7 +760,7 @@ class DocController(
756
760
is PrepareDocGenerationState -> state.filePaths
757
761
else -> emptyList()
758
762
}
759
- sendDocGenerationTelemetry(filePaths, session)
763
+ sendDocGenerationTelemetry(filePaths, session, docGenerationTask )
760
764
broadcastQEvent(QFeatureEvent .INVOCATION )
761
765
762
766
if (filePaths.isNotEmpty()) {
@@ -767,7 +771,7 @@ class DocController(
767
771
} catch (err: Exception ) {
768
772
// For non edit mode lock the chat input until they explicitly click one of the follow-ups
769
773
var isEnableChatInput = false
770
- if (err is DocException && Mode . EDIT == mode ) {
774
+ if (err is DocException && docGenerationTask.mode == Mode . EDIT ) {
771
775
isEnableChatInput = err.remainingIterations != null && err.remainingIterations > 0
772
776
}
773
777
@@ -779,15 +783,16 @@ class DocController(
779
783
messenger.sendUpdatePromptProgress(tabId = followUpMessage.tabId, inProgress(progress = 10 , message(" amazonqDoc.progress_message.scanning" )))
780
784
781
785
val session = getSessionInfo(followUpMessage.tabId)
786
+ val docGenerationTask = docGenerationTasks.getTask(followUpMessage.tabId)
782
787
783
788
messenger.sendAnswer(
784
- message = docGenerationProgressMessage(DocGenerationStep .UPLOAD_TO_S3 , this .mode),
789
+ message = docGenerationProgressMessage(DocGenerationStep .UPLOAD_TO_S3 , docGenerationTask .mode),
785
790
messageType = DocMessageType .AnswerPart ,
786
791
tabId = followUpMessage.tabId,
787
792
)
788
793
789
794
try {
790
- val sessionMessage: String = when (mode) {
795
+ val sessionMessage: String = when (docGenerationTask. mode) {
791
796
Mode .CREATE -> message(" amazonqDoc.session.create" )
792
797
else -> message(" amazonqDoc.session.sync" )
793
798
}
@@ -821,10 +826,10 @@ class DocController(
821
826
return
822
827
}
823
828
824
- sendDocGenerationTelemetry(filePaths, session)
829
+ sendDocGenerationTelemetry(filePaths, session, docGenerationTask )
825
830
826
831
messenger.sendAnswer(
827
- message = docGenerationProgressMessage(DocGenerationStep .COMPLETE , mode),
832
+ message = docGenerationProgressMessage(DocGenerationStep .COMPLETE , docGenerationTask. mode),
828
833
messageType = DocMessageType .AnswerPart ,
829
834
tabId = followUpMessage.tabId,
830
835
)
@@ -907,7 +912,6 @@ class DocController(
907
912
908
913
private suspend fun retryRequests (tabId : String ) {
909
914
var session: DocSession ? = null
910
- docGenerationTask = DocGenerationTask ()
911
915
try {
912
916
messenger.sendAsyncEventProgress(
913
917
tabId = tabId,
@@ -954,6 +958,7 @@ class DocController(
954
958
val session = getSessionInfo(tabId)
955
959
val currentSourceFolder = session.context.selectedSourceFolder
956
960
val projectRoot = session.context.projectRoot
961
+ val docGenerationTask = docGenerationTasks.getTask(tabId)
957
962
958
963
withContext(EDT ) {
959
964
messenger.sendAnswer(
@@ -1017,7 +1022,7 @@ class DocController(
1017
1022
}
1018
1023
}
1019
1024
1020
- private fun sendDocGenerationTelemetry (filePaths : List <NewFileZipInfo >, session : DocSession ) {
1025
+ private fun sendDocGenerationTelemetry (filePaths : List <NewFileZipInfo >, session : DocSession , docGenerationTask : DocGenerationTask ) {
1021
1026
docGenerationTask.conversationId = session.conversationId
1022
1027
val (totalGeneratedChars, totalGeneratedLines, totalGeneratedFiles) = session.countedGeneratedContent(filePaths, docGenerationTask.interactionType)
1023
1028
docGenerationTask.numberOfGeneratedChars = totalGeneratedChars
@@ -1030,6 +1035,7 @@ class DocController(
1030
1035
1031
1036
private fun sendDocAcceptanceTelemetry (tabId : String ) {
1032
1037
val session = getSessionInfo(tabId)
1038
+ val docGenerationTask = docGenerationTasks.getTask(tabId)
1033
1039
var filePaths: List <NewFileZipInfo > = emptyList()
1034
1040
1035
1041
when (val state = session.sessionState) {
0 commit comments