From 04cfd8ac72903ccff944ced9bfa2e7f869b0ccb5 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Thu, 24 Jul 2025 15:06:17 -0700 Subject: [PATCH 1/6] feat(amazonq): Enable one-click collection of logs from chat --- .../resources/META-INF/plugin-chat.xml | 1 + .../services/amazonq/GetAmazonQLogsAction.kt | 55 ++++++++++++++++++ .../amazonq/webview/BrowserConnector.kt | 56 +++++++++++-------- .../resources/AmazonQBundle.properties | 2 + .../AwsServerCapabilitiesProvider.kt | 2 + .../lsp/model/ExtendedClientMetadata.kt | 4 +- .../src/main/resources/META-INF/file.svg | 7 +++ 7 files changed, 102 insertions(+), 25 deletions(-) create mode 100644 plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt create mode 100644 plugins/amazonq/src/main/resources/META-INF/file.svg diff --git a/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml b/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml index 5d4e24f84be..638bf2c7a86 100644 --- a/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml +++ b/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml @@ -33,6 +33,7 @@ + diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt new file mode 100644 index 00000000000..fbe9d43d0e0 --- /dev/null +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt @@ -0,0 +1,55 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq + +import com.intellij.icons.AllIcons +import com.intellij.ide.actions.RevealFileAction +import com.intellij.ide.logsUploader.LogPacker +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.DumbAwareAction +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages +import com.intellij.openapi.util.IconLoader +import kotlinx.coroutines.runBlocking +import software.aws.toolkits.jetbrains.utils.notifyInfo +import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread +import software.aws.toolkits.resources.AmazonQBundle +import software.aws.toolkits.resources.AwsCoreBundle + +class GetAmazonQLogsAction : DumbAwareAction( + AmazonQBundle.message("amazonq.getLogs"), + null, + IconLoader.getIcon("/META-INF/file.svg", GetAmazonQLogsAction::class.java) +) { + + override fun getActionUpdateThread() = ActionUpdateThread.BGT + override fun actionPerformed(e: AnActionEvent) { + val project = e.project ?: return + showLogCollectionWarning(project) + } + + companion object { + fun showLogCollectionWarning(project: Project) { + if (Messages.showOkCancelDialog( + AmazonQBundle.message("amazonq.logs.warning"), + AmazonQBundle.message("amazonq.getLogs"), + AwsCoreBundle.message("general.ok"), + AwsCoreBundle.message("general.cancel"), + AllIcons.General.Warning + ) == 0 + ) { + pluginAwareExecuteOnPooledThread { + runBlocking { + try { + RevealFileAction.openFile(LogPacker.packLogs(project)) + } catch (_: Exception) { + notifyInfo("Cannot retrieve logs. Please try Help-> Collect Logs and Diagnostic data") + } + } + } + } + } + } +} diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index 6241eefedf3..533967ea68a 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -33,6 +33,7 @@ import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.core.utils.warn +import software.aws.toolkits.jetbrains.services.amazonq.GetAmazonQLogsAction import software.aws.toolkits.jetbrains.services.amazonq.apps.AppConnection import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageSerializer import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQChatServer @@ -419,33 +420,40 @@ class BrowserConnector( } CHAT_TAB_BAR_ACTIONS -> { - handleChat(AmazonQChatServer.tabBarActions, node) { params, invoke -> - invoke() - .whenComplete { actions, error -> - try { - if (error != null) { - throw error - } - - browser.postChat( - FlareUiMessage( - command = CHAT_TAB_BAR_ACTIONS, - params = actions + val action = node.params.get("action") + if (action.textValue() == "show_logs") { + runInEdt { + GetAmazonQLogsAction.showLogCollectionWarning(project) + } + } else { + handleChat(AmazonQChatServer.tabBarActions, node) { params, invoke -> + invoke() + .whenComplete { actions, error -> + try { + if (error != null) { + throw error + } + + browser.postChat( + FlareUiMessage( + command = CHAT_TAB_BAR_ACTIONS, + params = actions + ) ) - ) - } catch (e: Exception) { - val cause = if (e is CompletionException) e.cause else e - - // dont post error to UI if user cancels export - if (cause is ResponseErrorException && cause.responseError.code == ResponseErrorCode.RequestCancelled.getValue()) { - return@whenComplete - } - LOG.error { "Failed to perform chat tab bar action $e" } - params.tabId?.let { - browser.postChat(chatCommunicationManager.getErrorUiMessage(it, e, null)) + } catch (e: Exception) { + val cause = if (e is CompletionException) e.cause else e + + // dont post error to UI if user cancels export + if (cause is ResponseErrorException && cause.responseError.code == ResponseErrorCode.RequestCancelled.getValue()) { + return@whenComplete + } + LOG.error { "Failed to perform chat tab bar action $e" } + params.tabId?.let { + browser.postChat(chatCommunicationManager.getErrorUiMessage(it, e, null)) + } } } - } + } } } diff --git a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties index e780cdb6154..b38e1cac911 100644 --- a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties +++ b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties @@ -6,6 +6,8 @@ amazonqInlineChat.popup.editCode = Edit Code amazonqInlineChat.popup.generating = Generating... amazonqInlineChat.popup.reject=Reject \u238B amazonqInlineChat.popup.title=Enter Instructions for Q +amazonq.getLogs=Get Amazon Q logs +amazonq.logs.warning=Log files may contain sensitive information such as account IDs, resource names, and other data. Please be careful when sharing these logs. amazonq.refresh.panel=Refresh Chat Session amazonq.title=Amazon Q amazonq.workspace.settings.open.prompt=Workspace index is now enabled. You can disable it from Amazon Q settings. 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..53fbb136521 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 @@ -37,6 +37,7 @@ class AwsServerCapabilitiesProvider { mcpServers = true, // Seems like this is the only way to bounce reroute back to the LSP? reroute = true, + showLogs = true ) } } @@ -51,6 +52,7 @@ data class ChatOptions( val export: Boolean, val mcpServers: Boolean, val reroute: Boolean, + val showLogs: 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..e783d0e3147 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 @@ -32,6 +32,7 @@ data class DeveloperProfiles( data class WindowSettings( val showSaveFileDialog: Boolean, + val showLogs: Boolean, ) data class ClientInfoMetadata( @@ -73,7 +74,8 @@ fun createExtendedClientMetadata(project: Project): ExtendedClientMetadata { workspaceFilePath = project.workspaceFile?.path, ), window = WindowSettings( - showSaveFileDialog = true + showSaveFileDialog = true, + showLogs = true, ) ), contextConfiguration = ContextConfiguration( diff --git a/plugins/amazonq/src/main/resources/META-INF/file.svg b/plugins/amazonq/src/main/resources/META-INF/file.svg new file mode 100644 index 00000000000..2f57827e2e4 --- /dev/null +++ b/plugins/amazonq/src/main/resources/META-INF/file.svg @@ -0,0 +1,7 @@ + + + + Layer 1 + + + \ No newline at end of file From 563986f60711e286fd6017ab2779ec3bf2396563 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Fri, 25 Jul 2025 13:34:59 -0700 Subject: [PATCH 2/6] Add progress indicator --- .../jetbrains/services/amazonq/GetAmazonQLogsAction.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt index fbe9d43d0e0..9ccf99f7c70 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt @@ -14,7 +14,7 @@ import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.IconLoader import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.utils.notifyInfo -import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread +import software.aws.toolkits.jetbrains.utils.runUnderProgressIfNeeded import software.aws.toolkits.resources.AmazonQBundle import software.aws.toolkits.resources.AwsCoreBundle @@ -40,7 +40,7 @@ class GetAmazonQLogsAction : DumbAwareAction( AllIcons.General.Warning ) == 0 ) { - pluginAwareExecuteOnPooledThread { + runUnderProgressIfNeeded(project, AmazonQBundle.message("amazonq.getLogs"), cancelable = true) { runBlocking { try { RevealFileAction.openFile(LogPacker.packLogs(project)) From 244cffa7f40251e0f220c06f9635073d54e81073 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Thu, 31 Jul 2025 16:33:07 -0700 Subject: [PATCH 3/6] changed tooltip, made icon brighter in light mode --- .../services/amazonq/GetAmazonQLogsAction.kt | 18 +++++++++++++++--- .../resources/AmazonQBundle.properties | 1 + .../resources/{META-INF => icons}/file.svg | 0 3 files changed, 16 insertions(+), 3 deletions(-) rename plugins/amazonq/src/main/resources/{META-INF => icons}/file.svg (100%) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt index 9ccf99f7c70..2ad149e3876 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt @@ -12,6 +12,10 @@ import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.IconLoader +import com.intellij.ui.ColorUtil +import com.intellij.ui.JBColor +import com.intellij.util.IconUtil +import com.intellij.util.ui.UIUtil import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.utils.notifyInfo import software.aws.toolkits.jetbrains.utils.runUnderProgressIfNeeded @@ -19,11 +23,19 @@ import software.aws.toolkits.resources.AmazonQBundle import software.aws.toolkits.resources.AwsCoreBundle class GetAmazonQLogsAction : DumbAwareAction( - AmazonQBundle.message("amazonq.getLogs"), - null, - IconLoader.getIcon("/META-INF/file.svg", GetAmazonQLogsAction::class.java) + AmazonQBundle.message("amazonq.getLogs.tooltip.text") ) { + override fun update(e: AnActionEvent) { + super.update(e) + val baseIcon = IconLoader.getIcon("/icons/file.svg", GetAmazonQLogsAction::class.java) + e.presentation.icon = if (!JBColor.isBright()) { + baseIcon + } else { + IconUtil.colorize(baseIcon, ColorUtil.brighter(UIUtil.getLabelForeground(), 2)) + } + } + override fun getActionUpdateThread() = ActionUpdateThread.BGT override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return diff --git a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties index b38e1cac911..983e08d8b98 100644 --- a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties +++ b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties @@ -7,6 +7,7 @@ amazonqInlineChat.popup.generating = Generating... amazonqInlineChat.popup.reject=Reject \u238B amazonqInlineChat.popup.title=Enter Instructions for Q amazonq.getLogs=Get Amazon Q logs +amazonq.getLogs.tooltip.text=Show Logs amazonq.logs.warning=Log files may contain sensitive information such as account IDs, resource names, and other data. Please be careful when sharing these logs. amazonq.refresh.panel=Refresh Chat Session amazonq.title=Amazon Q diff --git a/plugins/amazonq/src/main/resources/META-INF/file.svg b/plugins/amazonq/src/main/resources/icons/file.svg similarity index 100% rename from plugins/amazonq/src/main/resources/META-INF/file.svg rename to plugins/amazonq/src/main/resources/icons/file.svg From 97b0bd7f3a6d90d0e382fafea96c992bdff1afe8 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Wed, 6 Aug 2025 10:12:37 -0700 Subject: [PATCH 4/6] use action instead of internal api --- .../services/amazonq/GetAmazonQLogsAction.kt | 41 +++++++------------ .../amazonq/webview/BrowserConnector.kt | 2 +- .../resources/AmazonQBundle.properties | 2 +- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt index 2ad149e3876..b7218b7edab 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt @@ -3,24 +3,23 @@ package software.aws.toolkits.jetbrains.services.amazonq -import com.intellij.icons.AllIcons -import com.intellij.ide.actions.RevealFileAction -import com.intellij.ide.logsUploader.LogPacker +import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.ActionUiKind import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.actionSystem.impl.SimpleDataContext import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project -import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.IconLoader import com.intellij.ui.ColorUtil import com.intellij.ui.JBColor import com.intellij.util.IconUtil import com.intellij.util.ui.UIUtil -import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.utils.notifyInfo -import software.aws.toolkits.jetbrains.utils.runUnderProgressIfNeeded import software.aws.toolkits.resources.AmazonQBundle -import software.aws.toolkits.resources.AwsCoreBundle +import software.aws.toolkits.resources.AmazonQBundle.message class GetAmazonQLogsAction : DumbAwareAction( AmazonQBundle.message("amazonq.getLogs.tooltip.text") @@ -39,28 +38,18 @@ class GetAmazonQLogsAction : DumbAwareAction( override fun getActionUpdateThread() = ActionUpdateThread.BGT override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return - showLogCollectionWarning(project) + showLogCollectionWarningGetLogs(project) } companion object { - fun showLogCollectionWarning(project: Project) { - if (Messages.showOkCancelDialog( - AmazonQBundle.message("amazonq.logs.warning"), - AmazonQBundle.message("amazonq.getLogs"), - AwsCoreBundle.message("general.ok"), - AwsCoreBundle.message("general.cancel"), - AllIcons.General.Warning - ) == 0 - ) { - runUnderProgressIfNeeded(project, AmazonQBundle.message("amazonq.getLogs"), cancelable = true) { - runBlocking { - try { - RevealFileAction.openFile(LogPacker.packLogs(project)) - } catch (_: Exception) { - notifyInfo("Cannot retrieve logs. Please try Help-> Collect Logs and Diagnostic data") - } - } - } + fun showLogCollectionWarningGetLogs(project: Project) { + try { + val action = ActionManager.getInstance().getAction("CollectZippedLogs") + val datacontxt = SimpleDataContext.builder().add(CommonDataKeys.PROJECT, project).build() + val ae = AnActionEvent.createEvent(action, datacontxt, null, ActionPlaces.UNKNOWN, ActionUiKind.POPUP, null) + action.actionPerformed(ae) + } catch (_: Exception) { + notifyInfo(message("amazonq.getLogs.tooltip.text"), message("amazonq.logs.warning")) } } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index 533967ea68a..8008c552278 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -423,7 +423,7 @@ class BrowserConnector( val action = node.params.get("action") if (action.textValue() == "show_logs") { runInEdt { - GetAmazonQLogsAction.showLogCollectionWarning(project) + GetAmazonQLogsAction.showLogCollectionWarningGetLogs(project) } } else { handleChat(AmazonQChatServer.tabBarActions, node) { params, invoke -> diff --git a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties index 983e08d8b98..15379cdb675 100644 --- a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties +++ b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties @@ -8,7 +8,7 @@ amazonqInlineChat.popup.reject=Reject \u238B amazonqInlineChat.popup.title=Enter Instructions for Q amazonq.getLogs=Get Amazon Q logs amazonq.getLogs.tooltip.text=Show Logs -amazonq.logs.warning=Log files may contain sensitive information such as account IDs, resource names, and other data. Please be careful when sharing these logs. +amazonq.logs.warning=Cannot retrieve logs. Please try Help-> Collect Logs and Diagnostic data amazonq.refresh.panel=Refresh Chat Session amazonq.title=Amazon Q amazonq.workspace.settings.open.prompt=Workspace index is now enabled. You can disable it from Amazon Q settings. From 7e8adddf2ff5dc7625805cfc8089c6f003fc793c Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Wed, 6 Aug 2025 20:14:06 -0700 Subject: [PATCH 5/6] feedback --- .../resources/META-INF/plugin-chat.xml | 2 +- .../services/amazonq/GetAmazonQLogsAction.kt | 52 ++++++++++++------- .../resources/AmazonQBundle.properties | 3 +- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml b/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml index 638bf2c7a86..3a2a8813ff9 100644 --- a/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml +++ b/plugins/amazonq/chat/jetbrains-community/resources/META-INF/plugin-chat.xml @@ -33,7 +33,7 @@ - + diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt index b7218b7edab..f31ce87d5ef 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt @@ -3,35 +3,39 @@ package software.aws.toolkits.jetbrains.services.amazonq -import com.intellij.openapi.actionSystem.ActionManager -import com.intellij.openapi.actionSystem.ActionPlaces -import com.intellij.openapi.actionSystem.ActionUiKind +import com.intellij.icons.AllIcons +import com.intellij.ide.actions.RevealFileAction +import com.intellij.ide.logsUploader.LogPacker import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.actionSystem.impl.SimpleDataContext import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.IconLoader import com.intellij.ui.ColorUtil import com.intellij.ui.JBColor import com.intellij.util.IconUtil import com.intellij.util.ui.UIUtil +import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.utils.notifyInfo -import software.aws.toolkits.resources.AmazonQBundle +import software.aws.toolkits.jetbrains.utils.runUnderProgressIfNeeded import software.aws.toolkits.resources.AmazonQBundle.message +import software.aws.toolkits.resources.AwsCoreBundle + +class GetAmazonQLogsAction : DumbAwareAction(message("amazonq.getLogs.tooltip.text")) { + private val baseIcon = IconLoader.getIcon("/icons/file.svg", GetAmazonQLogsAction::class.java) + + private val lightIcon by lazy { + IconUtil.colorize(baseIcon, ColorUtil.brighter(UIUtil.getLabelForeground(), 2)) + } + -class GetAmazonQLogsAction : DumbAwareAction( - AmazonQBundle.message("amazonq.getLogs.tooltip.text") -) { override fun update(e: AnActionEvent) { - super.update(e) - val baseIcon = IconLoader.getIcon("/icons/file.svg", GetAmazonQLogsAction::class.java) e.presentation.icon = if (!JBColor.isBright()) { baseIcon } else { - IconUtil.colorize(baseIcon, ColorUtil.brighter(UIUtil.getLabelForeground(), 2)) + lightIcon } } @@ -43,13 +47,23 @@ class GetAmazonQLogsAction : DumbAwareAction( companion object { fun showLogCollectionWarningGetLogs(project: Project) { - try { - val action = ActionManager.getInstance().getAction("CollectZippedLogs") - val datacontxt = SimpleDataContext.builder().add(CommonDataKeys.PROJECT, project).build() - val ae = AnActionEvent.createEvent(action, datacontxt, null, ActionPlaces.UNKNOWN, ActionUiKind.POPUP, null) - action.actionPerformed(ae) - } catch (_: Exception) { - notifyInfo(message("amazonq.getLogs.tooltip.text"), message("amazonq.logs.warning")) + if (Messages.showOkCancelDialog( + message("amazonq.logs.warning"), + message("amazonq.getLogs"), + AwsCoreBundle.message("general.ok"), + AwsCoreBundle.message("general.cancel"), + AllIcons.General.Warning + ) == 0 + ) { + runUnderProgressIfNeeded(project, message("amazonq.getLogs"), cancelable = true) { + runBlocking { + try { + RevealFileAction.openFile(LogPacker.packLogs(project)) + } catch (_: Exception) { + notifyInfo(message("amazonq.getLogs"), message("amazonq.logs.error"), project) + } + } + } } } } diff --git a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties index 15379cdb675..761a500ca06 100644 --- a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties +++ b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties @@ -8,7 +8,8 @@ amazonqInlineChat.popup.reject=Reject \u238B amazonqInlineChat.popup.title=Enter Instructions for Q amazonq.getLogs=Get Amazon Q logs amazonq.getLogs.tooltip.text=Show Logs -amazonq.logs.warning=Cannot retrieve logs. Please try Help-> Collect Logs and Diagnostic data +amazonq.logs.error=Cannot retrieve logs. Please try Help-> Collect Logs and Diagnostic data +amazonq.logs.warning=Log files may contain sensitive information such as account IDs, resource names, and other data. Please be careful when sharing these logs. amazonq.refresh.panel=Refresh Chat Session amazonq.title=Amazon Q amazonq.workspace.settings.open.prompt=Workspace index is now enabled. You can disable it from Amazon Q settings. From 9e29e3244567c90103ad5d21c6ff4c958d08985d Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Thu, 7 Aug 2025 10:30:33 -0700 Subject: [PATCH 6/6] Detekt --- .../toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt index f31ce87d5ef..0222bba8798 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/GetAmazonQLogsAction.kt @@ -29,8 +29,6 @@ class GetAmazonQLogsAction : DumbAwareAction(message("amazonq.getLogs.tooltip.te IconUtil.colorize(baseIcon, ColorUtil.brighter(UIUtil.getLabelForeground(), 2)) } - - override fun update(e: AnActionEvent) { e.presentation.icon = if (!JBColor.isBright()) { baseIcon