-
Notifications
You must be signed in to change notification settings - Fork 272
fix(amazonq): Stop button disappears after being clicked #5765
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
d798928
080462d
caa130a
ca86d62
470accf
fdf0430
9784f49
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat | ||
|
||
import com.intellij.openapi.components.Service | ||
import com.intellij.openapi.components.service | ||
import com.intellij.openapi.project.Project | ||
import java.util.concurrent.CompletableFuture | ||
import java.util.concurrent.ConcurrentHashMap | ||
import java.util.concurrent.TimeUnit | ||
import java.util.concurrent.TimeoutException | ||
|
||
/** | ||
* Manages asynchronous results for chat operations, particularly handling the coordination | ||
* between partial results and final results during cancellation. | ||
*/ | ||
@Service(Service.Level.PROJECT) | ||
class ChatAsyncResultManager { | ||
private val results = ConcurrentHashMap<String, CompletableFuture<Any>>() | ||
private val completedResults = ConcurrentHashMap<String, Any>() | ||
private val timeout = 30L | ||
private val timeUnit = TimeUnit.SECONDS | ||
Check warning on line 23 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
|
||
fun createRequestId(requestId: String) { | ||
if (!completedResults.containsKey(requestId)) { | ||
results[requestId] = CompletableFuture() | ||
Check warning on line 27 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
} | ||
} | ||
Check warning on line 29 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
|
||
fun removeRequestId(requestId: String) { | ||
val future = results.remove(requestId) | ||
Check warning on line 32 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
if (future != null && !future.isDone) { | ||
future.cancel(true) | ||
Check warning on line 34 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
} | ||
completedResults.remove(requestId) | ||
} | ||
Check warning on line 37 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
|
||
fun setResult(requestId: String, result: Any) { | ||
val future = results[requestId] | ||
Check warning on line 40 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
if (future != null) { | ||
future.complete(result) | ||
results.remove(requestId) | ||
Check warning on line 43 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
} | ||
completedResults[requestId] = result | ||
} | ||
Check warning on line 46 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
|
||
fun getResult(requestId: String): Any? = | ||
getResult(requestId, timeout, timeUnit) | ||
Check warning on line 49 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
|
||
private fun getResult(requestId: String, timeout: Long, unit: TimeUnit): Any? { | ||
val completedResult = completedResults[requestId] | ||
Check warning on line 52 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
if (completedResult != null) { | ||
return completedResult | ||
Check warning on line 54 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
} | ||
|
||
val future = results[requestId] ?: throw IllegalArgumentException("Request ID not found: $requestId") | ||
|
||
try { | ||
val result = future.get(timeout, unit) | ||
completedResults[requestId] = result | ||
results.remove(requestId) | ||
return result | ||
} catch (e: TimeoutException) { | ||
future.cancel(true) | ||
results.remove(requestId) | ||
throw TimeoutException("Operation timed out for requestId: $requestId") | ||
Check warning on line 67 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
} | ||
} | ||
|
||
companion object { | ||
fun getInstance(project: Project) = project.service<ChatAsyncResultManager>() | ||
Check warning on line 72 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatAsyncResultManager.kt
|
||
} | ||
} |
Uh oh!
There was an error while loading. Please reload this page.