diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/migration/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/migration/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt index 53de2db3454..b95002fe19f 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/migration/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/migration/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt @@ -37,6 +37,11 @@ interface CodeWhispererModelConfigurator { */ fun getNewUpdate(connectionId: String): Collection? + /** + * Get any current persisted customization arn override config + */ + fun getPersistedCustomizationOverride(): String? + companion object { fun getInstance(): CodeWhispererModelConfigurator = service() } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt index 077783d2c91..f19df1595bf 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt @@ -76,8 +76,11 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe private val hasShownNewCustomizationNotification = AtomicBoolean(false) + @Deprecated("Use customizationArnOverrideV2 for the latest arn override persistence") private var serviceDefaultArn: String? = null + private var customizationArnOverrideV2: String? = null + override fun showConfigDialog(project: Project) { runInEdt { calculateIfIamIdentityCenterConnection(project) { @@ -181,7 +184,7 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe */ override fun switchCustomization(project: Project, newCustomization: CodeWhispererCustomization?, isOverride: Boolean) { calculateIfIamIdentityCenterConnection(project) { - if (isOverride && (newCustomization == null || newCustomization.arn.isEmpty() || serviceDefaultArn == newCustomization.arn)) { + if (isOverride && (newCustomization == null || newCustomization.arn.isEmpty() || customizationArnOverrideV2 == newCustomization.arn)) { return@calculateIfIamIdentityCenterConnection } val oldCus = connectionIdToActiveCustomizationArn[it.id] @@ -197,7 +200,7 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe CodeWhispererCustomizationListener.notifyCustomUiUpdate() } if (isOverride) { - serviceDefaultArn = newCustomization?.arn + customizationArnOverrideV2 = newCustomization?.arn } } } @@ -249,6 +252,7 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe state.connectionIdToActiveCustomizationArn.putAll(this.connectionIdToActiveCustomizationArn) state.previousAvailableCustomizations.putAll(this.connectionToCustomizationsShownLastTime) state.serviceDefaultArn = this.serviceDefaultArn + state.customizationArnOverrideV2 = this.customizationArnOverrideV2 return state } @@ -261,8 +265,12 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe connectionToCustomizationsShownLastTime.putAll(state.previousAvailableCustomizations) this.serviceDefaultArn = state.serviceDefaultArn + this.customizationArnOverrideV2 = state.customizationArnOverrideV2 } + // current latest field is customizationArnOverrideV2 + override fun getPersistedCustomizationOverride() = customizationArnOverrideV2 + override fun dispose() {} private fun invalidateSelectedAndNotify(project: Project) { @@ -292,8 +300,12 @@ class CodeWhispererCustomizationState : BaseState() { @get:MapAnnotation val previousAvailableCustomizations by map>() + @Deprecated("Use customizationArnOverrideV2 for the latest arn override persistence") @get:Property var serviceDefaultArn by string() + + @get:Property + var customizationArnOverrideV2 by string() } data class CustomizationUiItem( diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererProjectStartupActivity.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererProjectStartupActivity.kt index e2adcb8bdc6..1900239222a 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererProjectStartupActivity.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererProjectStartupActivity.kt @@ -74,12 +74,18 @@ class CodeWhispererProjectStartupActivity : StartupActivity.DumbAware { runOnce = true } - // Start a job that runs every 30 mins + // Start a job that runs every 180 minutes private fun initFeatureConfigPollingJob(project: Project) { projectCoroutineScope(project).launch { while (isActive) { CodeWhispererFeatureConfigService.getInstance().fetchFeatureConfigs(project) CodeWhispererFeatureConfigService.getInstance().getCustomizationFeature()?.let { customization -> + val persistedCustomizationOverride = CodeWhispererModelConfigurator.getInstance().getPersistedCustomizationOverride() + val latestCustomizationOverride = customization.value.stringValue() + if (persistedCustomizationOverride == latestCustomizationOverride) return@let + + // latest is different from the currently persisted, need update + CodeWhispererFeatureConfigService.getInstance().validateCustomizationOverride(project, customization) CodeWhispererModelConfigurator.getInstance().switchCustomization( project, CodeWhispererCustomization(arn = customization.value.stringValue(), name = customization.variation), diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt index 04952537aa4..68703549967 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt @@ -88,7 +88,7 @@ object CodeWhispererConstants { const val TOTAL_MILLIS_IN_SECOND = 1000 const val TOTAL_SECONDS_IN_MINUTE: Long = 60L const val ACCOUNTLESS_START_URL = "accountless" - const val FEATURE_CONFIG_POLL_INTERVAL_IN_MS: Long = 30 * 60 * 1000L // 30 mins + const val FEATURE_CONFIG_POLL_INTERVAL_IN_MS: Long = 180 * 60 * 1000L // 180 mins const val USING: String = "using" const val GLOBAL_USING: String = "global using" const val STATIC: String = "static" diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererModelConfiguratorTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererModelConfiguratorTest.kt index baf42966096..b1fa0ef5592 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererModelConfiguratorTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererModelConfiguratorTest.kt @@ -421,7 +421,7 @@ class CodeWhispererModelConfiguratorTest { ) ) - this.serviceDefaultArn = "arn:aws:codewhisperer:default" + this.customizationArnOverrideV2 = "arn:aws:codewhisperer:default" } XmlSerializer.serializeInto(state, element) @@ -441,6 +441,7 @@ class CodeWhispererModelConfiguratorTest { "" + "" + "" + + "" + - " -