Skip to content

Commit 6e8bb5a

Browse files
committed
fix(amazonqFeatureDev): include cancellation token
1 parent dc5d9fb commit 6e8bb5a

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
@@ -288,10 +288,10 @@ class FeatureDevController(
288288

289289
private suspend fun handleStopMessage(message: IncomingFeatureDevMessage.StopResponse) {
290290
var session: Session? = null
291-
messenger.sendAnswer( tabId = message.tabId, "Stopping code generation ...", messageType = FeatureDevMessageType.Answer, canBeVoted = false)
291+
messenger.sendAnswer( tabId = message.tabId, message("amazonqFeatureDev.code_generation.stopping_code_generation"), messageType = FeatureDevMessageType.Answer, canBeVoted = false)
292292
messenger.sendUpdatePlaceholder(
293293
tabId = message.tabId,
294-
newPlaceholder = "Stopping code generation ..."
294+
newPlaceholder = message("amazonqFeatureDev.code_generation.stopping_code_generation")
295295
)
296296
messenger.sendChatInputEnabledMessage(tabId = message.tabId, enabled = false)
297297
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
@@ -25,16 +25,16 @@ private val logger = getLogger<CodeGenerationState>()
2525
class CodeGenerationState(
2626
override val tabID: String,
2727
override var approach: String,
28-
override val token: CancellationTokenSource?,
2928
val config: SessionStateConfig,
3029
val uploadId: String,
3130
val currentIteration: Int,
3231
val repositorySize: Double,
3332
val messenger: MessagePublisher,
3433
var codeGenerationRemainingIterationCount: Int? = null,
3534
var codeGenerationTotalIterationCount: Int? = null,
36-
var currentCodeGenerationId: UUID? = null
37-
) : SessionState {
35+
var currentCodeGenerationId: UUID? = null,
36+
override var token: CancellationTokenSource?
37+
) : SessionState {
3838
override val phase = SessionStatePhase.CODEGEN
3939

4040
override suspend fun interact(action: SessionStateAction): SessionStateInteraction {
@@ -62,8 +62,7 @@ class CodeGenerationState(
6262
tabId = tabID,
6363
newPlaceholder = message("amazonqFeatureDev.code_generation.generating_code")
6464
)
65-
66-
val codeGenerationResult = generateCode(codeGenerationId = response.codeGenerationId(), messenger = messenger)
65+
val codeGenerationResult = generateCode(codeGenerationId = response.codeGenerationId(), messenger = messenger, token = action.token)
6766
numberOfReferencesGenerated = codeGenerationResult.references.size
6867
numberOfFilesGenerated = codeGenerationResult.newFiles.size
6968
codeGenerationRemainingIterationCount = codeGenerationResult.codeGenerationRemainingIterationCount
@@ -115,11 +114,16 @@ class CodeGenerationState(
115114
}
116115
}
117116

118-
private suspend fun CodeGenerationState.generateCode(codeGenerationId: String, messenger: MessagePublisher): CodeGenerationResult {
117+
private suspend fun CodeGenerationState.generateCode(codeGenerationId: String, messenger: MessagePublisher, token: CancellationTokenSource?): CodeGenerationResult {
119118
val pollCount = 180
120119
val requestDelay = 10000L
121120

121+
122122
repeat(pollCount) {
123+
124+
if (token?.token()?.isCancellationRequested == true) {
125+
return CodeGenerationResult(emptyList(), emptyList(), emptyList());
126+
}
123127
val codeGenerationResultState = config.featureDevService.getTaskAssistCodeGeneration(
124128
conversationId = config.conversationId,
125129
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
@@ -55,6 +55,8 @@ amazonqFeatureDev.code_generation.notification_message=Your code suggestions fro
5555
amazonqFeatureDev.code_generation.notification_open_link=Open chat
5656
amazonqFeatureDev.code_generation.notification_title=Amazon Q Developer Agent for software development
5757
amazonqFeatureDev.code_generation.provide_code_feedback=How can I improve the code for your use case?
58+
amazonqFeatureDev.code_generation.stopping_code_generation=Stopping code generation ...
59+
amazonqFeatureDev.code_generation.stopped_code_generation=You've stopped code generation.
5860
amazonqFeatureDev.code_generation.updated_code=Okay, I updated your code files. Would you like to work on another task?
5961
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).
6062
amazonqFeatureDev.error_text=Sorry, we encountered a problem when processing your request.

0 commit comments

Comments
 (0)