From 8b8b9a187051726680f0a60a413827204d31ab6b Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 30 Apr 2025 12:07:14 +0200 Subject: [PATCH 1/3] fix(amazonq): only download single copy of LSP at once This addresses multiple problems with the Flare dependency resolution: * Multiple projects starting will attempt to download the same artifact concurrently to the same location * If the user has never downloaded the LSP, they always get an error because we incorrectly assume that a file exists * Multiple projects can resolve different versions of the server/client --- .../amazonq/toolwindow/AmazonQPanel.kt | 5 +- .../services/amazonq/webview/Browser.kt | 1 + .../services/amazonq/lsp/AmazonQLspService.kt | 2 +- .../amazonq/lsp/artifacts/ArtifactHelper.kt | 33 +++---- .../amazonq/lsp/artifacts/ArtifactManager.kt | 88 +++++++++++-------- .../lsp/artifacts/ArtifactManagerTest.kt | 34 ++++--- .../resources/MessagesBundle.properties | 2 +- 7 files changed, 90 insertions(+), 75 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt index 68375af8e63..8d23c334aeb 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt @@ -7,6 +7,7 @@ import com.intellij.idea.AppMode import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.runInEdt +import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.ui.components.JBLoadingPanel @@ -18,8 +19,10 @@ import com.intellij.ui.dsl.builder.AlignX import com.intellij.ui.dsl.builder.AlignY import com.intellij.ui.dsl.builder.panel import com.intellij.ui.jcef.JBCefApp +import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.isDeveloperMode import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactHelper +import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager import software.aws.toolkits.jetbrains.services.amazonq.webview.Browser import java.awt.event.ActionListener import java.util.concurrent.CompletableFuture @@ -88,7 +91,7 @@ class AmazonQPanel(private val parent: Disposable, val project: Project) { wrapper.setContent(loadingPanel) ApplicationManager.getApplication().executeOnPooledThread { - val webUri = ArtifactHelper().getLatestLocalLspArtifact().resolve("amazonq-ui.js").toUri() + val webUri = runBlocking { service().fetchArtifact(project).resolve("amazonq-ui.js").toUri() } loadingPanel.stopLoading() runInEdt { browser.complete( diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt index 8177af3f194..d5506c2dc2b 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt @@ -116,6 +116,7 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project) ): String { val quickActionConfig = generateQuickActionConfig() val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)") + // language=HTML val jsScripts = """