Skip to content

Commit 56c8c67

Browse files
committed
Revert "feat(amazonq): Introduce auto trigger changes officially (aws#5080)"
This reverts commit b01283e.
1 parent 199b8ae commit 56c8c67

File tree

66 files changed

+4594
-1196
lines changed

Some content is hidden

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

66 files changed

+4594
-1196
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/resources/META-INF/plugin-codewhisperer.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55
<applicationListeners>
66
<listener class="software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererUIChangeListener"
77
topic="software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererPopupStateChangeListener"/>
8+
<listener class="software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererUIChangeListenerNew"
9+
topic="software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererPopupStateChangeListener"/>
810
<listener class="software.aws.toolkits.jetbrains.services.codewhisperer.toolwindow.CodeWhispererCodeReferenceActionListener"
911
topic="software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererUserActionListener"/>
12+
<listener class="software.aws.toolkits.jetbrains.services.codewhisperer.toolwindow.CodeWhispererCodeReferenceActionListenerNew"
13+
topic="software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererUserActionListener"/>
1014
</applicationListeners>
1115

1216
<projectListeners>

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererAcceptAction.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@ import com.intellij.openapi.actionSystem.CommonDataKeys
1010
import com.intellij.openapi.application.ApplicationManager
1111
import com.intellij.openapi.project.DumbAware
1212
import software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererPopupManager
13-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatusNew
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
1515
import software.aws.toolkits.resources.message
1616

1717
open class CodeWhispererAcceptAction(title: String = message("codewhisperer.inline.accept")) : AnAction(title), DumbAware {
1818
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.EDT
1919

2020
override fun update(e: AnActionEvent) {
2121
e.presentation.isEnabled = e.project != null && e.getData(CommonDataKeys.EDITOR) != null &&
22-
CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()
22+
CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()
2323
}
2424

2525
override fun actionPerformed(e: AnActionEvent) {
26-
val sessionContext = e.project?.getUserData(CodeWhispererService.KEY_SESSION_CONTEXT) ?: return
27-
if (!CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()) return
26+
val sessionContext = e.project?.getUserData(CodeWhispererServiceNew.KEY_SESSION_CONTEXT) ?: return
27+
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return
2828
ApplicationManager.getApplication().messageBus.syncPublisher(
2929
CodeWhispererPopupManager.CODEWHISPERER_USER_ACTION_PERFORMED
3030
).beforeAccept(sessionContext)

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererActionPromoter.kt

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,77 @@ import com.intellij.codeInsight.lookup.impl.actions.ChooseItemAction
77
import com.intellij.openapi.actionSystem.ActionPromoter
88
import com.intellij.openapi.actionSystem.AnAction
99
import com.intellij.openapi.actionSystem.DataContext
10-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
10+
import com.intellij.openapi.editor.actionSystem.EditorAction
11+
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
12+
import software.aws.toolkits.jetbrains.services.codewhisperer.popup.handlers.CodeWhispererPopupLeftArrowHandler
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.popup.handlers.CodeWhispererPopupRightArrowHandler
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.popup.handlers.CodeWhispererPopupTabHandler
15+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatusNew
1116

1217
class CodeWhispererActionPromoter : ActionPromoter {
1318
override fun promote(actions: MutableList<out AnAction>, context: DataContext): MutableList<AnAction> {
14-
val results = actions.toMutableList()
15-
if (!CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()) return results
19+
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
20+
val results = actions.toMutableList()
21+
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return results
1622

17-
results.sortWith { a, b ->
18-
if (isCodeWhispererForceAction(a)) {
19-
return@sortWith -1
20-
} else if (isCodeWhispererForceAction(b)) {
21-
return@sortWith 1
22-
}
23+
results.sortWith { a, b ->
24+
if (isCodeWhispererForceAction(a)) {
25+
return@sortWith -1
26+
} else if (isCodeWhispererForceAction(b)) {
27+
return@sortWith 1
28+
}
2329

24-
if (a is ChooseItemAction) {
25-
return@sortWith -1
26-
} else if (b is ChooseItemAction) {
27-
return@sortWith 1
28-
}
30+
if (a is ChooseItemAction) {
31+
return@sortWith -1
32+
} else if (b is ChooseItemAction) {
33+
return@sortWith 1
34+
}
35+
36+
if (isCodeWhispererAcceptAction(a)) {
37+
return@sortWith -1
38+
} else if (isCodeWhispererAcceptAction(b)) {
39+
return@sortWith 1
40+
}
2941

30-
if (isCodeWhispererAcceptAction(a)) {
42+
0
43+
}
44+
return results
45+
}
46+
val results = actions.toMutableList()
47+
results.sortWith { a, b ->
48+
if (isCodeWhispererPopupAction(a)) {
3149
return@sortWith -1
32-
} else if (isCodeWhispererAcceptAction(b)) {
50+
} else if (isCodeWhispererPopupAction(b)) {
3351
return@sortWith 1
52+
} else {
53+
0
3454
}
35-
36-
0
3755
}
3856
return results
3957
}
4058

4159
private fun isCodeWhispererAcceptAction(action: AnAction): Boolean =
42-
action is CodeWhispererAcceptAction
60+
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
61+
action is CodeWhispererAcceptAction
62+
} else {
63+
action is EditorAction && action.handler is CodeWhispererPopupTabHandler
64+
}
4365

4466
private fun isCodeWhispererForceAcceptAction(action: AnAction): Boolean =
4567
action is CodeWhispererForceAcceptAction
4668

4769
private fun isCodeWhispererNavigateAction(action: AnAction): Boolean =
48-
action is CodeWhispererNavigateNextAction || action is CodeWhispererNavigatePrevAction
70+
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
71+
action is CodeWhispererNavigateNextAction || action is CodeWhispererNavigatePrevAction
72+
} else {
73+
action is EditorAction && (
74+
action.handler is CodeWhispererPopupRightArrowHandler ||
75+
action.handler is CodeWhispererPopupLeftArrowHandler
76+
)
77+
}
78+
79+
private fun isCodeWhispererPopupAction(action: AnAction): Boolean =
80+
isCodeWhispererAcceptAction(action) || isCodeWhispererNavigateAction(action)
4981

5082
private fun isCodeWhispererForceAction(action: AnAction): Boolean =
5183
isCodeWhispererForceAcceptAction(action) || isCodeWhispererNavigateAction(action)

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererNavigateNextAction.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import com.intellij.openapi.actionSystem.CommonDataKeys
1010
import com.intellij.openapi.application.ApplicationManager
1111
import com.intellij.openapi.project.DumbAware
1212
import software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererPopupManager
13-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatusNew
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
1515
import software.aws.toolkits.resources.message
1616

1717
class CodeWhispererNavigateNextAction : AnAction(message("codewhisperer.inline.navigate.next")), DumbAware {
@@ -20,12 +20,12 @@ class CodeWhispererNavigateNextAction : AnAction(message("codewhisperer.inline.n
2020
override fun update(e: AnActionEvent) {
2121
e.presentation.isEnabled = e.project != null &&
2222
e.getData(CommonDataKeys.EDITOR) != null &&
23-
CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()
23+
CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()
2424
}
2525

2626
override fun actionPerformed(e: AnActionEvent) {
27-
val sessionContext = e.project?.getUserData(CodeWhispererService.KEY_SESSION_CONTEXT) ?: return
28-
if (!CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()) return
27+
val sessionContext = e.project?.getUserData(CodeWhispererServiceNew.KEY_SESSION_CONTEXT) ?: return
28+
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return
2929
ApplicationManager.getApplication().messageBus.syncPublisher(
3030
CodeWhispererPopupManager.CODEWHISPERER_USER_ACTION_PERFORMED
3131
).navigateNext(sessionContext)

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererNavigatePrevAction.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import com.intellij.openapi.actionSystem.CommonDataKeys
1010
import com.intellij.openapi.application.ApplicationManager
1111
import com.intellij.openapi.project.DumbAware
1212
import software.aws.toolkits.jetbrains.services.codewhisperer.popup.CodeWhispererPopupManager
13-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatusNew
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
1515
import software.aws.toolkits.resources.message
1616

1717
class CodeWhispererNavigatePrevAction : AnAction(message("codewhisperer.inline.navigate.previous")), DumbAware {
@@ -20,12 +20,12 @@ class CodeWhispererNavigatePrevAction : AnAction(message("codewhisperer.inline.n
2020
override fun update(e: AnActionEvent) {
2121
e.presentation.isEnabled = e.project != null &&
2222
e.getData(CommonDataKeys.EDITOR) != null &&
23-
CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()
23+
CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()
2424
}
2525

2626
override fun actionPerformed(e: AnActionEvent) {
27-
val sessionContext = e.project?.getUserData(CodeWhispererService.KEY_SESSION_CONTEXT) ?: return
28-
if (!CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()) return
27+
val sessionContext = e.project?.getUserData(CodeWhispererServiceNew.KEY_SESSION_CONTEXT) ?: return
28+
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return
2929
ApplicationManager.getApplication().messageBus.syncPublisher(
3030
CodeWhispererPopupManager.CODEWHISPERER_USER_ACTION_PERFORMED
3131
).navigatePrevious(sessionContext)

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererRecommendationAction.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import com.intellij.openapi.actionSystem.CommonDataKeys
1010
import com.intellij.openapi.project.DumbAware
1111
import com.intellij.openapi.util.Key
1212
import kotlinx.coroutines.Job
13+
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
1314
import software.aws.toolkits.jetbrains.services.codewhisperer.model.LatencyContext
1415
import software.aws.toolkits.jetbrains.services.codewhisperer.model.TriggerTypeInfo
1516
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutomatedTriggerType
1617
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
18+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
1719
import software.aws.toolkits.resources.message
1820
import software.aws.toolkits.telemetry.CodewhispererTriggerType
1921
import java.util.concurrent.atomic.AtomicReference
@@ -30,12 +32,23 @@ class CodeWhispererRecommendationAction : AnAction(message("codewhisperer.trigge
3032
latencyContext.codewhispererPreprocessingStart = System.nanoTime()
3133
latencyContext.codewhispererEndToEndStart = System.nanoTime()
3234
val editor = e.getRequiredData(CommonDataKeys.EDITOR)
33-
if (!CodeWhispererService.getInstance().canDoInvocation(editor, CodewhispererTriggerType.OnDemand)) {
35+
if (!(
36+
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
37+
CodeWhispererServiceNew.getInstance().canDoInvocation(editor, CodewhispererTriggerType.OnDemand)
38+
} else {
39+
CodeWhispererService.getInstance().canDoInvocation(editor, CodewhispererTriggerType.OnDemand)
40+
}
41+
)
42+
) {
3443
return
3544
}
3645

3746
val triggerType = TriggerTypeInfo(CodewhispererTriggerType.OnDemand, CodeWhispererAutomatedTriggerType.Unknown())
38-
val job = CodeWhispererService.getInstance().showRecommendationsInPopup(editor, triggerType, latencyContext)
47+
val job = if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
48+
CodeWhispererServiceNew.getInstance().showRecommendationsInPopup(editor, triggerType, latencyContext)
49+
} else {
50+
CodeWhispererService.getInstance().showRecommendationsInPopup(editor, triggerType, latencyContext)
51+
}
3952

4053
e.getData(CommonDataKeys.EDITOR)?.getUserData(ACTION_JOB_KEY)?.set(job)
4154
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext
4444
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
4545
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
4646
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
47-
import software.aws.toolkits.jetbrains.services.codewhisperer.model.RequestContext
48-
import software.aws.toolkits.jetbrains.services.codewhisperer.model.ResponseContext
49-
import software.aws.toolkits.jetbrains.services.codewhisperer.model.SessionContext
47+
import software.aws.toolkits.jetbrains.services.codewhisperer.model.SessionContextNew
48+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.RequestContext
49+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.RequestContextNew
50+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.ResponseContext
5051
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
5152
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getTelemetryOptOutPreference
5253
import software.aws.toolkits.jetbrains.services.codewhisperer.util.transform
@@ -89,7 +90,6 @@ interface CodeWhispererClientAdaptor : Disposable {
8990
fun listAvailableCustomizations(): List<CodeWhispererCustomization>
9091

9192
fun sendUserTriggerDecisionTelemetry(
92-
sessionContext: SessionContext,
9393
requestContext: RequestContext,
9494
responseContext: ResponseContext,
9595
completionType: CodewhispererCompletionType,
@@ -100,6 +100,18 @@ interface CodeWhispererClientAdaptor : Disposable {
100100
acceptedCharCount: Int,
101101
): SendTelemetryEventResponse
102102

103+
fun sendUserTriggerDecisionTelemetry(
104+
sessionContext: SessionContextNew,
105+
requestContext: RequestContextNew,
106+
responseContext: ResponseContext,
107+
completionType: CodewhispererCompletionType,
108+
suggestionState: CodewhispererSuggestionState,
109+
suggestionReferenceCount: Int,
110+
lineCount: Int,
111+
numberOfRecommendations: Int,
112+
acceptedCharCount: Int,
113+
): SendTelemetryEventResponse
114+
103115
fun sendCodePercentageTelemetry(
104116
language: CodeWhispererProgrammingLanguage,
105117
customizationArn: String?,
@@ -290,7 +302,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
290302
}
291303

292304
override fun sendUserTriggerDecisionTelemetry(
293-
sessionContext: SessionContext,
294305
requestContext: RequestContext,
295306
responseContext: ResponseContext,
296307
completionType: CodewhispererCompletionType,
@@ -299,6 +310,53 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
299310
lineCount: Int,
300311
numberOfRecommendations: Int,
301312
acceptedCharCount: Int,
313+
): SendTelemetryEventResponse {
314+
val fileContext = requestContext.fileContextInfo
315+
val programmingLanguage = fileContext.programmingLanguage
316+
var e2eLatency = requestContext.latencyContext.getCodeWhispererEndToEndLatency()
317+
318+
// When we send a userTriggerDecision for neither Accept nor Reject, service side should not use this value
319+
// and client side will set this value to 0.0.
320+
if (suggestionState != CodewhispererSuggestionState.Accept &&
321+
suggestionState != CodewhispererSuggestionState.Reject
322+
) {
323+
e2eLatency = 0.0
324+
}
325+
326+
return bearerClient().sendTelemetryEvent { requestBuilder ->
327+
requestBuilder.telemetryEvent { telemetryEventBuilder ->
328+
telemetryEventBuilder.userTriggerDecisionEvent {
329+
it.requestId(requestContext.latencyContext.firstRequestId)
330+
it.completionType(completionType.toCodeWhispererSdkType())
331+
it.programmingLanguage { builder -> builder.languageName(programmingLanguage.toCodeWhispererRuntimeLanguage().languageId) }
332+
it.sessionId(responseContext.sessionId)
333+
it.recommendationLatencyMilliseconds(e2eLatency)
334+
it.triggerToResponseLatencyMilliseconds(requestContext.latencyContext.paginationFirstCompletionTime)
335+
it.perceivedLatencyMilliseconds(requestContext.latencyContext.perceivedLatency)
336+
it.suggestionState(suggestionState.toCodeWhispererSdkType())
337+
it.timestamp(Instant.now())
338+
it.suggestionReferenceCount(suggestionReferenceCount)
339+
it.generatedLine(lineCount)
340+
it.customizationArn(requestContext.customizationArn)
341+
it.numberOfRecommendations(numberOfRecommendations)
342+
it.acceptedCharacterCount(acceptedCharCount)
343+
}
344+
}
345+
requestBuilder.optOutPreference(getTelemetryOptOutPreference())
346+
requestBuilder.userContext(codeWhispererUserContext())
347+
}
348+
}
349+
350+
override fun sendUserTriggerDecisionTelemetry(
351+
sessionContext: SessionContextNew,
352+
requestContext: RequestContextNew,
353+
responseContext: ResponseContext,
354+
completionType: CodewhispererCompletionType,
355+
suggestionState: CodewhispererSuggestionState,
356+
suggestionReferenceCount: Int,
357+
lineCount: Int,
358+
numberOfRecommendations: Int,
359+
acceptedCharCount: Int,
302360
): SendTelemetryEventResponse {
303361
val fileContext = requestContext.fileContextInfo
304362
val programmingLanguage = fileContext.programmingLanguage
@@ -628,8 +686,6 @@ private fun CodewhispererSuggestionState.toCodeWhispererSdkType() = when {
628686
this == CodewhispererSuggestionState.Reject -> SuggestionState.REJECT
629687
this == CodewhispererSuggestionState.Empty -> SuggestionState.EMPTY
630688
this == CodewhispererSuggestionState.Discard -> SuggestionState.DISCARD
631-
this == CodewhispererSuggestionState.Ignore -> SuggestionState.MERGE
632-
this == CodewhispererSuggestionState.Unseen -> SuggestionState.MERGE
633689
else -> SuggestionState.UNKNOWN_TO_SDK_VERSION
634690
}
635691

0 commit comments

Comments
 (0)