Skip to content

Commit 5390890

Browse files
authored
feat(amazonq): Add events to trigger file refresh on file changes in agentic (#5709)
JetBrains does not automatically refresh the editor when a file is changed externally.(https://youtrack.jetbrains.com/issue/IJPL-2188/Background-changes-by-external-tool-not-being-picked-up-until-VFS-refresh-happens) Whenever a file is written to externally, trigger a vfs refresh(either for a file or directory) so new changes can be easily reflected in the workspace.
1 parent ea838ad commit 5390890

File tree

6 files changed

+80
-2
lines changed

6 files changed

+80
-2
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererAbap.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ class CodeWhispererAbap private constructor() : CodeWhispererProgrammingLanguage
1111

1212
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Abap
1313

14-
override fun isCodeCompletionSupported(): Boolean = true
15-
1614
companion object {
1715
const val ID = "abap"
1816

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny
1010
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_CONTEXT_COMMANDS
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyFileParams
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_APPEND_FILE
15+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_COPY_FILE
16+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_CREATE_DIRECTORY
17+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_REMOVE_FILE
18+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.DID_WRITE_FILE
19+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileParams
1320
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
1421
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
1522
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIFF
@@ -45,4 +52,19 @@ interface AmazonQLanguageClient : LanguageClient {
4552

4653
@JsonNotification(CHAT_SEND_CONTEXT_COMMANDS)
4754
fun sendContextCommands(params: LSPAny): CompletableFuture<Unit>
55+
56+
@JsonNotification(DID_COPY_FILE)
57+
fun copyFile(params: CopyFileParams)
58+
59+
@JsonNotification(DID_WRITE_FILE)
60+
fun writeFile(params: FileParams)
61+
62+
@JsonNotification(DID_APPEND_FILE)
63+
fun appendFile(params: FileParams)
64+
65+
@JsonNotification(DID_REMOVE_FILE)
66+
fun removeFile(params: FileParams)
67+
68+
@JsonNotification(DID_CREATE_DIRECTORY)
69+
fun createDirectory(params: FileParams)
4870
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.intellij.openapi.fileChooser.FileSaverDescriptor
1313
import com.intellij.openapi.fileEditor.FileEditorManager
1414
import com.intellij.openapi.project.Project
1515
import com.intellij.openapi.vfs.LocalFileSystem
16+
import com.intellij.openapi.vfs.VfsUtil
1617
import com.intellij.openapi.vfs.VirtualFileManager
1718
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
1819
import org.eclipse.lsp4j.ConfigurationParams
@@ -25,6 +26,7 @@ import org.eclipse.lsp4j.ShowDocumentParams
2526
import org.eclipse.lsp4j.ShowDocumentResult
2627
import org.eclipse.lsp4j.ShowMessageRequestParams
2728
import org.slf4j.event.Level
29+
import software.amazon.awssdk.utils.UserHomeDirectoryUtils
2830
import software.aws.toolkits.core.utils.error
2931
import software.aws.toolkits.core.utils.getLogger
3032
import software.aws.toolkits.core.utils.info
@@ -38,6 +40,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny
3840
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB
3941
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_CONTEXT_COMMANDS
4042
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE
43+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyFileParams
44+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileParams
4145
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
4246
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
4347
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
@@ -389,7 +393,38 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
389393
return CompletableFuture.completedFuture(Unit)
390394
}
391395

396+
override fun appendFile(params: FileParams) = refreshVfs(params.path)
397+
398+
override fun createDirectory(params: FileParams) = refreshVfs(params.path)
399+
400+
override fun removeFile(params: FileParams) = refreshVfs(params.path)
401+
402+
override fun writeFile(params: FileParams) = refreshVfs(params.path)
403+
404+
override fun copyFile(params: CopyFileParams) {
405+
refreshVfs(params.oldPath)
406+
return refreshVfs(params.newPath)
407+
}
408+
409+
private fun refreshVfs(path: String) {
410+
val currPath = Paths.get(path)
411+
if (currPath.startsWith(localHistoryPath)) return
412+
try {
413+
ApplicationManager.getApplication().invokeLater {
414+
VfsUtil.markDirtyAndRefresh(false, true, true, currPath.toFile())
415+
}
416+
} catch (e: Exception) {
417+
LOG.warn(e) { "Could not refresh file" }
418+
}
419+
}
420+
392421
companion object {
422+
val localHistoryPath = Paths.get(
423+
UserHomeDirectoryUtils.userHomeDirectory(),
424+
".aws",
425+
"amazonq",
426+
"history"
427+
)
393428
private val LOG = getLogger<AmazonQLanguageClientImpl>()
394429
}
395430
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
5+
6+
data class CopyFileParams(
7+
val oldPath: String,
8+
val newPath: String,
9+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
5+
6+
data class FileParams(
7+
val path: String,
8+
)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ const val CHAT_TAB_BAR_ACTIONS = "aws/chat/tabBarAction"
3131
const val CHAT_TAB_CHANGE = "aws/chat/tabChange"
3232
const val CHAT_TAB_REMOVE = "aws/chat/tabRemove"
3333

34+
const val DID_COPY_FILE = "aws/didCopyFile"
35+
const val DID_WRITE_FILE = "aws/didWriteFile"
36+
const val DID_APPEND_FILE = "aws/didAppendFile"
37+
const val DID_REMOVE_FILE = "aws/didRemoveFileOrDirectory"
38+
const val DID_CREATE_DIRECTORY = "aws/didCreateDirectory"
39+
3440
const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat"
3541

3642
const val OPEN_FILE_DIFF = "aws/openFileDiff"

0 commit comments

Comments
 (0)