Skip to content

Commit a1d43e4

Browse files
committed
feat(amazonq): support configuration for VS Code
1 parent c8ea116 commit a1d43e4

File tree

6 files changed

+44
-9
lines changed

6 files changed

+44
-9
lines changed

server/aws-lsp-codewhisperer/src/language-server/amazonQServiceManager/AmazonQTokenServiceManager.ts

+28-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
CredentialsType,
1414
InitializeParams,
1515
CancellationTokenSource,
16+
DidChangeConfigurationParams,
1617
} from '@aws/language-server-runtimes/server-interface'
1718
import {
1819
DEFAULT_AWS_Q_ENDPOINT_URL,
@@ -34,7 +35,7 @@ import {
3435
AmazonQServiceProfileUpdateCancelled,
3536
} from './errors'
3637
import { BaseAmazonQServiceManager } from './BaseAmazonQServiceManager'
37-
import { Q_CONFIGURATION_SECTION } from '../configuration/qConfigurationServer'
38+
import { Q_CONFIGURATION_SECTION, Q_CONFIGURATION_VSC } from '../configuration/qConfigurationServer'
3839
import { textUtils } from '@aws/lsp-core'
3940
import { CodeWhispererStreaming } from '@amzn/codewhisperer-streaming'
4041
import { ConfiguredRetryStrategy } from '@aws-sdk/util-retry'
@@ -281,8 +282,33 @@ export class AmazonQTokenServiceManager implements BaseAmazonQServiceManager {
281282
this.logServiceState('Unknown Connection state')
282283
}
283284

284-
public async handleDidChangeConfiguration() {
285+
public async handleDidChangeConfiguration(ideCategory?: string, params?: DidChangeConfigurationParams) {
285286
try {
287+
if (ideCategory === 'VSCODE') {
288+
const vscConfig = await this.features.lsp.workspace.getConfiguration(Q_CONFIGURATION_VSC)
289+
if (!vscConfig) {
290+
this.log(`VS Code configuration not found`)
291+
return
292+
}
293+
const optOutTelemetryPreference = vscConfig['shareContentWithAWS'] === true ? 'OPTOUT' : 'OPTIN'
294+
this.log(`Read configuration optOutTelemetryPreference=${optOutTelemetryPreference}`)
295+
this.configurationCache.set('optOutTelemetryPreference', optOutTelemetryPreference)
296+
const includeSuggestionsWithCodeReferences = vscConfig['showCodeWithReferences'] === true
297+
this.log(
298+
`Read сonfiguration includeSuggestionsWithCodeReferences=${includeSuggestionsWithCodeReferences}`
299+
)
300+
this.configurationCache.set(
301+
'includeSuggestionsWithCodeReferences',
302+
includeSuggestionsWithCodeReferences
303+
)
304+
305+
const customizationArn = textUtils.undefinedIfEmpty(params?.settings['customization'])
306+
if (customizationArn) {
307+
this.log(`Read configuration customizationArn=${customizationArn}`)
308+
this.configurationCache.set('customizationArn', customizationArn)
309+
}
310+
return
311+
}
286312
const qConfig = await this.features.lsp.workspace.getConfiguration(Q_CONFIGURATION_SECTION)
287313
if (qConfig) {
288314
// aws.q.customizationArn - selected customization
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { DidChangeConfigurationParams } from '@aws/language-server-runtimes/protocol'
12
import { CodeWhispererServiceBase } from '../codeWhispererService'
23

34
export interface BaseAmazonQServiceManager {
4-
handleDidChangeConfiguration: () => Promise<void>
5+
handleDidChangeConfiguration: (ideCategory?: string, params?: DidChangeConfigurationParams) => Promise<void>
56
getCodewhispererService: () => CodeWhispererServiceBase
67
}

server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
SDKInitializator,
1717
ResponseError,
1818
LSPErrorCodes,
19+
DidChangeConfigurationParams,
1920
} from '@aws/language-server-runtimes/server-interface'
2021
import { AWSError } from 'aws-sdk'
2122
import { autoTrigger, triggerType } from './auto-trigger/autoTrigger'
@@ -34,7 +35,7 @@ import { CodePercentageTracker } from './telemetry/codePercentage'
3435
import { CodeWhispererPerceivedLatencyEvent, CodeWhispererServiceInvocationEvent } from './telemetry/types'
3536
import { getCompletionType, getEndPositionForAcceptedSuggestion, isAwsError, safeGet } from './utils'
3637
import { getUserAgent, makeUserContextObject } from './utilities/telemetryUtils'
37-
import { Q_CONFIGURATION_SECTION } from './configuration/qConfigurationServer'
38+
import { Q_CONFIGURATION_SECTION, Q_CONFIGURATION_VSC } from './configuration/qConfigurationServer'
3839
import { fetchSupplementalContext } from './utilities/supplementalContextUtil/supplementalContextUtil'
3940
import { textUtils } from '@aws/lsp-core'
4041
import { TelemetryService } from './telemetryService'
@@ -642,12 +643,13 @@ export const CodewhispererServerFactory =
642643
await emitUserTriggerDecisionTelemetry(telemetry, telemetryService, session, timeSinceLastUserModification)
643644
}
644645

645-
const updateConfiguration = async () => {
646+
const updateConfiguration = async (params?: DidChangeConfigurationParams) => {
646647
try {
647648
// Currently can't hook AmazonQTokenServiceManager.handleDidChangeConfiguration to lsp listenre directly
648649
// as it will override listeners from each consuming Server.
649650
// TODO: refactor configuration listener in Server and AmazonQTokenServiceManager in runtimes.
650-
await amazonQServiceManager.handleDidChangeConfiguration()
651+
const ideCategory = telemetryService.getUserContext()?.ideCategory
652+
await amazonQServiceManager.handleDidChangeConfiguration(ideCategory, params)
651653

652654
const qConfig = await lsp.workspace.getConfiguration(Q_CONFIGURATION_SECTION)
653655
if (qConfig) {
@@ -739,7 +741,7 @@ export const CodewhispererServerFactory =
739741
lsp.extensions.onInlineCompletionWithReferences(onInlineCompletionHandler)
740742
lsp.extensions.onLogInlineCompletionSessionResults(onLogInlineCompletionSessionResultsHandler)
741743
lsp.onInitialized(onInitializedHandler)
742-
lsp.didChangeConfiguration(updateConfiguration)
744+
lsp.didChangeConfiguration(params => updateConfiguration(params))
743745

744746
lsp.onDidChangeTextDocument(async p => {
745747
const textDocument = await workspace.getTextDocument(p.textDocument.uri)

server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const Q_DEVELOPER_PROFILES = 'developerProfiles'
2424
export const Q_CUSTOMIZATIONS_CONFIGURATION_SECTION = `${Q_CONFIGURATION_SECTION}.${Q_CUSTOMIZATIONS}`
2525
export const Q_DEVELOPER_PROFILES_CONFIGURATION_SECTION = `${Q_CONFIGURATION_SECTION}.${Q_DEVELOPER_PROFILES}`
2626

27+
export const Q_CONFIGURATION_VSC = 'amazonQ'
2728
export const QConfigurationServerToken =
2829
(): Server =>
2930
({ credentialsProvider, lsp, logging, runtime, workspace, sdkInitializator }) => {

server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
import { CodewhispererLanguage, getRuntimeLanguage } from './languageDetection'
3131
import { CONVERSATION_ID_METRIC_KEY } from './chat/telemetry/chatTelemetryController'
3232
import { BaseAmazonQServiceManager } from './amazonQServiceManager/BaseAmazonQServiceManager'
33+
// import { User } from 'aws-sdk/clients/budgets'
3334

3435
export class TelemetryService {
3536
// Using Base service manager here to support fallback cases such as in codeWhispererServer
@@ -70,6 +71,10 @@ export class TelemetryService {
7071
this.userContext = userContext
7172
}
7273

74+
public getUserContext(): UserContext | undefined {
75+
return this.userContext
76+
}
77+
7378
public updateOptOutPreference(optOutPreference: OptOutPreference): void {
7479
this.optOutPreference = optOutPreference
7580
}

server/aws-lsp-codewhisperer/src/language-server/utilities/telemetryUtils.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export const getUserAgent = (initializeParams: InitializeParams, serverInfo?: Se
4747
}
4848

4949
const IDE_CATEGORY_MAP: { [key: string]: IdeCategory } = {
50-
'AmazonQ-For-VSCode': 'VSCODE',
50+
'AWS IDE Extensions for VSCode': 'VSCODE',
5151
'Amazon-Q-For-JetBrains': 'JETBRAINS',
5252
'AmazonQ-For-Eclipse': 'ECLIPSE',
5353
'AWS-Toolkit-For-VisualStudio': 'VISUAL_STUDIO',
@@ -59,7 +59,7 @@ const mapClientNameToIdeCategory = (clientName: string): string | undefined => {
5959

6060
// Use InitializeParams.initializationOptions.aws.clientInfo.extension to derive IDE Category from calling client
6161
// https://github.com/aws/language-server-runtimes/blob/main/runtimes/protocol/lsp.ts#L60-L69
62-
const getIdeCategory = (initializeParams: InitializeParams) => {
62+
export const getIdeCategory = (initializeParams: InitializeParams) => {
6363
let ideCategory
6464
if (initializeParams.initializationOptions?.aws?.clientInfo?.extension?.name) {
6565
ideCategory = mapClientNameToIdeCategory(initializeParams.initializationOptions.aws.clientInfo.extension.name)

0 commit comments

Comments
 (0)