diff --git a/.changes/next-release/feature-c8e68d82-96e3-4043-9fd5-4fa97fc00fe6.json b/.changes/next-release/feature-c8e68d82-96e3-4043-9fd5-4fa97fc00fe6.json deleted file mode 100644 index b2ee7d735c9..00000000000 --- a/.changes/next-release/feature-c8e68d82-96e3-4043-9fd5-4fa97fc00fe6.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type" : "feature", - "description" : "Amazon Q /test, /doc, and /dev capabilities integrated into Agentic coding." -} \ No newline at end of file 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 fe93c71f505..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 @@ -3,6 +3,7 @@ @file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.cwc.commands +import com.google.gson.Gson import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow @@ -16,6 +17,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_ 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.amazonqCodeTest.controller.TestCommandMessage import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType @@ -26,21 +28,25 @@ class ActionRegistrar { val flow = _messages.asSharedFlow() fun reportMessageClick(command: EditorContextCommand, project: Project) { - // new agentic chat route - 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 != SEND_TO_PROMPT) { - val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) - uiMessage = FlareUiMessage(command = GENERIC_COMMAND, params = params) - } else { - val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) - uiMessage = FlareUiMessage(command = SEND_TO_PROMPT, params = params) + if (command == EditorContextCommand.GenerateUnitTests) { + AsyncChatUiListener.notifyPartialMessageUpdate(project, Gson().toJson(TestCommandMessage())) + } else { + // new agentic chat route + 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 != SEND_TO_PROMPT) { + val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name) + uiMessage = FlareUiMessage(command = GENERIC_COMMAND, params = params) + } else { + val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU) + uiMessage = FlareUiMessage(command = SEND_TO_PROMPT, params = params) + } + AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) } - AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage) } } } diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts index 35af48f8973..1033f29a8e1 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts @@ -38,6 +38,7 @@ export class QuickActionGenerator { const quickActionCommands = [ { + groupName: `Q Developer Agent for Software Development`, commands: [ ...(this.isFeatureDevEnabled ? [ @@ -77,6 +78,11 @@ export class QuickActionGenerator { }, ] : []), + ], + }, + { + groupName: `Q Developer Agent for Code Transformation`, + commands:[ ...(this.isCodeTransformEnabled ? [ { @@ -87,7 +93,22 @@ export class QuickActionGenerator { ] : []), ], - } + }, + { + groupName: 'Quick Actions', + commands: [ + { + command: '/help', + icon: MynahIcons.HELP, + description: 'Learn more about Amazon Q', + }, + { + command: '/clear', + icon: MynahIcons.TRASH, + description: 'Clear this session', + }, + ], + }, ].filter((section) => section.commands.length > 0) const commandUnavailability: Record< diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts index d8bb2048801..b700b38ff6d 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts @@ -344,7 +344,14 @@ private handleDocCommand(chatPrompt: ChatPrompt, tabID: string, taskName: string this.connector.startTestGen(testTabId, realPromptText) return } - + /** + * right click -> generate test has no tab id + * we have to manually create one if a testgen tab + * wasn't previously created + */ + if (!tabID) { + tabID = this.mynahUI?.updateStore('', {}) + } const affectedTabId: string | undefined = this.addTab(tabID) // if there is no test tab, open a new one diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt index bae6b41c363..4055b8381a5 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt @@ -34,9 +34,7 @@ class AwsServerCapabilitiesProvider { ), history = true, export = true, - mcpServers = true, - // Seems like this is the only way to bounce reroute back to the LSP? - reroute = true, + mcpServers = true ) } } @@ -50,7 +48,6 @@ data class ChatOptions( val history: Boolean, val export: Boolean, val mcpServers: Boolean, - val reroute: Boolean, ) data class QuickActions( diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt index 8168645d829..604a80e9215 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt @@ -25,7 +25,6 @@ data class DeveloperProfiles( val developerProfiles: Boolean, val mcp: Boolean, val pinnedContextEnabled: Boolean, - val imageContextEnabled: Boolean, val reroute: Boolean, val workspaceFilePath: String?, ) @@ -68,7 +67,6 @@ fun createExtendedClientMetadata(project: Project): ExtendedClientMetadata { developerProfiles = true, mcp = true, pinnedContextEnabled = true, - imageContextEnabled = true, reroute = true, workspaceFilePath = project.workspaceFile?.path, ),