Skip to content

Commit 2594dbe

Browse files
committed
Merge branch 'main' into image
2 parents eb596bd + 9981133 commit 2594dbe

File tree

56 files changed

+1054
-709
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1054
-709
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "/transform: run all builds client-side"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q Chat: Pin context items in chat and manage workspace rules"
4+
}

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ reported the issue. Please try to include as much information as you can. Detail
2424

2525
* [Java 21](https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/downloads-list.html)
2626
* [Git](https://git-scm.com/)
27+
* If you run into a build issue on first build, ensure Git is configured to handle longer paths (common with Windows - run command as Admin): `git config --system core.longpaths true`
2728
* .NET 6
2829
* In theory, you can use a higher version, however we build with .NET 6 in CI
2930
* macOS steps:

buildSrc/settings.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,11 @@ dependencyResolutionManagement {
4343
includeGroupByRegex("org\\.jetbrains\\.intellij\\.platform.*")
4444
}
4545
}
46+
maven {
47+
url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")
48+
content {
49+
includeGroupByRegex("org\\.mockito\\.kotlin")
50+
}
51+
}
4652
}
4753
}

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ detekt = "1.23.7"
1010
diff-util = "4.12"
1111
intellijExt = "1.1.8"
1212
# match with <root>/settings.gradle.kts
13-
intellijGradle = "2.3.0"
13+
intellijGradle = "2.6.0"
1414
intellijRemoteRobot = "0.11.22"
1515
jackson = "2.17.2"
1616
jacoco = "0.8.12"
@@ -24,7 +24,7 @@ kotlin = "2.1.20"
2424
kotlinCoroutines = "1.8.0"
2525
lsp4j = "0.24.0"
2626
mockito = "5.12.0"
27-
mockitoKotlin = "5.4.0"
27+
mockitoKotlin = "5.4.1-SNAPSHOT"
2828
mockk = "1.13.17"
2929
nimbus-jose-jwt = "9.40"
3030
node-gradle = "7.0.2"

plugins/amazonq/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ val prepareBundledFlare by tasks.registering(Copy::class) {
133133
}
134134

135135
tasks.withType<PrepareSandboxTask>().configureEach {
136+
intoChild(intellijPlatform.projectName.map { "$it/lib" })
137+
.from(file("contrib/QCT-Maven-6-16.jar"))
136138
intoChild(intellijPlatform.projectName.map { "$it/flare" })
137139
.from(prepareBundledFlare)
138140
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import com.intellij.icons.AllIcons
77
import com.intellij.openapi.actionSystem.ActionUpdateThread
88
import com.intellij.openapi.actionSystem.AnActionEvent
99
import com.intellij.openapi.application.ApplicationManager
10+
import com.intellij.openapi.progress.currentThreadCoroutineScope
1011
import com.intellij.openapi.project.DumbAwareAction
1112
import com.intellij.util.messages.Topic
13+
import kotlinx.coroutines.launch
1214
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1315
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
1416
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE
@@ -22,9 +24,11 @@ class QRefreshPanelAction : DumbAwareAction(AmazonQBundle.message("amazonq.refre
2224

2325
// Notify LSP server about all open tabs being removed
2426
val chatManager = ChatCommunicationManager.getInstance(project)
25-
chatManager.getAllTabIds().forEach { tabId ->
26-
AmazonQLspService.executeIfRunning(project) { server ->
27-
rawEndpoint.notify(CHAT_TAB_REMOVE, mapOf("tabId" to tabId))
27+
currentThreadCoroutineScope().launch {
28+
chatManager.getAllTabIds().forEach { tabId ->
29+
AmazonQLspService.executeAsyncIfRunning(project) {
30+
rawEndpoint.notify(CHAT_TAB_REMOVE, mapOf("tabId" to tabId))
31+
}
2832
}
2933
}
3034

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

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_
6060
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
6161
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LIST_CONVERSATIONS
6262
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB
63+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_PINNED_CONTEXT_ADD
64+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_PINNED_CONTEXT_REMOVE
6365
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_PROMPT_OPTION_ACKNOWLEDGED
6466
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
6567
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY
@@ -73,6 +75,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Encry
7375
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
7476
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResponse
7577
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_MCP_SERVERS_REQUEST_METHOD
78+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_RULES_REQUEST_METHOD
7679
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.MCP_SERVER_CLICK_REQUEST_METHOD
7780
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIALOG
7881
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIALOG_REQUEST_METHOD
@@ -85,6 +88,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenT
8588
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResultSuccess
8689
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE
8790
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest
91+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.RULE_CLICK_REQUEST_METHOD
8892
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
8993
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.STOP_CHAT_RESPONSE
9094
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest
@@ -114,7 +118,7 @@ class BrowserConnector(
114118
private val themeBrowserAdapter: ThemeBrowserAdapter = ThemeBrowserAdapter(),
115119
private val project: Project,
116120
) {
117-
var uiReady = CompletableDeferred<Boolean>()
121+
val uiReady = CompletableDeferred<Boolean>()
118122
private val chatCommunicationManager = ChatCommunicationManager.getInstance(project)
119123
private val chatAsyncResultManager = ChatAsyncResultManager.getInstance(project)
120124

@@ -214,7 +218,7 @@ class BrowserConnector(
214218
}
215219
}
216220

217-
private fun handleFlareChatMessages(browser: Browser, node: JsonNode) {
221+
private suspend fun handleFlareChatMessages(browser: Browser, node: JsonNode) {
218222
when (node.command) {
219223
SEND_CHAT_COMMAND_PROMPT -> {
220224
val requestFromUi = serializer.deserializeChatMessages<SendChatPromptRequest>(node)
@@ -236,7 +240,7 @@ class BrowserConnector(
236240
chatCommunicationManager.registerPartialResultToken(partialResultToken)
237241

238242
var encryptionManager: JwtEncryptionManager? = null
239-
val result = AmazonQLspService.executeIfRunning(project) { server ->
243+
val result = AmazonQLspService.executeAsyncIfRunning(project) { server ->
240244
encryptionManager = this.encryptionManager
241245

242246
val encryptedParams = EncryptedChatParams(this.encryptionManager.encrypt(chatParams), partialResultToken)
@@ -256,7 +260,7 @@ class BrowserConnector(
256260
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)
257261
chatCommunicationManager.registerPartialResultToken(partialResultToken)
258262
var encryptionManager: JwtEncryptionManager? = null
259-
val result = AmazonQLspService.executeIfRunning(project) { server ->
263+
val result = AmazonQLspService.executeAsyncIfRunning(project) { server ->
260264
encryptionManager = this.encryptionManager
261265

262266
val encryptedParams = EncryptedQuickActionChatParams(this.encryptionManager.encrypt(quickActionParams), partialResultToken)
@@ -487,6 +491,7 @@ class BrowserConnector(
487491
)
488492
}
489493
}
494+
490495
OPEN_FILE_DIALOG -> {
491496
handleChat(AmazonQChatServer.showOpenFileDialog, node)
492497
.whenComplete { response, _ ->
@@ -498,6 +503,36 @@ class BrowserConnector(
498503
)
499504
}
500505
}
506+
507+
LIST_RULES_REQUEST_METHOD -> {
508+
handleChat(AmazonQChatServer.listRules, node)
509+
.whenComplete { response, _ ->
510+
browser.postChat(
511+
FlareUiMessage(
512+
command = LIST_RULES_REQUEST_METHOD,
513+
params = response
514+
)
515+
)
516+
}
517+
}
518+
RULE_CLICK_REQUEST_METHOD -> {
519+
handleChat(AmazonQChatServer.ruleClick, node)
520+
.whenComplete { response, _ ->
521+
browser.postChat(
522+
FlareUiMessage(
523+
command = RULE_CLICK_REQUEST_METHOD,
524+
params = response
525+
)
526+
)
527+
}
528+
}
529+
CHAT_PINNED_CONTEXT_ADD -> {
530+
handleChat(AmazonQChatServer.pinnedContextAdd, node)
531+
}
532+
CHAT_PINNED_CONTEXT_REMOVE -> {
533+
handleChat(AmazonQChatServer.pinnedContextRemove, node)
534+
}
535+
501536
}
502537
}
503538

@@ -594,7 +629,7 @@ class BrowserConnector(
594629
}
595630
}
596631

597-
private inline fun <reified Request, Response> handleChat(
632+
private suspend inline fun <reified Request, Response> handleChat(
598633
lspMethod: JsonRpcMethod<Request, Response>,
599634
node: JsonNode,
600635
crossinline serverAction: (params: Request, invokeService: () -> CompletableFuture<Response>) -> CompletableFuture<Response>,
@@ -605,7 +640,7 @@ class BrowserConnector(
605640
serializer.deserializeChatMessages<Request>(node.params, lspMethod.params)
606641
}
607642

608-
return AmazonQLspService.executeIfRunning(project) { _ ->
643+
return AmazonQLspService.executeAsyncIfRunning(project) { _ ->
609644
val invokeService = when (lspMethod) {
610645
is JsonRpcNotification<Request> -> {
611646
// notify is Unit
@@ -627,7 +662,7 @@ class BrowserConnector(
627662
} ?: CompletableFuture.failedFuture<Response>(IllegalStateException("LSP Server not running"))
628663
}
629664

630-
private inline fun <reified Request, Response> handleChat(
665+
private suspend inline fun <reified Request, Response> handleChat(
631666
lspMethod: JsonRpcMethod<Request, Response>,
632667
node: JsonNode,
633668
): CompletableFuture<Response> = handleChat(

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevControllerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class FeatureDevControllerTest : FeatureDevTestBase() {
170170
whenever(featureDevClient.createTaskAssistConversation()).thenReturn(exampleCreateTaskAssistConversationResponse)
171171
whenever(featureDevClient.sendFeatureDevTelemetryEvent(any())).thenReturn(exampleSendTelemetryEventResponse)
172172
whenever(chatSessionStorage.getSession(any(), any())).thenReturn(spySession)
173-
doNothing().`when`(chatSessionStorage).deleteSession(any())
173+
doNothing().whenever(chatSessionStorage).deleteSession(any())
174174

175175
mockkObject(AmazonqTelemetry)
176176
every { AmazonqTelemetry.endChat(amazonqConversationId = any(), amazonqEndOfTheConversationLatency = any()) } just runs

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ import java.util.concurrent.atomic.AtomicBoolean
7272
import javax.net.ssl.SSLHandshakeException
7373

7474
const val MAX_ZIP_SIZE = 2000000000 // 2GB
75-
const val EXPLAINABILITY_V1 = "EXPLAINABILITY_V1"
76-
const val SELECTIVE_TRANSFORMATION_V2 = "SELECTIVE_TRANSFORMATION_V2"
7775

7876
// constants for handling SDKClientException
7977
const val CONNECTION_REFUSED_ERROR: String = "Connection refused"
@@ -554,6 +552,8 @@ class CodeModernizerSession(
554552

555553
else -> {
556554
LOG.error(e) { e.message.toString() }
555+
LOG.info { "Stopping transformation job [$jobId] due to unexpected error." }
556+
stopTransformation(jobId.id)
557557
CodeModernizerJobCompletedResult.RetryableFailure(
558558
jobId,
559559
message("codemodernizer.notification.info.modernize_failed.connection_failed", e.message.orEmpty()),

0 commit comments

Comments
 (0)