Skip to content

Commit 67c231d

Browse files
committed
fix(amazonqFeatureDev): include cancellation token
1 parent dabd53c commit 67c231d

File tree

10 files changed

+46
-15
lines changed

10 files changed

+46
-15
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ class FeatureDevController(
290290

291291
private suspend fun handleStopMessage(message: IncomingFeatureDevMessage.StopResponse) {
292292
var session: Session? = null
293-
messenger.sendAnswer( tabId = message.tabId, "Stopping code generation ...", messageType = FeatureDevMessageType.Answer, canBeVoted = false)
293+
messenger.sendAnswer( tabId = message.tabId, message("amazonqFeatureDev.code_generation.stopping_code_generation"), messageType = FeatureDevMessageType.Answer, canBeVoted = false)
294294
messenger.sendUpdatePlaceholder(
295295
tabId = message.tabId,
296-
newPlaceholder = "Stopping code generation ..."
296+
newPlaceholder = message("amazonqFeatureDev.code_generation.stopping_code_generation")
297297
)
298298
messenger.sendChatInputEnabledMessage(tabId = message.tabId, enabled = false)
299299
session = getSessionInfo(message.tabId)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevControllerExtensions.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package software.aws.toolkits.jetbrains.services.amazonqFeatureDev.controller
55

66
import com.intellij.notification.NotificationAction
7+
import org.gradle.tooling.GradleConnector
78
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CODE_GENERATION_RETRY_LIMIT
89
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FeatureDevMessageType
910
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUp
@@ -68,6 +69,21 @@ suspend fun FeatureDevController.onCodeGeneration(session: Session, message: Str
6869
}
6970
}
7071

72+
if (state.token?.token()?.isCancellationRequested == true) {
73+
messenger.sendAnswer(
74+
tabId = tabId,
75+
messageType = FeatureDevMessageType.Answer,
76+
message = message("amazonqFeatureDev.code_generation.stopped_code_generation")
77+
)
78+
messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = true)
79+
80+
messenger.sendUpdatePlaceholder(
81+
tabId = tabId,
82+
newPlaceholder = message("amazonqFeatureDev.placeholder.new_plan")
83+
)
84+
return
85+
}
86+
7187
// Atm this is the only possible path as codegen is mocked to return empty.
7288
if (filePaths.size or deletedFiles.size == 0) {
7389
messenger.sendAnswer(
@@ -115,9 +131,13 @@ suspend fun FeatureDevController.onCodeGeneration(session: Session, message: Str
115131

116132
messenger.sendUpdatePlaceholder(tabId = tabId, newPlaceholder = message("amazonqFeatureDev.placeholder.after_code_generation"))
117133
} finally {
118-
messenger.sendAsyncEventProgress(tabId = tabId, inProgress = false) // Finish processing the event
119-
messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false) // Lock chat input until a follow-up is clicked.
120134

135+
if (session.sessionState.token?.token()?.isCancellationRequested == true) {
136+
session.sessionState.token = GradleConnector.newCancellationTokenSource()
137+
} else {
138+
messenger.sendAsyncEventProgress(tabId = tabId, inProgress = false) // Finish processing the event
139+
messenger.sendChatInputEnabledMessage(tabId = tabId, enabled = false) // Lock chat input until a follow-up is clicked.
140+
}
121141
if (toolWindow != null && !toolWindow.isVisible) {
122142
notifyInfo(
123143
title = message("amazonqFeatureDev.code_generation.notification_title"),

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/CodeGenerationState.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ private val logger = getLogger<CodeGenerationState>()
3131
class CodeGenerationState(
3232
override val tabID: String,
3333
override var approach: String,
34-
override val token: CancellationTokenSource?,
3534
val config: SessionStateConfig,
3635
val uploadId: String,
3736
val currentIteration: Int,
3837
val repositorySize: Double,
3938
val messenger: MessagePublisher,
4039
var codeGenerationRemainingIterationCount: Int? = null,
4140
var codeGenerationTotalIterationCount: Int? = null,
42-
var currentCodeGenerationId: UUID? = null
43-
) : SessionState {
41+
var currentCodeGenerationId: UUID? = null,
42+
override var token: CancellationTokenSource?
43+
) : SessionState {
4444
override val phase = SessionStatePhase.CODEGEN
4545

4646
override suspend fun interact(action: SessionStateAction): SessionStateInteraction {
@@ -69,8 +69,7 @@ class CodeGenerationState(
6969
tabId = tabID,
7070
newPlaceholder = message("amazonqFeatureDev.code_generation.generating_code")
7171
)
72-
73-
val codeGenerationResult = generateCode(codeGenerationId = response.codeGenerationId(), messenger = messenger)
72+
val codeGenerationResult = generateCode(codeGenerationId = response.codeGenerationId(), messenger = messenger, token = action.token)
7473
numberOfReferencesGenerated = codeGenerationResult.references.size
7574
numberOfFilesGenerated = codeGenerationResult.newFiles.size
7675
codeGenerationRemainingIterationCount = codeGenerationResult.codeGenerationRemainingIterationCount
@@ -127,11 +126,16 @@ class CodeGenerationState(
127126
}
128127
}
129128

130-
private suspend fun CodeGenerationState.generateCode(codeGenerationId: String, messenger: MessagePublisher): CodeGenerationResult {
129+
private suspend fun CodeGenerationState.generateCode(codeGenerationId: String, messenger: MessagePublisher, token: CancellationTokenSource?): CodeGenerationResult {
131130
val pollCount = 180
132131
val requestDelay = 10000L
133132

133+
134134
repeat(pollCount) {
135+
136+
if (token?.token()?.isCancellationRequested == true) {
137+
return CodeGenerationResult(emptyList(), emptyList(), emptyList());
138+
}
135139
val codeGenerationResultState = config.featureDevService.getTaskAssistCodeGeneration(
136140
conversationId = config.conversationId,
137141
codeGenerationId = codeGenerationId,

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/ConversationNotStartedState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.gradle.tooling.CancellationTokenSource
88
class ConversationNotStartedState(
99
override var approach: String,
1010
override val tabID: String,
11-
override val token: CancellationTokenSource?,
11+
override var token: CancellationTokenSource?,
1212
) : SessionState {
1313
override val phase = SessionStatePhase.INIT
1414

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/PrepareCodeGenerationState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private val logger = getLogger<PrepareCodeGenerationState>()
2323

2424
class PrepareCodeGenerationState(
2525
override var tabID: String,
26-
override val token: CancellationTokenSource?,
26+
override var token: CancellationTokenSource?,
2727
override var approach: String,
2828
private var config: SessionStateConfig,
2929
val filePaths: List<NewFileZipInfo>,

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/Session.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session
66
import com.intellij.openapi.diagnostic.logger
77
import com.intellij.openapi.project.Project
88
import com.intellij.openapi.vfs.VfsUtil
9+
import org.gradle.tooling.GradleConnector
910
import software.aws.toolkits.jetbrains.services.amazonq.FeatureDevSessionContext
1011
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher
1112
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CODE_GENERATION_RETRY_LIMIT
@@ -81,7 +82,7 @@ class Session(val tabID: String, val project: Project) {
8182
currentIteration = 0, // first code gen iteration
8283
uploadId = "", // There is no code gen uploadId so far
8384
messenger = messenger,
84-
token = null
85+
token = GradleConnector.newCancellationTokenSource()
8586
)
8687
}
8788

@@ -115,6 +116,7 @@ class Session(val tabID: String, val project: Project) {
115116
var action = SessionStateAction(
116117
task = task,
117118
msg = msg,
119+
token = sessionState.token
118120
)
119121
val resp = sessionState.interact(action)
120122
if (resp.nextState != null) {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/SessionState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.gradle.tooling.CancellationTokenSource
88
interface SessionState {
99
val tabID: String
1010
val phase: SessionStatePhase?
11-
val token: CancellationTokenSource?
11+
var token: CancellationTokenSource?
1212
var approach: String
1313
suspend fun interact(action: SessionStateAction): SessionStateInteraction
1414
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/SessionStateTypes.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
package software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session
55

66
import com.fasterxml.jackson.annotation.JsonValue
7+
import org.gradle.tooling.CancellationTokenSource
78
import software.aws.toolkits.jetbrains.services.amazonq.FeatureDevSessionContext
89
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.FeatureDevService
910
import software.aws.toolkits.jetbrains.services.cwc.messages.RecommendationContentSpan
1011

1112
data class SessionStateAction(
1213
val task: String,
1314
val msg: String,
15+
val token: CancellationTokenSource? = null
1416
)
1517

1618
data class Interaction(

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/CodeGenerationStateTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class CodeGenerationStateTest : FeatureDevTestBase() {
5555
testUploadId,
5656
0,
5757
testRepositorySize,
58-
messenger
58+
messenger,
59+
token = null
5960
)
6061

6162
mockkStatic(MessagePublisher::sendAnswerPart)

plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ amazonqFeatureDev.code_generation.notification_message=Your code suggestions fro
5757
amazonqFeatureDev.code_generation.notification_open_link=Open chat
5858
amazonqFeatureDev.code_generation.notification_title=Amazon Q Developer Agent for software development
5959
amazonqFeatureDev.code_generation.provide_code_feedback=How can I improve the code for your use case?
60+
amazonqFeatureDev.code_generation.stopping_code_generation=Stopping code generation ...
61+
amazonqFeatureDev.code_generation.stopped_code_generation=You've stopped code generation.
6062
amazonqFeatureDev.code_generation.updated_code=Okay, I updated your code files. Would you like to work on another task?
6163
amazonqFeatureDev.content_length.error_text=The folder you selected is too large for me to use as context. Please choose a smaller folder to work on. For more information on quotas, see the [Amazon Q Developer documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/software-dev.html#quotas).
6264
amazonqFeatureDev.error_text=Sorry, we encountered a problem when processing your request.

0 commit comments

Comments
 (0)