From a578559910f7d04557493d5b87fd0228d714c1b8 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Thu, 8 May 2025 17:07:11 -0700 Subject: [PATCH 1/8] action commands in chat support --- .../services/cwc/commands/ActionRegistrar.kt | 39 ++++++++++++++++++- .../services/cwc/controller/ChatController.kt | 19 +-------- .../model/aws/chat/GenericCommandParams.kt | 18 +++++++++ 3 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt 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 71110cba420..7d9cd4d7db1 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 @@ -3,10 +3,17 @@ package software.aws.toolkits.jetbrains.services.cwc.commands +import com.google.gson.Gson import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.runBlocking +import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage +import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor +import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType // Register Editor Actions in the Editor Context Menu class ActionRegistrar { @@ -15,7 +22,29 @@ class ActionRegistrar { val flow = _messages.asSharedFlow() fun reportMessageClick(command: EditorContextCommand, project: Project) { - _messages.tryEmit(ContextMenuActionMessage(command, project)) + if (command == EditorContextCommand.GenerateUnitTests) { + // pre-existing old chat code path + _messages.tryEmit(ContextMenuActionMessage(command, project)) + } + else { + // new agentic chat route + runBlocking { + val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) + val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) + val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" + + val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) + + val uiMessage = """ + { + "command": "genericCommand", + "params": ${Gson().toJson(params)} + } + """.trimIndent() + AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + } + } + } fun reportMessageClick(command: EditorContextCommand, issue: MutableMap, project: Project) { @@ -25,5 +54,13 @@ class ActionRegistrar { // provide singleton access companion object { val instance = ActionRegistrar() + + /** + * Computes the product of 10 * 10 + * @return The result of 10 * 10 + */ + fun computeTenTimesTen(): Int { + return 10 * 10 + } } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt index c061f8be1c3..09c970814d3 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt @@ -289,28 +289,11 @@ class ChatController private constructor( if (message.project != context.project) { return } - val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) - val triggerId = UUID.randomUUID().toString() - val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" - - if (message.command == EditorContextCommand.SendToPrompt) { - messagePublisher.publish( - EditorContextCommandMessage( - message = codeSelection, - command = message.command.actionId, - triggerId = triggerId, - ), - ) - return - } + if (message.command == EditorContextCommand.GenerateUnitTests) { // Publish an event to "codetest" tab with command as "test" and type as "addAnswer" val messageToPublish = TestCommandMessage() context.messagesFromAppToUi.publish(messageToPublish) - } else { - // Create prompt - val prompt = "${message.command} the following part of my code for me: $codeSelection" - processPromptActions(prompt, message, triggerId, fileContext) } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt new file mode 100644 index 00000000000..3d42b0ace2c --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt @@ -0,0 +1,18 @@ +// 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.model.aws.chat + + +//https://github.com/aws/language-server-runtimes/blob/main/chat-client-ui-types/src/uiContracts.ts#L27 +enum class TriggerType(val value: String) { + HOTKEYS("hotkeys"), + CLICK("click"), + CONTEXT_MENU("contextMenu") +} + +data class GenericCommandParams( + val selection: String, + val triggerType: TriggerType, + val genericCommand: String +) From 77d9cab22f4132520e1c63ac636c36077e21dcf4 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Thu, 8 May 2025 17:30:15 -0700 Subject: [PATCH 2/8] detekt --- .../services/cwc/commands/ActionRegistrar.kt | 32 +++++++++---------- .../cwc/commands/EditorContextCommand.kt | 2 +- .../model/aws/chat/GenericCommandParams.kt | 12 ++++--- 3 files changed, 25 insertions(+), 21 deletions(-) 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 7d9cd4d7db1..2586ddb3a23 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 @@ -1,6 +1,6 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 - +@file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.cwc.commands import com.google.gson.Gson @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor @@ -25,26 +26,33 @@ class ActionRegistrar { if (command == EditorContextCommand.GenerateUnitTests) { // pre-existing old chat code path _messages.tryEmit(ContextMenuActionMessage(command, project)) - } - else { + } else { // new agentic chat route runBlocking { val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" - - val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) - - val uiMessage = """ + var uiMessage = "" + if (command.verb != "sendToPrompt") { + val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) + uiMessage = """ { "command": "genericCommand", "params": ${Gson().toJson(params)} } """.trimIndent() + } else { + val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) + uiMessage = """ + { + "command": "sendToPrompt", + "params": ${Gson().toJson(params)} + } + """.trimIndent() + } AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) } } - } fun reportMessageClick(command: EditorContextCommand, issue: MutableMap, project: Project) { @@ -54,13 +62,5 @@ class ActionRegistrar { // provide singleton access companion object { val instance = ActionRegistrar() - - /** - * Computes the product of 10 * 10 - * @return The result of 10 * 10 - */ - fun computeTenTimesTen(): Int { - return 10 * 10 - } } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/EditorContextCommand.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/EditorContextCommand.kt index d7b8f8d0a42..33a9cc50baa 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/EditorContextCommand.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/EditorContextCommand.kt @@ -31,7 +31,7 @@ enum class EditorContextCommand( actionId = "aws.amazonq.generateUnitTests", ), SendToPrompt( - verb = "SendToPrompt", + verb = "sendToPrompt", actionId = "aws.amazonq.sendToPrompt", ), ExplainCodeScanIssue( diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt index 3d42b0ace2c..8c3ed00af8e 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt @@ -3,16 +3,20 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat - -//https://github.com/aws/language-server-runtimes/blob/main/chat-client-ui-types/src/uiContracts.ts#L27 +// https://github.com/aws/language-server-runtimes/blob/main/chat-client-ui-types/src/uiContracts.ts#L27 enum class TriggerType(val value: String) { HOTKEYS("hotkeys"), CLICK("click"), - CONTEXT_MENU("contextMenu") + CONTEXT_MENU("contextMenu"), } data class GenericCommandParams( val selection: String, val triggerType: TriggerType, - val genericCommand: String + val genericCommand: String, +) + +data class SendToPromptParams( + val selection: String, + val triggerType: TriggerType, ) From 017e925cc176e6fa41a8023b9f412fb57a5b3a77 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 9 May 2025 10:57:32 -0700 Subject: [PATCH 3/8] format --- .../services/cwc/commands/ActionRegistrar.kt | 17 ++++------------- .../lsp/model/aws/chat/GenericCommandParams.kt | 4 ++++ 2 files changed, 8 insertions(+), 13 deletions(-) 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 2586ddb3a23..d64c67437f7 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 @@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener +import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType @@ -32,23 +33,13 @@ class ActionRegistrar { val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" - var uiMessage = "" + var uiMessage: FlareUiMessage? = null if (command.verb != "sendToPrompt") { val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) - uiMessage = """ - { - "command": "genericCommand", - "params": ${Gson().toJson(params)} - } - """.trimIndent() + uiMessage = FlareUiMessage(command = "genericCommand", params = params) } else { val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) - uiMessage = """ - { - "command": "sendToPrompt", - "params": ${Gson().toJson(params)} - } - """.trimIndent() + uiMessage = FlareUiMessage(command = "sendToPrompt", params = params) } AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt index 8c3ed00af8e..7cd433a09d4 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt @@ -11,12 +11,16 @@ enum class TriggerType(val value: String) { } data class GenericCommandParams( + val tabId: String? = null, val selection: String, val triggerType: TriggerType, val genericCommand: String, ) +// https://github.com/aws/language-server-runtimes/blob/b7c4718b9bd84e08e72b992da5d699549af9f115/chat-client-ui-types/src/uiContracts.ts#L67 data class SendToPromptParams( val selection: String, val triggerType: TriggerType, + val prompt: ChatPrompt? = null, + val autoSubmit: Boolean? = null ) From 92062ee9330ce2165315e2de599d6f78718db234 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 9 May 2025 11:14:05 -0700 Subject: [PATCH 4/8] detekt --- .../toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt | 1 - .../services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) 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 d64c67437f7..fc2dc335fb5 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 @@ -3,7 +3,6 @@ @file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.cwc.commands -import com.google.gson.Gson import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt index 7cd433a09d4..5cdea4dc84f 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GenericCommandParams.kt @@ -22,5 +22,5 @@ data class SendToPromptParams( val selection: String, val triggerType: TriggerType, val prompt: ChatPrompt? = null, - val autoSubmit: Boolean? = null + val autoSubmit: Boolean? = null, ) From 8146d97ec6b84668558079db9281436b2b21511b Mon Sep 17 00:00:00 2001 From: Lei Gao <97199248+leigaol@users.noreply.github.com> Date: Fri, 9 May 2025 11:45:48 -0700 Subject: [PATCH 5/8] Update plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt Co-authored-by: Richard Li <742829+rli@users.noreply.github.com> --- .../toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt | 1 - 1 file changed, 1 deletion(-) 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 fc2dc335fb5..9547b7f30a7 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 @@ -1,6 +1,5 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -@file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.cwc.commands import com.intellij.openapi.project.Project From 466fe68d5ce40a9b5f5a5c7c5ba23c2867cb4349 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 9 May 2025 11:46:38 -0700 Subject: [PATCH 6/8] minimize changes --- .../toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt | 1 + 1 file changed, 1 insertion(+) 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 9547b7f30a7..720bd153e31 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 @@ -1,5 +1,6 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 + package software.aws.toolkits.jetbrains.services.cwc.commands import com.intellij.openapi.project.Project From 5313dadc1215160104cdbfffab4732d68d9aa5f3 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 9 May 2025 11:57:18 -0700 Subject: [PATCH 7/8] project coroutine --- .../jetbrains/services/cwc/commands/ActionRegistrar.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 720bd153e31..0fd937f978f 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 @@ -6,7 +6,8 @@ package software.aws.toolkits.jetbrains.services.cwc.commands import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.launch +import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams @@ -28,7 +29,7 @@ class ActionRegistrar { _messages.tryEmit(ContextMenuActionMessage(command, project)) } else { // new agentic chat route - runBlocking { + projectCoroutineScope(project).launch { val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" From bcd66db98b50968e152474f0c4960160523f606d Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 9 May 2025 12:00:10 -0700 Subject: [PATCH 8/8] fix edt blocking --- .../services/cwc/commands/ActionRegistrar.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) 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 0fd937f978f..292d1aa7358 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 @@ -3,11 +3,11 @@ package software.aws.toolkits.jetbrains.services.cwc.commands +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.launch -import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope +import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams @@ -29,19 +29,21 @@ class ActionRegistrar { _messages.tryEmit(ContextMenuActionMessage(command, project)) } else { // new agentic chat route - projectCoroutineScope(project).launch { - val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) - val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) - val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" - var uiMessage: FlareUiMessage? = null - if (command.verb != "sendToPrompt") { - val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) - uiMessage = FlareUiMessage(command = "genericCommand", params = params) - } else { - val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) - uiMessage = FlareUiMessage(command = "sendToPrompt", params = params) + ApplicationManager.getApplication().executeOnPooledThread { + runBlocking { + val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project) + val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu) + val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n" + var uiMessage: FlareUiMessage? = null + if (command.verb != "sendToPrompt") { + val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) + uiMessage = FlareUiMessage(command = "genericCommand", params = params) + } else { + val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) + uiMessage = FlareUiMessage(command = "sendToPrompt", params = params) + } + AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) } - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) } } }