Skip to content

feat(amazonq): Add quick actions to Flare chat #5561

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
Apr 21, 2025
Merged
Show file tree
Hide file tree
Changes from 17 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 @@ -20,7 +20,7 @@

class MessageSerializer @VisibleForTesting constructor() {

private val objectMapper = jacksonObjectMapper()
val objectMapper = jacksonObjectMapper()

Check warning on line 23 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/commands/MessageSerializer.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/commands/MessageSerializer.kt#L23

Added line #L23 was not covered by tests

Check notice

Code scanning / QDJVMC

Function or property has platform type Note

Declaration has type inferred from a platform call, which can lead to unchecked nullability issues. Specify type explicitly as nullable or non-nullable.
.registerModule(JavaTimeModule())
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS)
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
Expand All @@ -37,8 +37,8 @@

fun serialize(value: Any): String = objectMapper.writeValueAsString(value)

fun <T> deserializeChatMessages(value: JsonNode, clazz: Class<T>): T =
objectMapper.treeToValue(value, clazz)
inline fun <reified T> deserializeChatMessages(value: JsonNode): T =
objectMapper.treeToValue<T>(value)

// Provide singleton global access
companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runInEdt
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.ui.components.JBLoadingPanel
import com.intellij.ui.components.JBPanelWithEmptyText
Expand All @@ -24,7 +25,7 @@
import java.util.concurrent.CompletableFuture
import javax.swing.JButton

class AmazonQPanel(private val parent: Disposable) {
class AmazonQPanel(private val parent: Disposable, val project: Project) {

Check warning on line 28 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#L28

Added line #L28 was not covered by tests
private val webviewContainer = Wrapper()
val browser = CompletableFuture<Browser>()

Expand Down Expand Up @@ -91,7 +92,7 @@
loadingPanel.stopLoading()
runInEdt {
browser.complete(
Browser(parent, webUri).also {
Browser(parent, webUri, project).also {

Check warning on line 95 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#L95

Added line #L95 was not covered by tests
wrapper.setContent(it.component())
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
private val browserConnector = BrowserConnector(project = project)
private val editorThemeAdapter = EditorThemeAdapter()

private val chatPanel = AmazonQPanel(parent = this)
private val chatPanel = AmazonQPanel(parent = this, project)

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L52 was not covered by tests

val component: JComponent = chatPanel.component

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.ui.jcef.JBCefJSQuery
import org.cef.CefApp
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.profile.QRegionProfile
import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
Expand All @@ -17,7 +20,8 @@
/*
Displays the web view for the Amazon Q tool window
*/
class Browser(parent: Disposable, private val webUri: URI) : Disposable {

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

Check warning on line 24 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#L24

Added line #L24 was not covered by tests

val jcefBrowser = createBrowser(parent)

Expand All @@ -39,8 +43,17 @@
"mynah",
AssetResourceHandler.AssetResourceHandlerFactory(),
)

loadWebView(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand, activeProfile)
AmazonQLspService.getInstance(project).addLspInitializeMessageListener {
loadWebView(
isCodeTransformAvailable,
isFeatureDevAvailable,
isDocAvailable,
isCodeScanAvailable,
isCodeTestAvailable,
highlightCommand,
activeProfile

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

Added lines #L46 - L54 were not covered by tests
)
}

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#L56

Added line #L56 was not covered by tests
}

override fun dispose() {
Expand Down Expand Up @@ -101,6 +114,7 @@
highlightCommand: HighlightCommand?,
activeProfile: QRegionProfile?,
): String {
val quickActionConfig = 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#L117

Added line #L117 was not covered by tests
val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)")
val jsScripts = """
<script type="text/javascript" src="$webUri" defer onload="init()"></script>
Expand All @@ -113,7 +127,7 @@
}
},
{
quickActionCommands: [],
quickActionCommands: $quickActionConfig,

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

Added line #L130 was not covered by tests
disclaimerAcknowledged: ${MeetQSettings.getInstance().disclaimerAcknowledged}
}
);
Expand Down Expand Up @@ -220,6 +234,10 @@
activeProfile
}

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

Check warning on line 239 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#L238-L239

Added lines #L238 - L239 were not covered by tests

companion object {
private const val MAX_ONBOARDING_PAGE_COUNT = 3
private val OBJECT_MAPPER = jacksonObjectMapper()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.future.await

Check warning

Code scanning / QDJVMC

Unused import directive Warning

Unused import directive
import kotlinx.coroutines.launch
import org.cef.browser.CefBrowser
import org.eclipse.lsp4j.Position
Expand All @@ -27,10 +28,13 @@
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
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.CursorState
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest
import software.aws.toolkits.jetbrains.services.amazonq.util.command
Expand Down Expand Up @@ -147,7 +151,7 @@
private fun handleFlareChatMessages(browser: Browser, node: JsonNode) {
when (node.command) {
SEND_CHAT_COMMAND_PROMPT -> {
val requestFromUi = serializer.deserializeChatMessages(node, SendChatPromptRequest::class.java)
val requestFromUi = serializer.deserializeChatMessages<SendChatPromptRequest>(node)

Check warning on line 154 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#L154

Added line #L154 was not covered by tests
val chatPrompt = ChatPrompt(
requestFromUi.params.prompt.prompt,
requestFromUi.params.prompt.escapedPrompt,
Expand All @@ -167,32 +171,59 @@
)
)

val partialResultToken = chatCommunicationManager.addPartialChatMessage(requestFromUi.params.tabId)
val chatParams = ChatParams(
requestFromUi.params.tabId,
chatPrompt,
textDocumentIdentifier,
cursorState
)

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

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#L181-L182

Added lines #L181 - L182 were not covered by tests

var encryptionManager: JwtEncryptionManager? = null
val result = AmazonQLspService.executeIfRunning(project) { server ->
encryptionManager = this.encryptionManager
encryptionManager?.encrypt(chatParams)?.let { EncryptedChatParams(it, partialResultToken) }?.let { server.sendChatPrompt(it) }
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
showResult(result, partialResultToken, tabId, encryptionManager, browser)

Check warning on line 189 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#L189

Added line #L189 was 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 196 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-L196

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

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

Added line #L198 was not covered by tests
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if we are extracting the encryptionManager, we might as well capture the server instance so that we don't need to fetch it on every invocation

encryptionManager?.encrypt(quickActionParams)?.let {
EncryptedQuickActionChatParams(it, partialResultToken)
}?.let {
server.sendQuickAction(it)
}
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))

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

Added lines #L200 - L204 were not covered by tests

result.whenComplete {
value, error ->
chatCommunicationManager.removePartialChatMessage(partialResultToken)
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
node.command,
requestFromUi.params.tabId,
encryptionManager?.decrypt(value).orEmpty(),
isPartialResult = false
)
browser.postChat(messageToChat)
}
showResult(result, partialResultToken, tabId, encryptionManager, browser)

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

Added line #L206 was not covered by tests
}
}
}

private fun showResult(
result: CompletableFuture<String>,
partialResultToken: String,
tabId: String,
encryptionManager: JwtEncryptionManager?,
browser: Browser,
) {
result.whenComplete { value, error ->
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to handle error

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chatCommunicationManager.removePartialChatMessage(partialResultToken)
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
SEND_CHAT_COMMAND_PROMPT,
tabId,

Check warning on line 222 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#L218-L222

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

Check warning on line 224 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#L224

Added line #L224 was not covered by tests
)
browser.postChat(messageToChat)
}
}

Check warning on line 228 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#L226-L228

Added lines #L226 - L228 were not covered by tests
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
import org.eclipse.lsp4j.services.LanguageServer
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.GetConfigurationFromServerParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams
import java.util.concurrent.CompletableFuture
Expand All @@ -31,6 +34,9 @@ interface AmazonQLanguageServer : LanguageServer {
@JsonRequest("aws/getConfigurationFromServer")
fun getConfigurationFromServer(params: GetConfigurationFromServerParams): CompletableFuture<LspServerConfigurations>

@JsonRequest("aws/chat/sendChatPrompt")
@JsonRequest(SEND_CHAT_COMMAND_PROMPT)
fun sendChatPrompt(params: EncryptedChatParams): CompletableFuture<String>

@JsonRequest(CHAT_QUICK_ACTION)
fun sendQuickAction(params: EncryptedQuickActionChatParams): CompletableFuture<String>
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.SystemInfo
import com.intellij.util.animation.consumer

Check warning

Code scanning / QDJVMC

Unused import directive Warning

Unused import directive
import com.intellij.util.io.await
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
Expand All @@ -40,6 +41,10 @@
import org.eclipse.lsp4j.TextDocumentClientCapabilities
import org.eclipse.lsp4j.WorkspaceClientCapabilities
import org.eclipse.lsp4j.jsonrpc.Launcher
import org.eclipse.lsp4j.jsonrpc.Launcher.Builder

Check warning

Code scanning / QDJVMC

Unused import directive Warning

Unused import directive
import org.eclipse.lsp4j.jsonrpc.MessageConsumer
import org.eclipse.lsp4j.jsonrpc.messages.Message
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
import org.eclipse.lsp4j.launch.LSPLauncher
import org.slf4j.event.Level
import software.aws.toolkits.core.utils.getLogger
Expand All @@ -50,6 +55,9 @@
import software.aws.toolkits.jetbrains.services.amazonq.lsp.auth.DefaultAuthCredentialsService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.DefaultModuleDependenciesService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AmazonQLspTypeAdapterFactory
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsExtendedInitializeResult
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata
import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDocumentServiceHandler
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders
Expand Down Expand Up @@ -101,6 +109,10 @@

@Service(Service.Level.PROJECT)
class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable {
private val lspInitializedMessageReceivedListener = mutableListOf<AmazonQInitializeMessageReceivedListener>()
fun addLspInitializeMessageListener(listener: AmazonQInitializeMessageReceivedListener) = lspInitializedMessageReceivedListener.add(listener)
fun notifyInitializeMessageReceived() = lspInitializedMessageReceivedListener.forEach { it() }

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

Added lines #L112 - L114 were not covered by tests

private var instance: Deferred<AmazonQServerInstance>
val capabilities
get() = instance.getCompleted().initializeResult.getCompleted().capabilities
Expand Down Expand Up @@ -266,6 +278,17 @@
launcherHandler.startNotify()

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

Check warning on line 282 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#L281-L282

Added lines #L281 - L282 were not covered by tests
message ->
if (message is ResponseMessage && message.result is AwsExtendedInitializeResult) {
val result = message.result as AwsExtendedInitializeResult
AwsServerCapabilitiesProvider.getInstance(project).setAwsServerCapabilities(result.getAwsServerCapabilities())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we already expose capabilities on the service

AmazonQLspServer.getInstance(project).capabilities.serverCapabilities

?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Want to keep this in place to be able to access other agents potentially from this map

AmazonQLspService.getInstance(project).notifyInitializeMessageReceived()

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

Added lines #L285 - L287 were not covered by tests
}
consumer?.consume(message)
}

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

Added line #L290 was not covered by tests
}
.setLocalService(AmazonQLanguageClientImpl(project))
.setRemoteInterface(AmazonQLanguageServer::class.java)
.configureGson {
Expand All @@ -274,6 +297,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 300 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#L300

Added line #L300 was not covered by tests
}.traceMessages(
PrintWriter(
object : StringWriter() {
Expand Down Expand Up @@ -348,7 +372,21 @@
}
}

class MessageTracer {

Check warning on line 375 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#L375

Added line #L375 was not covered by tests

Check warning

Code scanning / QDJVMC

Unused symbol Warning

Class "MessageTracer" is never used
private val traceLogger = LOG.atLevel(if (isDeveloperMode()) Level.INFO else Level.DEBUG)

fun trace(direction: String, message: Message) {

Check warning

Code scanning / QDJVMC

Unused symbol Warning

Function "trace" is never used
traceLogger.log {
buildString {
append("$direction: ")
append(message.toString())
}

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

Added lines #L379 - L383 were not covered by tests
}
}

Check warning on line 385 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#L385

Added line #L385 was not covered by tests
}
companion object {
private val LOG = getLogger<AmazonQServerInstance>()
}
}

typealias AmazonQInitializeMessageReceivedListener = () -> Unit
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright 2025 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.lsp.flareChat

import com.google.gson.Gson
import com.google.gson.TypeAdapter
import com.google.gson.TypeAdapterFactory
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonWriter
import org.eclipse.lsp4j.InitializeResult
import java.io.IOException

class AmazonQLspTypeAdapterFactory : TypeAdapterFactory {

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L15 was not covered by tests
override fun <T : Any?> create(gson: Gson, type: TypeToken<T>): TypeAdapter<T>? {
if (type.rawType === InitializeResult::class.java) {
val delegate: TypeAdapter<InitializeResult?> = gson.getDelegateAdapter(this, type) as TypeAdapter<InitializeResult?>

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L18 was not covered by tests

return object : TypeAdapter<InitializeResult>() {

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L20 was not covered by tests
@Throws(IOException::class)
override fun write(out: JsonWriter, value: InitializeResult?) {
delegate.write(out, value)
}

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

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AmazonQLspTypeAdapterFactory.kt#L23-L24

Added lines #L23 - L24 were not covered by tests

@Throws(IOException::class)
override fun read(`in`: JsonReader): InitializeResult =
gson.fromJson(`in`, AwsExtendedInitializeResult::class.java)

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L28 was not covered by tests
} as TypeAdapter<T>
}
return null

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L31 was not covered by tests
}
}

class AwsExtendedInitializeResult(awsServerCapabilities: AwsServerCapabilities? = null) : InitializeResult() {

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L35 was not covered by tests
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

data class

private var awsServerCapabilities: AwsServerCapabilities? = null

fun getAwsServerCapabilities(): AwsServerCapabilities? = awsServerCapabilities

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

View check run for this annotation

Codecov / codecov/patch

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

Added line #L38 was not covered by tests

fun setAwsServerCapabilities(awsServerCapabilities: AwsServerCapabilities?) {

Check warning

Code scanning / QDJVMC

Unused symbol Warning

Function "setAwsServerCapabilities" is never used
this.awsServerCapabilities = awsServerCapabilities
}

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

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AmazonQLspTypeAdapterFactory.kt#L41-L42

Added lines #L41 - L42 were not covered by tests
}
Loading