Skip to content

Commit 2e2ff62

Browse files
committed
export chat:
1 parent 8b14510 commit 2e2ff62

File tree

10 files changed

+42
-91
lines changed

10 files changed

+42
-91
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileC
7373
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickNotification
7474
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams
7575
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
76-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
77-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest
7876
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResponse
7977
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickNotification
8078
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
@@ -233,7 +231,7 @@ class BrowserConnector(
233231
requestFromUi.params.tabId,
234232
chatPrompt,
235233
textDocumentIdentifier,
236-
cursorState
234+
cursorState,
237235
)
238236

239237
val tabId = requestFromUi.params.tabId
@@ -359,18 +357,14 @@ class BrowserConnector(
359357
}
360358

361359
CHAT_TAB_BAR_ACTIONS -> {
362-
handleChatNotification<TabBarActionRequest, TabBarActionParams>(node)
363-
{
364-
server, params ->
360+
handleChatNotification<TabBarActionRequest, TabBarActionParams>(node) {
361+
server, params ->
365362
val result = server.tabBarActions(params)
366363
result.whenComplete { params1, error ->
367364
val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1)
368365
browser.postChat(res)
369366
}
370-
371-
372367
}
373-
374368
}
375369
CHAT_CREATE_PROMPT -> {
376370
handleChatNotification<CreatePromptNotification, CreatePromptParams>(node) {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
11
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
3+
@file:Suppress("BannedImports")
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp
55

66
import com.google.gson.Gson
77
import com.intellij.notification.NotificationType
88
import com.intellij.openapi.application.ApplicationManager
99
import com.intellij.openapi.application.invokeAndWaitIfNeeded
10-
import com.intellij.openapi.fileChooser.FileChooser
11-
import com.intellij.openapi.fileChooser.FileChooserDescriptor
12-
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
1310
import com.intellij.openapi.fileChooser.FileChooserFactory
1411
import com.intellij.openapi.fileChooser.FileSaverDescriptor
1512
import com.intellij.openapi.fileEditor.FileEditorManager
1613
import com.intellij.openapi.project.Project
17-
import com.intellij.openapi.ui.DialogWrapper
18-
import com.intellij.openapi.vfs.LocalFileSystem
1914
import com.intellij.openapi.vfs.VirtualFileManager
20-
import com.intellij.ui.components.textFieldWithBrowseButton
21-
import com.intellij.ui.dsl.builder.panel
2215
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
2316
import org.eclipse.lsp4j.ConfigurationParams
2417
import org.eclipse.lsp4j.MessageActionItem
@@ -47,17 +40,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credential
4740
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
4841
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
4942
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
50-
import software.aws.toolkits.jetbrains.utils.computeOnEdt
51-
import java.io.File
52-
import java.io.FileFilter
53-
import java.net.URI
5443
import java.util.UUID
5544
import java.util.concurrent.CompletableFuture
56-
import java.util.concurrent.ConcurrentHashMap
5745
import java.util.concurrent.TimeUnit
58-
import javax.swing.JComponent
59-
import javax.swing.JFileChooser
60-
import javax.swing.filechooser.FileNameExtensionFilter
6146

6247
/**
6348
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
@@ -114,7 +99,6 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
11499
}
115100
}
116101

117-
118102
override fun getConnectionMetadata(): CompletableFuture<ConnectionMetadata> =
119103
CompletableFuture.supplyAsync {
120104
val connection = ToolkitConnectionManager.getInstance(project)
@@ -152,10 +136,9 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
152136
}
153137
}
154138

155-
val saveAtUri = params.defaultURI ?:"export-chat.html"
156-
157-
return CompletableFuture.supplyAsync{
139+
val saveAtUri = params.defaultUri ?: "export-chat.html"
158140

141+
return CompletableFuture.supplyAsync {
159142
return@supplyAsync invokeAndWaitIfNeeded {
160143
val descriptor = FileSaverDescriptor("Export", "Choose a location to export").apply {
161144
withFileFilter { file ->
@@ -170,20 +153,16 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
170153
chosenFile?.let {
171154
return@invokeAndWaitIfNeeded ShowSaveFileDialogResult(chosenFile.file.path)
172155
// TODO: Add error state shown in chat ui instead of throwing
173-
} ?: throw Error( "Export failed")
156+
} ?: throw Error("Export failed")
174157
}
175-
176-
177158
}
178-
179-
180159
}
181160

182161
override fun getSerializedChat(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult> {
183162
val requestId = UUID.randomUUID().toString()
184163
val result = CompletableFuture<GetSerializedChatResult>()
185164

186-
pendingSerializedChatRequests[requestId] = result
165+
ChatCommunicationManager.pendingSerializedChatRequests[requestId] = result
187166

188167
val uiMessage = """
189168
{
@@ -197,7 +176,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
197176
result.orTimeout(30000, TimeUnit.MILLISECONDS)
198177
.whenComplete { _, error ->
199178
if (error != null) {
200-
pendingSerializedChatRequests.remove(requestId)
179+
ChatCommunicationManager.pendingSerializedChatRequests.remove(requestId)
201180
}
202181
}
203182

@@ -259,31 +238,11 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
259238

260239
companion object {
261240
private val LOG = getLogger<AmazonQLanguageClientImpl>()
262-
private val pendingSerializedChatRequests = ConcurrentHashMap<String, CompletableFuture<GetSerializedChatResult>>()
263-
fun completeSerializedChatResponse(requestId: String, content: String) {
264-
pendingSerializedChatRequests.remove(requestId)?.complete(GetSerializedChatResult((content)))
265-
}
266241
}
267242
}
268243

269244
data class FormatMapping(
270245
val format: String,
271246
val key: String,
272-
val extensions: String
247+
val extensions: String,
273248
)
274-
275-
class aaaaa(val project: Project, val descriptor: FileChooserDescriptor): DialogWrapper(project) {
276-
277-
278-
init {
279-
super.init()
280-
title = "Export"
281-
}
282-
283-
override fun createCenterPanel(): JComponent? = panel {
284-
row {
285-
textFieldWithBrowseButton(project, descriptor)
286-
}
287-
288-
}
289-
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileC
3737
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams
3838
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
3939
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
40-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest
4140
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
4241
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
4342
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
@@ -129,5 +128,4 @@ interface AmazonQLanguageServer : LanguageServer {
129128

130129
@JsonNotification(CHAT_CREATE_PROMPT)
131130
fun createPrompt(params: CreatePromptParams): CompletableFuture<Unit>
132-
133131
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class AwsServerCapabilitiesProvider {
1515
this.serverCapabilities = serverCapabilities
1616
}
1717

18-
fun getChatOptions() = serverCapabilities?.chatOptions ?: DEFAULT_CHAT_OPTIONS
18+
fun getChatOptions() = serverCapabilities?.chatOptions ?: DEFAULT_CHAT_OPTIONS
1919

2020
companion object {
2121
fun getInstance(project: Project) = project.service<AwsServerCapabilitiesProvider>()

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
3+
@file:Suppress("BannedImports")
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat
55

66
import com.google.gson.Gson
@@ -10,8 +10,10 @@ import com.intellij.openapi.project.Project
1010
import org.eclipse.lsp4j.ProgressParams
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ProgressNotificationUtils.getObject
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
1314
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
1415
import java.util.UUID
16+
import java.util.concurrent.CompletableFuture
1517
import java.util.concurrent.ConcurrentHashMap
1618

1719
@Service(Service.Level.PROJECT)
@@ -57,6 +59,11 @@ class ChatCommunicationManager {
5759
companion object {
5860
fun getInstance(project: Project) = project.service<ChatCommunicationManager>()
5961

62+
val pendingSerializedChatRequests = ConcurrentHashMap<String, CompletableFuture<GetSerializedChatResult>>()
63+
fun completeSerializedChatResponse(requestId: String, content: String) {
64+
pendingSerializedChatRequests.remove(requestId)?.complete(GetSerializedChatResult((content)))
65+
}
66+
6067
fun convertToJsonToSendToChat(command: String, tabId: String, params: String, isPartialResult: Boolean): String =
6168
"""
6269
{
@@ -73,6 +80,6 @@ class ChatCommunicationManager {
7380
"command":"$command",
7481
"params": ${if (params != null) Gson().toJson(params) else "{}"}
7582
}
76-
""".trimIndent()
83+
""".trimIndent()
7784
}
7885
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ data class AwsMetadata(
1616

1717
data class AwsClientCapabilities(
1818
val q: DeveloperProfiles,
19-
val window: WindowSettings
19+
val window: WindowSettings,
2020
)
2121

2222
data class DeveloperProfiles(
2323
val developerProfiles: Boolean,
2424
)
2525

2626
data class WindowSettings(
27-
val showSaveFileDialog: Boolean
27+
val showSaveFileDialog: Boolean,
2828
)
2929

3030
data class ClientInfoMetadata(

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const val CHAT_COPY_CODE_TO_CLIPBOARD = "copyToClipboard"
2424
const val CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION = "aws/chat/copyCodeToClipboard"
2525
const val CHAT_INSERT_TO_CURSOR = "insertToCursorPosition"
2626
const val CHAT_INSERT_TO_CURSOR_NOTIFICATION = "aws/chat/insertToCursorPosition"
27-
const val CHAT_TAB_BAR_ACTIONS="aws/chat/tabBarAction"
27+
const val CHAT_TAB_BAR_ACTIONS = "aws/chat/tabBarAction"
2828
const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt"
2929
const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog"
3030
const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat"

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/GetSerializedChatParams.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,25 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
55

66
data class GetSerializedChatParams(
77
val tabId: String,
8-
val format : String
8+
val format: String,
99
) {
1010
companion object {
11-
fun create(tabId: String, format: SerializedChatFormat): GetSerializedChatParams {
12-
return GetSerializedChatParams(tabId, format.value)
13-
}
11+
fun create(tabId: String, format: SerializedChatFormat): GetSerializedChatParams =
12+
GetSerializedChatParams(tabId, format.value)
1413
}
1514
}
1615

1716
enum class SerializedChatFormat(val value: String) {
1817
HTML("html"),
19-
MARKDOWN("markdown");
18+
MARKDOWN("markdown"),
19+
;
2020

21-
override fun toString(): String {
22-
return name.lowercase()
23-
}
21+
override fun toString(): String =
22+
name.lowercase()
2423
}
2524

2625
data class GetSerializedChatResult(
27-
val content: String
26+
val content: String,
2827
)
2928

3029
data class GetSerializedChatRequest(
@@ -35,7 +34,7 @@ data class GetSerializedChatRequest(
3534

3635
data class GetSerializedChatResponseParams(
3736
val success: Boolean,
38-
val result: GetSerializedChatResult
37+
val result: GetSerializedChatResult,
3938
)
4039

4140
data class GetSerializedChatResponse(

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/ShowSaveFileDialogParams.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33

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

6-
import java.net.URI
7-
86
data class ShowSaveFileDialogParams(
97
val supportedFormats: List<String>,
10-
val defaultURI: String?
8+
val defaultUri: String?,
119
)
1210

1311
data class ShowSaveFileDialogResult(
14-
val target: String
12+
val targetUri: String,
1513
)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/TabBarActionParams.kt

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,27 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
55

66
data class TabBarActionParams(
77
val tabId: String?,
8-
val action: String
8+
val action: String,
99
) {
1010
companion object {
11-
fun create(tabId: String?, action: TabBarAction): TabBarActionParams {
12-
return TabBarActionParams(tabId, action.value)
13-
}
11+
fun create(tabId: String?, action: TabBarAction): TabBarActionParams =
12+
TabBarActionParams(tabId, action.value)
1413
}
1514
}
1615

17-
1816
enum class TabBarAction(val value: String) {
19-
EXPORT("export");
20-
21-
override fun toString(): String {
22-
return name.lowercase()
23-
}
17+
EXPORT("export"),
18+
;
2419

20+
override fun toString(): String =
21+
name.lowercase()
2522
}
2623

2724
data class TabBarActionResult(
28-
val success: Boolean
25+
val success: Boolean,
2926
)
3027

3128
data class TabBarActionRequest(
3229
override val command: String,
3330
override val params: TabBarActionParams,
3431
) : ChatNotification<TabBarActionParams>
35-

0 commit comments

Comments
 (0)