Skip to content

Commit 847b17a

Browse files
Merge main into feature/q-lsp
2 parents 888d9dc + eb19cbc commit 847b17a

File tree

6 files changed

+628
-160
lines changed

6 files changed

+628
-160
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/common/clients/AmazonQCodeGenerateClient.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import software.amazon.awssdk.services.codewhispererruntime.model.ContentChecksu
1313
import software.amazon.awssdk.services.codewhispererruntime.model.CreateTaskAssistConversationRequest
1414
import software.amazon.awssdk.services.codewhispererruntime.model.CreateTaskAssistConversationResponse
1515
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlResponse
16-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationEvent
16+
import software.amazon.awssdk.services.codewhispererruntime.model.DocV2AcceptanceEvent
17+
import software.amazon.awssdk.services.codewhispererruntime.model.DocV2GenerationEvent
1718
import software.amazon.awssdk.services.codewhispererruntime.model.GetTaskAssistCodeGenerationResponse
1819
import software.amazon.awssdk.services.codewhispererruntime.model.IdeCategory
1920
import software.amazon.awssdk.services.codewhispererruntime.model.OperatingSystem
@@ -49,7 +50,7 @@ class AmazonQCodeGenerateClient(private val project: Project) {
4950
OptOutPreference.OPTOUT
5051
}
5152

52-
private val docGenerationUserContext = ClientMetadata.getDefault().let {
53+
private val docUserContext = ClientMetadata.getDefault().let {
5354
val osForFeatureDev: OperatingSystem =
5455
when {
5556
SystemInfo.isWindows -> OperatingSystem.WINDOWS
@@ -75,15 +76,17 @@ class AmazonQCodeGenerateClient(private val project: Project) {
7576
private val amazonQStreamingClient
7677
get() = AmazonQStreamingClient.getInstance(project)
7778

78-
fun sendDocGenerationTelemetryEvent(
79-
docGenerationEvent: DocGenerationEvent,
79+
fun sendDocTelemetryEvent(
80+
generationEvent: DocV2GenerationEvent? = null,
81+
acceptanceEvent: DocV2AcceptanceEvent? = null,
8082
): SendTelemetryEventResponse =
8183
bearerClient().sendTelemetryEvent { requestBuilder ->
8284
requestBuilder.telemetryEvent { telemetryEventBuilder ->
83-
telemetryEventBuilder.docGenerationEvent(docGenerationEvent)
85+
generationEvent?.let { telemetryEventBuilder.docV2GenerationEvent(it) }
86+
acceptanceEvent?.let { telemetryEventBuilder.docV2AcceptanceEvent(it) }
8487
}
8588
requestBuilder.optOutPreference(getTelemetryOptOutPreference())
86-
requestBuilder.userContext(docGenerationUserContext)
89+
requestBuilder.userContext(docUserContext)
8790
}
8891

8992
fun createTaskAssistConversation(): CreateTaskAssistConversationResponse = bearerClient().createTaskAssistConversation(

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

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ import com.intellij.openapi.vfs.LocalFileSystem
1818
import com.intellij.openapi.vfs.VfsUtil
1919
import com.intellij.openapi.wm.ToolWindowManager
2020
import kotlinx.coroutines.withContext
21-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationFolderLevel
22-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationInteractionType
23-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationUserDecision
21+
import software.amazon.awssdk.services.codewhispererruntime.model.DocFolderLevel
22+
import software.amazon.awssdk.services.codewhispererruntime.model.DocInteractionType
23+
import software.amazon.awssdk.services.codewhispererruntime.model.DocUserDecision
2424
import software.aws.toolkits.core.utils.debug
2525
import software.aws.toolkits.core.utils.error
2626
import software.aws.toolkits.core.utils.getLogger
@@ -168,25 +168,25 @@ class DocController(
168168
FollowUpTypes.NEW_TASK -> newTask(message.tabId)
169169
FollowUpTypes.CLOSE_SESSION -> closeSession(message.tabId)
170170
FollowUpTypes.CREATE_DOCUMENTATION -> {
171-
docGenerationTask.interactionType = DocGenerationInteractionType.GENERATE_README
171+
docGenerationTask.interactionType = DocInteractionType.GENERATE_README
172172
mode = Mode.CREATE
173173
promptForDocTarget(message.tabId)
174174
}
175175

176176
FollowUpTypes.UPDATE_DOCUMENTATION -> {
177-
docGenerationTask.interactionType = DocGenerationInteractionType.UPDATE_README
177+
docGenerationTask.interactionType = DocInteractionType.UPDATE_README
178178
updateDocumentation(message.tabId)
179179
}
180180

181181
FollowUpTypes.CANCEL_FOLDER_SELECTION -> {
182-
docGenerationTask.reset()
182+
docGenerationTask.folderLevel = DocFolderLevel.ENTIRE_WORKSPACE
183183
newTask(message.tabId)
184184
}
185185

186186
FollowUpTypes.PROCEED_FOLDER_SELECTION -> if (mode == Mode.EDIT) makeChanges(message.tabId) else onDocsGeneration(message)
187187
FollowUpTypes.ACCEPT_CHANGES -> {
188-
docGenerationTask.userDecision = DocGenerationUserDecision.ACCEPT
189-
sendDocGenerationTelemetry(message.tabId)
188+
docGenerationTask.userDecision = DocUserDecision.ACCEPT
189+
sendDocAcceptanceTelemetry(message.tabId)
190190
acceptChanges(message)
191191
}
192192

@@ -196,8 +196,8 @@ class DocController(
196196
}
197197

198198
FollowUpTypes.REJECT_CHANGES -> {
199-
docGenerationTask.userDecision = DocGenerationUserDecision.REJECT
200-
sendDocGenerationTelemetry(message.tabId)
199+
docGenerationTask.userDecision = DocUserDecision.REJECT
200+
sendDocAcceptanceTelemetry(message.tabId)
201201
rejectChanges(message)
202202
}
203203

@@ -208,7 +208,7 @@ class DocController(
208208

209209
FollowUpTypes.EDIT_DOCUMENTATION -> {
210210
mode = Mode.EDIT
211-
docGenerationTask.interactionType = DocGenerationInteractionType.EDIT_README
211+
docGenerationTask.interactionType = DocInteractionType.EDIT_README
212212
promptForDocTarget(message.tabId)
213213
}
214214
}
@@ -454,8 +454,7 @@ class DocController(
454454
session.isAuthenticating = true
455455
return
456456
}
457-
docGenerationTask.userIdentity = session.getUserIdentity()
458-
docGenerationTask.numberOfNavigation += 1
457+
docGenerationTask.numberOfNavigations += 1
459458
messenger.sendUpdatePlaceholder(tabId, message("amazonqDoc.prompt.placeholder"))
460459
} catch (err: Exception) {
461460
val message = createUserFacingErrorMessage(err.message)
@@ -733,7 +732,6 @@ class DocController(
733732
session.isAuthenticating = true
734733
return
735734
}
736-
docGenerationTask.userIdentity = session.getUserIdentity()
737735
session.preloader(message, messenger)
738736

739737
when (session.sessionState.phase) {
@@ -747,6 +745,7 @@ class DocController(
747745
is PrepareDocGenerationState -> state.filePaths
748746
else -> emptyList()
749747
}
748+
sendDocGenerationTelemetry(filePaths, session)
750749
broadcastQEvent(QFeatureEvent.INVOCATION)
751750

752751
if (filePaths.isNotEmpty()) {
@@ -811,6 +810,8 @@ class DocController(
811810
return
812811
}
813812

813+
sendDocGenerationTelemetry(filePaths, session)
814+
814815
messenger.sendAnswer(
815816
message = docGenerationProgressMessage(DocGenerationStep.COMPLETE, mode),
816817
messageType = DocMessageType.AnswerPart,
@@ -988,9 +989,9 @@ class DocController(
988989
}
989990

990991
if (selectedFolder.path == projectRoot.path) {
991-
docGenerationTask.folderLevel = DocGenerationFolderLevel.ENTIRE_WORKSPACE
992+
docGenerationTask.folderLevel = DocFolderLevel.ENTIRE_WORKSPACE
992993
} else {
993-
docGenerationTask.folderLevel = DocGenerationFolderLevel.SUB_FOLDER
994+
docGenerationTask.folderLevel = DocFolderLevel.SUB_FOLDER
994995
}
995996

996997
logger.info { "Selected correct folder inside workspace: ${selectedFolder.path}" }
@@ -1005,7 +1006,18 @@ class DocController(
10051006
}
10061007
}
10071008

1008-
private fun sendDocGenerationTelemetry(tabId: String) {
1009+
private fun sendDocGenerationTelemetry(filePaths: List<NewFileZipInfo>, session: DocSession) {
1010+
docGenerationTask.conversationId = session.conversationId
1011+
val (totalGeneratedChars, totalGeneratedLines, totalGeneratedFiles) = session.countedGeneratedContent(filePaths, docGenerationTask.interactionType)
1012+
docGenerationTask.numberOfGeneratedChars = totalGeneratedChars
1013+
docGenerationTask.numberOfGeneratedLines = totalGeneratedLines
1014+
docGenerationTask.numberOfGeneratedFiles = totalGeneratedFiles
1015+
1016+
val docGenerationEvent = docGenerationTask.docGenerationEventBase()
1017+
session.sendDocTelemetryEvent(docGenerationEvent)
1018+
}
1019+
1020+
private fun sendDocAcceptanceTelemetry(tabId: String) {
10091021
val session = getSessionInfo(tabId)
10101022
var filePaths: List<NewFileZipInfo> = emptyList()
10111023

@@ -1016,12 +1028,12 @@ class DocController(
10161028
}
10171029
docGenerationTask.conversationId = session.conversationId
10181030
val (totalAddedChars, totalAddedLines, totalAddedFiles) = session.countAddedContent(filePaths, docGenerationTask.interactionType)
1019-
docGenerationTask.numberOfAddChars = totalAddedChars
1020-
docGenerationTask.numberOfAddLines = totalAddedLines
1021-
docGenerationTask.numberOfAddFiles = totalAddedFiles
1031+
docGenerationTask.numberOfAddedChars = totalAddedChars
1032+
docGenerationTask.numberOfAddedLines = totalAddedLines
1033+
docGenerationTask.numberOfAddedFiles = totalAddedFiles
10221034

1023-
val docGenerationEvent = docGenerationTask.docGenerationEventBase()
1024-
session.sendDocGenerationEvent(docGenerationEvent)
1035+
val docAcceptanceEvent = docGenerationTask.docAcceptanceEventBase()
1036+
session.sendDocTelemetryEvent(null, docAcceptanceEvent)
10251037
}
10261038

10271039
fun getProject() = context.project

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

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,82 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonqDoc.controller
55

6-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationEvent
7-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationFolderLevel
8-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationInteractionType
9-
import software.amazon.awssdk.services.codewhispererruntime.model.DocGenerationUserDecision
6+
import software.amazon.awssdk.services.codewhispererruntime.model.DocFolderLevel
7+
import software.amazon.awssdk.services.codewhispererruntime.model.DocInteractionType
8+
import software.amazon.awssdk.services.codewhispererruntime.model.DocUserDecision
9+
import software.amazon.awssdk.services.codewhispererruntime.model.DocV2AcceptanceEvent
10+
import software.amazon.awssdk.services.codewhispererruntime.model.DocV2GenerationEvent
1011
import software.aws.toolkits.core.utils.debug
1112
import software.aws.toolkits.core.utils.getLogger
1213

1314
class DocGenerationTask {
1415
// Telemetry fields
1516
var conversationId: String? = null
16-
var numberOfAddChars: Int? = null
17-
var numberOfAddLines: Int? = null
18-
var numberOfAddFiles: Int? = null
19-
var userDecision: DocGenerationUserDecision? = null
20-
var interactionType: DocGenerationInteractionType? = null
21-
var userIdentity: String? = null
22-
var numberOfNavigation = 0
23-
var folderLevel: DocGenerationFolderLevel? = DocGenerationFolderLevel.ENTIRE_WORKSPACE
24-
fun docGenerationEventBase(): DocGenerationEvent {
17+
var numberOfAddedChars: Int? = null
18+
var numberOfAddedLines: Int? = null
19+
var numberOfAddedFiles: Int? = null
20+
var numberOfGeneratedChars: Int? = null
21+
var numberOfGeneratedLines: Int? = null
22+
var numberOfGeneratedFiles: Int? = null
23+
var userDecision: DocUserDecision? = null
24+
var interactionType: DocInteractionType? = null
25+
var numberOfNavigations = 0
26+
var folderLevel: DocFolderLevel? = DocFolderLevel.ENTIRE_WORKSPACE
27+
fun docGenerationEventBase(): DocV2GenerationEvent {
2528
val undefinedProps = this::class.java.declaredFields
2629
.filter { it.get(this) == null }
2730
.map { it.name }
2831

2932
if (undefinedProps.isNotEmpty()) {
3033
val undefinedValue = undefinedProps.joinToString(", ")
31-
logger.debug { "DocGenerationEvent has undefined properties: $undefinedValue" }
34+
logger.debug { "DocV2GenerationEvent has undefined properties: $undefinedValue" }
3235
}
3336

34-
return DocGenerationEvent.builder()
37+
return DocV2GenerationEvent.builder()
3538
.conversationId(conversationId)
36-
.numberOfAddChars(numberOfAddChars)
37-
.numberOfAddLines(numberOfAddLines)
38-
.numberOfAddFiles(numberOfAddFiles)
39+
.numberOfGeneratedChars(numberOfGeneratedChars)
40+
.numberOfGeneratedLines(numberOfGeneratedLines)
41+
.numberOfGeneratedFiles(numberOfGeneratedFiles)
42+
.interactionType(interactionType)
43+
.numberOfNavigations(numberOfNavigations)
44+
.folderLevel(folderLevel)
45+
.build()
46+
}
47+
48+
fun docAcceptanceEventBase(): DocV2AcceptanceEvent {
49+
val undefinedProps = this::class.java.declaredFields
50+
.filter { it.get(this) == null }
51+
.map { it.name }
52+
53+
if (undefinedProps.isNotEmpty()) {
54+
val undefinedValue = undefinedProps.joinToString(", ")
55+
logger.debug { "DocV2AcceptanceEvent has undefined properties: $undefinedValue" }
56+
}
57+
58+
return DocV2AcceptanceEvent.builder()
59+
.conversationId(conversationId)
60+
.numberOfAddedChars(numberOfAddedChars)
61+
.numberOfAddedLines(numberOfAddedLines)
62+
.numberOfAddedFiles(numberOfAddedFiles)
3963
.userDecision(userDecision)
4064
.interactionType(interactionType)
41-
.userIdentity(userIdentity)
42-
.numberOfNavigation(numberOfNavigation)
65+
.numberOfNavigations(numberOfNavigations)
4366
.folderLevel(folderLevel)
4467
.build()
4568
}
4669

4770
fun reset() {
4871
conversationId = null
49-
numberOfAddChars = null
50-
numberOfAddLines = null
51-
numberOfAddFiles = null
72+
numberOfAddedChars = null
73+
numberOfAddedLines = null
74+
numberOfAddedFiles = null
75+
numberOfGeneratedChars = null
76+
numberOfGeneratedLines = null
77+
numberOfGeneratedFiles = null
5278
userDecision = null
5379
interactionType = null
54-
userIdentity = null
55-
numberOfNavigation = 0
56-
folderLevel = null
80+
numberOfNavigations = 0
81+
folderLevel = DocFolderLevel.ENTIRE_WORKSPACE
5782
}
5883

5984
companion object {

0 commit comments

Comments
 (0)