Skip to content

Commit f5c8d38

Browse files
committed
Merge conflicts resolved
1 parent e2c667a commit f5c8d38

File tree

12 files changed

+199
-17
lines changed

12 files changed

+199
-17
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project)
127127
}
128128
},
129129
{
130+
agenticMode: true,
130131
quickActionCommands: $quickActionConfig,
131132
disclaimerAcknowledged: ${MeetQSettings.getInstance().disclaimerAcknowledged},
132133
pairProgrammingAcknowledged: ${!MeetQSettings.getInstance().amazonQChatPairProgramming}

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged
1818
import kotlinx.coroutines.flow.launchIn
1919
import kotlinx.coroutines.flow.merge
2020
import kotlinx.coroutines.flow.onEach
21+
import kotlinx.coroutines.future.await
2122
import kotlinx.coroutines.launch
2223
import org.cef.browser.CefBrowser
2324
import org.eclipse.lsp4j.Position
@@ -26,6 +27,7 @@ import software.aws.toolkits.core.utils.getLogger
2627
import software.aws.toolkits.core.utils.warn
2728
import software.aws.toolkits.jetbrains.services.amazonq.apps.AppConnection
2829
import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageSerializer
30+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageClientImpl
2931
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
3032
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
3133
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
@@ -42,7 +44,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_
4244
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK
4345
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FILE_CLICK
4446
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK
45-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_GET_SERIALIZED_CHAT
4647
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
4748
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR
4849
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
@@ -71,8 +72,10 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileC
7172
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileClickParams
7273
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickNotification
7374
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams
75+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
7476
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
7577
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest
78+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResponse
7679
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickNotification
7780
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
7881
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionNotification
@@ -347,17 +350,25 @@ class BrowserConnector(
347350
}
348351
}
349352

350-
CHAT_GET_SERIALIZED_CHAT -> {
351-
handleChatNotification<GetSerializedChatRequest, GetSerializedChatParams>(node)
352-
{
353-
server, params -> server.getSerializedActions(params)
354-
}
353+
GET_SERIALIZED_CHAT_REQUEST_METHOD -> {
354+
val response = serializer.deserializeChatMessages<GetSerializedChatResponse>(node)
355+
AmazonQLanguageClientImpl.completeSerializedChatResponse(
356+
response.requestId,
357+
response.params.result.content
358+
)
355359
}
356360

357361
CHAT_TAB_BAR_ACTIONS -> {
358362
handleChatNotification<TabBarActionRequest, TabBarActionParams>(node)
359363
{
360-
server, params -> server.tabBarActions(params)
364+
server, params ->
365+
val result = server.tabBarActions(params)
366+
result.whenComplete { params1, error ->
367+
val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1)
368+
browser.postChat(res)
369+
}
370+
371+
361372
}
362373

363374
}

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

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

66
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
77
import org.eclipse.lsp4j.services.LanguageClient
8+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
9+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
10+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
811
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams
912
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
15+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult
1016
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
1117
import java.util.concurrent.CompletableFuture
1218

@@ -20,4 +26,10 @@ interface AmazonQLanguageClient : LanguageClient {
2026

2127
@JsonRequest("aws/chat/openTab")
2228
fun openTab(params: OpenTabParams): CompletableFuture<OpenTabResult>
29+
30+
@JsonRequest(SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD)
31+
fun showSaveFileDialog(params: ShowSaveFileDialogParams): CompletableFuture<ShowSaveFileDialogResult>
32+
33+
@JsonRequest(GET_SERIALIZED_CHAT_REQUEST_METHOD)
34+
fun getSerializedChat(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult>
2335
}

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

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,22 @@
33

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

6+
import com.google.gson.Gson
67
import com.intellij.notification.NotificationType
78
import com.intellij.openapi.application.ApplicationManager
9+
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
13+
import com.intellij.openapi.fileChooser.FileChooserFactory
14+
import com.intellij.openapi.fileChooser.FileSaverDescriptor
815
import com.intellij.openapi.fileEditor.FileEditorManager
916
import com.intellij.openapi.project.Project
17+
import com.intellij.openapi.ui.DialogWrapper
18+
import com.intellij.openapi.vfs.LocalFileSystem
1019
import com.intellij.openapi.vfs.VirtualFileManager
20+
import com.intellij.ui.components.textFieldWithBrowseButton
21+
import com.intellij.ui.dsl.builder.panel
1122
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
1223
import org.eclipse.lsp4j.ConfigurationParams
1324
import org.eclipse.lsp4j.MessageActionItem
@@ -23,14 +34,30 @@ import software.aws.toolkits.core.utils.warn
2334
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
2435
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
2536
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
37+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
2638
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
39+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
40+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
41+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
2742
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams
2843
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
44+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
45+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult
2946
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
3047
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
3148
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
3249
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
54+
import java.util.UUID
3355
import java.util.concurrent.CompletableFuture
56+
import java.util.concurrent.ConcurrentHashMap
57+
import java.util.concurrent.TimeUnit
58+
import javax.swing.JComponent
59+
import javax.swing.JFileChooser
60+
import javax.swing.filechooser.FileNameExtensionFilter
3461

3562
/**
3663
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
@@ -87,6 +114,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
87114
}
88115
}
89116

117+
90118
override fun getConnectionMetadata(): CompletableFuture<ConnectionMetadata> =
91119
CompletableFuture.supplyAsync {
92120
val connection = ToolkitConnectionManager.getInstance(project)
@@ -111,6 +139,71 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
111139
// TODO implement chat history, this is here to unblock chat functionality
112140
CompletableFuture.completedFuture(OpenTabResult(""))
113141

142+
override fun showSaveFileDialog(params: ShowSaveFileDialogParams): CompletableFuture<ShowSaveFileDialogResult> {
143+
val filters = mutableMapOf<String, String>()
144+
val formatMappings = listOf(
145+
FormatMapping("markdown", "Markdown", "md"),
146+
FormatMapping("html", "HTML", "html")
147+
)
148+
149+
params.supportedFormats.forEach { format ->
150+
formatMappings.find { it.format == format }?.let { mapping ->
151+
filters[mapping.key] = mapping.extensions
152+
}
153+
}
154+
155+
val saveAtUri = params.defaultURI ?:"export-chat.html"
156+
157+
return CompletableFuture.supplyAsync{
158+
159+
return@supplyAsync invokeAndWaitIfNeeded {
160+
val descriptor = FileSaverDescriptor("Export", "Choose a location to export").apply {
161+
withFileFilter { file ->
162+
filters.values.any { ext ->
163+
file.name.endsWith(".$ext")
164+
}
165+
}
166+
}
167+
168+
val chosenFile = FileChooserFactory.getInstance().createSaveFileDialog(descriptor, project).save(saveAtUri)
169+
170+
chosenFile?.let {
171+
return@invokeAndWaitIfNeeded ShowSaveFileDialogResult(chosenFile.file.toURI())
172+
// TODO: Add error state shown in chat ui instead of throwing
173+
} ?: throw Error( "Export failed")
174+
}
175+
176+
177+
}
178+
179+
180+
}
181+
182+
override fun getSerializedChat(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult> {
183+
val requestId = UUID.randomUUID().toString()
184+
val result = CompletableFuture<GetSerializedChatResult>()
185+
186+
pendingSerializedChatRequests[requestId] = result
187+
188+
val uiMessage = """
189+
{
190+
"command": "$GET_SERIALIZED_CHAT_REQUEST_METHOD",
191+
"params": ${Gson().toJson(params)},
192+
"requestId": "$requestId"
193+
}
194+
""".trimIndent()
195+
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
196+
197+
result.orTimeout(30000, TimeUnit.MILLISECONDS)
198+
.whenComplete { _, error ->
199+
if (error != null) {
200+
pendingSerializedChatRequests.remove(requestId)
201+
}
202+
}
203+
204+
return result
205+
}
206+
114207
override fun configuration(params: ConfigurationParams): CompletableFuture<List<Any>> {
115208
if (params.items.isEmpty()) {
116209
return CompletableFuture.completedFuture(null)
@@ -166,5 +259,31 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
166259

167260
companion object {
168261
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+
}
266+
}
267+
}
268+
269+
data class FormatMapping(
270+
val format: String,
271+
val key: String,
272+
val extensions: String
273+
)
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+
169288
}
170289
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_
1818
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK
1919
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FILE_CLICK
2020
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK
21-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_GET_SERIALIZED_CHAT
2221
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
2322
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR_NOTIFICATION
2423
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
@@ -36,6 +35,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Encry
3635
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackParams
3736
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileClickParams
3837
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams
38+
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
4040
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatRequest
4141
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
@@ -124,7 +124,7 @@ interface AmazonQLanguageServer : LanguageServer {
124124
@JsonRequest(CHAT_TAB_BAR_ACTIONS)
125125
fun tabBarActions(params: TabBarActionParams): CompletableFuture<TabBarActionResult>
126126

127-
@JsonRequest(CHAT_GET_SERIALIZED_CHAT)
127+
@JsonRequest(GET_SERIALIZED_CHAT_REQUEST_METHOD)
128128
fun getSerializedActions(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult>
129129

130130
@JsonNotification(CHAT_CREATE_PROMPT)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat
55

6+
import com.google.gson.Gson
67
import com.intellij.openapi.components.Service
78
import com.intellij.openapi.components.service
89
import com.intellij.openapi.project.Project
@@ -65,5 +66,13 @@ class ChatCommunicationManager {
6566
"isPartialResult": $isPartialResult
6667
}
6768
""".trimIndent()
69+
70+
inline fun <reified T> convertNotificationToJsonForChat(command: String, params: T? = null) =
71+
"""
72+
{
73+
"command":"$command",
74+
"params": ${if (params != null) Gson().toJson(params) else "{}"}
75+
}
76+
""".trimIndent()
6877
}
6978
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@ data class AwsMetadata(
1616

1717
data class AwsClientCapabilities(
1818
val q: DeveloperProfiles,
19+
val window: WindowSettings
1920
)
2021

2122
data class DeveloperProfiles(
2223
val developerProfiles: Boolean,
2324
)
2425

26+
data class WindowSettings(
27+
val showSaveFileDialog: Boolean
28+
)
29+
2530
data class ClientInfoMetadata(
2631
val extension: ExtensionMetadata,
2732
val clientId: String,
@@ -50,6 +55,9 @@ fun createExtendedClientMetadata(): ExtendedClientMetadata {
5055
awsClientCapabilities = AwsClientCapabilities(
5156
q = DeveloperProfiles(
5257
developerProfiles = true
58+
),
59+
window = WindowSettings(
60+
showSaveFileDialog = true
5361
)
5462
)
5563
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ data class InnerChatPrompt(
3232

3333
data class InnerChatOptions(
3434
@JsonProperty("pair-programmer-mode")
35-
val pairProgrammingMode: String,
35+
val pairProgrammingMode: String?,
3636
)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +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_GET_SERIALIZED_CHAT="aws/chat/getSerializedChat"
2827
const val CHAT_TAB_BAR_ACTIONS="aws/chat/tabBarAction"
2928
const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt"
29+
const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog"
30+
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: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,14 @@ data class GetSerializedChatRequest(
3232
override val command: String,
3333
override val params: GetSerializedChatParams,
3434
) : ChatNotification<GetSerializedChatParams>
35+
36+
data class GetSerializedChatResponseParams(
37+
val success: Boolean,
38+
val result: GetSerializedChatResult
39+
)
40+
41+
data class GetSerializedChatResponse(
42+
val requestId: String,
43+
val command: String,
44+
val params: GetSerializedChatResponseParams,
45+
)

0 commit comments

Comments
 (0)