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,
),