Skip to content

Commit 3661d25

Browse files
authored
Merge branch 'feature/q-lsp-chat' into rli/fix-history-restore
2 parents ebf94f9 + f72b7db commit 3661d25

File tree

7 files changed

+70
-38
lines changed

7 files changed

+70
-38
lines changed

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
@@ -114,7 +114,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.AmazonQThe
114114
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.ThemeBrowserAdapter
115115
import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererConfigurable
116116
import software.aws.toolkits.jetbrains.settings.MeetQSettings
117-
import software.aws.toolkits.resources.AwsCoreBundle
118117
import software.aws.toolkits.telemetry.MetricResult
119118
import software.aws.toolkits.telemetry.Telemetry
120119
import java.util.concurrent.CompletableFuture
@@ -466,22 +465,6 @@ class BrowserConnector(
466465
}
467466
cancelInflightRequests(stopResponseRequest.params.tabId)
468467
chatCommunicationManager.removePartialChatMessage(stopResponseRequest.params.tabId)
469-
470-
val paramsJson = Gson().toJson(
471-
// https://github.com/aws/language-servers/blob/1c0d88806087125b6fc561f610cc15e98127c6bf/server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts#L403
472-
ChatUiMessageParams(
473-
title = AwsCoreBundle.message("amazonqChat.stopChatResponse"),
474-
body = ""
475-
)
476-
)
477-
478-
val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat(
479-
command = SEND_CHAT_COMMAND_PROMPT,
480-
tabId = stopResponseRequest.params.tabId,
481-
params = paramsJson.toString(),
482-
isPartialResult = false
483-
)
484-
browser.postChat(uiMessage)
485468
}
486469
OPEN_SETTINGS -> {
487470
val openSettingsNotification = serializer.deserializeChatMessages<OpenSettingsNotification>(node)
@@ -514,6 +497,8 @@ class BrowserConnector(
514497
)
515498
browser.postChat(messageToChat)
516499
chatCommunicationManager.removeInflightRequestForTab(tabId)
500+
} catch (e: CancellationException) {
501+
LOG.warn { "Cancelled chat generation" }
517502
} catch (e: Exception) {
518503
LOG.error { "Failed to send chat message $e" }
519504
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

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
// https://github.com/aws/language-server-runtimes/blob/main/chat-client-ui-types/src/uiContracts.ts#L27
7+
enum class TriggerType(val value: String) {
8+
HOTKEYS("hotkeys"),
9+
CLICK("click"),
10+
CONTEXT_MENU("contextMenu"),
11+
}
12+
13+
data class GenericCommandParams(
14+
val tabId: String? = null,
15+
val selection: String,
16+
val triggerType: TriggerType,
17+
val genericCommand: String,
18+
)
19+
20+
// https://github.com/aws/language-server-runtimes/blob/b7c4718b9bd84e08e72b992da5d699549af9f115/chat-client-ui-types/src/uiContracts.ts#L67
21+
data class SendToPromptParams(
22+
val selection: String,
23+
val triggerType: TriggerType,
24+
val prompt: ChatPrompt? = null,
25+
val autoSubmit: Boolean? = null,
26+
)

0 commit comments

Comments
 (0)