Skip to content

Commit d1bf37d

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/manodnyb/addQuickActions' into samgst/q-lsp-endChat
# Conflicts: # plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt # plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt # plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt
2 parents ec564bf + 28a199e commit d1bf37d

File tree

17 files changed

+239
-27
lines changed

17 files changed

+239
-27
lines changed

.changes/3.66.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"date" : "2025-04-11",
3+
"version" : "3.66",
4+
"entries" : [ {
5+
"type" : "feature",
6+
"description" : "The logs emitted by the Agent during user command execution will be accepted and written to `.amazonq/dev/run_command.log` file in the user's local repository."
7+
}, {
8+
"type" : "bugfix",
9+
"description" : "Unit test generation now completes successfully when using the `/test` command "
10+
} ]
11+
}

.changes/next-release/feature-5391ea41-f418-4154-9f0c-5de8bacf1aeb.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# _3.66_ (2025-04-11)
2+
- **(Feature)** The logs emitted by the Agent during user command execution will be accepted and written to `.amazonq/dev/run_command.log` file in the user's local repository.
3+
- **(Bug Fix)** Unit test generation now completes successfully when using the `/test` command
4+
15
# _3.64_ (2025-04-10)
26
- **(Bug Fix)** Fix issue where IDE freezes when logging into Amazon Q
37

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# Toolkit Version
5-
toolkitVersion=3.66-SNAPSHOT
5+
toolkitVersion=3.67-SNAPSHOT
66

77
# Publish Settings
88
publishToken=

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.intellij.idea.AppMode
77
import com.intellij.openapi.Disposable
88
import com.intellij.openapi.application.ApplicationManager
99
import com.intellij.openapi.application.runInEdt
10+
import com.intellij.openapi.project.Project
1011
import com.intellij.openapi.util.Disposer
1112
import com.intellij.ui.components.JBLoadingPanel
1213
import com.intellij.ui.components.JBPanelWithEmptyText
@@ -24,7 +25,7 @@ import java.awt.event.ActionListener
2425
import java.util.concurrent.CompletableFuture
2526
import javax.swing.JButton
2627

27-
class AmazonQPanel(private val parent: Disposable) {
28+
class AmazonQPanel(private val parent: Disposable, val project: Project) {
2829
private val webviewContainer = Wrapper()
2930
val browser = CompletableFuture<Browser>()
3031

@@ -91,7 +92,7 @@ class AmazonQPanel(private val parent: Disposable) {
9192
loadingPanel.stopLoading()
9293
runInEdt {
9394
browser.complete(
94-
Browser(parent, webUri).also {
95+
Browser(parent, webUri, project).also {
9596
wrapper.setContent(it.component())
9697
}
9798
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class AmazonQToolWindow private constructor(
4949
private val browserConnector = BrowserConnector(project = project)
5050
private val editorThemeAdapter = EditorThemeAdapter()
5151

52-
private val chatPanel = AmazonQPanel(parent = this)
52+
private val chatPanel = AmazonQPanel(parent = this, project)
5353

5454
val component: JComponent = chatPanel.component
5555

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ package software.aws.toolkits.jetbrains.services.amazonq.webview
55

66
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
77
import com.intellij.openapi.Disposable
8+
import com.intellij.openapi.project.Project
89
import com.intellij.openapi.util.Disposer
910
import com.intellij.ui.jcef.JBCefJSQuery
1011
import org.cef.CefApp
12+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
1114
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
1215
import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand
1316
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
@@ -17,7 +20,8 @@ import java.net.URI
1720
/*
1821
Displays the web view for the Amazon Q tool window
1922
*/
20-
class Browser(parent: Disposable, private val webUri: URI) : Disposable {
23+
24+
class Browser(parent: Disposable, private val webUri: URI, val project: Project) : Disposable {
2125

2226
val jcefBrowser = createBrowser(parent)
2327

@@ -39,8 +43,17 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable {
3943
"mynah",
4044
AssetResourceHandler.AssetResourceHandlerFactory(),
4145
)
42-
43-
loadWebView(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand, activeProfile)
46+
AmazonQLspService.getInstance(project).addServerStartedListener {
47+
loadWebView(
48+
isCodeTransformAvailable,
49+
isFeatureDevAvailable,
50+
isDocAvailable,
51+
isCodeScanAvailable,
52+
isCodeTestAvailable,
53+
highlightCommand,
54+
activeProfile
55+
)
56+
}
4457
}
4558

4659
override fun dispose() {
@@ -101,6 +114,7 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable {
101114
highlightCommand: HighlightCommand?,
102115
activeProfile: QRegionProfile?,
103116
): String {
117+
val quickActionConfig = generateQuickActionConfig()
104118
val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)")
105119
val jsScripts = """
106120
<script type="text/javascript" src="$webUri" defer onload="init()"></script>
@@ -113,7 +127,7 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable {
113127
}
114128
},
115129
{
116-
quickActionCommands: [],
130+
quickActionCommands: $quickActionConfig,
117131
disclaimerAcknowledged: ${MeetQSettings.getInstance().disclaimerAcknowledged}
118132
}
119133
);
@@ -220,6 +234,10 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable {
220234
activeProfile
221235
}
222236

237+
private fun generateQuickActionConfig() = AwsServerCapabilitiesProvider.getInstance(project).getChatOptions().quickActions.quickActionsCommandGroups
238+
.let { OBJECT_MAPPER.writeValueAsString(it) }
239+
?: "[]"
240+
223241
companion object {
224242
private const val MAX_ONBOARDING_PAGE_COUNT = 3
225243
private val OBJECT_MAPPER = jacksonObjectMapper()

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

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged
1818
import kotlinx.coroutines.flow.launchIn
1919
import kotlinx.coroutines.flow.merge
2020
import kotlinx.coroutines.flow.onEach
21+
import kotlinx.coroutines.future.await
2122
import kotlinx.coroutines.launch
2223
import org.cef.browser.CefBrowser
2324
import org.eclipse.lsp4j.Position
@@ -28,10 +29,13 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
2829
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
2930
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
3031
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier
32+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
3133
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatParams
3234
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
3335
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorState
3436
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
37+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
38+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest
3539
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EndChatParams
3640
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_END_CHAT
3741
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
@@ -170,33 +174,40 @@ class BrowserConnector(
170174
)
171175
)
172176

173-
val partialResultToken = chatCommunicationManager.addPartialChatMessage(requestFromUi.params.tabId)
174177
val chatParams = ChatParams(
175178
requestFromUi.params.tabId,
176179
chatPrompt,
177180
textDocumentIdentifier,
178181
cursorState
179182
)
180183

184+
val tabId = requestFromUi.params.tabId
185+
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)
186+
181187
var encryptionManager: JwtEncryptionManager? = null
182188
val result = AmazonQLspService.executeIfRunning(project) { server ->
183189
encryptionManager = this.encryptionManager
184190
encryptionManager?.encrypt(chatParams)?.let { EncryptedChatParams(it, partialResultToken) }?.let { server.sendChatPrompt(it) }
185191
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
186-
187-
result.whenComplete {
188-
value, error ->
189-
chatCommunicationManager.removePartialChatMessage(partialResultToken)
190-
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
191-
node.command,
192-
requestFromUi.params.tabId,
193-
encryptionManager?.decrypt(value).orEmpty(),
194-
isPartialResult = false
195-
)
196-
browser.postChat(messageToChat)
197-
}
192+
showResult(result, partialResultToken, tabId, encryptionManager, browser)
198193
}
194+
CHAT_QUICK_ACTION -> {
195+
val requestFromUi = serializer.deserializeChatMessages(node, QuickChatActionRequest::class.java)
196+
val tabId = requestFromUi.params.tabId
197+
val quickActionParams = requestFromUi.params
198+
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)
199+
var encryptionManager: JwtEncryptionManager? = null
200+
val result = AmazonQLspService.executeIfRunning(project) { server ->
201+
encryptionManager = this.encryptionManager
202+
encryptionManager?.encrypt(quickActionParams)?.let {
203+
EncryptedQuickActionChatParams(it, partialResultToken)
204+
}?.let {
205+
server.sendQuickAction(it)
206+
}
207+
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
199208

209+
showResult(result, partialResultToken, tabId, encryptionManager, browser)
210+
}
200211
SEND_END_CHAT -> {
201212
val requestFromUi = serializer.deserializeChatMessages(node, EndChatParams::class.java)
202213

@@ -207,4 +218,23 @@ class BrowserConnector(
207218
}
208219
}
209220
}
221+
222+
private fun showResult(
223+
result: CompletableFuture<String>,
224+
partialResultToken: String,
225+
tabId: String,
226+
encryptionManager: JwtEncryptionManager?,
227+
browser: Browser,
228+
) {
229+
result.whenComplete { value, error ->
230+
chatCommunicationManager.removePartialChatMessage(partialResultToken)
231+
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
232+
SEND_CHAT_COMMAND_PROMPT,
233+
tabId,
234+
encryptionManager?.decrypt(value).orEmpty(),
235+
isPartialResult = false
236+
)
237+
browser.postChat(messageToChat)
238+
}
239+
}
210240
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ class CodeTestChatController(
409409
.build()
410410
return GenerateAssistantResponseRequest.builder()
411411
.conversationState(conversationState)
412+
.profileArn(QRegionProfileManager.getInstance().activeProfile(context.project)?.arn)
412413
.build()
413414
}
414415

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class ChatSessionV1(
210210
.build()
211211
return GenerateAssistantResponseRequest.builder()
212212
.conversationState(conversationState)
213+
.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn)
213214
.build()
214215
}
215216

0 commit comments

Comments
 (0)