diff --git a/packages/amazonq/src/lsp/activation.ts b/packages/amazonq/src/lsp/activation.ts index e2c1b6899d9..f6622970b5d 100644 --- a/packages/amazonq/src/lsp/activation.ts +++ b/packages/amazonq/src/lsp/activation.ts @@ -7,19 +7,29 @@ import vscode from 'vscode' import { startLanguageServer } from './client' import { AmazonQLspInstaller, getBundledResourcePaths } from './lspInstaller' import { lspSetupStage, ToolkitError, messages, getLogger } from 'aws-core-vscode/shared' +import { getAmazonQLspConfig } from './config' export async function activate(ctx: vscode.ExtensionContext): Promise { + const config = getAmazonQLspConfig() + const registryUrl = config.registryUrl + try { await lspSetupStage('all', async () => { const installResult = await new AmazonQLspInstaller().resolve() - await lspSetupStage('launch', async () => await startLanguageServer(ctx, installResult.resourcePaths)) + await lspSetupStage( + 'launch', + async () => await startLanguageServer(ctx, installResult.resourcePaths, registryUrl) + ) }) } catch (err) { const e = err as ToolkitError getLogger('amazonqLsp').warn(`Failed to start downloaded LSP, falling back to bundled LSP: ${e.message}`) try { await lspSetupStage('all', async () => { - await lspSetupStage('launch', async () => await startLanguageServer(ctx, getBundledResourcePaths(ctx))) + await lspSetupStage( + 'launch', + async () => await startLanguageServer(ctx, getBundledResourcePaths(ctx), registryUrl) + ) }) } catch (error) { void messages.showViewLogsMessage( diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index 2255fb80fee..75d8d6af17e 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -83,7 +83,8 @@ export function hasGlibcPatch(): boolean { export async function startLanguageServer( extensionContext: vscode.ExtensionContext, - resourcePaths: AmazonQResourcePaths + resourcePaths: AmazonQResourcePaths, + registryUrl?: string ) { const toDispose = extensionContext.subscriptions @@ -188,6 +189,7 @@ export async function startLanguageServer( codeReviewInChat: codeReviewInChat, // feature flag for displaying findings found not through CodeReview in the Code Issues Panel displayFindings: true, + registryUrl: registryUrl, }, window: { notifications: true, diff --git a/packages/amazonq/src/lsp/config.ts b/packages/amazonq/src/lsp/config.ts index d33f58d6988..92689d3249d 100644 --- a/packages/amazonq/src/lsp/config.ts +++ b/packages/amazonq/src/lsp/config.ts @@ -12,6 +12,7 @@ import { export interface ExtendedAmazonQLSPConfig extends BaseLspInstaller.LspConfig { ui?: string + registryUrl?: string } // Taken from language server runtimes since they are not exported: @@ -44,10 +45,12 @@ export const defaultAmazonQLspConfig: ExtendedAmazonQLSPConfig = { } export function getAmazonQLspConfig(): ExtendedAmazonQLSPConfig { + const registryConfig = DevSettings.instance.get('amazonqRegistry', {}) return { ...defaultAmazonQLspConfig, ...(DevSettings.instance.getServiceConfig('amazonqLsp', {}) as ExtendedAmazonQLSPConfig), ...getServiceEnvVarConfig('amazonqLsp', Object.keys(defaultAmazonQLspConfig)), + registryUrl: (registryConfig as any)?.registryUrl, } } /** diff --git a/packages/amazonq/test/unit/amazonq/lsp/config.test.ts b/packages/amazonq/test/unit/amazonq/lsp/config.test.ts index c31e873e181..f2fc9d0975a 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/config.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/config.test.ts @@ -11,6 +11,7 @@ import { defaultAmazonQLspConfig, ExtendedAmazonQLSPConfig, getAmazonQLspConfig describe('getAmazonQLspConfig', () => { let sandbox: sinon.SinonSandbox let serviceConfigStub: sinon.SinonStub + let getStub: sinon.SinonStub const settingConfig: ExtendedAmazonQLSPConfig = { manifestUrl: 'https://custom.url/manifest.json', supportedVersions: '4.0.0', @@ -24,8 +25,10 @@ describe('getAmazonQLspConfig', () => { sandbox = sinon.createSandbox() serviceConfigStub = sandbox.stub() + getStub = sandbox.stub() sandbox.stub(DevSettings, 'instance').get(() => ({ getServiceConfig: serviceConfigStub, + get: getStub, })) }) @@ -36,29 +39,45 @@ describe('getAmazonQLspConfig', () => { it('uses default config', () => { serviceConfigStub.returns({}) - assert.deepStrictEqual(getAmazonQLspConfig(), defaultAmazonQLspConfig) + getStub.returns({}) + assert.deepStrictEqual(getAmazonQLspConfig(), { ...defaultAmazonQLspConfig, registryUrl: undefined }) }) it('overrides path', () => { const path = '/custom/path/to/lsp' serviceConfigStub.returns({ path }) + getStub.returns({}) assert.deepStrictEqual(getAmazonQLspConfig(), { ...defaultAmazonQLspConfig, path, + registryUrl: undefined, }) }) it('overrides default settings', () => { serviceConfigStub.returns(settingConfig) + getStub.returns({}) - assert.deepStrictEqual(getAmazonQLspConfig(), settingConfig) + assert.deepStrictEqual(getAmazonQLspConfig(), { ...settingConfig, registryUrl: undefined }) }) it('environment variable takes precedence over settings', () => { setEnv(settingConfig) serviceConfigStub.returns({}) - assert.deepStrictEqual(getAmazonQLspConfig(), settingConfig) + getStub.returns({}) + assert.deepStrictEqual(getAmazonQLspConfig(), { ...settingConfig, registryUrl: undefined }) + }) + + it('includes registryUrl from amazonqRegistry setting', () => { + const registryUrl = 'https://custom.registry.url/manifest.json' + serviceConfigStub.returns({}) + getStub.withArgs('amazonqRegistry', {}).returns({ registryUrl }) + + assert.deepStrictEqual(getAmazonQLspConfig(), { + ...defaultAmazonQLspConfig, + registryUrl, + }) }) function setEnv(envConfig: ExtendedAmazonQLSPConfig) { diff --git a/packages/core/src/shared/settings.ts b/packages/core/src/shared/settings.ts index abdddf636a3..09b4a1b3067 100644 --- a/packages/core/src/shared/settings.ts +++ b/packages/core/src/shared/settings.ts @@ -778,6 +778,7 @@ const devSettings = { codewhispererService: Record(String, String), amazonqLsp: Record(String, String), amazonqWorkspaceLsp: Record(String, String), + amazonqRegistry: Record(String, String), cloudformationLsp: Record(String, String), ssoCacheDirectory: String, autofillStartUrl: String,