Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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 @@ -35,6 +35,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryp
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AUTH_FOLLOW_UP_CLICKED
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AuthFollowUpClickNotification
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickNotification
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickResult
Expand Down Expand Up @@ -412,6 +414,13 @@ class BrowserConnector(
}
}
}
AUTH_FOLLOW_UP_CLICKED -> {
val message = serializer.deserializeChatMessages<AuthFollowUpClickNotification>(node)
chatCommunicationManager.handleAuthFollowUpClicked(
project,
message.params
)
}
CHAT_COPY_CODE_TO_CLIPBOARD -> {
handleChatNotification<CopyCodeToClipboardNotification, CopyCodeToClipboardParams>(node) { server, params ->
server.copyCodeToClipboard(params)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,22 @@ import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import org.eclipse.lsp4j.ProgressParams
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.core.utils.warn
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
import software.aws.toolkits.jetbrains.core.credentials.reauthConnectionIfNeeded
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ProgressNotificationUtils.getObject
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ErrorParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AuthFollowUpClickedParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AuthFollowupType
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
import java.util.UUID
import java.util.concurrent.CompletableFuture
import java.util.concurrent.ConcurrentHashMap
Expand Down Expand Up @@ -91,9 +100,40 @@ class ChatCommunicationManager {
return uiMessage
}

fun handleAuthFollowUpClicked(project: Project, params: AuthFollowUpClickedParams) {
val incomingType = params.authFollowupType
val connectionManager = ToolkitConnectionManager.getInstance(project)
try {
connectionManager.activeConnectionForFeature(QConnection.getInstance())?.let {
reauthConnectionIfNeeded(project, it, isReAuth = true)
}
when (incomingType) {
AuthFollowupType.USE_SUPPORTED_AUTH.value -> {
project.messageBus.syncPublisher(QRegionProfileSelectedListener.TOPIC)
.onProfileSelected(project, QRegionProfileManager.getInstance().activeProfile(project))
return
}
AuthFollowupType.RE_AUTH.value,
AuthFollowupType.MISSING_SCOPES.value,
AuthFollowupType.FULL_AUTH.value,
-> {
return
}
else -> {
LOG.warn { "Unknown auth follow up type: $incomingType" }
}
}
} catch (ex: Exception) {
LOG.warn(ex) { "Failed to handle authentication when auth follow up clicked" }
throw ex
}
}

companion object {
fun getInstance(project: Project) = project.service<ChatCommunicationManager>()

private val LOG = getLogger<ChatCommunicationManager>()

val pendingSerializedChatRequests = ConcurrentHashMap<String, CompletableFuture<GetSerializedChatResult>>()
fun completeSerializedChatResponse(requestId: String, content: String) {
pendingSerializedChatRequests.remove(requestId)?.complete(GetSerializedChatResult((content)))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat

data class AuthFollowUpClickNotification(
override val command: String,
override val params: AuthFollowUpClickedParams,
) : ChatNotification<AuthFollowUpClickedParams>

data class AuthFollowUpClickedParams(
val tabId: String,
val messageId: String,
val authFollowupType: String,
) {
companion object {
fun create(tabId: String, messageId: String, authType: AuthFollowupType): AuthFollowUpClickedParams =
AuthFollowUpClickedParams(tabId, messageId, authType.value)
}
}

enum class AuthFollowupType(val value: String) {
FULL_AUTH("full-auth"),
RE_AUTH("re-auth"),
MISSING_SCOPES("missing_scopes"),
USE_SUPPORTED_AUTH("use-supported-auth"),
;

override fun toString(): String =
name.lowercase()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat

const val AUTH_FOLLOW_UP_CLICKED = "authFollowUpClicked"
const val CHAT_BUTTON_CLICK = "aws/chat/buttonClick"
const val CHAT_CONVERSATION_CLICK = "aws/chat/conversationClick"
const val CHAT_COPY_CODE_TO_CLIPBOARD = "copyToClipboard"
Expand Down Expand Up @@ -33,10 +34,10 @@ const val CHAT_TAB_REMOVE = "aws/chat/tabRemove"
const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat"

const val OPEN_FILE_DIFF = "aws/openFileDiff"
const val OPEN_SETTINGS = "openSettings"

const val PROMPT_INPUT_OPTIONS_CHANGE = "aws/chat/promptInputOptionChange"

const val SEND_CHAT_COMMAND_PROMPT = "aws/chat/sendChatPrompt"
const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog"
const val STOP_CHAT_RESPONSE = "stopChatResponse"
const val OPEN_SETTINGS = "openSettings"
Loading