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
@@ -0,0 +1,4 @@
{
"type" : "bugfix",
"description" : "Fix UI freezes that may occur when interacting with large files in the editor"
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

import com.intellij.idea.AppMode
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runInEdt
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
Expand All @@ -19,12 +17,15 @@
import com.intellij.ui.dsl.builder.panel
import com.intellij.ui.jcef.JBCefApp
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import software.aws.toolkits.jetbrains.core.coroutines.EDT
import software.aws.toolkits.jetbrains.isDeveloperMode
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
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.AmazonQLspService
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
Expand All @@ -44,28 +45,28 @@
import java.util.concurrent.CompletableFuture
import javax.swing.JButton

class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Disposable {
private val browser = CompletableFuture<Browser>()

Check warning on line 49 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#L48-L49

Added lines #L48 - L49 were not covered by tests
private val webviewContainer = Wrapper()
private val appSource = AppSource()
private val browserConnector = BrowserConnector(project = project)
private val editorThemeAdapter = EditorThemeAdapter()
private val appConnections = mutableListOf<AppConnection>()

Check warning on line 54 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#L51-L54

Added lines #L51 - L54 were not covered by tests

init {
project.messageBus.connect().subscribe(
AsyncChatUiListener.TOPIC,
object : AsyncChatUiListener {

Check warning on line 59 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#L56-L59

Added lines #L56 - L59 were not covered by tests
override fun onChange(command: String) {
browser.get()?.postChat(command)
}

Check warning on line 62 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#L62

Added line #L62 was not covered by tests

override fun onChange(command: FlareUiMessage) {
browser.get()?.postChat(command)
}

Check warning on line 66 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#L66

Added line #L66 was not covered by tests
}
)
}

Check warning on line 69 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#L69

Added line #L69 was not covered by tests

val component = panel {
row {
Expand All @@ -78,12 +79,12 @@
row {
cell(
JButton("Show Web Debugger").apply {
addActionListener {

Check warning on line 82 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#L82

Added line #L82 was not covered by tests
// Code to be executed when the button is clicked
// Add your logic here

browser.get().jcefBrowser.openDevtools()
}

Check warning on line 87 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#L86-L87

Added lines #L86 - L87 were not covered by tests
},
)
.align(AlignX.CENTER)
Expand All @@ -100,107 +101,111 @@
} else {
webviewContainer.add(JBTextArea("JCEF not supported"))
}
browser.complete(null)

Check warning on line 104 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#L104

Added line #L104 was not covered by tests
} else {
val loadingPanel = JBLoadingPanel(null, this)
val wrapper = Wrapper()
loadingPanel.startLoading()

Check warning on line 108 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#L106-L108

Added lines #L106 - L108 were not covered by tests

webviewContainer.add(wrapper)
wrapper.setContent(loadingPanel)

Check warning on line 111 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#L110-L111

Added lines #L110 - L111 were not covered by tests

ApplicationManager.getApplication().executeOnPooledThread {
val webUri = runBlocking { service<ArtifactManager>().fetchArtifact(project).resolve("amazonq-ui.js").toUri() }
loadingPanel.stopLoading()
runInEdt {
scope.launch {
val webUri = service<ArtifactManager>().fetchArtifact(project).resolve("amazonq-ui.js").toUri()

Check warning on line 114 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#L113-L114

Added lines #L113 - L114 were not covered by tests
// wait for server to be running
AmazonQLspService.getInstance(project).instanceFlow.first()

Check warning on line 116 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#L116

Added line #L116 was not covered by tests

withContext(EDT) {
browser.complete(
Browser(this, webUri, project).also {
Browser(this@AmazonQPanel, webUri, project).also {
wrapper.setContent(it.component())

Check warning on line 121 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#L119-L121

Added lines #L119 - L121 were not covered by tests

initConnections()
connectUi(it)
connectApps(it)

Check warning on line 125 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#L123-L125

Added lines #L123 - L125 were not covered by tests

loadingPanel.stopLoading()
}

Check warning on line 128 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#L127-L128

Added lines #L127 - L128 were not covered by tests
)
}
}

Check warning on line 131 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#L130-L131

Added lines #L130 - L131 were not covered by tests
}
}

Check warning on line 133 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#L133

Added line #L133 was not covered by tests

fun sendMessage(message: AmazonQMessage, tabType: String) {
appConnections.filter { it.app.tabTypes.contains(tabType) }.forEach {
scope.launch {
it.messagesFromUiToApp.publish(message)

Check warning on line 138 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#L136-L138

Added lines #L136 - L138 were not covered by tests
}
}
}

fun sendMessageAppToUi(message: AmazonQMessage, tabType: String) {
appConnections.filter { it.app.tabTypes.contains(tabType) }.forEach {
scope.launch {
it.messagesFromAppToUi.publish(message)
}
}
}

Check warning on line 149 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#L144-L149

Added lines #L144 - L149 were not covered by tests

private fun initConnections() {
val apps = appSource.getApps(project)
apps.forEach { app ->
appConnections += AppConnection(
app = app,
messagesFromAppToUi = MessageConnector(),
messagesFromUiToApp = MessageConnector(),
messageTypeRegistry = MessageTypeRegistry(),

Check warning on line 158 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#L152-L158

Added lines #L152 - L158 were not covered by tests
)
}
}

Check warning on line 161 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#L160-L161

Added lines #L160 - L161 were not covered by tests

private fun connectApps(browser: Browser) {
val fqnWebviewAdapter = FqnWebviewAdapter(browser.jcefBrowser, browserConnector)

Check warning on line 164 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#L164

Added line #L164 was not covered by tests

appConnections.forEach { connection ->
val initContext = AmazonQAppInitContext(
project = project,
messagesFromAppToUi = connection.messagesFromAppToUi,
messagesFromUiToApp = connection.messagesFromUiToApp,
messageTypeRegistry = connection.messageTypeRegistry,
fqnWebviewAdapter = fqnWebviewAdapter,

Check warning on line 172 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#L166-L172

Added lines #L166 - L172 were not covered by tests
)
// Connect the app to the UI
connection.app.init(initContext)

Check warning on line 175 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#L175

Added line #L175 was not covered by tests
// Dispose of the app when the tool window is disposed.
Disposer.register(this, connection.app)
}
}

Check warning on line 179 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#L177-L179

Added lines #L177 - L179 were not covered by tests

private fun connectUi(browser: Browser) {
browser.init(
isCodeTransformAvailable = isCodeTransformAvailable(project),
isFeatureDevAvailable = isFeatureDevAvailable(project),
isCodeScanAvailable = isCodeScanAvailable(project),
isCodeTestAvailable = isCodeTestAvailable(project),
isDocAvailable = isDocAvailable(project),
highlightCommand = highlightCommand(),

Check warning on line 188 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#L182-L188

Added lines #L182 - L188 were not covered by tests
activeProfile = QRegionProfileManager.getInstance().takeIf { it.shouldDisplayProfileInfo(project) }?.activeProfile(project)
)

scope.launch {

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

Added line #L192 was not covered by tests
// Pipe messages from the UI to the relevant apps and vice versa
browserConnector.connect(
browser = browser,
connections = appConnections,

Check warning on line 196 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#L194-L196

Added lines #L194 - L196 were not covered by tests
)
}

Check warning on line 198 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#L198

Added line #L198 was not covered by tests

scope.launch {

Check warning on line 200 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#L200

Added line #L200 was not covered by tests
// Update the theme in the UI when the IDE theme changes
browserConnector.connectTheme(
chatBrowser = browser.jcefBrowser.cefBrowser,
themeSource = editorThemeAdapter.onThemeChange(),

Check warning on line 204 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#L202-L204

Added lines #L202 - L204 were not covered by tests
)
}
}

Check warning on line 207 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#L206-L207

Added lines #L206 - L207 were not covered by tests

override fun dispose() {
}

Check warning on line 210 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#L210

Added line #L210 was not covered by tests
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import com.intellij.ui.jcef.JBCefJSQuery
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
Expand All @@ -24,7 +23,7 @@
Displays the web view for the Amazon Q tool window
*/

class Browser(parent: Disposable, private val webUri: URI, val project: Project) : Disposable {

Check warning on line 26 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#L26

Added line #L26 was not covered by tests

val jcefBrowser = createBrowser(parent)

Expand All @@ -46,17 +45,16 @@
"mynah",
AssetResourceHandler.AssetResourceHandlerFactory(),
)
AmazonQLspService.getInstance(project).addLspInitializeMessageListener {
loadWebView(
isCodeTransformAvailable,
isFeatureDevAvailable,
isDocAvailable,
isCodeScanAvailable,
isCodeTestAvailable,
highlightCommand,
activeProfile
)
}

loadWebView(
isCodeTransformAvailable,
isFeatureDevAvailable,
isDocAvailable,
isCodeScanAvailable,
isCodeTestAvailable,
highlightCommand,
activeProfile

Check warning on line 56 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#L49-L56

Added lines #L49 - L56 were not covered by tests
)
}

override fun dispose() {
Expand All @@ -65,14 +63,14 @@

fun component() = jcefBrowser.component

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

Check warning on line 66 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#L66

Added line #L66 was not covered by tests

@Deprecated("shouldn't need this version")
fun postChat(message: String) {
jcefBrowser
.cefBrowser
.executeJavaScript("window.postMessage($message)", jcefBrowser.cefBrowser.url, 0)
}

Check warning on line 73 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#L72-L73

Added lines #L72 - L73 were not covered by tests

// Load the chat web app into the jcefBrowser
private fun loadWebView(
Expand Down Expand Up @@ -115,28 +113,28 @@
activeProfile: QRegionProfile?,
): String {
val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)")
val connectorAdapterPath = "http://mynah/js/connectorAdapter.js"
generateQuickActionConfig()

Check warning on line 117 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#L116-L117

Added lines #L116 - L117 were not covered by tests
// https://github.com/highlightjs/highlight.js/issues/1387
// language=HTML
val jsScripts = """
<script type="text/javascript" charset="UTF-8" src="$connectorAdapterPath"></script>
<script type="text/javascript" charset="UTF-8" src="$webUri" defer onload="init()"></script>

Check warning on line 122 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#L121-L122

Added lines #L121 - L122 were not covered by tests

<script type="text/javascript">

const init = () => {
const hybridChatConnector = connectorAdapter.initiateAdapter(
${MeetQSettings.getInstance().reinvent2024OnboardingCount < MAX_ONBOARDING_PAGE_COUNT},
${MeetQSettings.getInstance().disclaimerAcknowledged},
$isFeatureDevAvailable,
$isCodeTransformAvailable,
$isDocAvailable,
$isCodeScanAvailable,
$isCodeTestAvailable,

Check warning on line 134 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#L129-L134

Added lines #L129 - L134 were not covered by tests
{
postMessage: message => {
$postMessageToJavaJsCode

Check warning on line 137 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#L137

Added line #L137 was not covered by tests
}
},

Expand All @@ -151,24 +149,24 @@
{
agenticMode: true,
quickActionCommands: commands,
disclaimerAcknowledged: ${MeetQSettings.getInstance().disclaimerAcknowledged},

Check warning on line 152 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#L152

Added line #L152 was not covered by tests
pairProgrammingAcknowledged: ${!MeetQSettings.getInstance().amazonQChatPairProgramming}
},
hybridChatConnector,
${CodeWhispererFeatureConfigService.getInstance().getFeatureConfigJsonString()}

Check warning on line 156 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#L156

Added line #L156 was not covered by tests
);
}
</script>
""".trimIndent()

addQuickActionCommands(
isCodeTransformAvailable,
isFeatureDevAvailable,
isDocAvailable,
isCodeTestAvailable,
isCodeScanAvailable,
highlightCommand,
activeProfile

Check warning on line 169 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#L162-L169

Added lines #L162 - L169 were not covered by tests
)
return """
<!DOCTYPE html>
Expand Down Expand Up @@ -249,20 +247,20 @@
activeProfile: QRegionProfile?,
) {
// TODO: Remove this once chat has been integrated with agents. This is added temporarily to keep detekt happy.
isCodeScanAvailable
isCodeTestAvailable
isDocAvailable
isFeatureDevAvailable
isCodeTransformAvailable
MAX_ONBOARDING_PAGE_COUNT
OBJECT_MAPPER
highlightCommand
activeProfile
}

Check warning on line 259 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#L250-L259

Added lines #L250 - L259 were not covered by tests

private fun generateQuickActionConfig() = AwsServerCapabilitiesProvider.getInstance(project).getChatOptions().quickActions.quickActionsCommandGroups
.let { OBJECT_MAPPER.writeValueAsString(it) }
?: "[]"

Check warning on line 263 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#L262-L263

Added lines #L262 - L263 were not covered by tests

companion object {
private const val MAX_ONBOARDING_PAGE_COUNT = 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.project.Project
import com.intellij.ui.jcef.JBCefJSQuery.Response
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.coroutineScope
Expand Down Expand Up @@ -65,7 +66,6 @@
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatReadyNotification
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatUiMessageParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ConversationClickRequest
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardNotification
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams
Expand Down Expand Up @@ -114,7 +114,6 @@
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.ThemeBrowserAdapter
import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererConfigurable
import software.aws.toolkits.jetbrains.settings.MeetQSettings
import software.aws.toolkits.resources.AwsCoreBundle
import software.aws.toolkits.telemetry.MetricResult
import software.aws.toolkits.telemetry.Telemetry
import java.util.concurrent.CompletableFuture
Expand All @@ -123,10 +122,10 @@
class BrowserConnector(
private val serializer: MessageSerializer = MessageSerializer.getInstance(),
private val themeBrowserAdapter: ThemeBrowserAdapter = ThemeBrowserAdapter(),
private val project: Project,

Check warning on line 125 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#L125

Added line #L125 was not covered by tests
) {
var uiReady = CompletableDeferred<Boolean>()
private val chatCommunicationManager = ChatCommunicationManager.getInstance(project)

Check warning on line 128 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#L128

Added line #L128 was not covered by tests

suspend fun connect(
browser: Browser,
Expand All @@ -140,7 +139,7 @@
// this is sent when the named agents UI is ready
"ui-is-ready" -> {
uiReady.complete(true)
chatCommunicationManager.setUiReady()

Check warning on line 142 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#L142

Added line #L142 was not covered by tests
RunOnceUtil.runOnceForApp("AmazonQ-UI-Ready") {
MeetQSettings.getInstance().reinvent2024OnboardingCount += 1
}
Expand Down Expand Up @@ -172,15 +171,15 @@
}
}

val tabType = node.tabType

Check warning on line 174 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#L174

Added line #L174 was not covered by tests
if (tabType == null || tabType == "cwc") {
handleFlareChatMessages(browser, node)

Check warning on line 176 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#L176

Added line #L176 was not covered by tests
} else {
connections.filter { connection -> connection.app.tabTypes.contains(tabType) }.forEach { connection ->
launch {
val message = serializer.deserialize(node, connection.messageTypeRegistry)
connection.messagesFromUiToApp.publish(message)
}

Check warning on line 182 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#L178-L182

Added lines #L178 - L182 were not covered by tests
}
}
}
Expand All @@ -190,12 +189,12 @@
uiReady.await()

// Chat options including history and quick actions need to be sent in once UI is ready
val showChatOptions = """{

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

Added line #L192 was not covered by tests
"command": "chatOptions",
"params": ${Gson().toJson(AwsServerCapabilitiesProvider.getInstance(project).getChatOptions())}

Check warning on line 194 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#L194

Added line #L194 was not covered by tests
}
""".trimIndent()
browser.postChat(showChatOptions)

Check warning on line 197 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#L196-L197

Added lines #L196 - L197 were not covered by tests

// Send inbound messages to the browser
val inboundMessages = connections.map { it.messagesFromAppToUi.flow }.merge()
Expand Down Expand Up @@ -232,266 +231,250 @@
private fun handleFlareChatMessages(browser: Browser, node: JsonNode) {
when (node.command) {
SEND_CHAT_COMMAND_PROMPT -> {
val requestFromUi = serializer.deserializeChatMessages<SendChatPromptRequest>(node)
val chatPrompt = ChatPrompt(
requestFromUi.params.prompt.prompt,
requestFromUi.params.prompt.escapedPrompt,
node.command

Check warning on line 238 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#L234-L238

Added lines #L234 - L238 were not covered by tests
)
val editor = FileEditorManager.getInstance(project).selectedTextEditor

Check warning on line 240 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#L240

Added line #L240 was not covered by tests
val textDocumentIdentifier = editor?.let { TextDocumentIdentifier(toUriString(it.virtualFile)) }
val cursorState = editor?.let { LspEditorUtil.getCursorState(it) }

val chatParams = ChatParams(
requestFromUi.params.tabId,
chatPrompt,
textDocumentIdentifier,
cursorState,
context = requestFromUi.params.context

Check warning on line 249 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#L244-L249

Added lines #L244 - L249 were not covered by tests
)

val tabId = requestFromUi.params.tabId
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)

Check warning on line 253 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#L252-L253

Added lines #L252 - L253 were not covered by tests

var encryptionManager: JwtEncryptionManager? = null

Check warning on line 255 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#L255

Added line #L255 was not covered by tests
val result = AmazonQLspService.executeIfRunning(project) { server ->
encryptionManager = this.encryptionManager

Check warning on line 257 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#L257

Added line #L257 was not covered by tests

val encryptedParams = EncryptedChatParams(this.encryptionManager.encrypt(chatParams), partialResultToken)
server.sendChatPrompt(encryptedParams)
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

Check warning on line 261 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-L261

Added lines #L259 - L261 were not covered by tests

// We assume there is only one outgoing request per tab because the input is
// blocked when there is an outgoing request
chatCommunicationManager.setInflightRequestForTab(tabId, result)
showResult(result, partialResultToken, tabId, encryptionManager, browser)

Check warning on line 266 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#L265-L266

Added lines #L265 - L266 were not covered by tests
}
CHAT_QUICK_ACTION -> {
val requestFromUi = serializer.deserializeChatMessages<QuickChatActionRequest>(node)
val tabId = requestFromUi.params.tabId
val quickActionParams = requestFromUi.params
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)
var encryptionManager: JwtEncryptionManager? = null

Check warning on line 273 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#L269-L273

Added lines #L269 - L273 were not covered by tests
val result = AmazonQLspService.executeIfRunning(project) { server ->
encryptionManager = this.encryptionManager

Check warning on line 275 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#L275

Added line #L275 was not covered by tests

val encryptedParams = EncryptedQuickActionChatParams(this.encryptionManager.encrypt(quickActionParams), partialResultToken)
server.sendQuickAction(encryptedParams)
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

Check warning on line 279 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-L279

Added lines #L277 - L279 were not covered by tests

// We assume there is only one outgoing request per tab because the input is
// blocked when there is an outgoing request
chatCommunicationManager.setInflightRequestForTab(tabId, result)

Check warning on line 283 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#L283

Added line #L283 was not covered by tests

showResult(result, partialResultToken, tabId, encryptionManager, browser)

Check warning on line 285 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#L285

Added line #L285 was not covered by tests
}
CHAT_LIST_CONVERSATIONS -> {
val requestFromUi = serializer.deserializeChatMessages<ListConversationsRequest>(node)

Check warning on line 288 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#L288

Added line #L288 was not covered by tests
val result = AmazonQLspService.executeIfRunning(project) { server ->
server.listConversations(requestFromUi.params)
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

Check warning on line 291 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#L290-L291

Added lines #L290 - L291 were not covered by tests

result.whenComplete { response, _ ->
val uiMessage = """

Check warning on line 294 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#L293-L294

Added lines #L293 - L294 were not covered by tests
{
"command": "$CHAT_LIST_CONVERSATIONS",
"params": ${Gson().toJson(response)}

Check warning on line 297 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#L297

Added line #L297 was not covered by tests
}
""".trimIndent()
browser.postChat(uiMessage)
}

Check warning on line 301 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#L299-L301

Added lines #L299 - L301 were not covered by tests
}
CHAT_CONVERSATION_CLICK -> {
val requestFromUi = serializer.deserializeChatMessages<ConversationClickRequest>(node)

Check warning on line 304 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#L304

Added line #L304 was not covered by tests
val result = AmazonQLspService.executeIfRunning(project) { server ->
server.conversationClick(requestFromUi.params)
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

Check warning on line 307 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#L306-L307

Added lines #L306 - L307 were not covered by tests

result.whenComplete { response, _ ->
val uiMessage = """

Check warning on line 310 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#L309-L310

Added lines #L309 - L310 were not covered by tests
{
"command": "$CHAT_CONVERSATION_CLICK",
"params": ${Gson().toJson(response)}

Check warning on line 313 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#L313

Added line #L313 was not covered by tests
}
""".trimIndent()
browser.postChat(uiMessage)
}

Check warning on line 317 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#L315-L317

Added lines #L315 - L317 were not covered by tests
}
CHAT_FEEDBACK -> {
handleChatNotification<FeedbackNotification, FeedbackParams>(node) { server, params ->

Check warning on line 320 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#L320

Added line #L320 was not covered by tests
server.feedback(params)
}
}
CHAT_READY -> {
handleChatNotification<ChatReadyNotification, Unit>(node) { server, _ ->

Check warning on line 325 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#L325

Added line #L325 was not covered by tests
uiReady.complete(true)
chatCommunicationManager.setUiReady()
RunOnceUtil.runOnceForApp("AmazonQ-UI-Ready") {
MeetQSettings.getInstance().reinvent2024OnboardingCount += 1
}

Check warning on line 330 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#L329-L330

Added lines #L329 - L330 were not covered by tests
server.chatReady()
}
}
CHAT_TAB_ADD -> {
handleChatNotification<TabEventRequest, TabEventParams>(node) { server, params ->

Check warning on line 335 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#L335

Added line #L335 was not covered by tests
server.tabAdd(params)
}
}
CHAT_TAB_REMOVE -> {
handleChatNotification<TabEventRequest, TabEventParams>(node) { server, params ->

Check warning on line 340 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#L340

Added line #L340 was not covered by tests
chatCommunicationManager.removePartialChatMessage(params.tabId)
cancelInflightRequests(params.tabId)
server.tabRemove(params)
}
}
CHAT_TAB_CHANGE -> {
handleChatNotification<TabEventRequest, TabEventParams>(node) { server, params ->

Check warning on line 347 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#L347

Added line #L347 was not covered by tests
server.tabChange(params)
}
}
CHAT_OPEN_TAB -> {
val response = serializer.deserializeChatMessages<OpenTabResponse>(node)
chatCommunicationManager.completeTabOpen(
response.requestId,
response.params.result.tabId

Check warning on line 355 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#L352-L355

Added lines #L352 - L355 were not covered by tests
)
}
CHAT_INSERT_TO_CURSOR -> {
handleChatNotification<InsertToCursorPositionNotification, InsertToCursorPositionParams>(node) { server, params ->

Check warning on line 359 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#L359

Added line #L359 was not covered by tests
server.insertToCursorPosition(params)
}
}
CHAT_LINK_CLICK -> {
handleChatNotification<LinkClickNotification, LinkClickParams>(node) { server, params ->

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
server.linkClick(params)
}
}
CHAT_INFO_LINK_CLICK -> {
handleChatNotification<InfoLinkClickNotification, InfoLinkClickParams>(node) { server, params ->

Check warning on line 369 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#L369

Added line #L369 was not covered by tests
server.infoLinkClick(params)
}
}
CHAT_SOURCE_LINK_CLICK -> {
handleChatNotification<SourceLinkClickNotification, SourceLinkClickParams>(node) { server, params ->

Check warning on line 374 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#L374

Added line #L374 was not covered by tests
server.sourceLinkClick(params)
}
}
CHAT_FILE_CLICK -> {
handleChatNotification<FileClickNotification, FileClickParams>(node) { server, params ->

Check warning on line 379 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#L379

Added line #L379 was not covered by tests
server.fileClick(params)
}
}
PROMPT_INPUT_OPTIONS_CHANGE -> {
handleChatNotification<PromptInputOptionChangeNotification, PromptInputOptionChangeParams>(node) {

Check warning on line 384 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#L384

Added line #L384 was not covered by tests
server, params ->
server.promptInputOptionsChange(params)
}
}
CHAT_PROMPT_OPTION_ACKNOWLEDGED -> {
val acknowledgedMessage = node.get("params").get("messageId")

Check warning on line 390 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#L390

Added line #L390 was not covered by tests
if (acknowledgedMessage.asText() == "programmerModeCardId") {
MeetQSettings.getInstance().amazonQChatPairProgramming = false

Check warning on line 392 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#L392

Added line #L392 was not covered by tests
}
}
CHAT_FOLLOW_UP_CLICK -> {
handleChatNotification<FollowUpClickNotification, FollowUpClickParams>(node) { server, params ->

Check warning on line 396 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#L396

Added line #L396 was not covered by tests
server.followUpClick(params)
}
}
CHAT_BUTTON_CLICK -> {
handleChatNotification<ButtonClickNotification, ButtonClickParams>(node) { server, params ->

Check warning on line 401 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#L401

Added line #L401 was not covered by tests
server.buttonClick(params)
}.thenApply { response ->

Check warning on line 403 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#L403

Added line #L403 was not covered by tests
if (response is ButtonClickResult && !response.success) {
LOG.warn { "Failed to execute action associated with button with reason: ${response.failureReason}" }

Check warning on line 405 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#L405

Added line #L405 was not covered by tests
}
}

Check warning on line 407 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#L407

Added line #L407 was not covered by tests
}
AUTH_FOLLOW_UP_CLICKED -> {
val message = serializer.deserializeChatMessages<AuthFollowUpClickNotification>(node)
chatCommunicationManager.handleAuthFollowUpClicked(
project,
message.params

Check warning on line 413 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#L410-L413

Added lines #L410 - L413 were not covered by tests
)
}
CHAT_COPY_CODE_TO_CLIPBOARD -> {
handleChatNotification<CopyCodeToClipboardNotification, CopyCodeToClipboardParams>(node) { server, params ->

Check warning on line 417 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#L417

Added line #L417 was not covered by tests
server.copyCodeToClipboard(params)
}
}

GET_SERIALIZED_CHAT_REQUEST_METHOD -> {
val response = serializer.deserializeChatMessages<GetSerializedChatResponse>(node)
chatCommunicationManager.completeSerializedChatResponse(
response.requestId,
response.params.result.content

Check warning on line 426 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#L423-L426

Added lines #L423 - L426 were not covered by tests
)
}

CHAT_TAB_BAR_ACTIONS -> {
handleChatNotification<TabBarActionRequest, TabBarActionParams>(node) {

Check warning on line 431 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#L431

Added line #L431 was not covered by tests
server, params ->
val result = server.tabBarActions(params)
result.whenComplete { actions, error ->
try {

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
if (error != null) {
throw error

Check warning on line 437 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#L437

Added line #L437 was not covered by tests
}

browser.postChat(
FlareUiMessage(
command = CHAT_TAB_BAR_ACTIONS,

Check warning on line 442 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#L440-L442

Added lines #L440 - L442 were not covered by tests
params = actions ?: emptyMap<Any, Any>()
)
)
} catch (e: Exception) {
LOG.error { "Failed to perform chat tab bar action $e" }

Check warning on line 447 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#L446-L447

Added lines #L446 - L447 were not covered by tests
params.tabId?.let {
browser.postChat(chatCommunicationManager.getErrorUiMessage(it, e, null))
}

Check warning on line 450 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#L449-L450

Added lines #L449 - L450 were not covered by tests
}
}

Check warning on line 452 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#L452

Added line #L452 was not covered by tests
}
}
CHAT_CREATE_PROMPT -> {
handleChatNotification<CreatePromptNotification, CreatePromptParams>(node) {

Check warning on line 456 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#L456

Added line #L456 was not covered by tests
server, params ->
server.createPrompt(params)
}
}
STOP_CHAT_RESPONSE -> {
val stopResponseRequest = serializer.deserializeChatMessages<StopResponseMessage>(node)

Check warning on line 462 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#L462

Added line #L462 was not covered by tests
if (!chatCommunicationManager.hasInflightRequest(stopResponseRequest.params.tabId)) {
return

Check warning on line 464 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#L464

Added line #L464 was not covered by tests
}
cancelInflightRequests(stopResponseRequest.params.tabId)
chatCommunicationManager.removePartialChatMessage(stopResponseRequest.params.tabId)

Check warning on line 467 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#L466-L467

Added lines #L466 - L467 were not covered by tests

val paramsJson = Gson().toJson(
// https://github.com/aws/language-servers/blob/1c0d88806087125b6fc561f610cc15e98127c6bf/server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts#L403
ChatUiMessageParams(
title = AwsCoreBundle.message("amazonqChat.stopChatResponse"),
body = ""
)
)

val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat(
command = SEND_CHAT_COMMAND_PROMPT,
tabId = stopResponseRequest.params.tabId,
params = paramsJson.toString(),
isPartialResult = false
)
browser.postChat(uiMessage)
}
OPEN_SETTINGS -> {
val openSettingsNotification = serializer.deserializeChatMessages<OpenSettingsNotification>(node)

Check warning on line 470 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#L470

Added line #L470 was not covered by tests
if (openSettingsNotification.params.settingKey != OPEN_WORKSPACE_SETTINGS_KEY) return
runInEdt {
ShowSettingsUtil.getInstance().showSettingsDialog(browser.project, CodeWhispererConfigurable::class.java)
}

Check warning on line 474 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#L472-L474

Added lines #L472 - L474 were not covered by tests
}
}
}

Check warning on line 477 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#L477

Added line #L477 was not covered by tests

private fun showResult(
result: CompletableFuture<String>,
Expand All @@ -500,33 +483,35 @@
encryptionManager: JwtEncryptionManager?,
browser: Browser,
) {
result.whenComplete { value, error ->
try {

Check warning on line 487 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#L486-L487

Added lines #L486 - L487 were not covered by tests
if (error != null) {
throw error

Check warning on line 489 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#L489

Added line #L489 was not covered by tests
}
chatCommunicationManager.removePartialChatMessage(partialResultToken)
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
SEND_CHAT_COMMAND_PROMPT,
tabId,

Check warning on line 494 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#L491-L494

Added lines #L491 - L494 were not covered by tests
encryptionManager?.decrypt(value).orEmpty(),
isPartialResult = false

Check warning on line 496 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#L496

Added line #L496 was not covered by tests
)
browser.postChat(messageToChat)
chatCommunicationManager.removeInflightRequestForTab(tabId)
} catch (e: CancellationException) {
LOG.warn { "Cancelled chat generation" }
} catch (e: Exception) {
LOG.error { "Failed to send chat message $e" }
browser.postChat(chatCommunicationManager.getErrorUiMessage(tabId, e, partialResultToken))

Check warning on line 504 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#L498-L504

Added lines #L498 - L504 were not covered by tests
}
}
}

Check warning on line 507 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#L506-L507

Added lines #L506 - L507 were not covered by tests

private fun cancelInflightRequests(tabId: String) {
chatCommunicationManager.getInflightRequestForTab(tabId)?.let { request ->
request.cancel(true)
chatCommunicationManager.removeInflightRequestForTab(tabId)
}
}

Check warning on line 514 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#L511-L514

Added lines #L511 - L514 were not covered by tests

private inline fun <reified T, R> handleChatNotification(
node: JsonNode,
Expand All @@ -534,11 +519,11 @@
): CompletableFuture<*> where T : ChatNotification<R> {
val requestFromUi = serializer.deserializeChatMessages<T>(node)
return AmazonQLspService.executeIfRunning(project) { server ->
serverAction(server, requestFromUi.params)

Check warning on line 522 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#L522

Added line #L522 was not covered by tests
} ?: CompletableFuture.failedFuture<Unit>(IllegalStateException("LSP Server not running"))
}

companion object {
private val LOG = getLogger<BrowserConnector>()

Check warning on line 527 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#L527

Added line #L527 was not covered by tests
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.future.asCompletableFuture
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
Expand Down Expand Up @@ -75,7 +79,6 @@
import java.net.URI
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.util.Collections
import java.util.concurrent.Future
import kotlin.time.Duration.Companion.seconds

Expand Down Expand Up @@ -114,15 +117,14 @@

@Service(Service.Level.PROJECT)
class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable {
private val lspInitializedMessageReceivedListener = Collections.synchronizedList(mutableListOf<AmazonQInitializeMessageReceivedListener>())
fun addLspInitializeMessageListener(listener: AmazonQInitializeMessageReceivedListener) = lspInitializedMessageReceivedListener.add(listener)
fun notifyInitializeMessageReceived() = lspInitializedMessageReceivedListener.forEach { it() }
private val _flowInstance = MutableSharedFlow<AmazonQServerInstance>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
val instanceFlow = _flowInstance.asSharedFlow().map { it.languageServer }

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L120 - L121 were not covered by tests

private var instance: Deferred<AmazonQServerInstance>
val capabilities
get() = instance.getCompleted().initializeResult.getCompleted().capabilities
val encryptionManager
get() = instance.getCompleted().encryptionManager

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L127 was not covered by tests

// dont allow lsp commands if server is restarting
private val mutex = Mutex(false)
Expand All @@ -140,7 +142,9 @@
// wait for handshake to complete
instance.initializeResult.join()

instance
instance.also {
_flowInstance.emit(it)
}

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L145 - L147 were not covered by tests
}
} catch (e: Exception) {
LOG.warn(e) { "Failed to start LSP server" }
Expand Down Expand Up @@ -213,7 +217,7 @@
}

private class AmazonQServerInstance(private val project: Project, private val cs: CoroutineScope) : Disposable {
val encryptionManager = JwtEncryptionManager()

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L220 was not covered by tests

private val launcher: Launcher<AmazonQLanguageServer>

Expand Down Expand Up @@ -268,18 +272,18 @@

init {
// will cause slow service init, but maybe fine for now. will not block UI since fetch/extract will be under background progress
val artifact = runBlocking { service<ArtifactManager>().fetchArtifact(project) }.toAbsolutePath()

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L275 was not covered by tests

// more network calls
// make assumption that all requests will resolve to the same CA
// also terrible assumption that default endpoint is reachable
val qUri = URI(QDefaultServiceConfig.ENDPOINT)
val rtsTrustChain = TrustChainUtil.getTrustChain(qUri)
val extraCaCerts = Files.createTempFile("q-extra-ca", ".pem").apply {
writeText(
TrustChainUtil.certsToPem(rtsTrustChain)

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L280 - L284 were not covered by tests
)
}

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L286 was not covered by tests

val node = if (SystemInfo.isWindows) "node.exe" else "node"
val cmd = GeneralCommandLine(
Expand All @@ -287,31 +291,31 @@
LspSettings.getInstance().getArtifactPath() ?: artifact.resolve("aws-lsp-codewhisperer.js").toString(),
"--stdio",
"--set-credentials-encryption-key",
).withEnvironment(
buildMap {
put("NODE_EXTRA_CA_CERTS", extraCaCerts.toAbsolutePath().toString())

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L294 - L296 were not covered by tests

val proxy = JdkProxyProvider.getInstance().proxySelector.select(qUri)

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L298 was not covered by tests
// log if only socks proxy available
.firstOrNull { it.type() == Proxy.Type.HTTP }

if (proxy != null) {
val address = proxy.address()

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L303 was not covered by tests
if (address is java.net.InetSocketAddress) {
put(
"HTTPS_PROXY",
URIBuilder("http://${address.hostName}:${address.port}").apply {
val login = HttpConfigurable.getInstance().proxyLogin

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L305 - L308 were not covered by tests
if (login != null) {
setUserInfo(login, HttpConfigurable.getInstance().plainProxyPassword)

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L310 was not covered by tests
}
}.build().toASCIIString()

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L312 was not covered by tests
)
}
}
}

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L316 was not covered by tests
)
.withParentEnvironmentType(GeneralCommandLine.ParentEnvironmentType.CONSOLE)

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L318 was not covered by tests

launcherHandler = KillableColoredProcessHandler.Silent(cmd)
val inputWrapper = LSPProcessListener()
Expand All @@ -319,15 +323,14 @@
launcherHandler.startNotify()

launcher = LSPLauncher.Builder<AmazonQLanguageServer>()
.wrapMessages { consumer ->
MessageConsumer { message ->

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L326 - L327 were not covered by tests
if (message is ResponseMessage && message.result is AwsExtendedInitializeResult) {
val result = message.result as AwsExtendedInitializeResult
AwsServerCapabilitiesProvider.getInstance(project).setAwsServerCapabilities(result.getAwsServerCapabilities())

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

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L329 - L330 were not covered by tests
AmazonQLspService.getInstance(project).notifyInitializeMessageReceived()
}
consumer?.consume(message)
}

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L333 was not covered by tests
}
.setLocalService(AmazonQLanguageClientImpl(project))
.setRemoteInterface(AmazonQLanguageServer::class.java)
Expand All @@ -337,7 +340,7 @@

// otherwise Gson treats all numbers as double which causes deser issues
it.setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
it.registerTypeAdapterFactory(AmazonQLspTypeAdapterFactory())

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L343 was not covered by tests
}.traceMessages(
PrintWriter(
object : StringWriter() {
Expand All @@ -361,7 +364,7 @@
encryptionManager.writeInitializationPayload(launcherHandler.process.outputStream)

val initializeResult = try {
languageServer.initialize(createInitializeParams()).await()

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L367 was not covered by tests
} catch (e: Exception) {
LOG.warn(e) { "LSP initialization failed" }
null
Expand All @@ -378,7 +381,7 @@
}

// invokeOnCompletion results in weird lock/timeout error
initializeResult.asCompletableFuture().handleAsync { lspInitResult, ex ->

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L384 was not covered by tests
if (ex != null) {
return@handleAsync
}
Expand All @@ -386,7 +389,7 @@
[email protected] {
DefaultAuthCredentialsService(project, encryptionManager, this)
TextDocumentServiceHandler(project, this)
WorkspaceServiceHandler(project, lspInitResult, this)

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L392 was not covered by tests
DefaultModuleDependenciesService(project, this)
}
}
Expand All @@ -412,4 +415,4 @@
}
}

typealias AmazonQInitializeMessageReceivedListener = () -> Unit

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

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused symbol

Type alias "AmazonQInitializeMessageReceivedListener" is never used
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,18 @@ class TextDocumentServiceHandler(
}
AmazonQLspService.executeIfRunning(project) { languageServer ->
toUriString(file)?.let { uri ->
languageServer.textDocumentService.didOpen(
DidOpenTextDocumentParams().apply {
textDocument = TextDocumentItem().apply {
this.uri = uri
text = file.inputStream.readAllBytes().decodeToString()
languageId = file.fileType.name.lowercase()
version = file.modificationStamp.toInt()
pluginAwareExecuteOnPooledThread {
languageServer.textDocumentService.didOpen(
DidOpenTextDocumentParams().apply {
textDocument = TextDocumentItem().apply {
this.uri = uri
text = file.inputStream.readAllBytes().decodeToString()
languageId = file.fileType.name.lowercase()
version = file.modificationStamp.toInt()
}
}
}
)
)
}
}
}
}
Expand All @@ -95,14 +97,16 @@ class TextDocumentServiceHandler(
AmazonQLspService.executeIfRunning(project) { languageServer ->
val file = FileDocumentManager.getInstance().getFile(document) ?: return@executeIfRunning
toUriString(file)?.let { uri ->
languageServer.textDocumentService.didSave(
DidSaveTextDocumentParams().apply {
textDocument = TextDocumentIdentifier().apply {
this.uri = uri
pluginAwareExecuteOnPooledThread {
languageServer.textDocumentService.didSave(
DidSaveTextDocumentParams().apply {
textDocument = TextDocumentIdentifier().apply {
this.uri = uri
}
text = document.text
}
text = document.text
}
)
)
}
}
}
}
Expand Down
Loading
Loading