diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QRefreshPanelAction.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QRefreshPanelAction.kt index 84ba01c0e4c..14b551f25b6 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QRefreshPanelAction.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QRefreshPanelAction.kt @@ -9,6 +9,9 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.DumbAwareAction import com.intellij.util.messages.Topic +import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService +import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow import software.aws.toolkits.resources.AmazonQBundle import java.util.EventListener @@ -16,6 +19,15 @@ import java.util.EventListener class QRefreshPanelAction : DumbAwareAction(AmazonQBundle.message("amazonq.refresh.panel"), null, AllIcons.Actions.Refresh) { override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return + + // Notify LSP server about all open tabs being removed + val chatManager = ChatCommunicationManager.getInstance(project) + chatManager.getAllTabIds().forEach { tabId -> + AmazonQLspService.executeIfRunning(project) { server -> + rawEndpoint.notify(CHAT_TAB_REMOVE, mapOf("tabId" to tabId)) + } + } + // recreate chat browser AmazonQToolWindow.getInstance(project).disposeAndRecreate() // recreate signin browser 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 83d6a532ef1..5c0dbc67bd3 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 @@ -307,14 +307,19 @@ class BrowserConnector( } CHAT_TAB_ADD -> { - handleChat(AmazonQChatServer.tabAdd, node) + handleChat(AmazonQChatServer.tabAdd, node) { params, invoke -> + // Track the tab ID when a tab is added + chatCommunicationManager.addTabId(params.tabId) + invoke() + } } CHAT_TAB_REMOVE -> { handleChat(AmazonQChatServer.tabRemove, node) { params, invoke -> chatCommunicationManager.removePartialChatMessage(params.tabId) cancelInflightRequests(params.tabId) - + // Remove the tab ID from tracking when a tab is removed + chatCommunicationManager.removeTabId(params.tabId) invoke() } } 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 ac7deaa4134..a93f7c64297 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 @@ -45,6 +45,7 @@ class ChatCommunicationManager(private val project: Project, private val cs: Cor private val pendingTabRequests = ConcurrentHashMap>() private val partialResultLocks = ConcurrentHashMap() private val finalResultProcessed = ConcurrentHashMap() + private val openTabs = mutableSetOf() fun setUiReady() { uiReady.complete(true) @@ -80,6 +81,24 @@ class ChatCommunicationManager(private val project: Project, private val cs: Cor fun removePartialChatMessage(partialResultToken: String) = chatPartialResultMap.remove(partialResultToken) + fun addTabId(tabId: String) { + synchronized(openTabs) { + openTabs.add(tabId) + } + } + + fun removeTabId(tabId: String) { + synchronized(openTabs) { + openTabs.remove(tabId) + } + } + + fun getAllTabIds(): Set { + synchronized(openTabs) { + return openTabs.toSet() + } + } + fun addSerializedChatRequest(requestId: String, result: CompletableFuture) { pendingSerializedChatRequests[requestId] = result }