From 29c7b1bdbc65597656a1ed17ee794d1665209823 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Mon, 28 Apr 2025 12:03:19 -0700 Subject: [PATCH 1/9] send openTab to browser --- .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 88514e8cdc5..8db4add7d6b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -3,6 +3,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.intellij.notification.NotificationType import com.intellij.openapi.project.Project import migration.software.aws.toolkits.jetbrains.settings.AwsSettings @@ -16,9 +17,11 @@ import org.eclipse.lsp4j.ShowMessageRequestParams import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection +import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator @@ -76,9 +79,24 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC } } - override fun openTab(params: OpenTabParams): CompletableFuture = - // TODO implement chat history, this is here to unblock chat functionality - CompletableFuture.completedFuture(OpenTabResult("")) + override fun openTab(params: OpenTabParams): CompletableFuture { + val tabId = params.tabId.orEmpty() + + // Convert params to JSON to send to the UI + val paramsJson = jacksonObjectMapper().writeValueAsString(params) + + val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat( + command = CHAT_OPEN_TAB, + tabId = tabId, + params = paramsJson, + isPartialResult = false + ) + + AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + + // Return the tabId (either existing or newly created) + return CompletableFuture.completedFuture(OpenTabResult(tabId)) + } override fun configuration(params: ConfigurationParams): CompletableFuture> { if (params.items.isEmpty()) { From d90e230942835b8867425642b9d6d417c89a67ac Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Tue, 29 Apr 2025 14:34:19 -0700 Subject: [PATCH 2/9] initial --- .../amazonq/webview/BrowserConnector.kt | 31 ++++++++++++++ .../amazonq/lsp/AmazonQLanguageServer.kt | 14 +++++++ .../amazonq/lsp/artifacts/ManifestFetcher.kt | 2 +- .../AwsServerCapabilitiesProvider.kt | 8 +++- .../lsp/model/aws/chat/FlareChatCommands.kt | 2 + .../model/aws/chat/GetSerializedChatParams.kt | 34 ++++++++++++++++ .../lsp/model/aws/chat/TabBarActionParams.kt | 40 +++++++++++++++++++ 7 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.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 aa2dbed4239..2e40b6af5bb 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 @@ -4,6 +4,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.webview import com.fasterxml.jackson.databind.JsonNode +import com.google.gson.Gson import com.intellij.ide.BrowserUtil import com.intellij.ide.util.RunOnceUtil import com.intellij.openapi.project.Project @@ -28,6 +29,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageSerializ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer 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.getTextDocumentIdentifier import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickNotification @@ -37,6 +39,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_GET_SERIALIZED_CHAT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK @@ -45,6 +48,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_ADD +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_BAR_ACTIONS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_CHANGE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatNotification @@ -60,6 +64,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Feedb import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionNotification @@ -74,6 +80,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_ 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 +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventRequest import software.aws.toolkits.jetbrains.services.amazonq.util.command @@ -146,6 +154,14 @@ class BrowserConnector( // Wait for UI ready before starting to send messages to the UI. uiReady.await() + // Chat options including history and quick actions need to be sent in once UI is ready + val showChatOptions = """{ + "command": "chatOptions", + "params": ${Gson().toJson(AwsServerCapabilitiesProvider.getInstance(project).getChatOptions())} + } + """.trimIndent() + browser.postChat(showChatOptions) + // Send inbound messages to the browser val inboundMessages = connections.map { it.messagesFromAppToUi.flow }.merge() inboundMessages @@ -323,6 +339,21 @@ class BrowserConnector( server.copyCodeToClipboard(params) } } + + CHAT_GET_SERIALIZED_CHAT -> { + handleChatNotification(node) + { + server, params -> server.getSerializedActions(params) + } + } + + CHAT_TAB_BAR_ACTIONS -> { + handleChatNotification(node) + { + server, params -> server.tabBarActions(params) + } + + } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt index 6c715f96d0f..c554c083c8d 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt @@ -16,6 +16,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_GET_SERIALIZED_CHAT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR_NOTIFICATION import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK @@ -23,6 +24,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_ADD +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_BAR_ACTIONS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_CHANGE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams @@ -30,6 +32,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Encry import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams @@ -37,6 +42,8 @@ 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.SEND_CHAT_COMMAND_PROMPT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams @@ -106,4 +113,11 @@ interface AmazonQLanguageServer : LanguageServer { @JsonRequest(CHAT_BUTTON_CLICK) fun buttonClick(params: ButtonClickParams): CompletableFuture + + @JsonRequest(CHAT_TAB_BAR_ACTIONS) + fun tabBarActions(params: TabBarActionParams): CompletableFuture + + @JsonRequest(CHAT_GET_SERIALIZED_CHAT) + fun getSerializedActions(params: GetSerializedChatParams): CompletableFuture + } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt index 74656d5665b..882bef614cc 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt @@ -25,7 +25,7 @@ class ManifestFetcher( private val logger = getLogger() private const val DEFAULT_MANIFEST_URL = - "https://aws-toolkit-language-servers.amazonaws.com/remoteWorkspaceContext/0/manifest.json" + "https://d3akiidp1wvqyg.cloudfront.net/qAgenticChatServer/0/manifest.json" private val DEFAULT_MANIFEST_PATH: Path = getToolkitsCommonCacheRoot() .resolve("aws") 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 5c4eec4491a..882ee407de6 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 @@ -15,7 +15,7 @@ class AwsServerCapabilitiesProvider { this.serverCapabilities = serverCapabilities } - fun getChatOptions() = serverCapabilities?.chatOptions ?: DEFAULT_CHAT_OPTIONS + fun getChatOptions() = DEFAULT_CHAT_OPTIONS companion object { fun getInstance(project: Project) = project.service() @@ -30,7 +30,9 @@ class AwsServerCapabilitiesProvider { ) ) ) - ) + ), + history = true, + export = true ) } } @@ -41,6 +43,8 @@ data class AwsServerCapabilities( data class ChatOptions( val quickActions: QuickActions, + val history: Boolean, + val export: Boolean ) data class QuickActions( 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 3ea5bbccacd..3712cc22a36 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 @@ -22,3 +22,5 @@ const val CHAT_COPY_CODE_TO_CLIPBOARD = "copyToClipboard" const val CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION = "aws/chat/copyCodeToClipboard" const val CHAT_INSERT_TO_CURSOR = "insertToCursorPosition" const val CHAT_INSERT_TO_CURSOR_NOTIFICATION = "aws/chat/insertToCursorPosition" +const val CHAT_GET_SERIALIZED_CHAT="aws/chat/getSerializedChat" +const val CHAT_TAB_BAR_ACTIONS="aws/chat/tabBarAction" diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt new file mode 100644 index 00000000000..dc614b6fcab --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt @@ -0,0 +1,34 @@ +// 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 + +data class GetSerializedChatParams( + val tabId: String, + val format : String +) { + companion object { + fun create(tabId: String, format: SerializedChatFormat): GetSerializedChatParams { + return GetSerializedChatParams(tabId, format.value) + } + } +} + +enum class SerializedChatFormat(val value: String) { + HTML("html"), + MARKDOWN("markdown"); + + override fun toString(): String { + return name.lowercase() + } +} + +data class GetSerializedChatResult( + val content: String +) + +data class GetSerializedChatRequest( + val requestId: String, + override val command: String, + override val params: GetSerializedChatParams, +) : ChatNotification diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt new file mode 100644 index 00000000000..f2884cd463d --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt @@ -0,0 +1,40 @@ +// 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 + +//data class TabBarActionParams( +// val tabId: String?, +// val action: TabBarAction +//) +data class TabBarActionParams( + val tabId: String?, + val action: String +) { + companion object { + fun create(tabId: String?, action: TabBarAction): TabBarActionParams { + return TabBarActionParams(tabId, action.value) + } + } +} + + +enum class TabBarAction(val value: String) { + EXPORT("export"), + HISTORY("history"); + + override fun toString(): String { + return name.lowercase() + } + +} + +data class TabBarActionResult( + val success: Boolean +) + +data class TabBarActionRequest( + override val command: String, + override val params: TabBarActionParams, +) : ChatNotification + From 7a8cb716bfe5bd0eaff4aa96051dc339e5666c11 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Tue, 29 Apr 2025 14:44:34 -0700 Subject: [PATCH 3/9] Show options to for chat history and export in tab bar --- .../amazonq/webview/BrowserConnector.kt | 23 +---------- .../amazonq/lsp/AmazonQLanguageServer.kt | 14 ------- .../amazonq/lsp/artifacts/ManifestFetcher.kt | 2 +- .../AwsServerCapabilitiesProvider.kt | 4 +- .../lsp/model/aws/chat/FlareChatCommands.kt | 2 - .../model/aws/chat/GetSerializedChatParams.kt | 34 ---------------- .../lsp/model/aws/chat/TabBarActionParams.kt | 40 ------------------- 7 files changed, 4 insertions(+), 115 deletions(-) delete mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt delete mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.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 2e40b6af5bb..64ea5aa880b 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 @@ -1,6 +1,6 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 - +@file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.amazonq.webview import com.fasterxml.jackson.databind.JsonNode @@ -39,7 +39,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_GET_SERIALIZED_CHAT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK @@ -48,7 +47,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_ADD -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_BAR_ACTIONS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_CHANGE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatNotification @@ -64,8 +62,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Feedb import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionNotification @@ -80,8 +76,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_ 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 -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventRequest import software.aws.toolkits.jetbrains.services.amazonq.util.command @@ -339,21 +333,6 @@ class BrowserConnector( server.copyCodeToClipboard(params) } } - - CHAT_GET_SERIALIZED_CHAT -> { - handleChatNotification(node) - { - server, params -> server.getSerializedActions(params) - } - } - - CHAT_TAB_BAR_ACTIONS -> { - handleChatNotification(node) - { - server, params -> server.tabBarActions(params) - } - - } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt index c554c083c8d..6c715f96d0f 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt @@ -16,7 +16,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_GET_SERIALIZED_CHAT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR_NOTIFICATION import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK @@ -24,7 +23,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_ADD -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_BAR_ACTIONS import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_CHANGE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams @@ -32,9 +30,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Encry import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams @@ -42,8 +37,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.SEND_CHAT_COMMAND_PROMPT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams @@ -113,11 +106,4 @@ interface AmazonQLanguageServer : LanguageServer { @JsonRequest(CHAT_BUTTON_CLICK) fun buttonClick(params: ButtonClickParams): CompletableFuture - - @JsonRequest(CHAT_TAB_BAR_ACTIONS) - fun tabBarActions(params: TabBarActionParams): CompletableFuture - - @JsonRequest(CHAT_GET_SERIALIZED_CHAT) - fun getSerializedActions(params: GetSerializedChatParams): CompletableFuture - } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt index 882bef614cc..74656d5665b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt @@ -25,7 +25,7 @@ class ManifestFetcher( private val logger = getLogger() private const val DEFAULT_MANIFEST_URL = - "https://d3akiidp1wvqyg.cloudfront.net/qAgenticChatServer/0/manifest.json" + "https://aws-toolkit-language-servers.amazonaws.com/remoteWorkspaceContext/0/manifest.json" private val DEFAULT_MANIFEST_PATH: Path = getToolkitsCommonCacheRoot() .resolve("aws") 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 882ee407de6..7b36838a9b0 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 @@ -15,7 +15,7 @@ class AwsServerCapabilitiesProvider { this.serverCapabilities = serverCapabilities } - fun getChatOptions() = DEFAULT_CHAT_OPTIONS + fun getChatOptions() = serverCapabilities?.chatOptions ?: DEFAULT_CHAT_OPTIONS companion object { fun getInstance(project: Project) = project.service() @@ -44,7 +44,7 @@ data class AwsServerCapabilities( data class ChatOptions( val quickActions: QuickActions, val history: Boolean, - val export: Boolean + val export: Boolean, ) data class QuickActions( 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 3712cc22a36..3ea5bbccacd 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 @@ -22,5 +22,3 @@ const val CHAT_COPY_CODE_TO_CLIPBOARD = "copyToClipboard" const val CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION = "aws/chat/copyCodeToClipboard" const val CHAT_INSERT_TO_CURSOR = "insertToCursorPosition" const val CHAT_INSERT_TO_CURSOR_NOTIFICATION = "aws/chat/insertToCursorPosition" -const val CHAT_GET_SERIALIZED_CHAT="aws/chat/getSerializedChat" -const val CHAT_TAB_BAR_ACTIONS="aws/chat/tabBarAction" diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt deleted file mode 100644 index dc614b6fcab..00000000000 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt +++ /dev/null @@ -1,34 +0,0 @@ -// 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 - -data class GetSerializedChatParams( - val tabId: String, - val format : String -) { - companion object { - fun create(tabId: String, format: SerializedChatFormat): GetSerializedChatParams { - return GetSerializedChatParams(tabId, format.value) - } - } -} - -enum class SerializedChatFormat(val value: String) { - HTML("html"), - MARKDOWN("markdown"); - - override fun toString(): String { - return name.lowercase() - } -} - -data class GetSerializedChatResult( - val content: String -) - -data class GetSerializedChatRequest( - val requestId: String, - override val command: String, - override val params: GetSerializedChatParams, -) : ChatNotification diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt deleted file mode 100644 index f2884cd463d..00000000000 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt +++ /dev/null @@ -1,40 +0,0 @@ -// 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 - -//data class TabBarActionParams( -// val tabId: String?, -// val action: TabBarAction -//) -data class TabBarActionParams( - val tabId: String?, - val action: String -) { - companion object { - fun create(tabId: String?, action: TabBarAction): TabBarActionParams { - return TabBarActionParams(tabId, action.value) - } - } -} - - -enum class TabBarAction(val value: String) { - EXPORT("export"), - HISTORY("history"); - - override fun toString(): String { - return name.lowercase() - } - -} - -data class TabBarActionResult( - val success: Boolean -) - -data class TabBarActionRequest( - override val command: String, - override val params: TabBarActionParams, -) : ChatNotification - From 74832170ff15052f6c283fa3686d5cac523f101a Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Tue, 29 Apr 2025 18:09:59 -0700 Subject: [PATCH 4/9] add requestID and mapping --- .../amazonq/webview/BrowserConnector.kt | 12 ++++++ .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 42 +++++++++++++------ .../amazonq/lsp/model/aws/chat/TabEvent.kt | 19 +++++++-- 3 files changed, 56 insertions(+), 17 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 64ea5aa880b..7253a899c3c 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 @@ -26,6 +26,7 @@ import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn 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.AmazonQLanguageClientImpl import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager @@ -42,6 +43,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_PROMPT_OPTION_ACKNOWLEDGED import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY @@ -68,6 +70,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Inser import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResponse import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams @@ -104,6 +107,8 @@ class BrowserConnector( addMessageHook(browser) .onEach { json -> val node = serializer.toNode(json) + println(node.command) + println(node) when (node.command) { "disclaimer-acknowledged" -> { MeetQSettings.getInstance().disclaimerAcknowledged = true @@ -277,6 +282,13 @@ class BrowserConnector( server.tabChange(params) } } + CHAT_OPEN_TAB -> { + val response = serializer.deserializeChatMessages(node) + AmazonQLanguageClientImpl.completeTabOpen( + response.requestId, + response.params.result.tabId + ) + } CHAT_INSERT_TO_CURSOR -> { handleChatNotification(node) { server, params -> server.insertToCursorPosition(params) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 9ce3568a4e7..02a474fc4db 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -1,9 +1,11 @@ // Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +@file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.amazonq.lsp -import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.google.gson.Gson +import java.util.UUID import com.intellij.notification.NotificationType import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.fileEditor.FileEditorManager @@ -34,6 +36,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credential import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings import java.util.concurrent.CompletableFuture +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit /** * Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server @@ -111,22 +115,28 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC } override fun openTab(params: OpenTabParams): CompletableFuture { - val tabId = params.tabId.orEmpty() + val requestId = UUID.randomUUID().toString() + val result = CompletableFuture() - // Convert params to JSON to send to the UI - val paramsJson = jacksonObjectMapper().writeValueAsString(params) - - val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat( - command = CHAT_OPEN_TAB, - tabId = tabId, - params = paramsJson, - isPartialResult = false - ) + pendingTabRequests[requestId] = result + val uiMessage = """ + { + "command": "$CHAT_OPEN_TAB", + "params": ${Gson().toJson(params)}, + "requestId": "$requestId" + } + """.trimIndent() AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) - // Return the tabId (either existing or newly created) - return CompletableFuture.completedFuture(OpenTabResult(tabId)) + result.orTimeout(30000, TimeUnit.MILLISECONDS) + .whenComplete { _, error -> + if (error != null) { + pendingTabRequests.remove(requestId) + } + } + + return result } override fun configuration(params: ConfigurationParams): CompletableFuture> { @@ -184,5 +194,11 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC companion object { private val LOG = getLogger() + + private val pendingTabRequests = ConcurrentHashMap>() + + fun completeTabOpen(requestId: String, tabId: String) { + pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) + } } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabEvent.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabEvent.kt index d561c2833be..3a2fdd66b6e 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabEvent.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabEvent.kt @@ -12,15 +12,26 @@ data class TabEventParams( val tabId: String, ) -data class OpenTabResult( - val tabId: String, -) - data class OpenTabParams( val tabId: String? = null, val newTabOptions: NewTabOptions? = null, ) +data class OpenTabResponse( + val requestId: String, + val command: String, + val params: OpenTabResponseParams +) + +data class OpenTabResponseParams( + val success: Boolean, + val result: OpenTabResult +) + +data class OpenTabResult( + val tabId: String, +) + data class NewTabOptions( val state: TabState? = null, val data: TabData? = null, From ca8decbecfad96f7757c5072e2972934c4b57fe7 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Tue, 29 Apr 2025 18:29:23 -0700 Subject: [PATCH 5/9] remove println --- .../jetbrains/services/amazonq/webview/BrowserConnector.kt | 2 -- 1 file changed, 2 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 7253a899c3c..64d8589505d 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 @@ -107,8 +107,6 @@ class BrowserConnector( addMessageHook(browser) .onEach { json -> val node = serializer.toNode(json) - println(node.command) - println(node) when (node.command) { "disclaimer-acknowledged" -> { MeetQSettings.getInstance().disclaimerAcknowledged = true From 0fbc5c52a3e7b4d3e1d83fbcb5261eba6a7d5324 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Thu, 1 May 2025 11:27:49 -0700 Subject: [PATCH 6/9] move tab request map into ChatCommunicationManager --- .../amazonq/webview/BrowserConnector.kt | 3 +-- .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 19 +--------------- .../lsp/flareChat/ChatCommunicationManager.kt | 22 +++++++++++++++++++ 3 files changed, 24 insertions(+), 20 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 43de7a5beae..765155bada2 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 @@ -26,7 +26,6 @@ import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn 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.AmazonQLanguageClientImpl import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager @@ -288,7 +287,7 @@ class BrowserConnector( } CHAT_OPEN_TAB -> { val response = serializer.deserializeChatMessages(node) - AmazonQLanguageClientImpl.completeTabOpen( + chatCommunicationManager.completeTabOpen( response.requestId, response.params.result.tabId ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 1ca2b14b95f..bc1dc82f07f 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -36,8 +36,6 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.customization.Code import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings import java.util.UUID import java.util.concurrent.CompletableFuture -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.TimeUnit /** * Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server @@ -116,9 +114,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC override fun openTab(params: OpenTabParams): CompletableFuture { val requestId = UUID.randomUUID().toString() - val result = CompletableFuture() - - pendingTabRequests[requestId] = result + val result = ChatCommunicationManager.getInstance(project).addPendingOpenTabRequest(requestId) val uiMessage = """ { @@ -129,13 +125,6 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC """.trimIndent() AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) - result.orTimeout(30000, TimeUnit.MILLISECONDS) - .whenComplete { _, error -> - if (error != null) { - pendingTabRequests.remove(requestId) - } - } - return result } @@ -194,11 +183,5 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC companion object { private val LOG = getLogger() - - private val pendingTabRequests = ConcurrentHashMap>() - - fun completeTabOpen(requestId: String, tabId: String) { - pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) - } } } 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 1ee2c52fc92..cd10b922c58 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 @@ -9,13 +9,30 @@ 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.OpenTabResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT import java.util.UUID +import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit @Service(Service.Level.PROJECT) class ChatCommunicationManager { private val chatPartialResultMap = ConcurrentHashMap() + private val pendingTabRequests = ConcurrentHashMap>() + + fun addPendingOpenTabRequest(requestId: String): CompletableFuture { + return CompletableFuture().also { future -> + pendingTabRequests[requestId] = future + future.orTimeout(30000, TimeUnit.MILLISECONDS) + .whenComplete { _, error -> + if (error != null) { + pendingTabRequests.remove(requestId) + } + } + } + } + private fun getPartialChatMessage(partialResultToken: String): String = chatPartialResultMap.getValue(partialResultToken) @@ -53,6 +70,11 @@ class ChatCommunicationManager { AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) } } + + fun completeTabOpen(requestId: String, tabId: String) { + pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) + } + companion object { fun getInstance(project: Project) = project.service() From e7c7dbcaf5e455f5208d46537b5a4e9a3ed8c42c Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Thu, 1 May 2025 14:02:41 -0700 Subject: [PATCH 7/9] refactor for consistency --- .../amazonq/webview/BrowserConnector.kt | 2 +- .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 9 +++++- .../lsp/flareChat/ChatCommunicationManager.kt | 31 +++++++------------ 3 files changed, 21 insertions(+), 21 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 ee1e6a66968..d0b3a626902 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 @@ -286,7 +286,7 @@ class BrowserConnector( } CHAT_OPEN_TAB -> { val response = serializer.deserializeChatMessages(node) - chatCommunicationManager.completeTabOpen( + ChatCommunicationManager.completeTabOpen( response.requestId, response.params.result.tabId ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 45765357a53..15e9991f6a7 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -38,6 +38,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.customization.Code import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings import java.util.UUID import java.util.concurrent.CompletableFuture +import java.util.concurrent.TimeUnit /** * Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server @@ -116,7 +117,8 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC override fun openTab(params: OpenTabParams): CompletableFuture { val requestId = UUID.randomUUID().toString() - val result = ChatCommunicationManager.getInstance(project).addPendingOpenTabRequest(requestId) + val result = CompletableFuture() + ChatCommunicationManager.pendingTabRequests[requestId] = result val uiMessage = """ { @@ -127,6 +129,11 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC """.trimIndent() AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + result.orTimeout(30000, TimeUnit.MILLISECONDS) + .whenComplete { _, error -> + ChatCommunicationManager.pendingTabRequests.remove(requestId) + } + return result } 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 cd10b922c58..2713fbe6997 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 @@ -14,25 +14,10 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_ import java.util.UUID import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.TimeUnit @Service(Service.Level.PROJECT) class ChatCommunicationManager { private val chatPartialResultMap = ConcurrentHashMap() - private val pendingTabRequests = ConcurrentHashMap>() - - fun addPendingOpenTabRequest(requestId: String): CompletableFuture { - return CompletableFuture().also { future -> - pendingTabRequests[requestId] = future - future.orTimeout(30000, TimeUnit.MILLISECONDS) - .whenComplete { _, error -> - if (error != null) { - pendingTabRequests.remove(requestId) - } - } - } - } - private fun getPartialChatMessage(partialResultToken: String): String = chatPartialResultMap.getValue(partialResultToken) @@ -71,10 +56,6 @@ class ChatCommunicationManager { } } - fun completeTabOpen(requestId: String, tabId: String) { - pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) - } - companion object { fun getInstance(project: Project) = project.service() @@ -87,5 +68,17 @@ class ChatCommunicationManager { "isPartialResult": $isPartialResult } """.trimIndent() + + val pendingTabRequests = ConcurrentHashMap>() + + fun addPendingOpenTabRequest(requestId: String): CompletableFuture { + return CompletableFuture().also { future -> + pendingTabRequests[requestId] = future + } + } + + fun completeTabOpen(requestId: String, tabId: String) { + pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) + } } } From bec7436dd872bd72ee6eea43815ad98b59669ba7 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Thu, 1 May 2025 14:30:22 -0700 Subject: [PATCH 8/9] detekt --- .../amazonq/lsp/flareChat/ChatCommunicationManager.kt | 6 ------ 1 file changed, 6 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 2713fbe6997..61a21cbb03e 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 @@ -71,12 +71,6 @@ class ChatCommunicationManager { val pendingTabRequests = ConcurrentHashMap>() - fun addPendingOpenTabRequest(requestId: String): CompletableFuture { - return CompletableFuture().also { future -> - pendingTabRequests[requestId] = future - } - } - fun completeTabOpen(requestId: String, tabId: String) { pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) } From 310357c2563c9277d296c68a032932536c7a7d27 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Thu, 1 May 2025 20:48:42 -0700 Subject: [PATCH 9/9] detekt --- .../services/amazonq/lsp/flareChat/ChatCommunicationManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 201ae5c6b63..f148bc2ffe7 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 @@ -81,7 +81,7 @@ class ChatCommunicationManager { fun completeTabOpen(requestId: String, tabId: String) { pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) } - + inline fun convertNotificationToJsonForChat(command: String, params: T? = null) = """ {