Skip to content

Commit 5f52add

Browse files
authored
fix(amazonq): Support chat quick action commands (#5700)
1 parent 00fd096 commit 5f52add

File tree

4 files changed

+59
-20
lines changed

4 files changed

+59
-20
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@
33

44
package software.aws.toolkits.jetbrains.services.cwc.commands
55

6+
import com.intellij.openapi.application.ApplicationManager
67
import com.intellij.openapi.project.Project
78
import kotlinx.coroutines.flow.MutableSharedFlow
89
import kotlinx.coroutines.flow.asSharedFlow
10+
import kotlinx.coroutines.runBlocking
11+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
12+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
15+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
916
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
17+
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor
18+
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType
1019

1120
// Register Editor Actions in the Editor Context Menu
1221
class ActionRegistrar {
@@ -15,7 +24,28 @@ class ActionRegistrar {
1524
val flow = _messages.asSharedFlow()
1625

1726
fun reportMessageClick(command: EditorContextCommand, project: Project) {
18-
_messages.tryEmit(ContextMenuActionMessage(command, project))
27+
if (command == EditorContextCommand.GenerateUnitTests) {
28+
// pre-existing old chat code path
29+
_messages.tryEmit(ContextMenuActionMessage(command, project))
30+
} else {
31+
// new agentic chat route
32+
ApplicationManager.getApplication().executeOnPooledThread {
33+
runBlocking {
34+
val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project)
35+
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
36+
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
37+
var uiMessage: FlareUiMessage? = null
38+
if (command.verb != "sendToPrompt") {
39+
val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name)
40+
uiMessage = FlareUiMessage(command = "genericCommand", params = params)
41+
} else {
42+
val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU)
43+
uiMessage = FlareUiMessage(command = "sendToPrompt", params = params)
44+
}
45+
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
46+
}
47+
}
48+
}
1949
}
2050

2151
fun reportMessageClick(command: EditorContextCommand, issue: MutableMap<String, String>, project: Project) {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/EditorContextCommand.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ enum class EditorContextCommand(
3131
actionId = "aws.amazonq.generateUnitTests",
3232
),
3333
SendToPrompt(
34-
verb = "SendToPrompt",
34+
verb = "sendToPrompt",
3535
actionId = "aws.amazonq.sendToPrompt",
3636
),
3737
ExplainCodeScanIssue(

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -289,28 +289,11 @@ class ChatController private constructor(
289289
if (message.project != context.project) {
290290
return
291291
}
292-
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
293-
val triggerId = UUID.randomUUID().toString()
294-
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
295-
296-
if (message.command == EditorContextCommand.SendToPrompt) {
297-
messagePublisher.publish(
298-
EditorContextCommandMessage(
299-
message = codeSelection,
300-
command = message.command.actionId,
301-
triggerId = triggerId,
302-
),
303-
)
304-
return
305-
}
292+
306293
if (message.command == EditorContextCommand.GenerateUnitTests) {
307294
// Publish an event to "codetest" tab with command as "test" and type as "addAnswer"
308295
val messageToPublish = TestCommandMessage()
309296
context.messagesFromAppToUi.publish(messageToPublish)
310-
} else {
311-
// Create prompt
312-
val prompt = "${message.command} the following part of my code for me: $codeSelection"
313-
processPromptActions(prompt, message, triggerId, fileContext)
314297
}
315298
}
316299

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
5+
6+
// https://github.com/aws/language-server-runtimes/blob/main/chat-client-ui-types/src/uiContracts.ts#L27
7+
enum class TriggerType(val value: String) {
8+
HOTKEYS("hotkeys"),
9+
CLICK("click"),
10+
CONTEXT_MENU("contextMenu"),
11+
}
12+
13+
data class GenericCommandParams(
14+
val tabId: String? = null,
15+
val selection: String,
16+
val triggerType: TriggerType,
17+
val genericCommand: String,
18+
)
19+
20+
// https://github.com/aws/language-server-runtimes/blob/b7c4718b9bd84e08e72b992da5d699549af9f115/chat-client-ui-types/src/uiContracts.ts#L67
21+
data class SendToPromptParams(
22+
val selection: String,
23+
val triggerType: TriggerType,
24+
val prompt: ChatPrompt? = null,
25+
val autoSubmit: Boolean? = null,
26+
)

0 commit comments

Comments
 (0)