From c03620f4982ee62ff19fff6ea3c589db40f4c1ba Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 12:58:40 -0700 Subject: [PATCH 1/8] error handling --- .../amazonq/webview/BrowserConnector.kt | 24 ++++++++++++------- .../amazonq/lsp/model/aws/chat/ErrorParams.kt | 13 ++++++++++ .../lsp/model/aws/chat/FlareChatCommands.kt | 1 + 3 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt 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 b7d76719348..bc4c7a96702 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 @@ -425,14 +425,22 @@ class BrowserConnector( browser: Browser, ) { result.whenComplete { value, error -> - chatCommunicationManager.removePartialChatMessage(partialResultToken) - val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat( - SEND_CHAT_COMMAND_PROMPT, - tabId, - encryptionManager?.decrypt(value).orEmpty(), - isPartialResult = false - ) - browser.postChat(messageToChat) + try { + if (error != null) { + throw error + } + chatCommunicationManager.removePartialChatMessage(partialResultToken) + val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat( + SEND_CHAT_COMMAND_PROMPT, + tabId, + encryptionManager?.decrypt(value).orEmpty(), + isPartialResult = false + ) + browser.postChat(messageToChat) + + } catch (e: Exception) { + + } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt new file mode 100644 index 00000000000..13f5f4417e2 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt @@ -0,0 +1,13 @@ +// 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 + +import org.eclipse.lsp4j.TextDocumentIdentifier + +data class ErrorParams( + val tabID: String, + val triggerType: String?, + val message: String, + val title: String +) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt index 02934b87db1..91f55d5814d 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt @@ -31,3 +31,4 @@ const val CHAT_SEND_UPDATE = "aws/chat/sendChatUpdate" const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt" const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog" const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat" +const val CHAT_ERROR_PARAMS = "errorMessage" From 94cc9155b76f99a1409470c08d99512a2dfd4e68 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 14:20:35 -0700 Subject: [PATCH 2/8] update --- .../amazonq/webview/BrowserConnector.kt | 62 ++++++++++++++++--- .../lsp/model/aws/chat/FlareChatCommands.kt | 2 +- 2 files changed, 53 insertions(+), 11 deletions(-) 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 bc4c7a96702..6da4e6e51c6 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 @@ -23,6 +23,7 @@ import kotlinx.coroutines.launch import org.cef.browser.CefBrowser import org.eclipse.lsp4j.Position import org.eclipse.lsp4j.Range +import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn import software.aws.toolkits.jetbrains.services.amazonq.apps.AppConnection @@ -90,6 +91,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Promp import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_MESSAGE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickParams @@ -270,14 +272,21 @@ class BrowserConnector( server.listConversations(requestFromUi.params) } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) - result.whenComplete { response, _ -> - val uiMessage = """ + result.whenComplete { response, error -> + try { + if (error != null) { + throw error + } + val uiMessage = """ { "command": "$CHAT_LIST_CONVERSATIONS", "params": ${Gson().toJson(response)} } """.trimIndent() - browser.postChat(uiMessage) + browser.postChat(uiMessage) + } catch (e: Exception) { + LOG.error { "Failed to perform list conversation $e" } + } } } CHAT_CONVERSATION_CLICK -> { @@ -286,14 +295,21 @@ class BrowserConnector( server.conversationClick(requestFromUi.params) } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) - result.whenComplete { response, _ -> - val uiMessage = """ + result.whenComplete { response, error -> + try { + if (error != null) { + throw error + } + val uiMessage = """ { "command": "$CHAT_CONVERSATION_CLICK", "params": ${Gson().toJson(response)} } """.trimIndent() - browser.postChat(uiMessage) + browser.postChat(uiMessage) + } catch (e: Exception) { + LOG.error { "Failed to perform conversation click $e" } + } } } CHAT_FEEDBACK -> { @@ -403,8 +419,26 @@ class BrowserConnector( server, params -> val result = server.tabBarActions(params) result.whenComplete { params1, error -> - val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1) - browser.postChat(res) + try { + if (error != null) { + throw error + } + val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1) + browser.postChat(res) + } catch (e: Exception) { + LOG.error { "Failed to perform chat tab bar action $e" } + if (params.tabId != null) { + browser.postChat( + ChatCommunicationManager.convertToJsonToSendToChat( + CHAT_ERROR_MESSAGE, + params.tabId.toString(), + "", + isPartialResult = false + ) + ) + } + + } } } } @@ -437,9 +471,17 @@ class BrowserConnector( isPartialResult = false ) browser.postChat(messageToChat) - } catch (e: Exception) { - + LOG.error { "Failed to send chat message $e" } + chatCommunicationManager.removePartialChatMessage(partialResultToken) + browser.postChat( + ChatCommunicationManager.convertToJsonToSendToChat( + CHAT_ERROR_MESSAGE, + tabId, + encryptionManager?.decrypt(value).orEmpty(), + isPartialResult = false + ) + ) } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt index 91f55d5814d..7eb229f705a 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt @@ -31,4 +31,4 @@ const val CHAT_SEND_UPDATE = "aws/chat/sendChatUpdate" const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt" const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog" const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat" -const val CHAT_ERROR_PARAMS = "errorMessage" +const val CHAT_ERROR_MESSAGE = "errorMessage" From ed00af60fa14b6c14386219a7378d9c28fa16945 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 14:38:55 -0700 Subject: [PATCH 3/8] for --- .../services/amazonq/webview/BrowserConnector.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 52566ab72a5..6d11ab76e83 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 @@ -32,7 +32,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager -import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager.Companion.convertToJsonToSendToChat import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams @@ -445,7 +444,7 @@ class BrowserConnector( ChatCommunicationManager.convertToJsonToSendToChat( CHAT_ERROR_MESSAGE, params.tabId.toString(), - "", + getErrorUiMessage(e), isPartialResult = false ) ) @@ -477,7 +476,7 @@ class BrowserConnector( ) ) - val uiMessage = convertToJsonToSendToChat( + val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat( command = SEND_CHAT_COMMAND_PROMPT, tabId = stopResponseRequest.params.tabId, params = paramsJson.toString(), @@ -516,7 +515,7 @@ class BrowserConnector( ChatCommunicationManager.convertToJsonToSendToChat( CHAT_ERROR_MESSAGE, tabId, - encryptionManager?.decrypt(value).orEmpty(), + getErrorUiMessage(e), isPartialResult = false ) ) @@ -525,6 +524,12 @@ class BrowserConnector( } } + private fun getErrorUiMessage(e: Exception) = Gson().toJson( + ChatUiMessageParams( + title = "An error occurred while processing your request.", + body = "Details: ${e.message}" + )).toString() + private fun cancelInflightRequests(tabId: String) { chatCommunicationManager.getInflightRequestForTab(tabId)?.let { request -> request.cancel(true) From 46559e63a9ce44cd39e194d89d604791ac79ecab Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 16:09:32 -0700 Subject: [PATCH 4/8] update --- .../amazonq/webview/BrowserConnector.kt | 31 ++++-------------- .../lsp/flareChat/ChatCommunicationManager.kt | 32 +++++++++++++++++++ .../lsp/model/aws/chat/FlareChatCommands.kt | 2 +- 3 files changed, 39 insertions(+), 26 deletions(-) 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 6d11ab76e83..6fdba0c5ce7 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 @@ -91,7 +91,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Promp import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_MESSAGE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.STOP_CHAT_RESPONSE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickNotification @@ -212,6 +212,8 @@ class BrowserConnector( } } + + private fun handleFlareChatMessages(browser: Browser, node: JsonNode) { when (node.command) { SEND_CHAT_COMMAND_PROMPT -> { @@ -439,17 +441,9 @@ class BrowserConnector( browser.postChat(res) } catch (e: Exception) { LOG.error { "Failed to perform chat tab bar action $e" } - if (params.tabId != null) { - browser.postChat( - ChatCommunicationManager.convertToJsonToSendToChat( - CHAT_ERROR_MESSAGE, - params.tabId.toString(), - getErrorUiMessage(e), - isPartialResult = false - ) - ) + params.tabId?.let { + chatCommunicationManager.sendErrorToUi(it, e, null) } - } } } @@ -510,25 +504,12 @@ class BrowserConnector( chatCommunicationManager.removeInflightRequestForTab(tabId) } catch (e: Exception) { LOG.error { "Failed to send chat message $e" } - chatCommunicationManager.removePartialChatMessage(partialResultToken) - browser.postChat( - ChatCommunicationManager.convertToJsonToSendToChat( - CHAT_ERROR_MESSAGE, - tabId, - getErrorUiMessage(e), - isPartialResult = false - ) - ) + chatCommunicationManager.sendErrorToUi(tabId, e, partialResultToken) } } } - private fun getErrorUiMessage(e: Exception) = Gson().toJson( - ChatUiMessageParams( - title = "An error occurred while processing your request.", - body = "Details: ${e.message}" - )).toString() private fun cancelInflightRequests(tabId: String) { chatCommunicationManager.getInflightRequestForTab(tabId)?.let { request -> diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt index 90a321b24c5..6ffb790fcc3 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt @@ -4,15 +4,18 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat import com.google.gson.Gson +import com.google.gson.JsonElement import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import org.eclipse.lsp4j.ProgressParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ProgressNotificationUtils.getObject +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ErrorParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS import java.util.UUID import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap @@ -70,6 +73,28 @@ class ChatCommunicationManager { } } + fun sendErrorToUi(tabId: String, exception: Exception, token: String?) { + token?.let { + removePartialChatMessage(it) + } + val errorTitle = "An error occurred while processing your request." + val errorMessage = "Details: ${exception.message}" + val errorParams = Gson().toJsonTree(ErrorParams(tabId, null, errorMessage, errorTitle)) + sendErrorMessageToChatUi(CHAT_ERROR_PARAMS, tabId, errorParams, false) + } + + private fun sendErrorMessageToChatUi(command: String, tabId: String, partialChatResult: JsonElement, isPartialResult: Boolean) { + val uiMessage = """ + { + "command":"$command", + "tabId": "$tabId", + "params": $partialChatResult, + "isPartialResult": $isPartialResult + } + """.trimIndent() + AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + } + companion object { fun getInstance(project: Project) = project.service() @@ -77,6 +102,13 @@ class ChatCommunicationManager { fun completeSerializedChatResponse(requestId: String, content: String) { pendingSerializedChatRequests.remove(requestId)?.complete(GetSerializedChatResult((content))) } + fun getErrorUiMessage(tabId: String, e: Exception): String = Gson().toJson( + ErrorParams( + title = "An error occurred while processing your request.", + message = "Details: ${e.message}", + tabID = tabId, + triggerType = TODO(), + )).toString() fun convertToJsonToSendToChat(command: String, tabId: String, params: String, isPartialResult: Boolean): String = """ diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt index 0e7648c3e43..2229d4d015b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt @@ -31,5 +31,5 @@ const val CHAT_SEND_UPDATE = "aws/chat/sendChatUpdate" const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt" const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog" const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat" -const val CHAT_ERROR_MESSAGE = "errorMessage" +const val CHAT_ERROR_PARAMS = "errorMessage" const val STOP_CHAT_RESPONSE = "stopChatResponse" From dff6bc5f269ff82062777e476c7c2cae88241087 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 16:29:01 -0700 Subject: [PATCH 5/8] format --- .../amazonq/webview/BrowserConnector.kt | 7 +++++-- .../lsp/flareChat/ChatCommunicationManager.kt | 17 +++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) 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 6fdba0c5ce7..16648ed3fe5 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 @@ -442,7 +442,7 @@ class BrowserConnector( } catch (e: Exception) { LOG.error { "Failed to perform chat tab bar action $e" } params.tabId?.let { - chatCommunicationManager.sendErrorToUi(it, e, null) + browser.postChat(chatCommunicationManager.getErrorUiMessage(it, e, null)) } } } @@ -500,11 +500,14 @@ class BrowserConnector( encryptionManager?.decrypt(value).orEmpty(), isPartialResult = false ) + if (messageToChat.contains("abc")) { + throw Exception("abc err") + } browser.postChat(messageToChat) chatCommunicationManager.removeInflightRequestForTab(tabId) } catch (e: Exception) { LOG.error { "Failed to send chat message $e" } - chatCommunicationManager.sendErrorToUi(tabId, e, partialResultToken) + browser.postChat(chatCommunicationManager.getErrorUiMessage(tabId, e, partialResultToken)) } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt index 6ffb790fcc3..d44937a96c0 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt @@ -73,28 +73,25 @@ class ChatCommunicationManager { } } - fun sendErrorToUi(tabId: String, exception: Exception, token: String?) { + fun getErrorUiMessage(tabId: String, exception: Exception, token: String?): String { token?.let { removePartialChatMessage(it) } val errorTitle = "An error occurred while processing your request." val errorMessage = "Details: ${exception.message}" - val errorParams = Gson().toJsonTree(ErrorParams(tabId, null, errorMessage, errorTitle)) - sendErrorMessageToChatUi(CHAT_ERROR_PARAMS, tabId, errorParams, false) - } - - private fun sendErrorMessageToChatUi(command: String, tabId: String, partialChatResult: JsonElement, isPartialResult: Boolean) { + val errorParams = Gson().toJson(ErrorParams(tabId, null, errorMessage, errorTitle)).toString() val uiMessage = """ { - "command":"$command", + "command":"$CHAT_ERROR_PARAMS", "tabId": "$tabId", - "params": $partialChatResult, - "isPartialResult": $isPartialResult + "params": "$errorParams", + "isPartialResult": "true" } """.trimIndent() - AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + return uiMessage } + companion object { fun getInstance(project: Project) = project.service() From 596a06d7a7cc391128dc53c065c83341999d73d9 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 16:30:47 -0700 Subject: [PATCH 6/8] format --- .../lsp/flareChat/ChatCommunicationManager.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt index d44937a96c0..53ca185066b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt @@ -80,12 +80,13 @@ class ChatCommunicationManager { val errorTitle = "An error occurred while processing your request." val errorMessage = "Details: ${exception.message}" val errorParams = Gson().toJson(ErrorParams(tabId, null, errorMessage, errorTitle)).toString() + val isPartialResult = false val uiMessage = """ { "command":"$CHAT_ERROR_PARAMS", "tabId": "$tabId", - "params": "$errorParams", - "isPartialResult": "true" + "params": $errorParams, + "isPartialResult": $isPartialResult } """.trimIndent() return uiMessage @@ -99,13 +100,6 @@ class ChatCommunicationManager { fun completeSerializedChatResponse(requestId: String, content: String) { pendingSerializedChatRequests.remove(requestId)?.complete(GetSerializedChatResult((content))) } - fun getErrorUiMessage(tabId: String, e: Exception): String = Gson().toJson( - ErrorParams( - title = "An error occurred while processing your request.", - message = "Details: ${e.message}", - tabID = tabId, - triggerType = TODO(), - )).toString() fun convertToJsonToSendToChat(command: String, tabId: String, params: String, isPartialResult: Boolean): String = """ From a0a10f76dc9cbb88dd3a41870113d3c91bd1a37f Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 16:50:16 -0700 Subject: [PATCH 7/8] fix typo --- .../jetbrains/services/amazonq/webview/BrowserConnector.kt | 3 --- .../services/amazonq/lsp/model/aws/chat/ErrorParams.kt | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) 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 16648ed3fe5..7af7ac19809 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 @@ -500,9 +500,6 @@ class BrowserConnector( encryptionManager?.decrypt(value).orEmpty(), isPartialResult = false ) - if (messageToChat.contains("abc")) { - throw Exception("abc err") - } browser.postChat(messageToChat) chatCommunicationManager.removeInflightRequestForTab(tabId) } catch (e: Exception) { diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt index 13f5f4417e2..55f3728a553 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt @@ -6,7 +6,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat import org.eclipse.lsp4j.TextDocumentIdentifier data class ErrorParams( - val tabID: String, + val tabId: String, val triggerType: String?, val message: String, val title: String From da7c3dc9b2c59f510cf9064cde3abd40d6f61958 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 6 May 2025 16:54:40 -0700 Subject: [PATCH 8/8] detekt --- .../amazonq/webview/BrowserConnector.kt | 31 ++++--------------- .../lsp/flareChat/ChatCommunicationManager.kt | 8 ++--- .../amazonq/lsp/model/aws/chat/ErrorParams.kt | 4 +-- 3 files changed, 10 insertions(+), 33 deletions(-) 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 7af7ac19809..87f977adfa1 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 @@ -91,7 +91,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Promp import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.STOP_CHAT_RESPONSE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickNotification @@ -212,8 +211,6 @@ class BrowserConnector( } } - - private fun handleFlareChatMessages(browser: Browser, node: JsonNode) { when (node.command) { SEND_CHAT_COMMAND_PROMPT -> { @@ -285,21 +282,14 @@ class BrowserConnector( server.listConversations(requestFromUi.params) } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) - result.whenComplete { response, error -> - try { - if (error != null) { - throw error - } - val uiMessage = """ + result.whenComplete { response, _ -> + val uiMessage = """ { "command": "$CHAT_LIST_CONVERSATIONS", "params": ${Gson().toJson(response)} } """.trimIndent() - browser.postChat(uiMessage) - } catch (e: Exception) { - LOG.error { "Failed to perform list conversation $e" } - } + browser.postChat(uiMessage) } } CHAT_CONVERSATION_CLICK -> { @@ -308,21 +298,14 @@ class BrowserConnector( server.conversationClick(requestFromUi.params) } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) - result.whenComplete { response, error -> - try { - if (error != null) { - throw error - } - val uiMessage = """ + result.whenComplete { response, _ -> + val uiMessage = """ { "command": "$CHAT_CONVERSATION_CLICK", "params": ${Gson().toJson(response)} } """.trimIndent() - browser.postChat(uiMessage) - } catch (e: Exception) { - LOG.error { "Failed to perform conversation click $e" } - } + browser.postChat(uiMessage) } } CHAT_FEEDBACK -> { @@ -506,11 +489,9 @@ class BrowserConnector( LOG.error { "Failed to send chat message $e" } browser.postChat(chatCommunicationManager.getErrorUiMessage(tabId, e, partialResultToken)) } - } } - private fun cancelInflightRequests(tabId: String) { chatCommunicationManager.getInflightRequestForTab(tabId)?.let { request -> request.cancel(true) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt index 53ca185066b..67116573e1f 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt @@ -4,18 +4,17 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat import com.google.gson.Gson -import com.google.gson.JsonElement import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import org.eclipse.lsp4j.ProgressParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ProgressNotificationUtils.getObject +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ErrorParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS import java.util.UUID import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap @@ -81,18 +80,17 @@ class ChatCommunicationManager { val errorMessage = "Details: ${exception.message}" val errorParams = Gson().toJson(ErrorParams(tabId, null, errorMessage, errorTitle)).toString() val isPartialResult = false - val uiMessage = """ + val uiMessage = """ { "command":"$CHAT_ERROR_PARAMS", "tabId": "$tabId", "params": $errorParams, "isPartialResult": $isPartialResult } - """.trimIndent() + """.trimIndent() return uiMessage } - companion object { fun getInstance(project: Project) = project.service() diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt index 55f3728a553..225fa3a20c1 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ErrorParams.kt @@ -3,11 +3,9 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat -import org.eclipse.lsp4j.TextDocumentIdentifier - data class ErrorParams( val tabId: String, val triggerType: String?, val message: String, - val title: String + val title: String, )