Skip to content

Commit d215249

Browse files
feat(amazonq): client emits linkClick events when user clicks links in chat (#5608)
* Set up Flare chat connection * Partial chat results * feedback * detekt * syntax error * detekt * detekt * Add quick actions to chat * adding commands from initialize result * added trace logging * link click events * feedback * rename * missing license --------- Co-authored-by: Manodnya Bhoite <[email protected]> Co-authored-by: manodnyab <[email protected]>
1 parent 489f028 commit d215249

File tree

5 files changed

+103
-1
lines changed

5 files changed

+103
-1
lines changed

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,36 @@ import kotlinx.coroutines.flow.distinctUntilChanged
1717
import kotlinx.coroutines.flow.launchIn
1818
import kotlinx.coroutines.flow.merge
1919
import kotlinx.coroutines.flow.onEach
20-
import kotlinx.coroutines.future.await
2120
import kotlinx.coroutines.launch
2221
import org.cef.browser.CefBrowser
2322
import org.eclipse.lsp4j.Position
2423
import org.eclipse.lsp4j.Range
2524
import software.aws.toolkits.jetbrains.services.amazonq.apps.AppConnection
2625
import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageSerializer
26+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
2727
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
2828
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
2929
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
3030
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier
31+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
32+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
3133
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
34+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK
35+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatNotification
3236
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatParams
3337
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
3438
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorState
3539
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
3640
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
41+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickNotification
42+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
43+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickNotification
44+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
3745
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest
3846
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
3947
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest
48+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickNotification
49+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickParams
4050
import software.aws.toolkits.jetbrains.services.amazonq.util.command
4151
import software.aws.toolkits.jetbrains.services.amazonq.util.tabType
4252
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.AmazonQTheme
@@ -205,6 +215,23 @@ class BrowserConnector(
205215

206216
showResult(result, partialResultToken, tabId, encryptionManager, browser)
207217
}
218+
CHAT_LINK_CLICK -> {
219+
handleChatNotification<LinkClickNotification, LinkClickParams>(node) { server, params ->
220+
server.linkClick(params)
221+
}
222+
}
223+
224+
CHAT_INFO_LINK_CLICK -> {
225+
handleChatNotification<InfoLinkClickNotification, InfoLinkClickParams>(node) { server, params ->
226+
server.infoLinkClick(params)
227+
}
228+
}
229+
230+
CHAT_SOURCE_LINK_CLICK -> {
231+
handleChatNotification<SourceLinkClickNotification, SourceLinkClickParams>(node) { server, params ->
232+
server.sourceLinkClick(params)
233+
}
234+
}
208235
}
209236
}
210237

@@ -226,4 +253,14 @@ class BrowserConnector(
226253
browser.postChat(messageToChat)
227254
}
228255
}
256+
257+
private inline fun <reified T, R> handleChatNotification(
258+
node: JsonNode,
259+
crossinline serverAction: (server: AmazonQLanguageServer, params: R) -> CompletableFuture<*>,
260+
): CompletableFuture<*> where T : ChatNotification<R> {
261+
val requestFromUi = serializer.deserializeChatMessages<T>(node)
262+
return AmazonQLspService.executeIfRunning(project) { server ->
263+
serverAction(server, requestFromUi.params)
264+
} ?: CompletableFuture.failedFuture<Unit>(IllegalStateException("LSP Server not running"))
265+
}
229266
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,16 @@ import org.eclipse.lsp4j.services.LanguageServer
1010
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.GetConfigurationFromServerParams
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.UpdateConfigurationParams
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
1315
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
16+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK
1417
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
1518
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
19+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
20+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
1621
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
22+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SourceLinkClickParams
1723
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
1824
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams
1925
import java.util.concurrent.CompletableFuture
@@ -43,4 +49,13 @@ interface AmazonQLanguageServer : LanguageServer {
4349

4450
@JsonRequest(CHAT_QUICK_ACTION)
4551
fun sendQuickAction(params: EncryptedQuickActionChatParams): CompletableFuture<String>
52+
53+
@JsonNotification(CHAT_LINK_CLICK)
54+
fun linkClick(params: LinkClickParams): CompletableFuture<Unit>
55+
56+
@JsonNotification(CHAT_INFO_LINK_CLICK)
57+
fun infoLinkClick(params: InfoLinkClickParams): CompletableFuture<Unit>
58+
59+
@JsonNotification(CHAT_SOURCE_LINK_CLICK)
60+
fun sourceLinkClick(params: SourceLinkClickParams): CompletableFuture<Unit>
4661
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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+
interface ChatNotification<T> {
7+
val command: String
8+
val params: T
9+
}

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

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

66
const val SEND_CHAT_COMMAND_PROMPT = "aws/chat/sendChatPrompt"
77
const val CHAT_QUICK_ACTION = "aws/chat/sendChatQuickAction"
8+
const val CHAT_LINK_CLICK = "aws/chat/linkClick"
9+
const val CHAT_INFO_LINK_CLICK = "aws/chat/infoLinkClick"
10+
const val CHAT_SOURCE_LINK_CLICK = "aws/chat/sourceLinkClick"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
4+
5+
data class InfoLinkClickNotification(
6+
override val command: String,
7+
override val params: InfoLinkClickParams,
8+
) : ChatNotification<InfoLinkClickParams>
9+
10+
data class SourceLinkClickNotification(
11+
override val command: String,
12+
override val params: SourceLinkClickParams,
13+
) : ChatNotification<SourceLinkClickParams>
14+
15+
data class LinkClickNotification(
16+
override val command: String,
17+
override val params: LinkClickParams,
18+
) : ChatNotification<LinkClickParams>
19+
20+
data class InfoLinkClickParams(
21+
val tabId: String,
22+
val link: String,
23+
val eventId: String? = null,
24+
)
25+
26+
data class LinkClickParams(
27+
val tabId: String,
28+
val link: String,
29+
val eventId: String? = null,
30+
val messageId: String,
31+
)
32+
33+
data class SourceLinkClickParams(
34+
val tabId: String,
35+
val link: String,
36+
val eventId: String? = null,
37+
val messageId: String,
38+
)

0 commit comments

Comments
 (0)