Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "feature",
"description" : "/transform: ask user for permission to rerun job and view logs at end of partially successful transformation"
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
CodeTransformCancel("codetransform-cancel"),
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
CodeTransformConfirmOneOrMultipleDiffs("codetransform-confirm-one-or-multiple-diffs"),
CodeTransformConfirmPermissionsSelection("codetransform-confirm-permissions"),
CodeTransformNew("codetransform-new"),
CodeTransformOpenTransformHub("codetransform-open-transform-hub"),
CodeTransformOpenMvnBuild("codetransform-open-mvn-build"),
Expand Down Expand Up @@ -77,6 +78,7 @@ class CodeTransformChatApp : AmazonQApp {
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
CodeTransformMessageTypes.CodeTransformConfirmOneOrMultipleDiffs.type to IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs::class,
CodeTransformMessageTypes.CodeTransformConfirmPermissionsSelection.type to IncomingCodeTransformMessage.CodeTransformConfirmPermissions::class,
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
CodeTransformMessageTypes.CodeTransformOpenMvnBuild.type to IncomingCodeTransformMessage.CodeTransformOpenMvnBuild::class,
Expand Down Expand Up @@ -176,6 +178,7 @@ class CodeTransformChatApp : AmazonQApp {
is IncomingCodeTransformMessage.ChatPrompt -> inboundAppMessagesHandler.processChatPromptMessage(message)
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
is IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs -> inboundAppMessagesHandler.processCodeTransformOneOrMultipleDiffs(message)
is IncomingCodeTransformMessage.CodeTransformConfirmPermissions -> inboundAppMessagesHandler.processCodeTransformConfirmPermissions(message)
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
is IncomingCodeTransformMessage.CodeTransformOpenMvnBuild -> inboundAppMessagesHandler.processCodeTransformOpenMvnBuild(message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ interface InboundAppMessagesHandler {

suspend fun processCodeTransformOneOrMultipleDiffs(message: IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs)

suspend fun processCodeTransformConfirmPermissions(message: IncomingCodeTransformMessage.CodeTransformConfirmPermissions)

suspend fun processCodeTransformOpenTransformHub(message: IncomingCodeTransformMessage.CodeTransformOpenTransformHub)

suspend fun processCodeTransformOpenMvnBuild(message: IncomingCodeTransformMessage.CodeTransformOpenMvnBuild)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@ private val confirmOneOrMultipleDiffsSelectionButton = Button(
id = CodeTransformButtonId.ConfirmOneOrMultipleDiffs.id,
)

private val confirmUserSelectionPermissionsButton = Button(
keepCardAfterClick = false,
waitMandatoryFormItems = true,
text = message("codemodernizer.chat.message.button.confirm"),
id = CodeTransformButtonId.ConfirmPermissions.id,
)

private val openMvnBuildButton = Button(
id = CodeTransformButtonId.OpenMvnBuild.id,
text = message("codemodernizer.chat.message.button.view_build"),
Expand Down Expand Up @@ -204,14 +211,14 @@ private val selectSkipTestsFlagFormItem = FormItem(
title = message("codemodernizer.chat.form.user_selection.item.choose_skip_tests_option"),
mandatory = true,
options = listOf(
FormItemOption(
label = message("codemodernizer.chat.message.skip_tests_form.skip"),
value = message("codemodernizer.chat.message.skip_tests_form.skip"),
),
FormItemOption(
label = message("codemodernizer.chat.message.skip_tests_form.run_tests"),
value = message("codemodernizer.chat.message.skip_tests_form.run_tests"),
),
FormItemOption(
label = message("codemodernizer.chat.message.skip_tests_form.skip"),
value = message("codemodernizer.chat.message.skip_tests_form.skip"),
)
)
)

Expand All @@ -231,6 +238,50 @@ private val selectOneOrMultipleDiffsFlagFormItem = FormItem(
)
)

private val selectCanRerunJobFormItem = FormItem(
id = CodeTransformFormItemId.SelectCanRerunJob.id,
title = "To improve our service, do we have permission to re-run your job? You will *not* be charged.",
type = "radiogroup",
mandatory = true,
options = listOf(
FormItemOption(
label = "Yes",
value = "Yes",
),
FormItemOption(
label = "No",
value = "No",
)
)
)

private val selectCanViewLogsFormItem = FormItem(
id = CodeTransformFormItemId.SelectCanViewLogs.id,
title = "Do we also have permission to view the logs?",
type = "radiogroup",
mandatory = true,
options = listOf(
FormItemOption(
label = "Yes",
value = "Yes",
),
FormItemOption(
label = "No",
value = "No",
)
)
)

private fun getUserPermissionsSelectionMarkdown(canRerunJob: String, canViewLogs: String) = """
### Response received
-------------

| | |
| :------------------- | -------: |
| **Can re-run job** | $canRerunJob |
| **Can view logs** | $canViewLogs |
""".trimIndent()

private fun getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName: String, targetJdkVersion: String): String = """
### ${message("codemodernizer.chat.prompt.title.details")}
-------------
Expand Down Expand Up @@ -323,11 +374,13 @@ fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent =
formItems = listOf(selectSkipTestsFlagFormItem),
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserInputOneOrMultipleDiffsChatIntroContent(version: String): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.message.one_or_multiple_diffs", version.substring(4)), // extract "17" / "21" from "JDK_17" / "JDK_21"
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserInputOneOrMultipleDiffsFlagChatContent(): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.form.user_selection.title"),
Expand All @@ -339,6 +392,20 @@ fun buildUserInputOneOrMultipleDiffsFlagChatContent(): CodeTransformChatMessageC
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserInputPermissionsFeedbackChatContent(): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.form.user_permissions.title"),
buttons = listOf(
confirmUserSelectionPermissionsButton,
cancelUserSelectionButton,
),
formItems = listOf(
selectCanRerunJobFormItem,
selectCanViewLogsFormItem,
),
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserSkipTestsFlagSelectionChatContent(skipTestsSelection: String) = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.FinalizedAnswer,
message = message("codemodernizer.chat.message.skip_tests_form.response", skipTestsSelection.lowercase())
Expand Down Expand Up @@ -451,6 +518,11 @@ fun buildUserLanguageUpgradeSelectionSummaryChatContent(moduleName: String, targ
message = getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName, targetJdkVersion)
)

fun buildUserPermissionsSelectionChatContent(canRerunJob: String, canViewLogs: String) = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.Prompt,
message = getUserPermissionsSelectionMarkdown(canRerunJob, canViewLogs),
)

fun buildCompileLocalInProgressChatContent() = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.PendingAnswer,
message = message("codemodernizer.chat.message.local_build_begin"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType
import software.amazon.awssdk.services.toolkittelemetry.model.Sentiment
import software.aws.toolkits.core.utils.debug
import software.aws.toolkits.core.utils.error
import software.aws.toolkits.core.utils.getLogger
Expand Down Expand Up @@ -74,11 +75,13 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUs
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputLanguageUpgradeChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputOneOrMultipleDiffsChatIntroContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputOneOrMultipleDiffsFlagChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputPermissionsFeedbackChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSQLConversionMetadataChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatIntroContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserLanguageUpgradeSelectionSummaryChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserOneOrMultipleDiffsSelectionChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserPermissionsSelectionChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSQLConversionSelectionSummaryChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSkipTestsFlagSelectionChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserStopTransformChatContent
Expand Down Expand Up @@ -115,6 +118,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.validateSct
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeatureEvent
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
import software.aws.toolkits.resources.message
import software.aws.toolkits.telemetry.CodeTransformPreValidationError

Expand Down Expand Up @@ -429,6 +433,20 @@ class CodeTransformChatController(
}
}

override suspend fun processCodeTransformConfirmPermissions(message: IncomingCodeTransformMessage.CodeTransformConfirmPermissions) {
val canRerunJob = message.canRerunJob
val canViewLogs = message.canViewLogs
codeTransformChatHelper.addNewMessage(buildUserPermissionsSelectionChatContent(canRerunJob, canViewLogs))
if (canRerunJob == "Yes" || canViewLogs == "Yes") {
val sessionState = CodeModernizerSessionState.getInstance(context.project)
val jobId: String = sessionState.currentJobId?.id ?: "None"
TelemetryService.getInstance().sendFeedback(
Sentiment.POSITIVE,
"Permission to re-run job: $canRerunJob\nPermission to view logs: $canViewLogs\njobId: $jobId",
)
}
}

private fun getSourceJdk(moduleConfigurationFile: VirtualFile): JavaSdkVersion {
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleConfigurationFile, context.project)?.tryGetJdk(context.project)
Expand Down Expand Up @@ -719,7 +737,10 @@ class CodeTransformChatController(
when (downloadResult) {
is DownloadArtifactResult.Success -> {
if (downloadResult.artifact !is CodeModernizerArtifact) return artifactHandler.notifyUnableToApplyPatch("")
codeTransformChatHelper.updateLastPendingMessage(
if (result is CodeModernizerJobCompletedResult.JobPartiallySucceeded) {
codeTransformChatHelper.addNewMessage(buildUserInputPermissionsFeedbackChatContent())
}
codeTransformChatHelper.addNewMessage(
buildTransformResultChatContent(result, downloadResult.artifact.patches.size)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ enum class CodeTransformButtonId(val id: String) {
CancelTransformation("codetransform-input-cancel"),
ConfirmSkipTests("codetransform-input-confirm-skip-tests"),
ConfirmOneOrMultipleDiffs("codetransform-input-confirm-one-or-multiple-diffs"),
ConfirmPermissions("codetransform-input-confirm-permissions"),
StopTransformation("stop_transform"),
OpenTransformationHub("open_transformation_hub"),
OpenMvnBuild("open_mvn_build"),
Expand All @@ -39,6 +40,8 @@ enum class CodeTransformFormItemId(val id: String) {
SelectTargetVersion("targetVersion"),
SelectSkipTestsFlag("skipTestsSelection"),
SelectOneOrMultipleDiffsFlag("oneOrMultipleDiffsSelection"),
SelectCanRerunJob("rerunJobSelection"),
SelectCanViewLogs("viewLogsSelection"),
DependencyVersion("dependencyVersion"),
}

Expand Down Expand Up @@ -113,6 +116,12 @@ sealed interface IncomingCodeTransformMessage : CodeTransformBaseMessage {
val oneOrMultipleDiffsSelection: String,
) : IncomingCodeTransformMessage

data class CodeTransformConfirmPermissions(
@JsonProperty("tabID") val tabId: String,
val canRerunJob: String,
val canViewLogs: String,
) : IncomingCodeTransformMessage

data class CodeTransformOpenMvnBuild(
@JsonProperty("tabID") val tabId: String,
) : IncomingCodeTransformMessage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,14 @@ export class CodeTransformChatConnector {
tabType: 'codetransform',
oneOrMultipleDiffsSelection: action.formItemValues?.oneOrMultipleDiffsSelection
})
} else if (action.id === FormButtonIds.CodeTransformInputPermissions) {
this.sendMessageToExtension({
command: 'codetransform-confirm-permissions',
tabID,
tabType: 'codetransform',
canRerunJob: action.formItemValues?.rerunJobSelection,
canViewLogs: action.formItemValues?.viewLogsSelection,
})
} else if (action.id === FormButtonIds.OpenTransformationHub) {
this.sendMessageToExtension({
command: 'codetransform-open-transform-hub',
Expand Down
1 change: 1 addition & 0 deletions plugins/amazonq/mynah-ui/src/mynah-ui/ui/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ type MessageCommand =
| 'codetransform-stop'
| 'codetransform-confirm-skip-tests'
| 'codetransform-confirm-one-or-multiple-diffs'
| 'codetransform-confirm-permissions'
| 'codetransform-new'
| 'codetransform-open-transform-hub'
| 'codetransform-open-mvn-build'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export const enum FormButtonIds {
CodeTransformInputCancel = 'codetransform-input-cancel',
CodeTransformInputSkipTests = 'codetransform-input-confirm-skip-tests',
CodeTransformInputOneOrMultipleDiffs = 'codetransform-input-confirm-one-or-multiple-diffs',
CodeTransformInputPermissions = 'codetransform-input-confirm-permissions',
OpenMvnBuild = 'open_mvn_build',
StopTransform = 'stop_transform',
OpenTransformationHub = 'open_transformation_hub',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,7 @@ code.aws.value_prop_text=Amazon CodeCatalyst: Launch developer environments in t
code.aws.workspaces=Amazon CodeCatalyst
code.aws.workspaces.short=Dev Environments
codemodernizer.builderrordialog.description.title=Error occurred when building your project
codemodernizer.chat.form.user_permissions.title=Amazon Q Permissions Form
codemodernizer.chat.form.user_selection.item.choose_module=Choose a module to transform
codemodernizer.chat.form.user_selection.item.choose_one_or_multiple_diffs_option=Choose how to receive proposed changes
codemodernizer.chat.form.user_selection.item.choose_skip_tests_option=Choose to skip unit tests
Expand Down Expand Up @@ -686,7 +687,7 @@ codemodernizer.chat.message.skip_tests_form.skip=Skip unit tests
codemodernizer.chat.message.sql_metadata_success=I found the following source database, target database, and host based on the schema conversion metadata you provided:
codemodernizer.chat.message.sql_module_schema_prompt=To continue, choose the module and schema for this transformation.
codemodernizer.chat.message.transform_begin=I'm starting to transform your code. It can take 10 to 30 minutes to upgrade your code, depending on the size of your module. To monitor progress, go to the Transformation Hub.
codemodernizer.chat.message.transform_cancelled_by_user=I cancelled your transformation. If you want to start another transformation, choose **Start a new transformation**.
codemodernizer.chat.message.transform_cancelled_by_user=If you want to start another transformation, choose **Start a new transformation**.
codemodernizer.chat.message.transform_failed=I could not complete the transformation. {0}
codemodernizer.chat.message.transform_in_progress=If I run into any issues, I might pause the transformation to get input from you on how to proceed.
codemodernizer.chat.message.transform_stopped_by_user=I stopped your transformation. If you want to start another transformation, choose **Start a new transformation**.
Expand Down Expand Up @@ -788,7 +789,7 @@ codemodernizer.notification.warn.maven_failed.title=Amazon Q Code Transform unab
codemodernizer.notification.warn.on_resume.unknown_status_response.content=We received data from Amazon Q in a format that the plugin cannot handle. You may need to update the plugin and then try again.
codemodernizer.notification.warn.on_resume.unknown_status_response.title=Unable to resume job
codemodernizer.notification.warn.submit_feedback=Submit feedback
codemodernizer.notification.warn.unable_to_start_job=Amazon Q could not begin the transformation. Try starting the transformation again. {0}
codemodernizer.notification.warn.unable_to_start_job=Amazon Q could not begin the transformation. Try starting the transformation again. {0}. For more information, see the [Amazon Q documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/transform-java.html#quotas-java-transformation-ide).
codemodernizer.notification.warn.unknown_start_failure=Amazon Q could not begin the transformation. Try starting the transformation again.
codemodernizer.notification.warn.unknown_status_response=Amazon Q could not complete the transformation. Try starting the transformation again.
codemodernizer.notification.warn.upload_failed=Amazon Q could not upload your module. Try starting the transformation again. {0}
Expand Down
Loading