Skip to content

Commit 534a6f3

Browse files
committed
Merge remote-tracking branch 'origin/samgst/insert-to-cursor-fix' into samgst/insert-to-cursor-fix
2 parents 753ac30 + f62a93c commit 534a6f3

File tree

8 files changed

+119
-5
lines changed

8 files changed

+119
-5
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Encry
7474
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
7575
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
7676
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResponse
77+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_AVAILABLE_MODELS
7778
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_MCP_SERVERS_REQUEST_METHOD
7879
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_RULES_REQUEST_METHOD
7980
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.MCP_SERVER_CLICK_REQUEST_METHOD
@@ -547,6 +548,17 @@ class BrowserConnector(
547548
CHAT_PINNED_CONTEXT_REMOVE -> {
548549
handleChat(AmazonQChatServer.pinnedContextRemove, node)
549550
}
551+
LIST_AVAILABLE_MODELS -> {
552+
handleChat(AmazonQChatServer.listAvailableModels, node)
553+
.whenComplete { response, _ ->
554+
browser.postChat(
555+
FlareUiMessage(
556+
command = LIST_AVAILABLE_MODELS,
557+
params = response
558+
)
559+
)
560+
}
561+
}
550562
}
551563
}
552564

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSe
4040
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
4141
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
4242
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
43+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_AVAILABLE_MODELS
4344
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_MCP_SERVERS_REQUEST_METHOD
4445
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_RULES_REQUEST_METHOD
4546
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
47+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListAvailableModelsParams
48+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListAvailableModelsResult
4649
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListConversationsParams
4750
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.MCP_SERVER_CLICK_REQUEST_METHOD
4851
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIALOG_REQUEST_METHOD
@@ -255,4 +258,10 @@ object AmazonQChatServer : JsonRpcMethodProvider {
255258
Any::class.java,
256259
LSPAny::class.java
257260
)
261+
262+
val listAvailableModels = JsonRpcRequest(
263+
LIST_AVAILABLE_MODELS,
264+
ListAvailableModelsParams::class.java,
265+
ListAvailableModelsResult::class.java
266+
)
258267
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import software.aws.toolkits.core.utils.writeText
7373
import software.aws.toolkits.jetbrains.core.coroutines.ioDispatcher
7474
import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager
7575
import software.aws.toolkits.jetbrains.services.amazonq.lsp.auth.DefaultAuthCredentialsService
76+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.DefaultModuleDependenciesService
7677
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
7778
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AmazonQLspTypeAdapterFactory
7879
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsExtendedInitializeResult
@@ -592,9 +593,9 @@ private class AmazonQServerInstance(private val project: Project, private val cs
592593
WorkspaceServiceHandler(project, cs, lspInitResult).also {
593594
Disposer.register(this, it)
594595
}
595-
// DefaultModuleDependenciesService(project, cs).also {
596-
// Disposer.register(this, it)
597-
// }
596+
DefaultModuleDependenciesService(project, cs).also {
597+
Disposer.register(this, it)
598+
}
598599
}
599600
}
600601
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
99
import com.intellij.openapi.roots.ModuleRootEvent
1010
import com.intellij.openapi.roots.ModuleRootListener
1111
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.delay
1213
import kotlinx.coroutines.launch
1314
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1415
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.ModuleDependencyProvider.Companion.EP_NAME
@@ -44,14 +45,34 @@ class DefaultModuleDependenciesService(
4445
}
4546

4647
private fun syncAllModules() {
48+
val paramsMap = mutableMapOf<Pair<String, String>, DidChangeDependencyPathsParams>()
49+
4750
ModuleManager.getInstance(project).modules.forEach { module ->
4851
EP_NAME.forEachExtensionSafe {
4952
if (it.isApplicable(module)) {
50-
didChangeDependencyPaths(it.createParams(module))
53+
val params = it.createParams(module)
54+
val key = params.moduleName to params.runtimeLanguage
55+
56+
paramsMap.merge(key, params) { existing, new ->
57+
DidChangeDependencyPathsParams(
58+
moduleName = existing.moduleName,
59+
runtimeLanguage = existing.runtimeLanguage,
60+
paths = (existing.paths + new.paths).distinct(),
61+
includePatterns = (existing.includePatterns + new.includePatterns).distinct(),
62+
excludePatterns = (existing.excludePatterns + new.excludePatterns).distinct()
63+
)
64+
}
5165
return@forEachExtensionSafe
5266
}
5367
}
5468
}
69+
70+
paramsMap.values.chunked(10).forEachIndexed { index, chunk ->
71+
cs.launch {
72+
delay(index * 1000L)
73+
chunk.forEach { didChangeDependencyPaths(it) }
74+
}
75+
}
5576
}
5677

5778
override fun dispose() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class ChatCommunicationManager(private val project: Project, private val cs: Cor
200200
var errorMessage: String? = null
201201
if (exception is ResponseErrorException) {
202202
errorMessage = tryOrNull {
203-
Gson().fromJson(exception.responseError.data as JsonObject, ChatMessage::class.java).body
203+
"${exception.responseError.message}: ${Gson().fromJson(exception.responseError.data as JsonObject, ChatMessage::class.java).body}"
204204
} ?: exception.responseError.message
205205
}
206206

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,5 @@ const val MCP_SERVER_CLICK_REQUEST_METHOD = "aws/chat/mcpServerClick"
6464
const val OPEN_FILE_DIALOG_REQUEST_METHOD = "aws/chat/openFileDialog"
6565
const val LIST_RULES_REQUEST_METHOD = "aws/chat/listRules"
6666
const val RULE_CLICK_REQUEST_METHOD = "aws/chat/ruleClick"
67+
68+
const val LIST_AVAILABLE_MODELS = "aws/chat/listAvailableModels"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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 Model(
7+
val id: String,
8+
val name: String,
9+
)
10+
11+
data class ListAvailableModelsParams(
12+
val tabId: String,
13+
)
14+
15+
data class ListAvailableModelsResult(
16+
val tabId: String,
17+
val models: List<Model>,
18+
val selectedModelId: String? = null,
19+
)

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/DefaultModuleDependenciesServiceTest.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,56 @@ class DefaultModuleDependenciesServiceTest {
187187
verify(exactly = 2) { mockLanguageServer.didChangeDependencyPaths(params) }
188188
}
189189

190+
@Test
191+
fun `test deduplication of same moduleName and runtimeLanguage`() = runTest {
192+
// Arrange
193+
val module1 = mockk<Module>()
194+
val module2 = mockk<Module>()
195+
val params1 = DidChangeDependencyPathsParams(
196+
moduleName = "sameModule",
197+
runtimeLanguage = "java",
198+
paths = listOf("/path/to/dep1.jar"),
199+
includePatterns = listOf("*.java"),
200+
excludePatterns = listOf("test/**")
201+
)
202+
val params2 = DidChangeDependencyPathsParams(
203+
moduleName = "sameModule",
204+
runtimeLanguage = "java",
205+
paths = listOf("/path/to/dep2.jar"),
206+
includePatterns = listOf("*.class"),
207+
excludePatterns = listOf("build/**")
208+
)
209+
210+
every { mockModuleManager.modules } returns arrayOf(module1, module2)
211+
every { mockDependencyProvider.isApplicable(any()) } returns true
212+
every { mockDependencyProvider.createParams(module1) } returns params1
213+
every { mockDependencyProvider.createParams(module2) } returns params2
214+
215+
prepDependencyProvider(
216+
listOf(
217+
Pair(module1, params1),
218+
Pair(module2, params2)
219+
)
220+
)
221+
222+
sut = DefaultModuleDependenciesService(project, this)
223+
224+
advanceUntilIdle()
225+
226+
// Verify only one call with merged paths
227+
verify(exactly = 1) {
228+
mockLanguageServer.didChangeDependencyPaths(
229+
match {
230+
it.moduleName == "sameModule" &&
231+
it.runtimeLanguage == "java" &&
232+
it.paths.containsAll(listOf("/path/to/dep1.jar", "/path/to/dep2.jar")) &&
233+
it.includePatterns.containsAll(listOf("*.java", "*.class")) &&
234+
it.excludePatterns.containsAll(listOf("test/**", "build/**"))
235+
}
236+
)
237+
}
238+
}
239+
190240
private fun prepDependencyProvider(moduleParamPairs: List<Pair<Module, DidChangeDependencyPathsParams>>) {
191241
every { mockModuleManager.modules } returns moduleParamPairs.map { it.first }.toTypedArray()
192242

0 commit comments

Comments
 (0)