Skip to content

Commit 2e0fdf7

Browse files
andrewyuqmanodnyab
andauthored
feat(amazonq): Inline E2E flow using flare (#5629)
* Inline E2E flow using flare * Add accept, reject and discard hooks * clean up codebase * fix perceivedLatency * fix userInput and remove unused code * remove not needed methods and fields * detekt * remvoe IDE auto trigger logic * fix tests * remove debug options * fix tests in lsp * address comments and further remove no longer used logic * fix tests * fix tests * fix tests * fix tests * remove debug options --------- Co-authored-by: manodnyab <[email protected]>
1 parent ee32a9d commit 2e0fdf7

File tree

118 files changed

+937
-9487
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+937
-9487
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeScan/controller/CodeScanChatHelper.kt

-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import software.aws.toolkits.jetbrains.services.amazonqCodeScan.messages.CodeSca
1111
import software.aws.toolkits.jetbrains.services.amazonqCodeScan.messages.CodeScanChatMessageContent
1212
import software.aws.toolkits.jetbrains.services.amazonqCodeScan.messages.UpdatePlaceholderMessage
1313
import software.aws.toolkits.jetbrains.services.amazonqCodeScan.storage.ChatSessionStorage
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
15-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
1614
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
1715
import java.util.UUID
1816

@@ -36,7 +34,6 @@ class CodeScanChatHelper(
3634
clearPreviousItemButtons: Boolean? = false,
3735
) {
3836
if (isInValidSession()) return
39-
broadcastQEvent(QFeatureEvent.INVOCATION)
4037
messagePublisher.publish(
4138
CodeScanChatMessage(
4239
tabId = activeCodeScanTabId as String,

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt

+17-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ import software.aws.toolkits.jetbrains.core.coroutines.EDT
5454
import software.aws.toolkits.jetbrains.core.credentials.sono.isInternalUser
5555
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
5656
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
57+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReference
58+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReferencePosition
5759
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
5860
import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument
5961
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.CodeWhispererUTGChatManager
@@ -74,8 +76,6 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendA
7476
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
7577
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7678
import software.aws.toolkits.jetbrains.services.codewhisperer.language.programmingLanguage
77-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
78-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
7979
import software.aws.toolkits.jetbrains.services.codewhisperer.toolwindow.CodeWhispererCodeReferenceManager
8080
import software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin
8181
import software.aws.toolkits.jetbrains.services.cwc.ChatConstants
@@ -637,7 +637,21 @@ class CodeTestChatController(
637637
}
638638
LOG.debug { "Original code content from reference span: $originalContent" }
639639
withContext(EDT) {
640-
manager.addReferenceLogPanelEntry(reference = reference, null, null, originalContent?.split("\n"))
640+
// TODO flare: hook /test references with flare correctly, this is only a compile error fix which is not tested
641+
manager.addReferenceLogPanelEntry(
642+
reference = InlineCompletionReference(
643+
referenceName = reference.repository(),
644+
referenceUrl = reference.url(),
645+
licenseName = reference.licenseName(),
646+
position = InlineCompletionReferencePosition(
647+
startCharacter = reference.recommendationContentSpan().start(),
648+
endCharacter = reference.recommendationContentSpan().end()
649+
)
650+
),
651+
null,
652+
null,
653+
originalContent?.split("\n")
654+
)
641655
manager.toolWindow?.show()
642656
}
643657
}
@@ -1298,7 +1312,6 @@ class CodeTestChatController(
12981312
"Processing message: $message " +
12991313
"tabId: $tabId"
13001314
}
1301-
broadcastQEvent(QFeatureEvent.INVOCATION)
13021315
when (session.conversationState) {
13031316
ConversationState.WAITING_FOR_BUILD_COMMAND_INPUT -> handleBuildCommandInput(session, message)
13041317
ConversationState.WAITING_FOR_REGENERATE_INPUT -> handleRegenerateInput(session, message)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqDoc/controller/DocController.kt

-3
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Delete
7979
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.NewFileZipInfo
8080
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.SessionStatePhase
8181
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.CancellationTokenSource
82-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
83-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
8482
import software.aws.toolkits.resources.message
8583
import java.util.UUID
8684

@@ -768,7 +766,6 @@ class DocController(
768766
else -> emptyList()
769767
}
770768
sendDocGenerationTelemetry(filePaths, session, docGenerationTask)
771-
broadcastQEvent(QFeatureEvent.INVOCATION)
772769

773770
if (filePaths.isNotEmpty()) {
774771
processOpenDiff(

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

-5
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.Sessio
7575
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.storage.ChatSessionStorage
7676
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.InsertAction
7777
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.getFollowUpOptions
78-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
79-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
8078
import software.aws.toolkits.jetbrains.services.codewhisperer.util.content
8179
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.FeedbackComment
8280
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
@@ -219,7 +217,6 @@ class FeatureDevController(
219217
logger.debug { "$FEATURE_NAME: Processing InsertCodeAtCursorPosition: $message" }
220218

221219
withContext(EDT) {
222-
broadcastQEvent(QFeatureEvent.STARTS_EDITING)
223220
val editor: Editor = FileEditorManager.getInstance(context.project).selectedTextEditor ?: return@withContext
224221

225222
val caret: Caret = editor.caretModel.primaryCaret
@@ -231,7 +228,6 @@ class FeatureDevController(
231228
}
232229
editor.document.insertString(offset, message.code)
233230
}
234-
broadcastQEvent(QFeatureEvent.FINISHES_EDITING)
235231
}
236232
}
237233

@@ -750,7 +746,6 @@ class FeatureDevController(
750746
}
751747

752748
session.preloader(messenger)
753-
broadcastQEvent(QFeatureEvent.INVOCATION)
754749

755750
when (session.sessionState.phase) {
756751
SessionStatePhase.CODEGEN -> onCodeGeneration(session, message, tabId)

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

-21
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import com.intellij.openapi.editor.Caret
1919
import com.intellij.openapi.editor.Editor
2020
import com.intellij.openapi.fileEditor.FileEditorManager
2121
import com.intellij.openapi.options.ShowSettingsUtil
22-
import com.intellij.psi.PsiDocumentManager
2322
import kotlinx.coroutines.cancelChildren
2423
import kotlinx.coroutines.flow.catch
2524
import kotlinx.coroutines.flow.filter
@@ -46,9 +45,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPag
4645
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
4746
import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument
4847
import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererConfigurable
49-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererUserModificationTracker
50-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
51-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
5248
import software.aws.toolkits.jetbrains.services.cwc.InboundAppMessagesHandler
5349
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.exceptions.ChatApiException
5450
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatRequestData
@@ -61,7 +57,6 @@ import software.aws.toolkits.jetbrains.services.cwc.commands.EditorContextComman
6157
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.StaticPrompt
6258
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.StaticTextResponse
6359
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.messenger.ChatPromptHandler
64-
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.InsertedCodeModificationEntry
6560
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.TelemetryHelper
6661
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
6762
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.userIntent.UserIntentRecognizer
@@ -82,7 +77,6 @@ import software.aws.toolkits.jetbrains.services.cwc.messages.QuickActionMessage
8277
import software.aws.toolkits.jetbrains.services.cwc.storage.ChatSessionStorage
8378
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
8479
import software.aws.toolkits.telemetry.CwsprChatCommandType
85-
import java.time.Instant
8680
import java.util.UUID
8781

8882
data class TestCommandMessage(
@@ -207,7 +201,6 @@ class ChatController private constructor(
207201
}
208202

209203
override suspend fun processInsertCodeAtCursorPosition(message: IncomingCwcMessage.InsertCodeAtCursorPosition) {
210-
broadcastQEvent(QFeatureEvent.STARTS_EDITING)
211204
withContext(EDT) {
212205
val editor: Editor = FileEditorManager.getInstance(context.project).selectedTextEditor ?: return@withContext
213206

@@ -223,23 +216,10 @@ class ChatController private constructor(
223216
editor.document.insertString(offset, message.code)
224217

225218
ReferenceLogController.addReferenceLog(message.code, message.codeReference, editor, context.project, null)
226-
227-
CodeWhispererUserModificationTracker.getInstance(context.project).enqueue(
228-
InsertedCodeModificationEntry(
229-
telemetryHelper.getConversationId(message.tabId).orEmpty(),
230-
message.messageId,
231-
Instant.now(),
232-
PsiDocumentManager.getInstance(context.project).getPsiFile(editor.document)?.virtualFile,
233-
editor.document.createRangeMarker(caret.selectionStart, caret.selectionEnd, true),
234-
message.code,
235-
),
236-
)
237219
}
238220
}
239221
}
240222
telemetryHelper.recordInteractWithMessage(message)
241-
242-
broadcastQEvent(QFeatureEvent.FINISHES_EDITING)
243223
}
244224

245225
override suspend fun processStopResponseMessage(message: IncomingCwcMessage.StopResponse) {
@@ -433,7 +413,6 @@ class ChatController private constructor(
433413
sessionInfo.history.add(requestData)
434414
telemetryHelper.recordEnterFocusConversation(tabId)
435415
telemetryHelper.recordStartConversation(tabId, requestData)
436-
broadcastQEvent(QFeatureEvent.INVOCATION)
437416
// Send the request to the API and publish the responses back to the UI.
438417
// This is launched in a scope attached to the sessionInfo so that the Job can be cancelled on a per-session basis.
439418
ChatPromptHandler(telemetryHelper).handle(tabId, triggerId, requestData, sessionInfo, shouldAddIndexInProgressMessage)

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

+20-28
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ package software.aws.toolkits.jetbrains.services.cwc.controller
55

66
import com.intellij.openapi.editor.Editor
77
import com.intellij.openapi.project.Project
8-
import software.amazon.awssdk.services.codewhispererruntime.model.Reference
9-
import software.amazon.awssdk.services.codewhispererruntime.model.Span
8+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReference
9+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReferencePosition
1010
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.CodeReferenceGenerated
1111
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil
1212
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CaretPosition
@@ -15,21 +15,18 @@ import software.aws.toolkits.jetbrains.services.cwc.messages.CodeReference
1515

1616
object ReferenceLogController {
1717
fun addReferenceLog(originalCode: String, codeReferences: List<CodeReference>?, editor: Editor, project: Project, inlineChatStartPosition: CaretPosition?) {
18+
// TODO flare: hook /dev references with flare correctly, this is only a compile error fix which is not tested
1819
codeReferences?.let { references ->
1920
val cwReferences = references.map { reference ->
20-
Reference.builder()
21-
.licenseName(reference.licenseName)
22-
.repository(reference.repository)
23-
.url(reference.url)
24-
.recommendationContentSpan(
25-
reference.recommendationContentSpan?.let { span ->
26-
Span.builder()
27-
.start(span.start)
28-
.end(span.end)
29-
.build()
30-
}
21+
InlineCompletionReference(
22+
referenceName = reference.repository.orEmpty(),
23+
referenceUrl = reference.url.orEmpty(),
24+
licenseName = reference.licenseName.orEmpty(),
25+
position = InlineCompletionReferencePosition(
26+
startCharacter = reference.recommendationContentSpan?.start ?: 0,
27+
endCharacter = reference.recommendationContentSpan?.end ?: 0,
3128
)
32-
.build()
29+
)
3330
}
3431
val manager = CodeWhispererCodeReferenceManager.getInstance(project)
3532

@@ -38,29 +35,24 @@ object ReferenceLogController {
3835
cwReferences,
3936
editor,
4037
inlineChatStartPosition ?: CodeWhispererEditorUtil.getCaretPosition(editor),
41-
null,
4238
)
4339
}
4440
}
4541

4642
fun addReferenceLog(codeReferences: List<CodeReferenceGenerated>?, project: Project) {
4743
val manager = CodeWhispererCodeReferenceManager.getInstance(project)
4844

45+
// TODO flare: hook /dev references with flare correctly, this is only a compile error fix which is not tested
4946
codeReferences?.forEach { reference ->
50-
val cwReferences = Reference.builder()
51-
.licenseName(reference.licenseName)
52-
.repository(reference.repository)
53-
.url(reference.url)
54-
.recommendationContentSpan(
55-
reference.recommendationContentSpan?.let { span ->
56-
Span.builder()
57-
.start(span.start)
58-
.end(span.end)
59-
.build()
60-
}
47+
val cwReferences = InlineCompletionReference(
48+
referenceName = reference.repository.orEmpty(),
49+
referenceUrl = reference.url.orEmpty(),
50+
licenseName = reference.licenseName.orEmpty(),
51+
position = InlineCompletionReferencePosition(
52+
startCharacter = reference.recommendationContentSpan?.start ?: 0,
53+
endCharacter = reference.recommendationContentSpan?.end ?: 0,
6154
)
62-
.build()
63-
55+
)
6456
manager.addReferenceLogPanelEntry(reference = cwReferences, null, null, null)
6557
}
6658
}

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

-4
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import software.amazon.awssdk.awscore.exception.AwsServiceException
1313
import software.amazon.awssdk.services.codewhispererstreaming.model.CodeWhispererStreamingException
1414
import software.aws.toolkits.core.utils.convertMarkdownToHTML
1515
import software.aws.toolkits.core.utils.extractCodeBlockLanguage
16-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
17-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
1816
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.exceptions.ChatApiException
1917
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatRequestData
2018
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatResponseEvent
@@ -117,8 +115,6 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
117115
)
118116
telemetryHelper.recordAddMessage(data, response, responseText.length, statusCode, countTotalNumberOfCodeBlocks(responseText))
119117
emit(response)
120-
121-
broadcastQEvent(QFeatureEvent.INVOCATION)
122118
}
123119
.catch { exception ->
124120
val statusCode = if (exception is AwsServiceException) exception.statusCode() else 0

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatController.kt

-8
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSe
6060
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AMAZON_Q_WINDOW_ID
6161
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
6262
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CaretPosition
63-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
64-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
6563
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatRequestData
6664
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.TriggerType
6765
import software.aws.toolkits.jetbrains.services.cwc.controller.ReferenceLogController
@@ -545,7 +543,6 @@ class InlineChatController(
545543
private fun insertString(editor: Editor, offset: Int, text: String): RangeMarker {
546544
lateinit var rangeMarker: RangeMarker
547545

548-
broadcastQEvent(QFeatureEvent.STARTS_EDITING)
549546
ApplicationManager.getApplication().invokeAndWait {
550547
CommandProcessor.getInstance().runUndoTransparentAction {
551548
WriteCommandAction.runWriteCommandAction(project) {
@@ -555,20 +552,17 @@ class InlineChatController(
555552
highlightCodeWithBackgroundColor(editor, rangeMarker.startOffset, rangeMarker.endOffset, true)
556553
}
557554
}
558-
broadcastQEvent(QFeatureEvent.FINISHES_EDITING)
559555
return rangeMarker
560556
}
561557

562558
private fun replaceString(document: Document, start: Int, end: Int, text: String) {
563-
broadcastQEvent(QFeatureEvent.STARTS_EDITING)
564559
ApplicationManager.getApplication().invokeAndWait {
565560
CommandProcessor.getInstance().runUndoTransparentAction {
566561
WriteCommandAction.runWriteCommandAction(project) {
567562
document.replaceString(start, end, text)
568563
}
569564
}
570565
}
571-
broadcastQEvent(QFeatureEvent.FINISHES_EDITING)
572566
}
573567

574568
private fun highlightString(editor: Editor, start: Int, end: Int, isInsert: Boolean) {
@@ -725,8 +719,6 @@ class InlineChatController(
725719
canPopupAbort.set(true)
726720
undoChanges()
727721
}
728-
729-
broadcastQEvent(QFeatureEvent.FINISHES_EDITING)
730722
return errorMessage
731723
}
732724

0 commit comments

Comments
 (0)