Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 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.apps.AppConnection
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,10 +56,12 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
project.messageBus.connect().subscribe(
AsyncChatUiListener.TOPIC,
object : AsyncChatUiListener {
override fun onChange(message: String) {
runInEdt {
browser.get()?.postChat(message)
}
override fun onChange(command: String) {
browser.get()?.postChat(command)
}

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 org.cef.CefApp
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 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project)

fun component() = jcefBrowser.component

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

@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.flareChat.getTextDocumentIdentifier
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
Expand Down Expand Up @@ -139,6 +140,7 @@
// this is sent when the named agents UI is ready
"ui-is-ready" -> {
uiReady.complete(true)
chatCommunicationManager.setUiReady()

Check warning on line 143 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#L143

Added line #L143 was not covered by tests
RunOnceUtil.runOnceForApp("AmazonQ-UI-Ready") {
MeetQSettings.getInstance().reinvent2024OnboardingCount += 1
}
Expand Down Expand Up @@ -264,7 +266,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)
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

// We assume there is only one outgoing request per tab because the input is
Expand All @@ -280,11 +284,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)
} ?: (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 @@ -333,6 +335,7 @@
CHAT_READY -> {
handleChatNotification<ChatReadyNotification, Unit>(node) { server, _ ->
uiReady.complete(true)
chatCommunicationManager.setUiReady()
RunOnceUtil.runOnceForApp("AmazonQ-UI-Ready") {
MeetQSettings.getInstance().reinvent2024OnboardingCount += 1
}
Expand All @@ -358,7 +361,7 @@
}
CHAT_OPEN_TAB -> {
val response = serializer.deserializeChatMessages<OpenTabResponse>(node)
ChatCommunicationManager.completeTabOpen(
chatCommunicationManager.completeTabOpen(

Check warning on line 364 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#L364

Added line #L364 was not covered by tests
response.requestId,
response.params.result.tabId
)
Expand Down Expand Up @@ -429,7 +432,7 @@

GET_SERIALIZED_CHAT_REQUEST_METHOD -> {
val response = serializer.deserializeChatMessages<GetSerializedChatResponse>(node)
ChatCommunicationManager.completeSerializedChatResponse(
chatCommunicationManager.completeSerializedChatResponse(

Check warning on line 435 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#L435

Added line #L435 was not covered by tests
response.requestId,
response.params.result.content
)
Expand All @@ -439,13 +442,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,
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 @@ -136,20 +137,20 @@
override fun openTab(params: OpenTabParams): CompletableFuture<OpenTabResult> {
val requestId = UUID.randomUUID().toString()
val result = CompletableFuture<OpenTabResult>()
ChatCommunicationManager.pendingTabRequests[requestId] = result

val uiMessage = """
{
"command": "$CHAT_OPEN_TAB",
"params": ${Gson().toJson(params)},
"requestId": "$requestId"
}
""".trimIndent()
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
val chatManager = ChatCommunicationManager.getInstance(project)
chatManager.addTabOpenRequest(requestId, result)

Check warning on line 141 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#L140-L141

Added lines #L140 - L141 were not covered by tests

chatManager.notifyUi(

Check warning on line 143 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#L143

Added line #L143 was not covered by tests
FlareUiMessage(
command = CHAT_OPEN_TAB,
params = params,
requestId = requestId,
)
)

result.orTimeout(30000, TimeUnit.MILLISECONDS)
.whenComplete { _, error ->
ChatCommunicationManager.pendingTabRequests.remove(requestId)
chatManager.removeTabOpenRequest(requestId)

Check warning on line 153 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#L153

Added line #L153 was not covered by tests
}

return result
Expand Down Expand Up @@ -188,21 +189,20 @@
override fun getSerializedChat(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult> {
val requestId = UUID.randomUUID().toString()
val result = CompletableFuture<GetSerializedChatResult>()

ChatCommunicationManager.pendingSerializedChatRequests[requestId] = result

val uiMessage = """
{
"command": "$GET_SERIALIZED_CHAT_REQUEST_METHOD",
"params": ${Gson().toJson(params)},
"requestId": "$requestId"
}
""".trimIndent()
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
val chatManager = ChatCommunicationManager.getInstance(project)
chatManager.addSerializedChatRequest(requestId, result)

Check warning on line 193 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#L192-L193

Added lines #L192 - L193 were not covered by tests

chatManager.notifyUi(

Check warning on line 195 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#L195

Added line #L195 was not covered by tests
FlareUiMessage(
command = GET_SERIALIZED_CHAT_REQUEST_METHOD,
params = params,
requestId = requestId,
)
)

result.orTimeout(30000, TimeUnit.MILLISECONDS)
.whenComplete { _, error ->
ChatCommunicationManager.pendingSerializedChatRequests.remove(requestId)
chatManager.removeSerializedChatRequest(requestId)

Check warning on line 205 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#L205

Added line #L205 was not covered by tests
}

return result
Expand Down Expand Up @@ -257,19 +257,17 @@
try {
chatCommunicationManager.handlePartialResultProgressNotification(project, params)
} catch (e: Exception) {
error("Cannot handle partial chat")
LOG.error(e) { "Cannot handle partial chat" }
}
}

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,
)
)

return CompletableFuture.completedFuture(Unit)
}
Expand Down Expand Up @@ -343,15 +341,13 @@
)

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

AsyncChatUiListener.notifyPartialMessageUpdate(showContextCommands)

val chatManager = ChatCommunicationManager.getInstance(project)
chatManager.notifyUi(

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#L344-L345

Added lines #L344 - L345 were not covered by tests
FlareUiMessage(
command = CHAT_SEND_CONTEXT_COMMANDS,
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 com.intellij.util.messages.Topic
import java.util.EventListener

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

fun onChange(command: FlareUiMessage) {}

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)
}

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