Skip to content

Commit 5f91840

Browse files
committed
Introduce auto trigger changes officially
1 parent 2032a57 commit 5f91840

File tree

67 files changed

+1165
-4594
lines changed

Some content is hidden

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

67 files changed

+1165
-4594
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,8 @@
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"/>
108
<listener class="software.aws.toolkits.jetbrains.services.codewhisperer.toolwindow.CodeWhispererCodeReferenceActionListener"
119
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"/>
1410
</applicationListeners>
1511

1612
<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.CodeWhispererInvocationStatusNew
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
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-
CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()
22+
CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()
2323
}
2424

2525
override fun actionPerformed(e: AnActionEvent) {
26-
val sessionContext = e.project?.getUserData(CodeWhispererServiceNew.KEY_SESSION_CONTEXT) ?: return
27-
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return
26+
val sessionContext = e.project?.getUserData(CodeWhispererService.KEY_SESSION_CONTEXT) ?: return
27+
if (!CodeWhispererInvocationStatus.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: 20 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -7,77 +7,45 @@ 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 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
10+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
1611

1712
class CodeWhispererActionPromoter : ActionPromoter {
1813
override fun promote(actions: MutableList<out AnAction>, context: DataContext): MutableList<AnAction> {
19-
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
20-
val results = actions.toMutableList()
21-
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return results
22-
23-
results.sortWith { a, b ->
24-
if (isCodeWhispererForceAction(a)) {
25-
return@sortWith -1
26-
} else if (isCodeWhispererForceAction(b)) {
27-
return@sortWith 1
28-
}
29-
30-
if (a is ChooseItemAction) {
31-
return@sortWith -1
32-
} else if (b is ChooseItemAction) {
33-
return@sortWith 1
34-
}
14+
val results = actions.toMutableList()
15+
if (!CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()) return results
3516

36-
if (isCodeWhispererAcceptAction(a)) {
37-
return@sortWith -1
38-
} else if (isCodeWhispererAcceptAction(b)) {
39-
return@sortWith 1
40-
}
17+
results.sortWith { a, b ->
18+
if (isCodeWhispererForceAction(a)) {
19+
return@sortWith -1
20+
} else if (isCodeWhispererForceAction(b)) {
21+
return@sortWith 1
22+
}
4123

42-
0
24+
if (a is ChooseItemAction) {
25+
return@sortWith -1
26+
} else if (b is ChooseItemAction) {
27+
return@sortWith 1
4328
}
44-
return results
45-
}
46-
val results = actions.toMutableList()
47-
results.sortWith { a, b ->
48-
if (isCodeWhispererPopupAction(a)) {
29+
30+
if (isCodeWhispererAcceptAction(a)) {
4931
return@sortWith -1
50-
} else if (isCodeWhispererPopupAction(b)) {
32+
} else if (isCodeWhispererAcceptAction(b)) {
5133
return@sortWith 1
52-
} else {
53-
0
5434
}
35+
36+
0
5537
}
5638
return results
5739
}
5840

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

6644
private fun isCodeWhispererForceAcceptAction(action: AnAction): Boolean =
6745
action is CodeWhispererForceAcceptAction
6846

6947
private fun isCodeWhispererNavigateAction(action: AnAction): Boolean =
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)
48+
action is CodeWhispererNavigateNextAction || action is CodeWhispererNavigatePrevAction
8149

8250
private fun isCodeWhispererForceAction(action: AnAction): Boolean =
8351
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.CodeWhispererInvocationStatusNew
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
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-
CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()
23+
CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()
2424
}
2525

2626
override fun actionPerformed(e: AnActionEvent) {
27-
val sessionContext = e.project?.getUserData(CodeWhispererServiceNew.KEY_SESSION_CONTEXT) ?: return
28-
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return
27+
val sessionContext = e.project?.getUserData(CodeWhispererService.KEY_SESSION_CONTEXT) ?: return
28+
if (!CodeWhispererInvocationStatus.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.CodeWhispererInvocationStatusNew
14-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
13+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererInvocationStatus
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
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-
CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()
23+
CodeWhispererInvocationStatus.getInstance().isDisplaySessionActive()
2424
}
2525

2626
override fun actionPerformed(e: AnActionEvent) {
27-
val sessionContext = e.project?.getUserData(CodeWhispererServiceNew.KEY_SESSION_CONTEXT) ?: return
28-
if (!CodeWhispererInvocationStatusNew.getInstance().isDisplaySessionActive()) return
27+
val sessionContext = e.project?.getUserData(CodeWhispererService.KEY_SESSION_CONTEXT) ?: return
28+
if (!CodeWhispererInvocationStatus.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: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ 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
1413
import software.aws.toolkits.jetbrains.services.codewhisperer.model.LatencyContext
1514
import software.aws.toolkits.jetbrains.services.codewhisperer.model.TriggerTypeInfo
1615
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutomatedTriggerType
1716
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
18-
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererServiceNew
1917
import software.aws.toolkits.resources.message
2018
import software.aws.toolkits.telemetry.CodewhispererTriggerType
2119
import java.util.concurrent.atomic.AtomicReference
@@ -32,23 +30,12 @@ class CodeWhispererRecommendationAction : AnAction(message("codewhisperer.trigge
3230
latencyContext.codewhispererPreprocessingStart = System.nanoTime()
3331
latencyContext.codewhispererEndToEndStart = System.nanoTime()
3432
val editor = e.getRequiredData(CommonDataKeys.EDITOR)
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-
) {
33+
if (!CodeWhispererService.getInstance().canDoInvocation(editor, CodewhispererTriggerType.OnDemand)) {
4334
return
4435
}
4536

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

5340
e.getData(CommonDataKeys.EDITOR)?.getUserData(ACTION_JOB_KEY)?.set(job)
5441
}

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

Lines changed: 7 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ 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.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
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
5150
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
5251
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getTelemetryOptOutPreference
5352
import software.aws.toolkits.jetbrains.services.codewhisperer.util.transform
@@ -90,6 +89,7 @@ interface CodeWhispererClientAdaptor : Disposable {
9089
fun listAvailableCustomizations(): List<CodeWhispererCustomization>
9190

9291
fun sendUserTriggerDecisionTelemetry(
92+
sessionContext: SessionContext,
9393
requestContext: RequestContext,
9494
responseContext: ResponseContext,
9595
completionType: CodewhispererCompletionType,
@@ -100,18 +100,6 @@ 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-
115103
fun sendCodePercentageTelemetry(
116104
language: CodeWhispererProgrammingLanguage,
117105
customizationArn: String?,
@@ -302,6 +290,7 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
302290
}
303291

304292
override fun sendUserTriggerDecisionTelemetry(
293+
sessionContext: SessionContext,
305294
requestContext: RequestContext,
306295
responseContext: ResponseContext,
307296
completionType: CodewhispererCompletionType,
@@ -310,53 +299,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
310299
lineCount: Int,
311300
numberOfRecommendations: Int,
312301
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,
360302
): SendTelemetryEventResponse {
361303
val fileContext = requestContext.fileContextInfo
362304
val programmingLanguage = fileContext.programmingLanguage
@@ -686,6 +628,8 @@ private fun CodewhispererSuggestionState.toCodeWhispererSdkType() = when {
686628
this == CodewhispererSuggestionState.Reject -> SuggestionState.REJECT
687629
this == CodewhispererSuggestionState.Empty -> SuggestionState.EMPTY
688630
this == CodewhispererSuggestionState.Discard -> SuggestionState.DISCARD
631+
this == CodewhispererSuggestionState.Ignore -> SuggestionState.MERGE
632+
this == CodewhispererSuggestionState.Unseen -> SuggestionState.MERGE
689633
else -> SuggestionState.UNKNOWN_TO_SDK_VERSION
690634
}
691635

0 commit comments

Comments
 (0)