diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt index b9a6efd5b48..e5e92f7544b 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt @@ -29,7 +29,7 @@ class ActionRegistrar { fun reportMessageClick(command: EditorContextCommand, project: Project) { if (command == EditorContextCommand.GenerateUnitTests) { - AsyncChatUiListener.notifyPartialMessageUpdate(Gson().toJson(TestCommandMessage())) + AsyncChatUiListener.notifyPartialMessageUpdate(project, Gson().toJson(TestCommandMessage())) } else { // new agentic chat route ApplicationManager.getApplication().executeOnPooledThread { @@ -45,7 +45,7 @@ class ActionRegistrar { val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) uiMessage = FlareUiMessage(command = SEND_TO_PROMPT, params = params) } - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) } } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt index bf744d4b569..94f572984a9 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt @@ -4,6 +4,7 @@ package software.aws.toolkits.jetbrains.services.cwc.commands.codescan.actions import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.DataKey @@ -18,7 +19,14 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType class ExplainCodeIssueAction : AnAction(), DumbAware { + override fun getActionUpdateThread() = ActionUpdateThread.BGT + + override fun update(e: AnActionEvent) { + e.presentation.isEnabledAndVisible = e.project != null + } + override fun actionPerformed(e: AnActionEvent) { + val project = e.project ?: return val issueDataKey = DataKey.create>("amazonq.codescan.explainissue") val issueContext = e.getData(issueDataKey) ?: return @@ -50,7 +58,7 @@ class ExplainCodeIssueAction : AnAction(), DumbAware { ) val uiMessage = FlareUiMessage(SEND_TO_PROMPT, params) - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index dcaad8b7143..577b51cf612 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -315,6 +315,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC override fun sendChatUpdate(params: LSPAny): CompletableFuture { AsyncChatUiListener.notifyPartialMessageUpdate( + project, FlareUiMessage( command = CHAT_SEND_UPDATE, params = params, diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt index c6992526ec9..21d812cf075 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt @@ -3,10 +3,11 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat -import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project import com.intellij.util.messages.Topic import java.util.EventListener +@Deprecated("Why are we using a message bus for this????????") interface AsyncChatUiListener : EventListener { @Deprecated("shouldn't need this version") fun onChange(command: String) {} @@ -14,16 +15,17 @@ interface AsyncChatUiListener : EventListener { fun onChange(command: FlareUiMessage) {} companion object { - @Topic.AppLevel + @Topic.ProjectLevel val TOPIC = Topic.create("Partial chat message provider", AsyncChatUiListener::class.java) - fun notifyPartialMessageUpdate(command: FlareUiMessage) { - ApplicationManager.getApplication().messageBus.syncPublisher(TOPIC).onChange(command) + @Deprecated("Why are we using a message bus for this????????") + fun notifyPartialMessageUpdate(project: Project, command: FlareUiMessage) { + project.messageBus.syncPublisher(TOPIC).onChange(command) } @Deprecated("shouldn't need this version") - fun notifyPartialMessageUpdate(command: String) { - ApplicationManager.getApplication().messageBus.syncPublisher(TOPIC).onChange(command) + fun notifyPartialMessageUpdate(project: Project, command: String) { + project.messageBus.syncPublisher(TOPIC).onChange(command) } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt index bd64d7336f8..ac7deaa4134 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt @@ -37,7 +37,7 @@ import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap @Service(Service.Level.PROJECT) -class ChatCommunicationManager(private val cs: CoroutineScope) { +class ChatCommunicationManager(private val project: Project, private val cs: CoroutineScope) { val uiReady = CompletableDeferred() private val chatPartialResultMap = ConcurrentHashMap() private val inflightRequestByTabId = ConcurrentHashMap>() @@ -53,7 +53,7 @@ class ChatCommunicationManager(private val cs: CoroutineScope) { fun notifyUi(uiMessage: FlareUiMessage) { cs.launch { uiReady.await() - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) } } @@ -148,7 +148,7 @@ class ChatCommunicationManager(private val cs: CoroutineScope) { params = partialChatResult, isPartialResult = true ) - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) finalResultProcessed[token] = true ChatAsyncResultManager.getInstance(project).setResult(token, partialResultMap) return @@ -169,7 +169,7 @@ class ChatCommunicationManager(private val cs: CoroutineScope) { params = partialChatResult, isPartialResult = true ) - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) } } }