Skip to content

Commit 0c844c1

Browse files
committed
merge conflicts resolved
2 parents e94681a + 25ee578 commit 0c844c1

File tree

23 files changed

+370
-287
lines changed

23 files changed

+370
-287
lines changed

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: 7 additions & 20 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
@@ -140,6 +139,7 @@ class BrowserConnector(
140139
// this is sent when the named agents UI is ready
141140
"ui-is-ready" -> {
142141
uiReady.complete(true)
142+
chatCommunicationManager.setUiReady()
143143
RunOnceUtil.runOnceForApp("AmazonQ-UI-Ready") {
144144
MeetQSettings.getInstance().reinvent2024OnboardingCount += 1
145145
}
@@ -324,6 +324,7 @@ class BrowserConnector(
324324
CHAT_READY -> {
325325
handleChatNotification<ChatReadyNotification, Unit>(node) { server, _ ->
326326
uiReady.complete(true)
327+
chatCommunicationManager.setUiReady()
327328
RunOnceUtil.runOnceForApp("AmazonQ-UI-Ready") {
328329
MeetQSettings.getInstance().reinvent2024OnboardingCount += 1
329330
}
@@ -349,7 +350,7 @@ class BrowserConnector(
349350
}
350351
CHAT_OPEN_TAB -> {
351352
val response = serializer.deserializeChatMessages<OpenTabResponse>(node)
352-
ChatCommunicationManager.completeTabOpen(
353+
chatCommunicationManager.completeTabOpen(
353354
response.requestId,
354355
response.params.result.tabId
355356
)
@@ -420,7 +421,7 @@ class BrowserConnector(
420421

421422
GET_SERIALIZED_CHAT_REQUEST_METHOD -> {
422423
val response = serializer.deserializeChatMessages<GetSerializedChatResponse>(node)
423-
ChatCommunicationManager.completeSerializedChatResponse(
424+
chatCommunicationManager.completeSerializedChatResponse(
424425
response.requestId,
425426
response.params.result.content
426427
)
@@ -464,22 +465,6 @@ class BrowserConnector(
464465
}
465466
cancelInflightRequests(stopResponseRequest.params.tabId)
466467
chatCommunicationManager.removePartialChatMessage(stopResponseRequest.params.tabId)
467-
468-
val paramsJson = Gson().toJson(
469-
// https://github.com/aws/language-servers/blob/1c0d88806087125b6fc561f610cc15e98127c6bf/server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts#L403
470-
ChatUiMessageParams(
471-
title = AwsCoreBundle.message("amazonqChat.stopChatResponse"),
472-
body = ""
473-
)
474-
)
475-
476-
val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat(
477-
command = SEND_CHAT_COMMAND_PROMPT,
478-
tabId = stopResponseRequest.params.tabId,
479-
params = paramsJson.toString(),
480-
isPartialResult = false
481-
)
482-
browser.postChat(uiMessage)
483468
}
484469
OPEN_SETTINGS -> {
485470
val openSettingsNotification = serializer.deserializeChatMessages<OpenSettingsNotification>(node)
@@ -512,6 +497,8 @@ class BrowserConnector(
512497
)
513498
browser.postChat(messageToChat)
514499
chatCommunicationManager.removeInflightRequestForTab(tabId)
500+
} catch (e: CancellationException) {
501+
LOG.warn { "Cancelled chat generation" }
515502
} catch (e: Exception) {
516503
LOG.error { "Failed to send chat message $e" }
517504
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: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,69 @@
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
910
import kotlinx.coroutines.runBlocking
11+
1012
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
1113
import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry
12-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
13-
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
1414
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector
1515
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
1616
import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter
1717
import software.aws.toolkits.jetbrains.services.cwc.controller.TestCommandMessage
1818

19+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
20+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
21+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams
22+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
23+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
24+
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
25+
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor
26+
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType
27+
28+
1929
// Register Editor Actions in the Editor Context Menu
2030
class ActionRegistrar {
2131

2232
private val _messages by lazy { MutableSharedFlow<AmazonQMessage>(extraBufferCapacity = 10) }
2333
val flow = _messages.asSharedFlow()
2434

2535
fun reportMessageClick(command: EditorContextCommand, project: Project) {
36+
2637
// language=JSON
27-
AmazonQToolWindow.sendTestMessage(project)
38+
// AmazonQToolWindow.sendTestMessage(project)
2839
//AsyncChatUiListener.notifyPartialMessageUpdate(a)
2940
// _messages.tryEmit(ContextMenuActionMessage(command, project))
3041
// runBlocking {
3142
// MessageConnector().publish(messageToPublish)
3243
// }
3344

45+
46+
if (command == EditorContextCommand.GenerateUnitTests) {
47+
// pre-existing old chat code path
48+
_messages.tryEmit(ContextMenuActionMessage(command, project))
49+
} else {
50+
// new agentic chat route
51+
ApplicationManager.getApplication().executeOnPooledThread {
52+
runBlocking {
53+
val contextExtractor = ActiveFileContextExtractor.create(fqnWebviewAdapter = null, project = project)
54+
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
55+
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
56+
var uiMessage: FlareUiMessage? = null
57+
if (command.verb != "sendToPrompt") {
58+
val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name)
59+
uiMessage = FlareUiMessage(command = "genericCommand", params = params)
60+
} else {
61+
val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU)
62+
uiMessage = FlareUiMessage(command = "sendToPrompt", params = params)
63+
}
64+
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
65+
}
66+
}
67+
}
68+
3469
}
3570

3671
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>

0 commit comments

Comments
 (0)