diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt index 9f213d3d610..68375af8e63 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt @@ -7,6 +7,7 @@ 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.project.Project import com.intellij.openapi.util.Disposer import com.intellij.ui.components.JBLoadingPanel import com.intellij.ui.components.JBPanelWithEmptyText @@ -24,7 +25,7 @@ import java.awt.event.ActionListener import java.util.concurrent.CompletableFuture import javax.swing.JButton -class AmazonQPanel(private val parent: Disposable) { +class AmazonQPanel(private val parent: Disposable, val project: Project) { private val webviewContainer = Wrapper() val browser = CompletableFuture() @@ -91,7 +92,7 @@ class AmazonQPanel(private val parent: Disposable) { loadingPanel.stopLoading() runInEdt { browser.complete( - Browser(parent, webUri).also { + Browser(parent, webUri, project).also { wrapper.setContent(it.component()) } ) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt index 6783eceb0e5..979bdeeea2a 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt @@ -49,7 +49,7 @@ class AmazonQToolWindow private constructor( private val browserConnector = BrowserConnector(project = project) private val editorThemeAdapter = EditorThemeAdapter() - private val chatPanel = AmazonQPanel(parent = this) + private val chatPanel = AmazonQPanel(parent = this, project) val component: JComponent = chatPanel.component diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt index 46552c338a2..caf6111f418 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt @@ -5,9 +5,12 @@ package software.aws.toolkits.jetbrains.services.amazonq.webview 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 @@ -17,7 +20,8 @@ import java.net.URI /* 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 { val jcefBrowser = createBrowser(parent) @@ -39,8 +43,17 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable { "mynah", AssetResourceHandler.AssetResourceHandlerFactory(), ) - - loadWebView(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand, activeProfile) + AmazonQLspService.getInstance(project).addServerStartedListener { + loadWebView( + isCodeTransformAvailable, + isFeatureDevAvailable, + isDocAvailable, + isCodeScanAvailable, + isCodeTestAvailable, + highlightCommand, + activeProfile + ) + } } override fun dispose() { @@ -101,6 +114,7 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable { highlightCommand: HighlightCommand?, activeProfile: QRegionProfile?, ): String { + val quickActionConfig = generateQuickActionConfig() val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)") val jsScripts = """ @@ -113,7 +127,7 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable { } }, { - quickActionCommands: [], + quickActionCommands: $quickActionConfig, disclaimerAcknowledged: ${MeetQSettings.getInstance().disclaimerAcknowledged} } ); @@ -220,6 +234,10 @@ class Browser(parent: Disposable, private val webUri: URI) : Disposable { activeProfile } + private fun generateQuickActionConfig() = AwsServerCapabilitiesProvider.getInstance(project).getChatOptions().quickActions.quickActionsCommandGroups + .let { OBJECT_MAPPER.writeValueAsString(it) } + ?: "[]" + companion object { private const val MAX_ONBOARDING_PAGE_COUNT = 3 private val OBJECT_MAPPER = jacksonObjectMapper() diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index 768ee6893cc..6582b1dded8 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.future.await import kotlinx.coroutines.launch import org.cef.browser.CefBrowser import org.eclipse.lsp4j.Position @@ -27,11 +28,16 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService 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.EndChatParams +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.SEND_END_CHAT import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest import software.aws.toolkits.jetbrains.services.amazonq.util.command import software.aws.toolkits.jetbrains.services.amazonq.util.tabType @@ -167,7 +173,6 @@ class BrowserConnector( ) ) - val partialResultToken = chatCommunicationManager.addPartialChatMessage(requestFromUi.params.tabId) val chatParams = ChatParams( requestFromUi.params.tabId, chatPrompt, @@ -175,24 +180,62 @@ class BrowserConnector( cursorState ) + val tabId = requestFromUi.params.tabId + val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId) + 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) + } + CHAT_QUICK_ACTION -> { + val requestFromUi = serializer.deserializeChatMessages(node, QuickChatActionRequest::class.java) + val tabId = requestFromUi.params.tabId + val quickActionParams = requestFromUi.params + val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId) + var encryptionManager: JwtEncryptionManager? = null + val result = AmazonQLspService.executeIfRunning(project) { server -> + encryptionManager = this.encryptionManager + encryptionManager?.encrypt(quickActionParams)?.let { + EncryptedQuickActionChatParams(it, partialResultToken) + }?.let { + server.sendQuickAction(it) + } + } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) - 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) + } + SEND_END_CHAT -> { + val requestFromUi = serializer.deserializeChatMessages(node, EndChatParams::class.java) + val endChatParams = EndChatParams(requestFromUi.tabId) + val result = AmazonQLspService.executeIfRunning(project) { server -> + server.endChat(endChatParams) + } ?: CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")) + result.whenComplete { value, error -> + chatCommunicationManager.removePartialChatMessage(requestFromUi.tabId) } } } } + + private fun showResult( + result: CompletableFuture, + partialResultToken: String, + tabId: String, + encryptionManager: JwtEncryptionManager?, + browser: Browser, + ) { + result.whenComplete { value, error -> + chatCommunicationManager.removePartialChatMessage(partialResultToken) + val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat( + SEND_CHAT_COMMAND_PROMPT, + tabId, + encryptionManager?.decrypt(value).orEmpty(), + isPartialResult = false + ) + browser.postChat(messageToChat) + } + } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt index c7eefe33284..22a6818f920 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt @@ -10,6 +10,8 @@ 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.EncryptedChatParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EndChatParams 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 @@ -33,4 +35,10 @@ interface AmazonQLanguageServer : LanguageServer { @JsonRequest("aws/chat/sendChatPrompt") fun sendChatPrompt(params: EncryptedChatParams): CompletableFuture + + @JsonRequest("aws/chat/sendChatQuickAction") + fun sendQuickAction(params: EncryptedQuickActionChatParams): CompletableFuture + + @JsonRequest("aws/chat/endChat") + fun endChat(params: EndChatParams): CompletableFuture } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt index 63e944bcbbf..6a3e75ea375 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt @@ -40,7 +40,9 @@ import org.eclipse.lsp4j.SynchronizationCapabilities import org.eclipse.lsp4j.TextDocumentClientCapabilities import org.eclipse.lsp4j.WorkspaceClientCapabilities import org.eclipse.lsp4j.jsonrpc.Launcher -import org.eclipse.lsp4j.launch.LSPLauncher +import org.eclipse.lsp4j.jsonrpc.Launcher.Builder +import org.eclipse.lsp4j.jsonrpc.MessageConsumer +import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage import org.slf4j.event.Level import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info @@ -50,6 +52,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactMa 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 @@ -101,6 +106,10 @@ internal class LSPProcessListener : ProcessListener { @Service(Service.Level.PROJECT) class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable { + private val serverStartedListener = mutableListOf() + fun addServerStartedListener(listener: AmazonQServerStartedListener) = serverStartedListener.add(listener) + fun notifyServerStarted() = serverStartedListener.forEach { it() } + private var instance: Deferred val capabilities get() = instance.getCompleted().initializeResult.getCompleted().capabilities @@ -265,7 +274,20 @@ private class AmazonQServerInstance(private val project: Project, private val cs launcherHandler.addProcessListener(inputWrapper) launcherHandler.startNotify() - launcher = LSPLauncher.Builder() + class AmazonQServerBuilder : Builder() { + + override fun wrapMessageConsumer(consumer: MessageConsumer?): MessageConsumer = + super.wrapMessageConsumer { message -> + if (message is ResponseMessage && message.result is AwsExtendedInitializeResult) { + val result = message.result as AwsExtendedInitializeResult + AwsServerCapabilitiesProvider.getInstance(project).setAwsServerCapabilities(result.getAwsServerCapabilities()) + AmazonQLspService.getInstance(project).notifyServerStarted() + } + consumer?.consume(message) + } + } + + launcher = AmazonQServerBuilder() .setLocalService(AmazonQLanguageClientImpl(project)) .setRemoteInterface(AmazonQLanguageServer::class.java) .configureGson { @@ -274,6 +296,7 @@ private class AmazonQServerInstance(private val project: Project, private val cs // otherwise Gson treats all numbers as double which causes deser issues it.setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + it.registerTypeAdapterFactory(AmazonQLspTypeAdapterFactory()) }.traceMessages( PrintWriter( object : StringWriter() { @@ -352,3 +375,5 @@ private class AmazonQServerInstance(private val project: Project, private val cs private val LOG = getLogger() } } + +typealias AmazonQServerStartedListener = () -> Unit diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AmazonQLspTypeAdapterFactory.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AmazonQLspTypeAdapterFactory.kt new file mode 100644 index 00000000000..49553baccd8 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AmazonQLspTypeAdapterFactory.kt @@ -0,0 +1,42 @@ +// 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.stream.JsonReader +import com.google.gson.stream.JsonWriter +import org.eclipse.lsp4j.InitializeResult +import java.io.IOException + +class AmazonQLspTypeAdapterFactory : TypeAdapterFactory { + override fun create(gson: Gson, type: com.google.gson.reflect.TypeToken): TypeAdapter? { + if (type.rawType === InitializeResult::class.java) { + val delegate: TypeAdapter = gson.getDelegateAdapter(this, type) as TypeAdapter + + return object : TypeAdapter() { + @Throws(IOException::class) + override fun write(out: JsonWriter?, value: InitializeResult?) { + delegate.write(out, value) + } + + @Throws(IOException::class) + override fun read(`in`: JsonReader?): InitializeResult = + gson.fromJson(`in`, AwsExtendedInitializeResult::class.java) + } as TypeAdapter + } + return null + } +} + +class AwsExtendedInitializeResult : InitializeResult() { + private var awsServerCapabilities: AwsServerCapabilities? = null + + fun getAwsServerCapabilities(): AwsServerCapabilities? = awsServerCapabilities + + fun setAwsServerCapabilities(awsServerCapabilities: AwsServerCapabilities?) { + this.awsServerCapabilities = awsServerCapabilities + } +} diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt new file mode 100644 index 00000000000..5c4eec4491a --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/AwsServerCapabilitiesProvider.kt @@ -0,0 +1,57 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat + +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project + +@Service(Service.Level.PROJECT) +class AwsServerCapabilitiesProvider { + private var serverCapabilities: AwsServerCapabilities? = null + + fun setAwsServerCapabilities(serverCapabilities: AwsServerCapabilities?) { + this.serverCapabilities = serverCapabilities + } + + fun getChatOptions() = serverCapabilities?.chatOptions ?: DEFAULT_CHAT_OPTIONS + + companion object { + fun getInstance(project: Project) = project.service() + + private val DEFAULT_CHAT_OPTIONS: ChatOptions = ChatOptions( + QuickActions( + listOf( + QuickActionsCommandGroups( + listOf( + Command("/help", "Learn more about Amazon Q then"), + Command("/clear", "Clear this session") + ) + ) + ) + ) + ) + } +} + +data class AwsServerCapabilities( + val chatOptions: ChatOptions, +) + +data class ChatOptions( + val quickActions: QuickActions, +) + +data class QuickActions( + val quickActionsCommandGroups: List, +) + +data class QuickActionsCommandGroups( + val commands: List, +) + +data class Command( + val command: String, + val description: String, +) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/EndChat.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/EndChat.kt new file mode 100644 index 00000000000..0c16e43d151 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/EndChat.kt @@ -0,0 +1,12 @@ +// 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 EndChatParams( + val tabId: String, +) + +data class EndChatResult( + val status: Boolean, +) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt index 6ee3c89ff8e..a00f6e6cfce 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt @@ -4,3 +4,5 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat const val SEND_CHAT_COMMAND_PROMPT = "aws/chat/sendChatPrompt" +const val SEND_END_CHAT = "aws/chat/endChat" +const val CHAT_QUICK_ACTION = "aws/chat/sendChatQuickAction" diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/QuickChatActionRequest.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/QuickChatActionRequest.kt new file mode 100644 index 00000000000..2d69ec92375 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/QuickChatActionRequest.kt @@ -0,0 +1,20 @@ +// 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 QuickChatActionRequest( + val command: String, + val params: QuickChatActionPrompt, +) + +data class QuickChatActionPrompt( + val tabId: String, + val quickAction: String, + val prompt: String, +) + +data class EncryptedQuickActionChatParams( + val message: String, + val partialResultToken: String? = null, +)