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 e4f728fe745..1bdd916772e 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 @@ -46,6 +46,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 @@ -79,6 +80,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 @@ -288,6 +290,13 @@ class BrowserConnector( server.tabChange(params) } } + CHAT_OPEN_TAB -> { + val response = serializer.deserializeChatMessages(node) + ChatCommunicationManager.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 ea23698aef6..a731f63b465 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 @@ -28,6 +28,7 @@ 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.CHAT_OPEN_TAB import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatUpdateParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD @@ -120,9 +121,27 @@ 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 requestId = UUID.randomUUID().toString() + val result = CompletableFuture() + ChatCommunicationManager.pendingTabRequests[requestId] = result + + val uiMessage = """ + { + "command": "$CHAT_OPEN_TAB", + "params": ${Gson().toJson(params)}, + "requestId": "$requestId" + } + """.trimIndent() + AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) + + result.orTimeout(30000, TimeUnit.MILLISECONDS) + .whenComplete { _, error -> + ChatCommunicationManager.pendingTabRequests.remove(requestId) + } + + return result + } override fun showSaveFileDialog(params: ShowSaveFileDialogParams): CompletableFuture { val filters = mutableListOf() 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 c0fe93ef98f..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 @@ -11,6 +11,7 @@ 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.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 java.util.UUID import java.util.concurrent.CompletableFuture @@ -56,6 +57,7 @@ class ChatCommunicationManager { AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage) } } + companion object { fun getInstance(project: Project) = project.service() @@ -74,6 +76,12 @@ class ChatCommunicationManager { } """.trimIndent() + val pendingTabRequests = ConcurrentHashMap>() + + fun completeTabOpen(requestId: String, tabId: String) { + pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId)) + } + inline fun convertNotificationToJsonForChat(command: String, params: T? = null) = """ { 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..faa504c3d8a 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,