Skip to content

Commit 709a6ed

Browse files
committed
default optin project context for internal users
1 parent 41965f8 commit 709a6ed

File tree

7 files changed

+30
-26
lines changed

7 files changed

+30
-26
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,16 @@ import kotlinx.coroutines.delay
1414
import kotlinx.coroutines.time.withTimeout
1515
import software.aws.toolkits.core.utils.getLogger
1616
import software.aws.toolkits.core.utils.warn
17+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
18+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
19+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1720
import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState
21+
import software.aws.toolkits.jetbrains.services.amazonq.isInternalUser
1822
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
1923
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
2024
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
2125
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
26+
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
2227
import java.lang.management.ManagementFactory
2328
import java.time.Duration
2429
import java.util.concurrent.atomic.AtomicBoolean
@@ -29,6 +34,12 @@ class AmazonQStartupActivity : ProjectActivity {
2934
override suspend fun execute(project: Project) {
3035
if (ApplicationManager.getApplication().isUnitTestMode) return
3136

37+
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let {
38+
if (it is AwsBearerTokenConnection && isInternalUser(it.startUrl)) {
39+
CodeWhispererSettings.getInstance().toggleProjectContextEnabled(true, passive = true)
40+
}
41+
}
42+
3243
// initialize html contents in BGT so users don't have to wait when they open the tool window
3344
AmazonQToolWindow.getInstance(project)
3445

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/GenerateUnitTestsAction.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import com.intellij.openapi.actionSystem.CommonDataKeys
99
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
1010
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1111
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
12+
import software.aws.toolkits.jetbrains.services.amazonq.isInternalUser
1213

1314
class GenerateUnitTestsAction : CustomAction(EditorContextCommand.GenerateUnitTests) {
1415
override fun getActionUpdateThread() = ActionUpdateThread.BGT
1516

1617
override fun update(e: AnActionEvent) {
1718
val project = e.getData(CommonDataKeys.PROJECT) ?: return
1819
val connection = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
19-
e.presentation.isEnabledAndVisible = connection?.startUrl == "https://amzn.awsapps.com/start"
20+
e.presentation.isEnabledAndVisible = isInternalUser(connection?.startUrl)
2021
}
2122
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ import software.aws.toolkits.core.utils.getLogger
3636
import software.aws.toolkits.core.utils.info
3737
import software.aws.toolkits.core.utils.warn
3838
import software.aws.toolkits.jetbrains.core.coroutines.EDT
39-
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
4039
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
4140
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
4241
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthNeededState
42+
import software.aws.toolkits.jetbrains.services.amazonq.isInternalUser
4343
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher
4444
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction
4545
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType
@@ -129,8 +129,8 @@ class ChatController private constructor(
129129
val triggerId = UUID.randomUUID().toString()
130130
var shouldAddIndexInProgressMessage: Boolean = false
131131
var shouldUseWorkspaceContext: Boolean = false
132-
val isDataCollectionGroup = CodeWhispererFeatureConfigService.getInstance().getIsDataCollectionEnabled()
133132
val startUrl = getStartUrl(context.project)
133+
val isInternalUser = isInternalUser(startUrl)
134134

135135
if (prompt.contains("@workspace")) {
136136
if (CodeWhispererSettings.getInstance().isProjectContextEnabled()) {
@@ -143,7 +143,9 @@ class ChatController private constructor(
143143
} else {
144144
sendOpenSettingsMessage(message.tabId)
145145
}
146-
} else if (CodeWhispererSettings.getInstance().isProjectContextEnabled() && isDataCollectionGroup) {
146+
} else if (CodeWhispererSettings.getInstance().isProjectContextEnabled() && isInternalUser) {
147+
// if user does not have @workspace in the prompt, but user is Amazon internal
148+
// add project context by default
147149
val projectContextController = ProjectContextController.getInstance(context.project)
148150
queryResult = projectContextController.query(prompt)
149151
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/userIntent/UserIntentRecognizer.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package software.aws.toolkits.jetbrains.services.cwc.controller.chat.userIntent
55

66
import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent
7+
import software.aws.toolkits.jetbrains.services.amazonq.isInternalUser
78
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction
89
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType
910
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.FollowUpType
@@ -25,7 +26,7 @@ class UserIntentRecognizer {
2526
prompt.startsWith("Refactor") -> UserIntent.SUGGEST_ALTERNATE_IMPLEMENTATION
2627
prompt.startsWith("Fix") -> UserIntent.APPLY_COMMON_BEST_PRACTICES
2728
prompt.startsWith("Optimize") -> UserIntent.IMPROVE_CODE
28-
prompt.startsWith("Generate unit tests") && isInternalAmazonUser(startUrl) -> UserIntent.GENERATE_UNIT_TESTS
29+
prompt.startsWith("Generate unit tests") && isInternalUser(startUrl) -> UserIntent.GENERATE_UNIT_TESTS
2930
else -> null
3031
}
3132

@@ -45,6 +46,4 @@ class UserIntentRecognizer {
4546
fun getUserIntentFromOnboardingPageInteraction(interaction: OnboardingPageInteraction) = when (interaction.type) {
4647
OnboardingPageInteractionType.CwcButtonClick -> null
4748
}
48-
49-
private fun isInternalAmazonUser(startUrl: String?): Boolean = startUrl == "https://amzn.awsapps.com/start"
5049
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/CodeWhispererFeatureConfigService.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,6 @@ class CodeWhispererFeatureConfigService {
101101
// 6) Add a test case for this feature.
102102
fun getTestFeature(): String = getFeatureValueForKey(TEST_FEATURE_NAME).stringValue()
103103

104-
fun getIsDataCollectionEnabled(): Boolean =
105-
getFeatureValueForKey(DATA_COLLECTION_FEATURE).stringValue() == "data-collection"
106-
107104
fun getCustomizationArnOverride(): String = getFeatureValueForKey(CUSTOMIZATION_ARN_OVERRIDE_NAME).stringValue()
108105

109106
fun getNewAutoTriggerUX(): Boolean = getFeatureValueForKey(NEW_AUTO_TRIGGER_UX).stringValue() == "TREATMENT"
@@ -120,7 +117,6 @@ class CodeWhispererFeatureConfigService {
120117
fun getInstance(): CodeWhispererFeatureConfigService = service()
121118
private const val TEST_FEATURE_NAME = "testFeature"
122119
private const val INLINE_COMPLETION = "ProjectContextV2"
123-
private const val DATA_COLLECTION_FEATURE = "IDEProjectContextDataCollection"
124120
const val CUSTOMIZATION_ARN_OVERRIDE_NAME = "customizationArnOverride"
125121
private const val NEW_AUTO_TRIGGER_UX = "newAutoTriggerUX"
126122
private val LOG = getLogger<CodeWhispererFeatureConfigService>()

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QUtils.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererCon
1414
import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
1515
import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata
1616

17+
fun isInternalUser(startUrl: String?): Boolean = startUrl == "https://amzn.awsapps.com/start"
18+
1719
fun <T> calculateIfIamIdentityCenterConnection(project: Project, calculationTask: (connection: ToolkitConnection) -> T): T? =
1820
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(CodeWhispererConnection.getInstance())?.let {
1921
calculateIfIamIdentityCenterConnection(it, calculationTask)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/CodeWhispererSettings.kt

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.intellij.openapi.components.State
1111
import com.intellij.openapi.components.Storage
1212
import com.intellij.openapi.components.service
1313
import com.intellij.util.xmlb.annotations.Property
14-
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
1514

1615
@Service
1716
@State(name = "codewhispererSettings", storages = [Storage("aws.xml", roamingType = RoamingType.DISABLED)])
@@ -45,25 +44,19 @@ class CodeWhispererSettings : PersistentStateComponent<CodeWhispererConfiguratio
4544
true
4645
)
4746

48-
fun toggleProjectContextEnabled(value: Boolean) {
49-
state.value[CodeWhispererConfigurationType.IsProjectContextEnabled] = value
50-
}
51-
52-
fun isProjectContextEnabled() = getIsProjectContextEnabled()
53-
54-
private fun getIsProjectContextEnabled(): Boolean {
55-
val value = state.value.getOrDefault(CodeWhispererConfigurationType.IsProjectContextEnabled, false)
56-
val isDataCollectionGroup = CodeWhispererFeatureConfigService.getInstance().getIsDataCollectionEnabled()
57-
if (!value) {
58-
if (isDataCollectionGroup && !hasEnabledProjectContextOnce()) {
59-
toggleProjectContextEnabled(true)
47+
fun toggleProjectContextEnabled(value: Boolean, passive: Boolean = false) {
48+
if (passive) {
49+
if (isProjectContextEnabled() && !hasEnabledProjectContextOnce()) {
6050
toggleEnabledProjectContextOnce(true)
61-
return true
51+
state.value[CodeWhispererConfigurationType.IsProjectContextEnabled] = value
6252
}
53+
} else {
54+
state.value[CodeWhispererConfigurationType.IsProjectContextEnabled] = value
6355
}
64-
return value
6556
}
6657

58+
fun isProjectContextEnabled() = state.value.getOrDefault(CodeWhispererConfigurationType.IsProjectContextEnabled, false)
59+
6760
private fun hasEnabledProjectContextOnce() = state.value.getOrDefault(CodeWhispererConfigurationType.HasEnabledProjectContextOnce, false)
6861

6962
private fun toggleEnabledProjectContextOnce(value: Boolean) {

0 commit comments

Comments
 (0)