Skip to content

Commit 1058210

Browse files
Merge branch 'feature/q-lsp-chat' into samgst/q-lsp-telemetry
2 parents 6b30379 + 694c49b commit 1058210

File tree

27 files changed

+454
-356
lines changed

27 files changed

+454
-356
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix UI freezes that may occur when interacting with large files in the editor"
4+
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ package software.aws.toolkits.jetbrains.services.amazonq.toolwindow
55

66
import com.intellij.idea.AppMode
77
import com.intellij.openapi.Disposable
8-
import com.intellij.openapi.application.ApplicationManager
9-
import com.intellij.openapi.application.runInEdt
108
import com.intellij.openapi.components.service
119
import com.intellij.openapi.project.Project
1210
import com.intellij.openapi.util.Disposer
@@ -19,12 +17,15 @@ import com.intellij.ui.dsl.builder.AlignY
1917
import com.intellij.ui.dsl.builder.panel
2018
import com.intellij.ui.jcef.JBCefApp
2119
import kotlinx.coroutines.CoroutineScope
20+
import kotlinx.coroutines.flow.first
2221
import kotlinx.coroutines.launch
23-
import kotlinx.coroutines.runBlocking
22+
import kotlinx.coroutines.withContext
23+
import software.aws.toolkits.jetbrains.core.coroutines.EDT
2424
import software.aws.toolkits.jetbrains.isDeveloperMode
2525
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
2626
import software.aws.toolkits.jetbrains.services.amazonq.apps.AppConnection
2727
import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry
28+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
2829
import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager
2930
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
3031
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
@@ -109,17 +110,21 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
109110
webviewContainer.add(wrapper)
110111
wrapper.setContent(loadingPanel)
111112

112-
ApplicationManager.getApplication().executeOnPooledThread {
113-
val webUri = runBlocking { service<ArtifactManager>().fetchArtifact(project).resolve("amazonq-ui.js").toUri() }
114-
loadingPanel.stopLoading()
115-
runInEdt {
113+
scope.launch {
114+
val webUri = service<ArtifactManager>().fetchArtifact(project).resolve("amazonq-ui.js").toUri()
115+
// wait for server to be running
116+
AmazonQLspService.getInstance(project).instanceFlow.first()
117+
118+
withContext(EDT) {
116119
browser.complete(
117-
Browser(this, webUri, project).also {
120+
Browser(this@AmazonQPanel, webUri, project).also {
118121
wrapper.setContent(it.component())
119122

120123
initConnections()
121124
connectUi(it)
122125
connectApps(it)
126+
127+
loadingPanel.stopLoading()
123128
}
124129
)
125130
}

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

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.intellij.openapi.util.Disposer
1111
import com.intellij.ui.jcef.JBCefJSQuery
1212
import org.cef.CefApp
1313
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
14-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1514
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
1615
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
1716
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
@@ -46,17 +45,16 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project)
4645
"mynah",
4746
AssetResourceHandler.AssetResourceHandlerFactory(),
4847
)
49-
AmazonQLspService.getInstance(project).addLspInitializeMessageListener {
50-
loadWebView(
51-
isCodeTransformAvailable,
52-
isFeatureDevAvailable,
53-
isDocAvailable,
54-
isCodeScanAvailable,
55-
isCodeTestAvailable,
56-
highlightCommand,
57-
activeProfile
58-
)
59-
}
48+
49+
loadWebView(
50+
isCodeTransformAvailable,
51+
isFeatureDevAvailable,
52+
isDocAvailable,
53+
isCodeScanAvailable,
54+
isCodeTestAvailable,
55+
highlightCommand,
56+
activeProfile
57+
)
6058
}
6159

6260
override fun dispose() {

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

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.intellij.openapi.fileEditor.FileEditorManager
1212
import com.intellij.openapi.options.ShowSettingsUtil
1313
import com.intellij.openapi.project.Project
1414
import com.intellij.ui.jcef.JBCefJSQuery.Response
15+
import kotlinx.coroutines.CancellationException
1516
import kotlinx.coroutines.CompletableDeferred
1617
import kotlinx.coroutines.channels.awaitClose
1718
import kotlinx.coroutines.coroutineScope
@@ -65,7 +66,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatN
6566
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatParams
6667
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
6768
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatReadyNotification
68-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatUiMessageParams
6969
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ConversationClickRequest
7070
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardNotification
7171
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams
@@ -117,7 +117,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.AmazonQThe
117117
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.ThemeBrowserAdapter
118118
import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererConfigurable
119119
import software.aws.toolkits.jetbrains.settings.MeetQSettings
120-
import software.aws.toolkits.resources.AwsCoreBundle
121120
import software.aws.toolkits.telemetry.MetricResult
122121
import software.aws.toolkits.telemetry.Telemetry
123122
import java.util.concurrent.CompletableFuture
@@ -469,22 +468,6 @@ class BrowserConnector(
469468
}
470469
cancelInflightRequests(stopResponseRequest.params.tabId)
471470
chatCommunicationManager.removePartialChatMessage(stopResponseRequest.params.tabId)
472-
473-
val paramsJson = Gson().toJson(
474-
// https://github.com/aws/language-servers/blob/1c0d88806087125b6fc561f610cc15e98127c6bf/server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts#L403
475-
ChatUiMessageParams(
476-
title = AwsCoreBundle.message("amazonqChat.stopChatResponse"),
477-
body = ""
478-
)
479-
)
480-
481-
val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat(
482-
command = SEND_CHAT_COMMAND_PROMPT,
483-
tabId = stopResponseRequest.params.tabId,
484-
params = paramsJson.toString(),
485-
isPartialResult = false
486-
)
487-
browser.postChat(uiMessage)
488471
}
489472
OPEN_SETTINGS -> {
490473
val openSettingsNotification = serializer.deserializeChatMessages<OpenSettingsNotification>(node)
@@ -522,6 +505,8 @@ class BrowserConnector(
522505
)
523506
browser.postChat(messageToChat)
524507
chatCommunicationManager.removeInflightRequestForTab(tabId)
508+
} catch (e: CancellationException) {
509+
LOG.warn { "Cancelled chat generation" }
525510
} catch (e: Exception) {
526511
LOG.error { "Failed to send chat message $e" }
527512
browser.postChat(chatCommunicationManager.getErrorUiMessage(tabId, e, partialResultToken))

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevExceptions.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ class GuardrailsException(operation: String, desc: String?, cause: Throwable? =
8282
class PromptRefusalException(operation: String, desc: String?, cause: Throwable? = null) :
8383
ClientException(message("amazonqFeatureDev.exception.prompt_refusal"), operation, desc, cause)
8484

85+
class FileCreationFailedException(operation: String, desc: String?, cause: Throwable? = null) :
86+
ServiceException(message("amazonqFeatureDev.exception.failed_generation"), operation, desc, cause)
87+
8588
class ThrottlingException(operation: String, desc: String?, cause: Throwable? = null) :
8689
ClientException(message("amazonqFeatureDev.exception.throttling"), operation, desc, cause)
8790

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/session/CodeGenerationState.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.EmptyPatchExce
1313
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FEATURE_NAME
1414
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FeatureDevException
1515
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FeatureDevOperation
16+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FileCreationFailedException
1617
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.GuardrailsException
1718
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.NoChangeRequiredException
1819
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PromptRefusalException
@@ -261,6 +262,10 @@ private suspend fun CodeGenerationState.generateCode(
261262
codeGenerationResultState.codeGenerationStatusDetail()?.contains(
262263
"EmptyPatch",
263264
),
265+
-> throw FileCreationFailedException(operation = FeatureDevOperation.GenerateCode.toString(), desc = "File creation failed")
266+
codeGenerationResultState.codeGenerationStatusDetail()?.contains(
267+
"FileCreationFailed",
268+
),
264269
-> {
265270
if (codeGenerationResultState.codeGenerationStatusDetail().contains("NO_CHANGE_REQUIRED")) {
266271
throw NoChangeRequiredException(operation = FeatureDevOperation.GenerateCode.toString(), desc = "No change required")

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@
33

44
package software.aws.toolkits.jetbrains.services.cwc.commands
55

6+
import com.intellij.openapi.application.ApplicationManager
67
import com.intellij.openapi.project.Project
78
import kotlinx.coroutines.flow.MutableSharedFlow
89
import kotlinx.coroutines.flow.asSharedFlow
10+
import kotlinx.coroutines.runBlocking
11+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
12+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
15+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
916
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
17+
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor
18+
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType
1019

1120
// Register Editor Actions in the Editor Context Menu
1221
class ActionRegistrar {
@@ -15,7 +24,28 @@ class ActionRegistrar {
1524
val flow = _messages.asSharedFlow()
1625

1726
fun reportMessageClick(command: EditorContextCommand, project: Project) {
18-
_messages.tryEmit(ContextMenuActionMessage(command, project))
27+
if (command == EditorContextCommand.GenerateUnitTests) {
28+
// pre-existing old chat code path
29+
_messages.tryEmit(ContextMenuActionMessage(command, project))
30+
} else {
31+
// new agentic chat route
32+
ApplicationManager.getApplication().executeOnPooledThread {
33+
runBlocking {
34+
val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project)
35+
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
36+
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
37+
var uiMessage: FlareUiMessage? = null
38+
if (command.verb != "sendToPrompt") {
39+
val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name)
40+
uiMessage = FlareUiMessage(command = "genericCommand", params = params)
41+
} else {
42+
val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU)
43+
uiMessage = FlareUiMessage(command = "sendToPrompt", params = params)
44+
}
45+
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
46+
}
47+
}
48+
}
1949
}
2050

2151
fun reportMessageClick(command: EditorContextCommand, issue: MutableMap<String, String>, project: Project) {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/EditorContextCommand.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ enum class EditorContextCommand(
3131
actionId = "aws.amazonq.generateUnitTests",
3232
),
3333
SendToPrompt(
34-
verb = "SendToPrompt",
34+
verb = "sendToPrompt",
3535
actionId = "aws.amazonq.sendToPrompt",
3636
),
3737
ExplainCodeScanIssue(

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -289,28 +289,11 @@ class ChatController private constructor(
289289
if (message.project != context.project) {
290290
return
291291
}
292-
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
293-
val triggerId = UUID.randomUUID().toString()
294-
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
295-
296-
if (message.command == EditorContextCommand.SendToPrompt) {
297-
messagePublisher.publish(
298-
EditorContextCommandMessage(
299-
message = codeSelection,
300-
command = message.command.actionId,
301-
triggerId = triggerId,
302-
),
303-
)
304-
return
305-
}
292+
306293
if (message.command == EditorContextCommand.GenerateUnitTests) {
307294
// Publish an event to "codetest" tab with command as "test" and type as "addAnswer"
308295
val messageToPublish = TestCommandMessage()
309296
context.messagesFromAppToUi.publish(messageToPublish)
310-
} else {
311-
// Create prompt
312-
val prompt = "${message.command} the following part of my code for me: $codeSelection"
313-
processPromptActions(prompt, message, triggerId, fileContext)
314297
}
315298
}
316299

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@ import org.eclipse.lsp4j.services.LanguageClient
99
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny
1010
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_CONTEXT_COMMANDS
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE
12-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatUpdateParams
1312
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
14-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
1513
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
1614
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIFF
1715
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
18-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams
1916
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
2017
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD
2118
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
@@ -32,16 +29,16 @@ interface AmazonQLanguageClient : LanguageClient {
3229
fun getConnectionMetadata(): CompletableFuture<ConnectionMetadata>
3330

3431
@JsonRequest("aws/chat/openTab")
35-
fun openTab(params: OpenTabParams): CompletableFuture<OpenTabResult>
32+
fun openTab(params: LSPAny): CompletableFuture<OpenTabResult>
3633

3734
@JsonRequest(SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD)
3835
fun showSaveFileDialog(params: ShowSaveFileDialogParams): CompletableFuture<ShowSaveFileDialogResult>
3936

4037
@JsonRequest(GET_SERIALIZED_CHAT_REQUEST_METHOD)
41-
fun getSerializedChat(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult>
38+
fun getSerializedChat(params: LSPAny): CompletableFuture<GetSerializedChatResult>
4239

4340
@JsonNotification(CHAT_SEND_UPDATE)
44-
fun sendChatUpdate(params: ChatUpdateParams): CompletableFuture<Unit>
41+
fun sendChatUpdate(params: LSPAny): CompletableFuture<Unit>
4542

4643
@JsonNotification(OPEN_FILE_DIFF)
4744
fun openFileDiff(params: OpenFileDiffParams): CompletableFuture<Unit>

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny
3838
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_OPEN_TAB
3939
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_CONTEXT_COMMANDS
4040
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_SEND_UPDATE
41-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatUpdateParams
4241
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
43-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
4442
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
4543
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
46-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams
4744
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
4845
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
4946
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult
@@ -169,7 +166,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
169166
}
170167
}
171168

172-
override fun openTab(params: OpenTabParams): CompletableFuture<OpenTabResult> {
169+
override fun openTab(params: LSPAny): CompletableFuture<OpenTabResult> {
173170
val requestId = UUID.randomUUID().toString()
174171
val result = CompletableFuture<OpenTabResult>()
175172
val chatManager = ChatCommunicationManager.getInstance(project)
@@ -221,7 +218,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
221218
)
222219
}
223220

224-
override fun getSerializedChat(params: GetSerializedChatParams): CompletableFuture<GetSerializedChatResult> {
221+
override fun getSerializedChat(params: LSPAny): CompletableFuture<GetSerializedChatResult> {
225222
val requestId = UUID.randomUUID().toString()
226223
val result = CompletableFuture<GetSerializedChatResult>()
227224
val chatManager = ChatCommunicationManager.getInstance(project)
@@ -296,7 +293,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
296293
}
297294
}
298295

299-
override fun sendChatUpdate(params: ChatUpdateParams): CompletableFuture<Unit> {
296+
override fun sendChatUpdate(params: LSPAny): CompletableFuture<Unit> {
300297
AsyncChatUiListener.notifyPartialMessageUpdate(
301298
FlareUiMessage(
302299
command = CHAT_SEND_UPDATE,
@@ -380,7 +377,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
380377
chatManager.notifyUi(
381378
FlareUiMessage(
382379
command = CHAT_SEND_CONTEXT_COMMANDS,
383-
params = params ?: error("received empty payload for $CHAT_SEND_CONTEXT_COMMANDS"),
380+
params = params,
384381
)
385382
)
386383
return CompletableFuture.completedFuture(Unit)

0 commit comments

Comments
 (0)