diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererAbap.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererAbap.kt index da8334406a4..4096e519e24 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererAbap.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererAbap.kt @@ -11,8 +11,6 @@ class CodeWhispererAbap private constructor() : CodeWhispererProgrammingLanguage override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Abap - override fun isCodeCompletionSupported(): Boolean = true - companion object { const val ID = "abap" diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt index 7fa611032d4..90e7eb49978 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt @@ -10,6 +10,13 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny 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_CONTEXT_COMMANDS 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.CopyFileParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_APPEND_FILE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_COPY_FILE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_CREATE_DIRECTORY +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_REMOVE_FILE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_WRITE_FILE +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIFF @@ -45,4 +52,19 @@ interface AmazonQLanguageClient : LanguageClient { @JsonNotification(CHAT_SEND_CONTEXT_COMMANDS) fun sendContextCommands(params: LSPAny): CompletableFuture + + @JsonNotification(DID_COPY_FILE) + fun copyFile(params: CopyFileParams) + + @JsonNotification(DID_WRITE_FILE) + fun writeFile(params: FileParams) + + @JsonNotification(DID_APPEND_FILE) + fun appendFile(params: FileParams) + + @JsonNotification(DID_REMOVE_FILE) + fun removeFile(params: FileParams) + + @JsonNotification(DID_CREATE_DIRECTORY) + fun createDirectory(params: FileParams) } 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 030253a3cf0..6364451f871 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 @@ -13,6 +13,7 @@ import com.intellij.openapi.fileChooser.FileSaverDescriptor import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFileManager import migration.software.aws.toolkits.jetbrains.settings.AwsSettings import org.eclipse.lsp4j.ConfigurationParams @@ -25,6 +26,7 @@ import org.eclipse.lsp4j.ShowDocumentParams import org.eclipse.lsp4j.ShowDocumentResult import org.eclipse.lsp4j.ShowMessageRequestParams import org.slf4j.event.Level +import software.amazon.awssdk.utils.UserHomeDirectoryUtils import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info @@ -38,6 +40,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny 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_CONTEXT_COMMANDS 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.CopyFileParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams @@ -389,7 +393,38 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC return CompletableFuture.completedFuture(Unit) } + override fun appendFile(params: FileParams) = refreshVfs(params.path) + + override fun createDirectory(params: FileParams) = refreshVfs(params.path) + + override fun removeFile(params: FileParams) = refreshVfs(params.path) + + override fun writeFile(params: FileParams) = refreshVfs(params.path) + + override fun copyFile(params: CopyFileParams) { + refreshVfs(params.oldPath) + return refreshVfs(params.newPath) + } + + private fun refreshVfs(path: String) { + val currPath = Paths.get(path) + if (currPath.startsWith(localHistoryPath)) return + try { + ApplicationManager.getApplication().invokeLater { + VfsUtil.markDirtyAndRefresh(false, true, true, currPath.toFile()) + } + } catch (e: Exception) { + LOG.warn(e) { "Could not refresh file" } + } + } + companion object { + val localHistoryPath = Paths.get( + UserHomeDirectoryUtils.userHomeDirectory(), + ".aws", + "amazonq", + "history" + ) private val LOG = getLogger() } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CopyFileParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CopyFileParams.kt new file mode 100644 index 00000000000..68b4b7e9315 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CopyFileParams.kt @@ -0,0 +1,9 @@ +// 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 CopyFileParams( + val oldPath: String, + val newPath: String, +) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FileParams.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FileParams.kt new file mode 100644 index 00000000000..2e1344b03b0 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FileParams.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.chat + +data class FileParams( + val path: String, +) 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 8725c8a64d9..1dc7579b35b 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 @@ -31,6 +31,12 @@ const val CHAT_TAB_BAR_ACTIONS = "aws/chat/tabBarAction" const val CHAT_TAB_CHANGE = "aws/chat/tabChange" const val CHAT_TAB_REMOVE = "aws/chat/tabRemove" +const val DID_COPY_FILE = "aws/didCopyFile" +const val DID_WRITE_FILE = "aws/didWriteFile" +const val DID_APPEND_FILE = "aws/didAppendFile" +const val DID_REMOVE_FILE = "aws/didRemoveFileOrDirectory" +const val DID_CREATE_DIRECTORY = "aws/didCreateDirectory" + const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat" const val OPEN_FILE_DIFF = "aws/openFileDiff"