Skip to content

Commit e836e51

Browse files
authored
feat(shared): support AB testing aws#5443
## Problem Enable A/B testing for AWS Toolkits and Amazon Q by reusing CodeWhisperer's A/B testing platform ## Solution - Abstract out Feature Config from CodeWhisperer to Shared folder.
1 parent 648c809 commit e836e51

File tree

16 files changed

+94
-66
lines changed

16 files changed

+94
-66
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "Support AB testing"
4+
}

packages/core/src/codewhisperer/activation.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import {
3939
connectWithCustomization,
4040
applySecurityFix,
4141
signoutCodeWhisperer,
42-
fetchFeatureConfigsCmd,
4342
toggleCodeScans,
4443
registerToolkitApiCallback,
4544
} from './commands/basicCommands'
@@ -71,6 +70,7 @@ import { registerWebviewErrorHandler } from '../webviews/server'
7170
import { logAndShowError, logAndShowWebviewError } from '../shared/utilities/logAndShowUtils'
7271
import { openSettings } from '../shared/settings'
7372
import { telemetry } from '../shared/telemetry'
73+
import { FeatureConfigProvider } from '../shared/featureConfig'
7474

7575
let localize: nls.LocalizeFunc
7676

@@ -252,8 +252,6 @@ export async function activate(context: ExtContext): Promise<void> {
252252
selectCustomizationPrompt.register(),
253253
// notify new customizations
254254
notifyNewCustomizationsCmd.register(),
255-
// fetch feature configs
256-
fetchFeatureConfigsCmd.register(),
257255
/**
258256
* On recommendation acceptance
259257
*/
@@ -594,6 +592,10 @@ export async function activate(context: ExtContext): Promise<void> {
594592
)
595593
}
596594

595+
void FeatureConfigProvider.instance.fetchFeatureConfigs().catch((error) => {
596+
getLogger().error('Failed to fetch feature configs - %s', error)
597+
})
598+
597599
await Commands.tryExecute('aws.amazonq.refreshConnectionCallback')
598600
container.ready()
599601
}

packages/core/src/codewhisperer/client/codewhisperer.ts

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,7 @@ import { AWSError, Credentials, Service } from 'aws-sdk'
77
import globals from '../../shared/extensionGlobals'
88
import * as CodeWhispererClient from './codewhispererclient'
99
import * as CodeWhispererUserClient from './codewhispereruserclient'
10-
import {
11-
ListAvailableCustomizationsResponse,
12-
ListFeatureEvaluationsRequest,
13-
ListFeatureEvaluationsResponse,
14-
SendTelemetryEventRequest,
15-
} from './codewhispereruserclient'
10+
import { ListAvailableCustomizationsResponse, SendTelemetryEventRequest } from './codewhispereruserclient'
1611
import { ServiceOptions } from '../../shared/awsClientBuilder'
1712
import { hasVendedIamCredentials } from '../../auth/auth'
1813
import { CodeWhispererSettings } from '../util/codewhispererSettings'
@@ -267,19 +262,6 @@ export class DefaultCodeWhispererClient {
267262
getLogger().debug(`codewhisperer: sendTelemetryEvent requestID: ${response.$response.requestId}`)
268263
}
269264

270-
public async listFeatureEvaluations(): Promise<ListFeatureEvaluationsResponse> {
271-
const request: ListFeatureEvaluationsRequest = {
272-
userContext: {
273-
ideCategory: 'VSCODE',
274-
operatingSystem: getOperatingSystem(),
275-
product: 'CodeWhisperer', // TODO: update this?
276-
clientId: getClientId(globals.globalState),
277-
ideVersion: extensionVersion,
278-
},
279-
}
280-
return (await this.createUserSdkClient()).listFeatureEvaluations(request).promise()
281-
}
282-
283265
/**
284266
* @description Use this function to start the transformation job.
285267
* @param request

packages/core/src/codewhisperer/commands/basicCommands.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import { applyPatch } from 'diff'
2929
import { closeSecurityIssueWebview, showSecurityIssueWebview } from '../views/securityIssue/securityIssueWebview'
3030
import { Mutable } from '../../shared/utilities/tsUtils'
3131
import { CodeWhispererSource } from './types'
32-
import { FeatureConfigProvider } from '../service/featureConfigProvider'
3332
import { TelemetryHelper } from '../util/telemetryHelper'
3433
import { Auth, AwsConnection } from '../../auth'
3534
import { once } from '../../shared/utilities/functionUtils'
@@ -302,13 +301,6 @@ function focusQAfterDelay() {
302301
}, 1000)
303302
}
304303

305-
export const fetchFeatureConfigsCmd = Commands.declare(
306-
{ id: 'aws.amazonq.fetchFeatureConfigs', logging: false },
307-
() => async () => {
308-
await FeatureConfigProvider.instance.fetchFeatureConfigs()
309-
}
310-
)
311-
312304
/**
313305
* Actually install Amazon Q.
314306
* Sometimes reload VS Code window after installation is necessary

packages/core/src/codewhisperer/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export { session } from './util/codeWhispererSession'
5353
export { onInlineAcceptance } from './commands/onInlineAcceptance'
5454
export { stopTransformByQ } from './commands/startTransformByQ'
5555
export { getCompletionItems, getCompletionItem, getLabel } from './service/completionProvider'
56-
export { featureDefinitions, FeatureConfigProvider } from './service/featureConfigProvider'
56+
export { featureDefinitions, FeatureConfigProvider } from '../shared/featureConfig'
5757
export { ReferenceInlineProvider } from './service/referenceInlineProvider'
5858
export { ReferenceHoverProvider } from './service/referenceHoverProvider'
5959
export { CWInlineCompletionItemProvider } from './service/inlineCompletionItemProvider'

packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55
import * as vscode from 'vscode'
6-
import * as fs from 'fs-extra'
6+
import * as fs from 'fs'
77
import * as path from 'path'
88
import * as os from 'os'
99
import * as codeWhisperer from '../../client/codewhisperer'
@@ -343,7 +343,7 @@ export async function zipCode({ dependenciesFolder, humanInTheLoopFlag, modulePa
343343
const sourceFiles = getFilesRecursively(modulePath, false)
344344
let sourceFilesSize = 0
345345
for (const file of sourceFiles) {
346-
if ((await fs.stat(file)).isDirectory()) {
346+
if (fs.statSync(file).isDirectory()) {
347347
getLogger().info('CodeTransformation: Skipping directory, likely a symlink')
348348
continue
349349
}

packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import AdmZip from 'adm-zip'
77
import os from 'os'
8-
import fs from 'fs-extra'
8+
import fs from 'fs'
99
import { parsePatch, applyPatches, ParsedDiff } from 'diff'
1010
import path from 'path'
1111
import vscode from 'vscode'
@@ -129,7 +129,7 @@ export class DiffModel {
129129
changedFiles.forEach((file) => {
130130
const pathToTmpFile = path.join(pathToTmpSrcDir, file.oldFileName!.substring(2))
131131
// use mkdirsSync to create parent directories in pathToTmpFile too
132-
fs.mkdirsSync(path.dirname(pathToTmpFile))
132+
fs.mkdirSync(path.dirname(pathToTmpFile), { recursive: true })
133133
const pathToOldFile = path.join(pathToWorkspace, file.oldFileName!.substring(2))
134134
// pathToOldFile will not exist for new files such as summary.md
135135
if (fs.existsSync(pathToOldFile)) {

packages/core/src/codewhisperer/util/authUtil.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ export class AuthUtil {
139139
// To check valid connection
140140
if (this.isValidEnterpriseSsoInUse() || (this.isBuilderIdInUse() && !this.isConnectionExpired())) {
141141
// start the feature config polling job
142-
await vscode.commands.executeCommand('aws.amazonq.fetchFeatureConfigs')
143142
await showAmazonQWalkthroughOnce()
144143
}
145144
await this.setVscodeContextProps()

packages/core/src/codewhisperer/util/customizationUtil.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { showMessageWithUrl } from '../../shared/utilities/messages'
1818
import { parse } from '@aws-sdk/util-arn-parser'
1919
import { Commands } from '../../shared/vscode/commands2'
2020
import { vsCodeState } from '../models/model'
21-
import { FeatureConfigProvider } from '../service/featureConfigProvider'
21+
import { FeatureConfigProvider } from '../../shared/featureConfig'
2222

2323
/**
2424
*

packages/core/src/codewhisperer/util/telemetryHelper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { isAwsError } from '../../shared/errors'
2525
import { getLogger } from '../../shared/logger'
2626
import { session } from './codeWhispererSession'
2727
import { CodeWhispererSupplementalContext } from '../models/model'
28-
import { FeatureConfigProvider } from '../service/featureConfigProvider'
28+
import { FeatureConfigProvider } from '../../shared/featureConfig'
2929
import { CodeScanRemediationsEventType } from '../client/codewhispereruserclient'
3030

3131
export class TelemetryHelper {

0 commit comments

Comments
 (0)