Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry
import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
Expand Down Expand Up @@ -55,8 +56,12 @@
project.messageBus.connect().subscribe(
AsyncChatUiListener.TOPIC,
object : AsyncChatUiListener {
override fun onChange(message: String) {
browser.get()?.postChat(message)
override fun onChange(command: String) {
browser.get()?.postChat(command)
}

Check warning on line 61 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L61 was not covered by tests

override fun onChange(command: FlareUiMessage) {
browser.get()?.postChat(command)
}
}
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

@file:Suppress("BannedImports")
package software.aws.toolkits.jetbrains.services.amazonq.webview

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.google.gson.Gson
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
Expand All @@ -12,6 +13,7 @@
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
Expand Down Expand Up @@ -63,6 +65,9 @@

fun component() = jcefBrowser.component

fun postChat(command: FlareUiMessage) = postChat(Gson().toJson(command))

Check warning on line 68 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L68 was not covered by tests

@Deprecated("shouldn't need this version")
fun postChat(message: String) {
jcefBrowser
.cefBrowser
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AUTH_FOLLOW_UP_CLICKED
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AuthFollowUpClickNotification
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickNotification
Expand Down Expand Up @@ -254,7 +255,9 @@
var encryptionManager: JwtEncryptionManager? = null
val result = AmazonQLspService.executeIfRunning(project) { server ->
encryptionManager = this.encryptionManager
encryptionManager?.encrypt(chatParams)?.let { EncryptedChatParams(it, partialResultToken) }?.let { server.sendChatPrompt(it) }

val encryptedParams = EncryptedChatParams(this.encryptionManager.encrypt(chatParams), partialResultToken)
server.sendChatPrompt(encryptedParams)

Check warning on line 260 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L259 - L260 were not covered by tests
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

// We assume there is only one outgoing request per tab because the input is
Expand All @@ -270,11 +273,9 @@
var encryptionManager: JwtEncryptionManager? = null
val result = AmazonQLspService.executeIfRunning(project) { server ->
encryptionManager = this.encryptionManager
encryptionManager?.encrypt(quickActionParams)?.let {
EncryptedQuickActionChatParams(it, partialResultToken)
}?.let {
server.sendQuickAction(it)
}

val encryptedParams = EncryptedQuickActionChatParams(this.encryptionManager.encrypt(quickActionParams), partialResultToken)
server.sendQuickAction(encryptedParams)

Check warning on line 278 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L277 - L278 were not covered by tests
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

// We assume there is only one outgoing request per tab because the input is
Expand Down Expand Up @@ -429,13 +430,18 @@
handleChatNotification<TabBarActionRequest, TabBarActionParams>(node) {
server, params ->
val result = server.tabBarActions(params)
result.whenComplete { params1, error ->
result.whenComplete { actions, error ->
try {
if (error != null) {
throw error
}
val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1)
browser.postChat(res)

browser.postChat(
FlareUiMessage(
command = CHAT_TAB_BAR_ACTIONS,

Check warning on line 441 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L439 - L441 were not covered by tests
params = actions ?: emptyMap<Any, Any>()
)
)
} catch (e: Exception) {
LOG.error { "Failed to perform chat tab bar action $e" }
params.tabId?.let {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
@file:Suppress("BannedImports")
package software.aws.toolkits.jetbrains.services.amazonq.lsp

import com.google.gson.Gson
import com.intellij.diff.DiffContentFactory
import com.intellij.diff.DiffManager
import com.intellij.diff.DiffManagerEx
Expand All @@ -26,13 +25,15 @@
import org.eclipse.lsp4j.ShowDocumentParams
import org.eclipse.lsp4j.ShowDocumentResult
import org.eclipse.lsp4j.ShowMessageRequestParams
import software.aws.toolkits.core.utils.error
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.core.utils.warn
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
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
Expand Down Expand Up @@ -138,14 +139,13 @@
val result = CompletableFuture<OpenTabResult>()
ChatCommunicationManager.pendingTabRequests[requestId] = result

val uiMessage = """
{
"command": "$CHAT_OPEN_TAB",
"params": ${Gson().toJson(params)},
"requestId": "$requestId"
}
""".trimIndent()
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
AsyncChatUiListener.notifyPartialMessageUpdate(
FlareUiMessage(
command = CHAT_OPEN_TAB,
params = params,
requestId = requestId,

Check warning on line 146 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L142 - L146 were not covered by tests
)
)

result.orTimeout(30000, TimeUnit.MILLISECONDS)
.whenComplete { _, error ->
Expand Down Expand Up @@ -191,14 +191,13 @@

ChatCommunicationManager.pendingSerializedChatRequests[requestId] = result

val uiMessage = """
{
"command": "$GET_SERIALIZED_CHAT_REQUEST_METHOD",
"params": ${Gson().toJson(params)},
"requestId": "$requestId"
}
""".trimIndent()
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
AsyncChatUiListener.notifyPartialMessageUpdate(
FlareUiMessage(
command = GET_SERIALIZED_CHAT_REQUEST_METHOD,
params = params,
requestId = requestId,

Check warning on line 198 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L194 - L198 were not covered by tests
)
)

result.orTimeout(30000, TimeUnit.MILLISECONDS)
.whenComplete { _, error ->
Expand Down Expand Up @@ -257,19 +256,17 @@
try {
chatCommunicationManager.handlePartialResultProgressNotification(project, params)
} catch (e: Exception) {
error("Cannot handle partial chat")
LOG.error(e) { "Cannot handle partial chat" }

Check warning on line 259 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L259 was not covered by tests
}
}

override fun sendChatUpdate(params: ChatUpdateParams): CompletableFuture<Unit> {
val uiMessage = """
{
"command":"$CHAT_SEND_UPDATE",
"params":${Gson().toJson(params)}
}
""".trimIndent()

AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
AsyncChatUiListener.notifyPartialMessageUpdate(
FlareUiMessage(
command = CHAT_SEND_UPDATE,
params = params,

Check warning on line 267 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L264 - L267 were not covered by tests
)
)

return CompletableFuture.completedFuture(Unit)
}
Expand Down Expand Up @@ -343,14 +340,12 @@
)

override fun sendContextCommands(params: LSPAny): CompletableFuture<Unit> {
val showContextCommands = """
{
"command":"$CHAT_SEND_CONTEXT_COMMANDS",
"params": ${Gson().toJson(params)}
}
""".trimIndent()

AsyncChatUiListener.notifyPartialMessageUpdate(showContextCommands)
AsyncChatUiListener.notifyPartialMessageUpdate(
FlareUiMessage(
command = CHAT_SEND_CONTEXT_COMMANDS,

Check warning on line 345 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L343 - L345 were not covered by tests
params = params ?: error("received empty payload for $CHAT_SEND_CONTEXT_COMMANDS"),
)
)

return CompletableFuture.completedFuture(Unit)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@
import java.util.EventListener

interface AsyncChatUiListener : EventListener {
fun onChange(message: String) {}
@Deprecated("shouldn't need this version")
fun onChange(command: String) {}

Check warning on line 12 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L12 was not covered by tests

fun onChange(command: FlareUiMessage) {}

Check warning on line 14 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L14 was not covered by tests

companion object {
@Topic.AppLevel
val TOPIC = Topic.create("Partial chat message provider", AsyncChatUiListener::class.java)

fun notifyPartialMessageUpdate(message: String) {
ApplicationManager.getApplication().messageBus.syncPublisher(TOPIC).onChange(message)
fun notifyPartialMessageUpdate(command: FlareUiMessage) {
ApplicationManager.getApplication().messageBus.syncPublisher(TOPIC).onChange(command)
}

Check warning on line 22 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt#L21-L22

Added lines #L21 - L22 were not covered by tests

@Deprecated("shouldn't need this version")
fun notifyPartialMessageUpdate(command: String) {
ApplicationManager.getApplication().messageBus.syncPublisher(TOPIC).onChange(command)

Check warning on line 26 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AsyncChatUiListener.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L26 was not covered by tests
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,5 @@ class ChatCommunicationManager {
fun completeTabOpen(requestId: String, tabId: String) {
pendingTabRequests.remove(requestId)?.complete(OpenTabResult(tabId))
}

inline fun <reified T> convertNotificationToJsonForChat(command: String, params: T? = null) =
"""
{
"command":"$command",
"params": ${if (params != null) Gson().toJson(params) else "{}"}
}
""".trimIndent()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// 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.flareChat

data class FlareUiMessage(
val command: String,
val params: Any,
val requestId: String? = null,
)

Check warning on line 10 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/FlareUiMessage.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/FlareUiMessage.kt#L6-L10

Added lines #L6 - L10 were not covered by tests
Loading