Skip to content

Commit bd85256

Browse files
committed
Merge branch 'feature/q-lsp-chat' into samgst/q-lsp-chat-sendChatUpdate
# Conflicts: # plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt
2 parents 2e9cdda + 81b4d79 commit bd85256

File tree

10 files changed

+131
-43
lines changed

10 files changed

+131
-43
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Butto
3434
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams
3535
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickResult
3636
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_BUTTON_CLICK
37+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_COPY_CODE_TO_CLIPBOARD
3738
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK
3839
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK
3940
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
41+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR
4042
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
4143
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_PROMPT_OPTION_ACKNOWLEDGED
4244
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
@@ -49,6 +51,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatN
4951
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatParams
5052
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
5153
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatReadyNotification
54+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardNotification
55+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams
5256
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorState
5357
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
5458
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
@@ -58,6 +62,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Follo
5862
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams
5963
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickNotification
6064
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
65+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionNotification
66+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
6167
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickNotification
6268
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
6369
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE
@@ -261,6 +267,11 @@ class BrowserConnector(
261267
server.tabChange(params)
262268
}
263269
}
270+
CHAT_INSERT_TO_CURSOR -> {
271+
handleChatNotification<InsertToCursorPositionNotification, InsertToCursorPositionParams>(node) { server, params ->
272+
server.insertToCursorPosition(params)
273+
}
274+
}
264275
CHAT_LINK_CLICK -> {
265276
handleChatNotification<LinkClickNotification, LinkClickParams>(node) { server, params ->
266277
server.linkClick(params)
@@ -307,6 +318,11 @@ class BrowserConnector(
307318
}
308319
}
309320
}
321+
CHAT_COPY_CODE_TO_CLIPBOARD -> {
322+
handleChatNotification<CopyCodeToClipboardNotification, CopyCodeToClipboardParams>(node) { server, params ->
323+
server.copyCodeToClipboard(params)
324+
}
325+
}
310326
}
311327
}
312328

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,13 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
109109
optOutTelemetry = AwsSettings.getInstance().isTelemetryEnabled,
110110
customization = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn,
111111
// local context
112-
enableLocalIndexing = qSettings.isProjectContextEnabled(),
113-
indexWorkerThreads = qSettings.getProjectContextIndexThreadCount(),
114-
enableGpuAcceleration = qSettings.isProjectContextGpu(),
115-
localIndexing = LocalIndexingConfiguration(
116-
maxIndexSizeMB = qSettings.getProjectContextIndexMaxSize()
112+
projectContext = ProjectContextConfiguration(
113+
enableLocalIndexing = qSettings.isProjectContextEnabled(),
114+
indexWorkerThreads = qSettings.getProjectContextIndexThreadCount(),
115+
enableGpuAcceleration = qSettings.isProjectContextGpu(),
116+
localIndexing = LocalIndexingConfiguration(
117+
maxIndexSizeMB = qSettings.getProjectContextIndexMaxSize()
118+
)
117119
)
118120
)
119121
)

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,25 @@ 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_COPY_CODE_TO_CLIPBOARD_NOTIFICATION
1617
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FEEDBACK
1718
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_FOLLOW_UP_CLICK
1819
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INFO_LINK_CLICK
20+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_INSERT_TO_CURSOR_NOTIFICATION
1921
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_LINK_CLICK
2022
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_QUICK_ACTION
2123
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_READY
2224
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SOURCE_LINK_CLICK
2325
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_ADD
2426
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_CHANGE
2527
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_TAB_REMOVE
28+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams
2629
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams
2730
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams
2831
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackParams
2932
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FollowUpClickParams
3033
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InfoLinkClickParams
34+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.InsertToCursorPositionParams
3135
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LinkClickParams
3236
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMPT_INPUT_OPTIONS_CHANGE
3337
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PromptInputOptionChangeParams
@@ -61,6 +65,9 @@ interface AmazonQLanguageServer : LanguageServer {
6165
@JsonRequest(SEND_CHAT_COMMAND_PROMPT)
6266
fun sendChatPrompt(params: EncryptedChatParams): CompletableFuture<String>
6367

68+
@JsonNotification(CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION)
69+
fun copyCodeToClipboard(params: CopyCodeToClipboardParams): CompletableFuture<Unit>
70+
6471
@JsonNotification(CHAT_TAB_ADD)
6572
fun tabAdd(params: TabEventParams): CompletableFuture<Unit>
6673

@@ -73,6 +80,9 @@ interface AmazonQLanguageServer : LanguageServer {
7380
@JsonRequest(CHAT_QUICK_ACTION)
7481
fun sendQuickAction(params: EncryptedQuickActionChatParams): CompletableFuture<String>
7582

83+
@JsonNotification(CHAT_INSERT_TO_CURSOR_NOTIFICATION)
84+
fun insertToCursorPosition(params: InsertToCursorPositionParams): CompletableFuture<Unit>
85+
7686
@JsonNotification(CHAT_FEEDBACK)
7787
fun feedback(params: FeedbackParams): CompletableFuture<Unit>
7888

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ data class AmazonQLspConfiguration(
1515
@SerializedName(AmazonQLspConstants.LSP_CUSTOMIZATION_CONFIGURATION_KEY)
1616
val customization: String? = null,
1717

18+
val projectContext: ProjectContextConfiguration? = null,
19+
)
20+
21+
data class ProjectContextConfiguration(
1822
val enableLocalIndexing: Boolean? = null,
1923

2024
val enableGpuAcceleration: Boolean? = null,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ object AmazonQLspConstants {
1313
const val LSP_ENABLE_TELEMETRY_EVENTS_CONFIGURATION_KEY = "enableTelemetryEventsToDestination"
1414
const val LSP_CUSTOMIZATION_CONFIGURATION_KEY = "customization"
1515
const val LSP_WORKSPACE_CONTEXT_ENABLED_KEY = "workspaceContext"
16+
const val LSP_PROJECT_CONTEXT_KEY = "projectContext"
1617
}

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
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

6+
import com.google.gson.Gson
67
import com.google.gson.ToNumberPolicy
78
import com.intellij.execution.configurations.GeneralCommandLine
89
import com.intellij.execution.impl.ExecutionManagerImpl
@@ -43,7 +44,7 @@ import org.eclipse.lsp4j.WorkspaceClientCapabilities
4344
import org.eclipse.lsp4j.jsonrpc.Launcher
4445
import org.eclipse.lsp4j.jsonrpc.Launcher.Builder
4546
import org.eclipse.lsp4j.jsonrpc.MessageConsumer
46-
import org.eclipse.lsp4j.jsonrpc.messages.Message
47+
import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage
4748
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
4849
import org.eclipse.lsp4j.launch.LSPLauncher
4950
import org.slf4j.event.Level
@@ -56,6 +57,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.auth.DefaultAuthCred
5657
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.DefaultModuleDependenciesService
5758
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
5859
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AmazonQLspTypeAdapterFactory
60+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
5961
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsExtendedInitializeResult
6062
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
6163
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata
@@ -287,6 +289,16 @@ private class AmazonQServerInstance(private val project: Project, private val cs
287289
AwsServerCapabilitiesProvider.getInstance(project).setAwsServerCapabilities(result.getAwsServerCapabilities())
288290
AmazonQLspService.getInstance(project).notifyInitializeMessageReceived()
289291
}
292+
if (message is NotificationMessage && message.method == "aws/chat/sendContextCommands") {
293+
val showContextCommands = """
294+
{
295+
"command":"aws/chat/sendContextCommands",
296+
"params": ${Gson().toJson(message.params)}
297+
}
298+
""".trimIndent()
299+
300+
AsyncChatUiListener.notifyPartialMessageUpdate(showContextCommands)
301+
}
290302
consumer?.consume(message)
291303
}
292304
}
@@ -373,18 +385,6 @@ private class AmazonQServerInstance(private val project: Project, private val cs
373385
}
374386
}
375387

376-
class MessageTracer {
377-
private val traceLogger = LOG.atLevel(if (isDeveloperMode()) Level.INFO else Level.DEBUG)
378-
379-
fun trace(direction: String, message: Message) {
380-
traceLogger.log {
381-
buildString {
382-
append("$direction: ")
383-
append(message.toString())
384-
}
385-
}
386-
}
387-
}
388388
companion object {
389389
private val LOG = getLogger<AmazonQServerInstance>()
390390
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
data class CopyCodeToClipboardNotification(
7+
override val command: String,
8+
override val params: CopyCodeToClipboardParams,
9+
) : ChatNotification<CopyCodeToClipboardParams>
10+
11+
data class CopyCodeToClipboardParams(
12+
val tabId: String,
13+
val messageId: String,
14+
val code: String? = null,
15+
val type: String? = null,
16+
val referenceTrackerInformation: List<ReferenceTrackerInformation>? = null,
17+
val eventId: String? = null,
18+
val codeBlockIndex: Int? = null,
19+
val totalCodeBlocks: Int? = null,
20+
)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,8 @@ const val CHAT_TAB_CHANGE = "aws/chat/tabChange"
1818
const val CHAT_TAB_REMOVE = "aws/chat/tabRemove"
1919
const val CHAT_OPEN_TAB = "aws/chat/openTab"
2020
const val CHAT_BUTTON_CLICK = "aws/chat/buttonClick"
21+
const val CHAT_COPY_CODE_TO_CLIPBOARD = "copyToClipboard"
22+
const val CHAT_COPY_CODE_TO_CLIPBOARD_NOTIFICATION = "aws/chat/copyCodeToClipboard"
23+
const val CHAT_INSERT_TO_CURSOR = "insertToCursorPosition"
24+
const val CHAT_INSERT_TO_CURSOR_NOTIFICATION = "aws/chat/insertToCursorPosition"
2125
const val CHAT_SEND_UPDATE = "aws/chat/sendChatUpdate"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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+
import org.eclipse.lsp4j.Position
7+
import org.eclipse.lsp4j.TextDocumentIdentifier
8+
9+
data class InsertToCursorPositionNotification(
10+
override val command: String,
11+
override val params: InsertToCursorPositionParams,
12+
) : ChatNotification<InsertToCursorPositionParams>
13+
14+
data class InsertToCursorPositionParams(
15+
val tabId: String,
16+
val messageId: String,
17+
val cursorPosition: Position? = null,
18+
val textDocument: TextDocumentIdentifier? = null,
19+
val code: String? = null,
20+
val type: String? = null,
21+
val referenceTrackerInformation: List<ReferenceTrackerInformation>? = null,
22+
val eventId: String? = null,
23+
val codeBlockIndex: Int? = null,
24+
val totalCodeBlocks: Int? = null,
25+
)

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,13 @@ class AmazonQLanguageClientImplTest {
180180
AmazonQLspConfiguration(
181181
optOutTelemetry = telemetryEnabled,
182182
customization = customizationArn,
183-
enableLocalIndexing = enableIndexing,
184-
enableGpuAcceleration = enableGpu,
185-
indexWorkerThreads = workerThreads,
186-
localIndexing = LocalIndexingConfiguration(
187-
maxIndexSizeMB = indexSize,
183+
projectContext = ProjectContextConfiguration(
184+
enableLocalIndexing = enableIndexing,
185+
enableGpuAcceleration = enableGpu,
186+
indexWorkerThreads = workerThreads,
187+
localIndexing = LocalIndexingConfiguration(
188+
maxIndexSizeMB = indexSize,
189+
)
188190
)
189191
)
190192
)
@@ -196,14 +198,16 @@ class AmazonQLanguageClientImplTest {
196198
optOutTelemetry = true,
197199
enableTelemetryEvents = true,
198200
customization = "arn",
199-
enableLocalIndexing = true,
200-
enableGpuAcceleration = true,
201-
indexWorkerThreads = 123,
202-
localIndexing = LocalIndexingConfiguration(
203-
maxFileSizeMB = 789,
204-
maxIndexSizeMB = 456,
205-
indexCacheDirPath = "/a/path",
206-
ignoreFilePatterns = listOf("ignore", "patterns")
201+
projectContext = ProjectContextConfiguration(
202+
enableLocalIndexing = true,
203+
enableGpuAcceleration = true,
204+
indexWorkerThreads = 123,
205+
localIndexing = LocalIndexingConfiguration(
206+
maxFileSizeMB = 789,
207+
maxIndexSizeMB = 456,
208+
indexCacheDirPath = "/a/path",
209+
ignoreFilePatterns = listOf("ignore", "patterns")
210+
)
207211
)
208212
)
209213

@@ -214,17 +218,19 @@ class AmazonQLanguageClientImplTest {
214218
"optOutTelemetry": true,
215219
"enableTelemetryEventsToDestination": true,
216220
"customization": "arn",
217-
"enableLocalIndexing": true,
218-
"enableGpuAcceleration": true,
219-
"indexWorkerThreads": 123,
220-
"localIndexing": {
221-
"ignoreFilePatterns": [
222-
"ignore",
223-
"patterns"
224-
],
225-
"maxFileSizeMB": 789,
226-
"maxIndexSizeMB": 456,
227-
"indexCacheDirPath": "/a/path"
221+
"projectContext": {
222+
"enableLocalIndexing": true,
223+
"enableGpuAcceleration": true,
224+
"indexWorkerThreads": 123,
225+
"localIndexing": {
226+
"ignoreFilePatterns": [
227+
"ignore",
228+
"patterns"
229+
],
230+
"maxFileSizeMB": 789,
231+
"maxIndexSizeMB": 456,
232+
"indexCacheDirPath": "/a/path"
233+
}
228234
}
229235
}
230236
""".trimIndent()

0 commit comments

Comments
 (0)