Skip to content

Commit 8e9c856

Browse files
feat(amazonq): History button in chat lists conversation history and opens tab when one selected (#5662)
* send openTab to browser * initial * Show options to for chat history and export in tab bar * add requestID and mapping * remove println * clicking button shows history list of conversations * detekt * feedback * move tab request map into ChatCommunicationManager * update enum classes * revert enum update * refactor for consistency * strings for enums * simplify * revert to working impl * detekt * fix serialization * unused function * detekt --------- Co-authored-by: Manodnya Bhoite <[email protected]>
1 parent 9abe243 commit 8e9c856

File tree

4 files changed

+160
-0
lines changed

4 files changed

+160
-0
lines changed

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Butto
3737
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams
3838
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickResult
3939
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_BUTTON_CLICK
40+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_CONVERSATION_CLICK
4041
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD
4142
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_CREATE_PROMPT
4243
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_DISCLAIMER_ACKNOWLEDGED
@@ -46,6 +47,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.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
50+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LIST_CONVERSATIONS
4951
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB
5052
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_PROMPT_OPTION_ACKNOWLEDGED
5153
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
@@ -59,6 +61,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatN
5961
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatParams
6062
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
6163
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatReadyNotification
64+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ConversationClickRequest
6265
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardNotification
6366
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams
6467
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CreatePromptNotification
@@ -80,6 +83,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Inser
8083
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
8184
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickNotification
8285
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
86+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListConversationsRequest
8387
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResponse
8488
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE
8589
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeNotification
@@ -260,6 +264,38 @@ class BrowserConnector(
260264

261265
showResult(result, partialResultToken, tabId, encryptionManager, browser)
262266
}
267+
CHAT_LIST_CONVERSATIONS -> {
268+
val requestFromUi = serializer.deserializeChatMessages<ListConversationsRequest>(node)
269+
val result = AmazonQLspService.executeIfRunning(project) { server ->
270+
server.listConversations(requestFromUi.params)
271+
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
272+
273+
result.whenComplete { response, _ ->
274+
val uiMessage = """
275+
{
276+
"command": "$CHAT_LIST_CONVERSATIONS",
277+
"params": ${Gson().toJson(response)}
278+
}
279+
""".trimIndent()
280+
browser.postChat(uiMessage)
281+
}
282+
}
283+
CHAT_CONVERSATION_CLICK -> {
284+
val requestFromUi = serializer.deserializeChatMessages<ConversationClickRequest>(node)
285+
val result = AmazonQLspService.executeIfRunning(project) { server ->
286+
server.conversationClick(requestFromUi.params)
287+
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
288+
289+
result.whenComplete { response, _ ->
290+
val uiMessage = """
291+
{
292+
"command": "$CHAT_CONVERSATION_CLICK",
293+
"params": ${Gson().toJson(response)}
294+
}
295+
""".trimIndent()
296+
browser.postChat(uiMessage)
297+
}
298+
}
263299
CHAT_FEEDBACK -> {
264300
handleChatNotification<FeedbackNotification, FeedbackParams>(node) { server, params ->
265301
server.feedback(params)

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.UpdateConf
1313
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams
1414
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickResult
1515
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_BUTTON_CLICK
16+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_CONVERSATION_CLICK
1617
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION
1718
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_CREATE_PROMPT
1819
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK
@@ -21,13 +22,16 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_
2122
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
2223
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR_NOTIFICATION
2324
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
25+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LIST_CONVERSATIONS
2426
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
2527
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY
2628
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK
2729
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_ADD
2830
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_BAR_ACTIONS
2931
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_CHANGE
3032
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE
33+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ConversationClickParams
34+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ConversationClickResult
3135
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams
3236
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CreatePromptParams
3337
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
@@ -41,6 +45,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSe
4145
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
4246
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
4347
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
48+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListConversationsParams
49+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ListConversationsResult
4450
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE
4551
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams
4652
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
@@ -117,6 +123,12 @@ interface AmazonQLanguageServer : LanguageServer {
117123
@JsonNotification(CHAT_FILE_CLICK)
118124
fun fileClick(params: FileClickParams): CompletableFuture<Unit>
119125

126+
@JsonRequest(CHAT_LIST_CONVERSATIONS)
127+
fun listConversations(params: ListConversationsParams): CompletableFuture<ListConversationsResult>
128+
129+
@JsonRequest(CHAT_CONVERSATION_CLICK)
130+
fun conversationClick(params: ConversationClickParams): CompletableFuture<ConversationClickResult>
131+
120132
@JsonRequest(CHAT_BUTTON_CLICK)
121133
fun buttonClick(params: ButtonClickParams): CompletableFuture<ButtonClickResult>
122134

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
5+
6+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
7+
// SPDX-License-Identifier: Apache-2.0
8+
9+
typealias FilterValue = String
10+
11+
data class TextBasedFilterOption(
12+
val type: String,
13+
val placeholder: String?,
14+
val icon: IconType?,
15+
) {
16+
companion object {
17+
fun create(type: TextInputType, placeholder: String, icon: IconType): TextBasedFilterOption =
18+
TextBasedFilterOption(type.value, placeholder, icon)
19+
}
20+
}
21+
22+
data class FilterOption(
23+
val id: String,
24+
val type: String,
25+
val placeholder: String?,
26+
val icon: IconType?,
27+
)
28+
29+
data class Action(
30+
val id: String,
31+
val icon: IconType?,
32+
val text: String,
33+
)
34+
35+
data class ConversationItem(
36+
val id: String,
37+
val icon: IconType?,
38+
val description: String?,
39+
val actions: List<Action>?,
40+
)
41+
42+
data class ConversationItemGroup(
43+
val groupName: String?,
44+
val icon: IconType?,
45+
val items: List<ConversationItem>?,
46+
)
47+
48+
data class ListConversationsParams(
49+
val filter: Map<String, FilterValue>?,
50+
)
51+
52+
data class ConversationsList(
53+
val header: Header?,
54+
val filterOptions: List<FilterOption>?,
55+
val list: List<ConversationItemGroup>,
56+
) {
57+
data class Header(
58+
val title: String,
59+
)
60+
}
61+
62+
typealias ListConversationsResult = ConversationsList
63+
64+
enum class TextInputType(val value: String) {
65+
TEXTAREA("textarea"),
66+
TEXTINPUT("textinput"),
67+
;
68+
69+
override fun toString(): String =
70+
name.lowercase()
71+
}
72+
73+
enum class ConversationAction(val value: String) {
74+
DELETE("delete"),
75+
EXPORT("markdown"),
76+
;
77+
78+
override fun toString(): String =
79+
name.lowercase()
80+
}
81+
data class ConversationClickParams(
82+
val id: String,
83+
val action: String?,
84+
) {
85+
companion object {
86+
fun create(id: String, action: ConversationAction): ConversationClickParams =
87+
ConversationClickParams(id, action.value)
88+
}
89+
}
90+
91+
data class ConversationClickResult(
92+
val id: String,
93+
val action: String?,
94+
val success: Boolean,
95+
) {
96+
companion object {
97+
fun create(id: String, action: ConversationAction, success: Boolean): ConversationClickResult =
98+
ConversationClickResult(id, action.value, success)
99+
}
100+
}
101+
102+
data class ListConversationsRequest(
103+
override val command: String,
104+
override val params: ListConversationsParams,
105+
) : ChatNotification<ListConversationsParams>
106+
107+
data class ConversationClickRequest(
108+
override val command: String,
109+
override val params: ConversationClickParams,
110+
) : ChatNotification<ConversationClickParams>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ const val PROMPT_INPUT_OPTIONS_CHANGE = "aws/chat/promptInputOptionChange"
1313
const val CHAT_PROMPT_OPTION_ACKNOWLEDGED = "chatPromptOptionAcknowledged"
1414
const val CHAT_FEEDBACK = "aws/chat/feedback"
1515
const val CHAT_FOLLOW_UP_CLICK = "aws/chat/followUpClick"
16+
const val CHAT_LIST_CONVERSATIONS = "aws/chat/listConversations"
17+
const val CHAT_CONVERSATION_CLICK = "aws/chat/conversationClick"
1618
const val CHAT_FILE_CLICK = "aws/chat/fileClick"
1719
const val CHAT_TAB_ADD = "aws/chat/tabAdd"
1820
const val CHAT_TAB_CHANGE = "aws/chat/tabChange"

0 commit comments

Comments
 (0)