From fe7a04c3b48e8b6fcceeb23eb07e4ccad87a28a9 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 7 Mar 2025 12:09:03 -0800 Subject: [PATCH 01/20] add sspc --- .../settings/CodeWhispererConfigurable.kt | 14 ++++++++++++++ .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 1 + .../services/amazonq/lsp/AmazonQLspConstants.kt | 1 + .../amazonq/lsp/CodeWhispererLspConfiguration.kt | 3 +++ .../jetbrains/settings/CodeWhispererSettings.kt | 6 ++++++ .../toolkits/resources/MessagesBundle.properties | 2 ++ 6 files changed, 27 insertions(+) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt index 3440d5fa8c8..7d31d9b7bfd 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt @@ -138,6 +138,20 @@ class CodeWhispererConfigurable(private val project: Project) : } group(message("aws.settings.codewhisperer.group.q_chat")) { + row { + checkBox(message("aws.settings.codewhisperer.workspace_context")).apply { + connect.subscribe( + ToolkitConnectionManagerListener.TOPIC, + object : ToolkitConnectionManagerListener { + override fun activeConnectionChanged(newConnection: ToolkitConnection?) { + enabled(isCodeWhispererEnabled(project)) + } + } + ) + enabled(invoke) + bindSelected(codeWhispererSettings::isWorkspaceContextEnabled, codeWhispererSettings::toggleWorkspaceContextEnabled) + }.comment(message("aws.settings.codewhisperer.workspace_context.tooltip")) + } row { checkBox(message("aws.settings.codewhisperer.project_context")).apply { connect.subscribe( 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 3ea36e4c82b..50b1be3626d 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 @@ -84,6 +84,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC CodeWhispererLspConfiguration( shouldShareData = CodeWhispererSettings.getInstance().isMetricOptIn(), shouldShareCodeReferences = CodeWhispererSettings.getInstance().isIncludeCodeWithReference(), + shouldEnableWorkspaceContext = CodeWhispererSettings.getInstance().isWorkspaceContextEnabled() ) ) } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspConstants.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspConstants.kt index 1cb6e2d391e..ca8fffcbb51 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspConstants.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspConstants.kt @@ -8,4 +8,5 @@ object AmazonQLspConstants { const val LSP_CW_CONFIGURATION_KEY = "aws.codeWhisperer" const val LSP_CW_OPT_OUT_KEY = "shareCodeWhispererContentWithAWS" const val LSP_CODE_REFERENCES_OPT_OUT_KEY = "includeSuggestionsWithCodeReferences" + const val LSP_WORKSPACE_CONTEXT_ENABLED_KEY = "workspaceContext" } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/CodeWhispererLspConfiguration.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/CodeWhispererLspConfiguration.kt index 9feb23a2fa4..d54acf55fbe 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/CodeWhispererLspConfiguration.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/CodeWhispererLspConfiguration.kt @@ -9,6 +9,9 @@ data class CodeWhispererLspConfiguration( @SerializedName(AmazonQLspConstants.LSP_CW_OPT_OUT_KEY) val shouldShareData: Boolean? = null, + @SerializedName(AmazonQLspConstants.LSP_WORKSPACE_CONTEXT_ENABLED_KEY) + val shouldEnableWorkspaceContext: Boolean? = null, + @SerializedName(AmazonQLspConstants.LSP_CODE_REFERENCES_OPT_OUT_KEY) val shouldShareCodeReferences: Boolean? = null, ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index 275411172f2..bd67fefc054 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -91,6 +91,11 @@ class CodeWhispererSettings : PersistentStateComponentLearn more +aws.settings.codewhisperer.workspace_context=Workspace context +aws.settings.codewhisperer.workspace_context.tooltip=When checked, Amazon Q will enable server side project context. aws.settings.codewhisperer.project_context=Workspace index aws.settings.codewhisperer.project_context.tooltip=When you add @workspace to your questions in Amazon Q chat, Amazon Q will index your workspace files locally to use as context for its response. Extra CPU usage is expected while indexing a workspace. This will not impact Amazon Q features or your IDE, but you may manage CPU usage by setting the number of local threads below. aws.settings.codewhisperer.project_context_gpu=Workspace index uses GPU From 0e1e60374b700b79716082a95ea959c53933fba5 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 7 Mar 2025 12:14:50 -0800 Subject: [PATCH 02/20] alpha endpoint --- plugins/amazonq/src/main/resources/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/src/main/resources/META-INF/plugin.xml b/plugins/amazonq/src/main/resources/META-INF/plugin.xml index 3f359ac25ea..bb76d6189ed 100644 --- a/plugins/amazonq/src/main/resources/META-INF/plugin.xml +++ b/plugins/amazonq/src/main/resources/META-INF/plugin.xml @@ -85,7 +85,7 @@ + defaultValue="https://rts.alpha-us-west-2.codewhisperer.ai.aws.dev/" restartRequired="true"/> From 3f850611eb7990baf25e8359944587faf3aeb005 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 7 Mar 2025 12:31:12 -0800 Subject: [PATCH 03/20] add workspace id to inline api --- .../codewhisperer/service/CodeWhispererService.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 111ccdc509f..756cd3540ce 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -21,6 +21,7 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import com.intellij.util.concurrency.annotations.RequiresEdt import com.intellij.util.messages.Topic +import io.ktor.client.request.request import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Job @@ -231,7 +232,8 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { buildCodeWhispererRequest( requestContext.fileContextInfo, requestContext.awaitSupplementalContext(), - requestContext.customizationArn + requestContext.customizationArn, + requestContext.workspaceId ) ) @@ -666,7 +668,12 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { // 5. customization val customizationArn = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn - return RequestContext(project, editor, triggerTypeInfo, caretPosition, fileContext, supplementalContext, connection, latencyContext, customizationArn) + // TODO: use workspaceID from LSP + // hardcoded for now! + val workspaceId = null + + return RequestContext(project, editor, triggerTypeInfo, caretPosition, + fileContext, supplementalContext, connection, latencyContext, customizationArn, workspaceId) } fun validateResponse(response: GenerateCompletionsResponse): GenerateCompletionsResponse { @@ -800,6 +807,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { fileContextInfo: FileContextInfo, supplementalContext: SupplementalContextInfo?, customizationArn: String?, + workspaceId: String? ): GenerateCompletionsRequest { val programmingLanguage = ProgrammingLanguage.builder() .languageName(fileContextInfo.programmingLanguage.toCodeWhispererRuntimeLanguage().languageId) @@ -828,6 +836,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { .referenceTrackerConfiguration { it.recommendationsWithReferences(includeCodeWithReference) } .customizationArn(customizationArn) .optOutPreference(getTelemetryOptOutPreference()) + .workspaceId(workspaceId) .build() } } @@ -843,6 +852,7 @@ data class RequestContext( val connection: ToolkitConnection?, val latencyContext: LatencyContext, val customizationArn: String?, + val workspaceId: String? ) { // TODO: should make the entire getRequestContext() suspend function instead of making supplemental context only var supplementalContext: SupplementalContextInfo? = null From eec8792e3847dab715c603fd7a076286b3781fc9 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Mon, 10 Mar 2025 14:56:25 -0700 Subject: [PATCH 04/20] listen to settings changes --- .../toolkits/jetbrains/settings/CodeWhispererSettings.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index bd67fefc054..6ad2075c625 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -93,6 +93,12 @@ class CodeWhispererSettings : PersistentStateComponent Date: Wed, 12 Mar 2025 11:55:19 -0700 Subject: [PATCH 05/20] add getConfig --- .../jetbrains/services/amazonq/lsp/AmazonQLspService.kt | 4 ++-- .../lsp/model/aws/GetConfigurationFromServerPayload.kt | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt index 59658c3a878..b676f392cbd 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt @@ -252,8 +252,8 @@ private class AmazonQServerInstance(private val project: Project, private val cs val artifact = runBlocking { ArtifactManager(project, manifestRange = null).fetchArtifact() }.toAbsolutePath() val node = if (SystemInfo.isWindows) "node.exe" else "node" val cmd = GeneralCommandLine( - artifact.resolve(node).toString(), - LspSettings.getInstance().getArtifactPath() ?: artifact.resolve("aws-lsp-codewhisperer.js").toString(), + "/Users/leigaol/.nvm/versions/node/v18.20.2/bin/node", + "/Users/leigaol/workplace/aws-toolkit-lsp/language-servers/app/aws-lsp-codewhisperer-runtimes/out/token-standalone.js", "--stdio", "--set-credentials-encryption-key", ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt new file mode 100644 index 00000000000..d038f237d06 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt @@ -0,0 +1,8 @@ +// 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 + +data class GetConfigurationFromServerPayload( + val section: String, +) From 7a7a662e092eff52f9c2be507dcc48b630698c18 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Wed, 12 Mar 2025 13:09:38 -0700 Subject: [PATCH 06/20] get workspaceId from LSP --- .../service/CodeWhispererService.kt | 32 +++++++++++++++++-- .../amazonq/lsp/AmazonQLanguageServer.kt | 5 +++ .../services/amazonq/lsp/AmazonQLspService.kt | 1 - ...kt => GetConfigurationFromServerParams.kt} | 2 +- .../lsp/model/aws/LspServerConfigurations.kt | 12 +++++++ 5 files changed, 47 insertions(+), 5 deletions(-) rename plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/{GetConfigurationFromServerPayload.kt => GetConfigurationFromServerParams.kt} (82%) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 756cd3540ce..2c1fd60e5bc 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -21,7 +21,6 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import com.intellij.util.concurrency.annotations.RequiresEdt import com.intellij.util.messages.Topic -import io.ktor.client.request.request import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Job @@ -30,6 +29,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.nio.file.Paths import software.amazon.awssdk.core.exception.SdkServiceException import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException @@ -54,6 +54,9 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection import software.aws.toolkits.jetbrains.services.amazonq.SUPPLEMENTAL_CONTEXT_TIMEOUT +import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.GetConfigurationFromServerParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManager @@ -92,6 +95,8 @@ import software.aws.toolkits.resources.message import software.aws.toolkits.telemetry.CodewhispererCompletionType import software.aws.toolkits.telemetry.CodewhispererSuggestionState import software.aws.toolkits.telemetry.CodewhispererTriggerType +import java.net.URI +import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @Service @@ -669,13 +674,34 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { val customizationArn = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn // TODO: use workspaceID from LSP - // hardcoded for now! - val workspaceId = null + var workspaceId: String? = null + try { + val workspacesInfos = getWorkspaceIds(project).get().workspaces + for (workspaceInfo in workspacesInfos) { + val workspaceRootPath = Paths.get(URI(workspaceInfo.workspaceRoot)).toString() + if (psiFile.virtualFile.path.startsWith(workspaceRootPath)) { + workspaceId = workspaceInfo.workspaceId + break + } + } + } catch (e: Exception) { + LOG.info("Cannot get workspaceId from LSP'$e'") + } + LOG.info("Found workspaceId from LSP '$workspaceId'") return RequestContext(project, editor, triggerTypeInfo, caretPosition, fileContext, supplementalContext, connection, latencyContext, customizationArn, workspaceId) } + fun getWorkspaceIds(project: Project): CompletableFuture { + val payload = GetConfigurationFromServerParams( + section = "aws.q.workspaceContext" + ) + return AmazonQLspService.executeIfRunning(project) { server -> + server.getConfigurationFromServer(payload) + } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) + } + fun validateResponse(response: GenerateCompletionsResponse): GenerateCompletionsResponse { // If contentSpans in reference are not consistent with content(recommendations), // remove the incorrect references. 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 6470584da8e..18cf95d3973 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 @@ -7,6 +7,8 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage import org.eclipse.lsp4j.jsonrpc.services.JsonNotification import org.eclipse.lsp4j.jsonrpc.services.JsonRequest import org.eclipse.lsp4j.services.LanguageServer +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.GetConfigurationFromServerParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams import java.util.concurrent.CompletableFuture @@ -24,4 +26,7 @@ interface AmazonQLanguageServer : LanguageServer { @JsonNotification("aws/credentials/token/delete") fun deleteTokenCredentials(): CompletableFuture + + @JsonRequest("aws/getConfigurationFromServer") + fun getConfigurationFromServer(params: GetConfigurationFromServerParams): CompletableFuture } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt index b676f392cbd..8c299240a0b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt @@ -55,7 +55,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDoc import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders import software.aws.toolkits.jetbrains.services.amazonq.lsp.workspace.WorkspaceServiceHandler import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata -import software.aws.toolkits.jetbrains.settings.LspSettings import java.io.IOException import java.io.OutputStreamWriter import java.io.PipedInputStream diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerParams.kt similarity index 82% rename from plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt rename to plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerParams.kt index d038f237d06..551ddfa97b0 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerPayload.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/GetConfigurationFromServerParams.kt @@ -3,6 +3,6 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws -data class GetConfigurationFromServerPayload( +data class GetConfigurationFromServerParams( val section: String, ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt new file mode 100644 index 00000000000..c85e1ac0e72 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt @@ -0,0 +1,12 @@ +// 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 + +// This represents each item in the array +data class WorkspaceInfo(val workspaceRoot: String, val workspaceId: String) + +// This represents the entire array +data class LspServerConfigurations ( val workspaces: List ) + + From 0028b2cc0696b37c235fd4dff381617efa85e4da Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Fri, 14 Mar 2025 11:29:21 -0700 Subject: [PATCH 07/20] switch to gamma --- plugins/amazonq/src/main/resources/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/src/main/resources/META-INF/plugin.xml b/plugins/amazonq/src/main/resources/META-INF/plugin.xml index bb76d6189ed..8190f72bfbe 100644 --- a/plugins/amazonq/src/main/resources/META-INF/plugin.xml +++ b/plugins/amazonq/src/main/resources/META-INF/plugin.xml @@ -85,7 +85,7 @@ + defaultValue="https://rts.gamma-us-west-2.codewhisperer.ai.aws.dev/" restartRequired="true"/> From 85b1091b8dcfbf897f365d61f5db3642b65e198f Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Mon, 17 Mar 2025 12:51:20 -0700 Subject: [PATCH 08/20] gamma lsp endpoint --- .../jetbrains/services/amazonq/lsp/AmazonQLspService.kt | 5 +++-- .../services/amazonq/lsp/artifacts/ArtifactManager.kt | 4 ++-- .../services/amazonq/lsp/artifacts/ManifestFetcher.kt | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt index 8c299240a0b..59658c3a878 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt @@ -55,6 +55,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDoc import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders import software.aws.toolkits.jetbrains.services.amazonq.lsp.workspace.WorkspaceServiceHandler import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata +import software.aws.toolkits.jetbrains.settings.LspSettings import java.io.IOException import java.io.OutputStreamWriter import java.io.PipedInputStream @@ -251,8 +252,8 @@ private class AmazonQServerInstance(private val project: Project, private val cs val artifact = runBlocking { ArtifactManager(project, manifestRange = null).fetchArtifact() }.toAbsolutePath() val node = if (SystemInfo.isWindows) "node.exe" else "node" val cmd = GeneralCommandLine( - "/Users/leigaol/.nvm/versions/node/v18.20.2/bin/node", - "/Users/leigaol/workplace/aws-toolkit-lsp/language-servers/app/aws-lsp-codewhisperer-runtimes/out/token-standalone.js", + artifact.resolve(node).toString(), + LspSettings.getInstance().getArtifactPath() ?: artifact.resolve("aws-lsp-codewhisperer.js").toString(), "--stdio", "--set-credentials-encryption-key", ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt index 7d41bfaddb5..901f52722ce 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt @@ -32,8 +32,8 @@ class ArtifactManager( companion object { private val DEFAULT_VERSION_RANGE = SupportedManifestVersionRange( - startVersion = SemVer("3.0.0", 3, 0, 0), - endVersion = SemVer("4.0.0", 4, 0, 0) + startVersion = SemVer("0.1.0", 0, 1, 0), + endVersion = SemVer("0.2.0", 0, 2, 0) ) private val logger = getLogger() } 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 4ccfbeca491..ca15dd07eb0 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/codewhisperer/0/manifest.json" + "https://aws-language-servers-gamma.amazonaws.com/remoteWorkspaceContext/0/manifest.json" private val DEFAULT_MANIFEST_PATH: Path = getToolkitsCommonCacheRoot() .resolve("aws") From 80cb11d02e8c330b49ef714b3cde97fe4230d042 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 18 Mar 2025 17:20:34 -0700 Subject: [PATCH 09/20] use internal scope --- .../core/credentials/sono/SonoConstants.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt index 2c9bd5941c1..052f3a32755 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt @@ -13,16 +13,16 @@ const val IDENTITY_CENTER_ROLE_ACCESS_SCOPE = "sso:account:access" @Deprecated("pending removal, merge into Q_SCOPES") val CODEWHISPERER_SCOPES = listOf( - "codewhisperer:completions", - "codewhisperer:analysis", + "codewhisperer_internal:completions", + "codewhisperer_internal:analysis", ) val Q_SCOPES = listOf( - "codewhisperer:conversations", - "codewhisperer:transformations", - "codewhisperer:taskassist", - "codewhisperer:completions", - "codewhisperer:analysis", + "codewhisperer_internal:conversations", + "codewhisperer_internal:transformations", + "codewhisperer_internal:taskassist", + "codewhisperer_internal:completions", + "codewhisperer_internal:analysis", ) val CODECATALYST_SCOPES = listOf( From 5295252ce905ab9149e02febccb02a9023129d51 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Mon, 31 Mar 2025 12:23:07 -0700 Subject: [PATCH 10/20] sspc --- .../codewhisperer/service/CodeWhispererService.kt | 3 +-- .../amazonq/lsp/artifacts/ArtifactManager.kt | 4 ++-- .../amazonq/lsp/artifacts/ManifestFetcher.kt | 2 +- .../amazonq/src/main/resources/META-INF/plugin.xml | 2 +- .../core/credentials/sono/SonoConstants.kt | 14 +++++++------- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 2c1fd60e5bc..b13f08baa05 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -673,7 +673,6 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { // 5. customization val customizationArn = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn - // TODO: use workspaceID from LSP var workspaceId: String? = null try { val workspacesInfos = getWorkspaceIds(project).get().workspaces @@ -693,7 +692,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { fileContext, supplementalContext, connection, latencyContext, customizationArn, workspaceId) } - fun getWorkspaceIds(project: Project): CompletableFuture { + private fun getWorkspaceIds(project: Project): CompletableFuture { val payload = GetConfigurationFromServerParams( section = "aws.q.workspaceContext" ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt index 901f52722ce..7d41bfaddb5 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt @@ -32,8 +32,8 @@ class ArtifactManager( companion object { private val DEFAULT_VERSION_RANGE = SupportedManifestVersionRange( - startVersion = SemVer("0.1.0", 0, 1, 0), - endVersion = SemVer("0.2.0", 0, 2, 0) + startVersion = SemVer("3.0.0", 3, 0, 0), + endVersion = SemVer("4.0.0", 4, 0, 0) ) private val logger = getLogger() } 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 ca15dd07eb0..4ccfbeca491 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-language-servers-gamma.amazonaws.com/remoteWorkspaceContext/0/manifest.json" + "https://aws-toolkit-language-servers.amazonaws.com/codewhisperer/0/manifest.json" private val DEFAULT_MANIFEST_PATH: Path = getToolkitsCommonCacheRoot() .resolve("aws") diff --git a/plugins/amazonq/src/main/resources/META-INF/plugin.xml b/plugins/amazonq/src/main/resources/META-INF/plugin.xml index 8190f72bfbe..3f359ac25ea 100644 --- a/plugins/amazonq/src/main/resources/META-INF/plugin.xml +++ b/plugins/amazonq/src/main/resources/META-INF/plugin.xml @@ -85,7 +85,7 @@ + defaultValue="https://codewhisperer.us-east-1.amazonaws.com/" restartRequired="true"/> diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt index 052f3a32755..2c9bd5941c1 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt @@ -13,16 +13,16 @@ const val IDENTITY_CENTER_ROLE_ACCESS_SCOPE = "sso:account:access" @Deprecated("pending removal, merge into Q_SCOPES") val CODEWHISPERER_SCOPES = listOf( - "codewhisperer_internal:completions", - "codewhisperer_internal:analysis", + "codewhisperer:completions", + "codewhisperer:analysis", ) val Q_SCOPES = listOf( - "codewhisperer_internal:conversations", - "codewhisperer_internal:transformations", - "codewhisperer_internal:taskassist", - "codewhisperer_internal:completions", - "codewhisperer_internal:analysis", + "codewhisperer:conversations", + "codewhisperer:transformations", + "codewhisperer:taskassist", + "codewhisperer:completions", + "codewhisperer:analysis", ) val CODECATALYST_SCOPES = listOf( From 57779bf1310fb3ad64b59f373438c060c86e2799 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Mon, 31 Mar 2025 12:24:34 -0700 Subject: [PATCH 11/20] log level --- .../services/codewhisperer/service/CodeWhispererService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index b13f08baa05..2f9e2f7bb4a 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -685,7 +685,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { } } catch (e: Exception) { - LOG.info("Cannot get workspaceId from LSP'$e'") + LOG.warn("Cannot get workspaceId from LSP'$e'") } LOG.info("Found workspaceId from LSP '$workspaceId'") return RequestContext(project, editor, triggerTypeInfo, caretPosition, From 913295bacf82317d3b62ba86e80302f428e03b3d Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Mon, 31 Mar 2025 12:38:34 -0700 Subject: [PATCH 12/20] clean up --- .../services/codewhisperer/service/CodeWhispererService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 2f9e2f7bb4a..5208a5ee240 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -680,6 +680,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { val workspaceRootPath = Paths.get(URI(workspaceInfo.workspaceRoot)).toString() if (psiFile.virtualFile.path.startsWith(workspaceRootPath)) { workspaceId = workspaceInfo.workspaceId + LOG.info("Found workspaceId from LSP '$workspaceId'") break } @@ -687,7 +688,6 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { } catch (e: Exception) { LOG.warn("Cannot get workspaceId from LSP'$e'") } - LOG.info("Found workspaceId from LSP '$workspaceId'") return RequestContext(project, editor, triggerTypeInfo, caretPosition, fileContext, supplementalContext, connection, latencyContext, customizationArn, workspaceId) } From 06a10ce63c7dbee87a4ce59ff86a88af6b186b9b Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 12:16:58 -0700 Subject: [PATCH 13/20] fix unit ttest --- .../lsp/AmazonQLanguageClientImplTest.kt | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt index c8e20428897..83131a45cc9 100644 --- a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt +++ b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt @@ -62,12 +62,14 @@ class AmazonQLanguageClientImplTest { @Test fun `configuration for codeWhisperer respects opt-out`() { CodeWhispererSettings.getInstance().toggleMetricOptIn(false) + CodeWhispererSettings.getInstance().toggleWorkspaceContextEnabled(true) assertThat(sut.configuration(configurationParams("aws.codeWhisperer")).get()) .singleElement() .isEqualTo( CodeWhispererLspConfiguration( shouldShareData = false, - shouldShareCodeReferences = false + shouldShareCodeReferences = false, + shouldEnableWorkspaceContext = true ) ) } @@ -75,12 +77,28 @@ class AmazonQLanguageClientImplTest { @Test fun `configuration for codeWhisperer respects opt-in`() { CodeWhispererSettings.getInstance().toggleMetricOptIn(true) + CodeWhispererSettings.getInstance().toggleWorkspaceContextEnabled(true) assertThat(sut.configuration(configurationParams("aws.codeWhisperer")).get()) .singleElement() .isEqualTo( CodeWhispererLspConfiguration( shouldShareData = true, - shouldShareCodeReferences = false + shouldShareCodeReferences = false, + shouldEnableWorkspaceContext = true + ) + ) + } + + @Test + fun `configuration for workspace context respects opt-in`() { + CodeWhispererSettings.getInstance().toggleWorkspaceContextEnabled(false) + assertThat(sut.configuration(configurationParams("aws.codeWhisperer")).get()) + .singleElement() + .isEqualTo( + CodeWhispererLspConfiguration( + shouldShareData = true, + shouldShareCodeReferences = false, + shouldEnableWorkspaceContext = false ) ) } From 61fa22c716819919b2b809f10de4ff9c27d3cbf5 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 13:13:31 -0700 Subject: [PATCH 14/20] fix validate localize messages --- .../software/aws/toolkits/resources/MessagesBundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties b/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties index 31dda73e84a..c7e667e7bc8 100644 --- a/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties +++ b/plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties @@ -288,8 +288,6 @@ aws.settings.codewhisperer.group.plugin_settings=Plugin Settings aws.settings.codewhisperer.group.q_chat=Chat aws.settings.codewhisperer.include_code_with_reference=Include suggestions with code references aws.settings.codewhisperer.include_code_with_reference.tooltip=When checked, Amazon Q will include suggestions with code references. If you authenticate through IAM Identity Center, this setting is controlled by your Amazon Q Developer Pro administrator. Learn more -aws.settings.codewhisperer.workspace_context=Workspace context -aws.settings.codewhisperer.workspace_context.tooltip=When checked, Amazon Q will enable server side project context. aws.settings.codewhisperer.project_context=Workspace index aws.settings.codewhisperer.project_context.tooltip=When you add @workspace to your questions in Amazon Q chat, Amazon Q will index your workspace files locally to use as context for its response. Extra CPU usage is expected while indexing a workspace. This will not impact Amazon Q features or your IDE, but you may manage CPU usage by setting the number of local threads below. aws.settings.codewhisperer.project_context_gpu=Workspace index uses GPU @@ -299,6 +297,8 @@ aws.settings.codewhisperer.project_context_index_max_size.tooltip=The maximum si aws.settings.codewhisperer.project_context_index_thread=Workspace index worker threads aws.settings.codewhisperer.project_context_index_thread.tooltip=Number of worker threads of Amazon Q local index process. Set to 0 to use system default worker threads for balanced performance. Please restart or reload IntelliJ after changing worker threads. aws.settings.codewhisperer.warning=To use Amazon Q, login with AWS Builder ID or AWS IAM Identity Center. +aws.settings.codewhisperer.workspace_context=Workspace context +aws.settings.codewhisperer.workspace_context.tooltip=When checked, Amazon Q will enable server side project context. aws.settings.dynamic_resources_configurable.clear_all=Clear All aws.settings.dynamic_resources_configurable.select_all=Select All aws.settings.dynamic_resources_configurable.suggest_types.dialog.message=Please suggest additional AWS resource types (e.g. AWS::S3::Bucket)\nyou would like to see supported in future releases.\n\n(max length: 2000 chars) From 22935def8d5d57a47fac15e4975104674bef285c Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 13:21:18 -0700 Subject: [PATCH 15/20] detekt --- .../codewhisperer/service/CodeWhispererService.kt | 13 +++++++------ .../lsp/model/aws/LspServerConfigurations.kt | 4 +--- .../jetbrains/settings/CodeWhispererSettings.kt | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 5208a5ee240..1d71cd84ffc 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -29,7 +29,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.nio.file.Paths import software.amazon.awssdk.core.exception.SdkServiceException import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException @@ -96,6 +95,7 @@ import software.aws.toolkits.telemetry.CodewhispererCompletionType import software.aws.toolkits.telemetry.CodewhispererSuggestionState import software.aws.toolkits.telemetry.CodewhispererTriggerType import java.net.URI +import java.nio.file.Paths import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @@ -683,13 +683,14 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { LOG.info("Found workspaceId from LSP '$workspaceId'") break } - } } catch (e: Exception) { LOG.warn("Cannot get workspaceId from LSP'$e'") } - return RequestContext(project, editor, triggerTypeInfo, caretPosition, - fileContext, supplementalContext, connection, latencyContext, customizationArn, workspaceId) + return RequestContext( + project, editor, triggerTypeInfo, caretPosition, + fileContext, supplementalContext, connection, latencyContext, customizationArn, workspaceId + ) } private fun getWorkspaceIds(project: Project): CompletableFuture { @@ -832,7 +833,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { fileContextInfo: FileContextInfo, supplementalContext: SupplementalContextInfo?, customizationArn: String?, - workspaceId: String? + workspaceId: String?, ): GenerateCompletionsRequest { val programmingLanguage = ProgrammingLanguage.builder() .languageName(fileContextInfo.programmingLanguage.toCodeWhispererRuntimeLanguage().languageId) @@ -877,7 +878,7 @@ data class RequestContext( val connection: ToolkitConnection?, val latencyContext: LatencyContext, val customizationArn: String?, - val workspaceId: String? + val workspaceId: String?, ) { // TODO: should make the entire getRequestContext() suspend function instead of making supplemental context only var supplementalContext: SupplementalContextInfo? = null diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt index c85e1ac0e72..e762b938d28 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt @@ -7,6 +7,4 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws data class WorkspaceInfo(val workspaceRoot: String, val workspaceId: String) // This represents the entire array -data class LspServerConfigurations ( val workspaces: List ) - - +data class LspServerConfigurations(val workspaces: List) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index 6ad2075c625..ea53b330c95 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -210,7 +210,7 @@ enum class CodeWhispererConfigurationType { HasEnabledProjectContextOnce, IsQPrioritizedForTabAccept, IsTabAcceptPriorityNotificationShownOnce, - IsWorkspaceContextEnabled + IsWorkspaceContextEnabled, } enum class CodeWhispererStringConfigurationType { From 5e439a487e963073e30773f01ca7255f560e4b1b Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 13:28:54 -0700 Subject: [PATCH 16/20] detekt --- .../services/codewhisperer/service/CodeWhispererService.kt | 4 ++-- .../jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 1d71cd84ffc..05d814b94a9 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -680,12 +680,12 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { val workspaceRootPath = Paths.get(URI(workspaceInfo.workspaceRoot)).toString() if (psiFile.virtualFile.path.startsWith(workspaceRootPath)) { workspaceId = workspaceInfo.workspaceId - LOG.info("Found workspaceId from LSP '$workspaceId'") + LOG.info { "Found workspaceId from LSP '$workspaceId'" } break } } } catch (e: Exception) { - LOG.warn("Cannot get workspaceId from LSP'$e'") + LOG.warn { "Cannot get workspaceId from LSP'$e'" } } return RequestContext( project, editor, triggerTypeInfo, caretPosition, diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt index 330ce9a092e..3bf772e86d5 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt @@ -257,7 +257,8 @@ fun aRequestContext( Random.nextLong(), aString() ), - customizationArn = null + customizationArn = null, + workspaceId = null ) } From a106dd7d7fab0eac849b63d2683b8ceb2d86902f Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 13:35:48 -0700 Subject: [PATCH 17/20] detekt --- .../aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt index ea53b330c95..7f9e443c14f 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt @@ -91,7 +91,7 @@ class CodeWhispererSettings : PersistentStateComponent Date: Tue, 1 Apr 2025 14:00:48 -0700 Subject: [PATCH 18/20] unit test --- .../codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt | 3 ++- .../services/codewhisperer/CodeWhispererServiceTest.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt index a82f8700eb4..1e81a695308 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt @@ -176,7 +176,8 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov }, null, mock(), - aString() + aString(), + null ) val responseContext = ResponseContext("sessionId") val recommendationContext = RecommendationContext( diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt index 1d5646d3869..add4a9909cd 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt @@ -212,7 +212,8 @@ class CodeWhispererServiceTest { supplementalContextDeferred = async { mockSupContext }, connection = ToolkitConnectionManager.getInstance(projectRule.project).activeConnection(), latencyContext = LatencyContext(), - customizationArn = "fake-arn" + customizationArn = "fake-arn", + workspaceId = null ) ) From 1fd6c90fba3237646e02c0202ba2aab5fab30ab2 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 14:40:32 -0700 Subject: [PATCH 19/20] unit test --- .../services/codewhisperer/CodeWhispererConfigurableTest.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt index 5224284b42a..67aff7a14e3 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt @@ -39,17 +39,18 @@ class CodeWhispererConfigurableTest : CodeWhispererTestBase() { val checkboxes = panel.components.filterIsInstance() - assertThat(checkboxes.size).isEqualTo(5) + assertThat(checkboxes.size).isEqualTo(6) assertThat(checkboxes.map { it.text }).containsExactlyInAnyOrder( message("aws.settings.codewhisperer.include_code_with_reference"), message("aws.settings.codewhisperer.configurable.opt_out.title"), message("aws.settings.codewhisperer.automatic_import_adder"), + "Workspace context", message("aws.settings.codewhisperer.project_context"), message("aws.settings.codewhisperer.project_context_gpu") ) val comments = panel.components.filterIsInstance() - assertThat(comments.size).isEqualTo(8) + assertThat(comments.size).isEqualTo(9) mockCodeWhispererEnabledStatus(false) ApplicationManager.getApplication().messageBus.syncPublisher(ToolkitConnectionManagerListener.TOPIC) From 6dc2272703e1c3bf2f1c1f591fa41ae786de7419 Mon Sep 17 00:00:00 2001 From: Lei Gao Date: Tue, 1 Apr 2025 15:09:02 -0700 Subject: [PATCH 20/20] gamma pdx --- .../amazonq/lsp/artifacts/ArtifactManager.kt | 4 ++-- .../amazonq/lsp/artifacts/ManifestFetcher.kt | 2 +- .../amazonq/src/main/resources/META-INF/plugin.xml | 2 +- .../core/credentials/sono/SonoConstants.kt | 14 +++++++------- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt index 7d41bfaddb5..901f52722ce 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt @@ -32,8 +32,8 @@ class ArtifactManager( companion object { private val DEFAULT_VERSION_RANGE = SupportedManifestVersionRange( - startVersion = SemVer("3.0.0", 3, 0, 0), - endVersion = SemVer("4.0.0", 4, 0, 0) + startVersion = SemVer("0.1.0", 0, 1, 0), + endVersion = SemVer("0.2.0", 0, 2, 0) ) private val logger = getLogger() } 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 4ccfbeca491..ca15dd07eb0 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/codewhisperer/0/manifest.json" + "https://aws-language-servers-gamma.amazonaws.com/remoteWorkspaceContext/0/manifest.json" private val DEFAULT_MANIFEST_PATH: Path = getToolkitsCommonCacheRoot() .resolve("aws") diff --git a/plugins/amazonq/src/main/resources/META-INF/plugin.xml b/plugins/amazonq/src/main/resources/META-INF/plugin.xml index 3f359ac25ea..8190f72bfbe 100644 --- a/plugins/amazonq/src/main/resources/META-INF/plugin.xml +++ b/plugins/amazonq/src/main/resources/META-INF/plugin.xml @@ -85,7 +85,7 @@ + defaultValue="https://rts.gamma-us-west-2.codewhisperer.ai.aws.dev/" restartRequired="true"/> diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt index 2c9bd5941c1..052f3a32755 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sono/SonoConstants.kt @@ -13,16 +13,16 @@ const val IDENTITY_CENTER_ROLE_ACCESS_SCOPE = "sso:account:access" @Deprecated("pending removal, merge into Q_SCOPES") val CODEWHISPERER_SCOPES = listOf( - "codewhisperer:completions", - "codewhisperer:analysis", + "codewhisperer_internal:completions", + "codewhisperer_internal:analysis", ) val Q_SCOPES = listOf( - "codewhisperer:conversations", - "codewhisperer:transformations", - "codewhisperer:taskassist", - "codewhisperer:completions", - "codewhisperer:analysis", + "codewhisperer_internal:conversations", + "codewhisperer_internal:transformations", + "codewhisperer_internal:taskassist", + "codewhisperer_internal:completions", + "codewhisperer_internal:analysis", ) val CODECATALYST_SCOPES = listOf(