From f2b8091d937fc0e24ec7e6059dcffc4f866fcc27 Mon Sep 17 00:00:00 2001 From: Nikolas Komonen <118216176+nkomonen-amazon@users.noreply.github.com> Date: Wed, 28 May 2025 10:59:37 -0400 Subject: [PATCH 01/20] deps(mynah): Bump mynah to 4.34.1 (#7391) We are bumping the version as it is potentially related to V1793742233 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Signed-off-by: nkomonen-amazon --- package-lock.json | 8 ++++---- packages/core/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa538ee968b..58810825c64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11098,9 +11098,9 @@ } }, "node_modules/@aws/mynah-ui": { - "version": "4.30.3", - "resolved": "https://registry.npmjs.org/@aws/mynah-ui/-/mynah-ui-4.30.3.tgz", - "integrity": "sha512-Xy22dzCaFUqpdSHMpLa8Dsq98DiAUq49dm7Iu8Yj2YZXSCyfKQiYMJOfwU8IoqeNcEney5JRMJpf+/RysWugbA==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@aws/mynah-ui/-/mynah-ui-4.34.1.tgz", + "integrity": "sha512-CO65lwedf6Iw3a3ULOl+9EHafIekiPlP+n8QciN9a3POfsRamHl0kpBGaGBzBRgsQ/h5R0FvFG/gAuWoiK/YIA==", "hasInstallScript": true, "license": "Apache License 2.0", "dependencies": { @@ -25334,7 +25334,7 @@ "@aws-sdk/s3-request-presigner": "<3.731.0", "@aws-sdk/smithy-client": "<3.731.0", "@aws-sdk/util-arn-parser": "<3.731.0", - "@aws/mynah-ui": "^4.30.3", + "@aws/mynah-ui": "^4.34.1", "@gerhobbelt/gitignore-parser": "^0.2.0-9", "@iarna/toml": "^2.2.5", "@smithy/fetch-http-handler": "^5.0.1", diff --git a/packages/core/package.json b/packages/core/package.json index f35369cc5b9..67e20d5feb1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -526,7 +526,7 @@ "@aws-sdk/s3-request-presigner": "<3.731.0", "@aws-sdk/smithy-client": "<3.731.0", "@aws-sdk/util-arn-parser": "<3.731.0", - "@aws/mynah-ui": "^4.30.3", + "@aws/mynah-ui": "^4.34.1", "@gerhobbelt/gitignore-parser": "^0.2.0-9", "@iarna/toml": "^2.2.5", "@smithy/fetch-http-handler": "^5.0.1", From 77b54abacce5034c9788528242ced4d1b983377b Mon Sep 17 00:00:00 2001 From: Nikolas Komonen <118216176+nkomonen-amazon@users.noreply.github.com> Date: Wed, 28 May 2025 15:48:01 -0400 Subject: [PATCH 02/20] Update CONTRIBUTING.md Did this just to force our codepipeline to retrigger --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 04dbdd11a26..9992cd16dcf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -382,7 +382,7 @@ If you need to report an issue attach these to give the most detailed informatio - ![](./docs/images/logsView.png) 2. Click the gear icon on the bottom right and select `Debug` - ![](./docs/images/logsSetDebug.png) -3. Click the gear icon again and select `Set As Default`. This will ensure we stay in `Debug` until explicitly changed +3. Click the gear icon again and select `Set As Default`. This will ensure we stay in `Debug` until explicitly changed. - ![](./docs/images/logsSetDefault.png) 4. Open the Command Palette again and select `Reload Window`. 5. Now you should see additional `[debug]` prefixed logs in the output. From 4caebadf7975d8ac2e6203b487868253be3eafe6 Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Wed, 28 May 2025 19:52:37 +0000 Subject: [PATCH 03/20] Release 1.70.0 --- package-lock.json | 4 ++-- packages/amazonq/.changes/1.70.0.json | 10 ++++++++++ .../Removal-951c2b6a-c6ce-45df-95d0-381ca51b935f.json | 4 ---- packages/amazonq/CHANGELOG.md | 4 ++++ packages/amazonq/package.json | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 packages/amazonq/.changes/1.70.0.json delete mode 100644 packages/amazonq/.changes/next-release/Removal-951c2b6a-c6ce-45df-95d0-381ca51b935f.json diff --git a/package-lock.json b/package-lock.json index 58810825c64..03f9a3262e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -25291,7 +25291,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.70.0-SNAPSHOT", + "version": "1.70.0", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.70.0.json b/packages/amazonq/.changes/1.70.0.json new file mode 100644 index 00000000000..841e8107430 --- /dev/null +++ b/packages/amazonq/.changes/1.70.0.json @@ -0,0 +1,10 @@ +{ + "date": "2025-05-28", + "version": "1.70.0", + "entries": [ + { + "type": "Removal", + "description": "Disable local workspace LSP" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Removal-951c2b6a-c6ce-45df-95d0-381ca51b935f.json b/packages/amazonq/.changes/next-release/Removal-951c2b6a-c6ce-45df-95d0-381ca51b935f.json deleted file mode 100644 index 4c95991dbb6..00000000000 --- a/packages/amazonq/.changes/next-release/Removal-951c2b6a-c6ce-45df-95d0-381ca51b935f.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Removal", - "description": "Disable local workspace LSP" -} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 30d7ee956c1..10c6904fe2a 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.70.0 2025-05-28 + +- **Removal** Disable local workspace LSP + ## 1.69.0 2025-05-22 - **Bug Fix** /transform: avoid prompting user for target JDK path unnecessarily diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 7a3aab1f8d6..8c7f8bef502 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI-powered assistant for building, operating, and transforming software, with advanced capabilities for managing data and AI", - "version": "1.70.0-SNAPSHOT", + "version": "1.70.0", "extensionKind": [ "workspace" ], From 5bf8bfcefb7273127a810f95c6f77e25015bd72e Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Wed, 28 May 2025 20:35:18 +0000 Subject: [PATCH 04/20] Update version to snapshot version: 1.71.0-SNAPSHOT --- package-lock.json | 4 ++-- packages/amazonq/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03f9a3262e1..50f914ba482 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.2", + "ts-node": "^10.9.1", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -25291,7 +25291,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.70.0", + "version": "1.71.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 8c7f8bef502..5a463d56add 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI-powered assistant for building, operating, and transforming software, with advanced capabilities for managing data and AI", - "version": "1.70.0", + "version": "1.71.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 6cbe787cbd1132bdea0de1b0d5edc5d329953087 Mon Sep 17 00:00:00 2001 From: Na Yue Date: Thu, 29 May 2025 10:18:24 -0700 Subject: [PATCH 05/20] feat(amazonq): add the mcp field to client capabilities --- packages/amazonq/src/lsp/client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index 549b0ac7dad..01dac742902 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -123,6 +123,7 @@ export async function startLanguageServer( awsClientCapabilities: { q: { developerProfiles: true, + mcp: true, }, window: { notifications: true, From 9b13c5f66c681e6027412ccae1c9a5bae33fbffb Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Thu, 29 May 2025 20:29:05 -0400 Subject: [PATCH 06/20] fix(tests): "rejected promise not handled" (#7403) ## Problem: rejected promise not handled within 1 second: Error: command 'aws.amazonq.focusChat' not found ## Solution: Don't use `void` to ignore rejected promises. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/amazonq/src/app/chat/activation.ts | 6 ++++-- packages/amazonq/src/extension.ts | 4 +++- packages/core/src/amazonq/auth/controller.ts | 5 ++++- .../core/src/codewhisperer/commands/basicCommands.ts | 9 +++++++-- .../core/src/codewhisperer/ui/codeWhispererNodes.ts | 10 ++++++++-- packages/core/src/codewhisperer/util/authUtil.ts | 4 +++- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/packages/amazonq/src/app/chat/activation.ts b/packages/amazonq/src/app/chat/activation.ts index af48bc65e05..659115d4256 100644 --- a/packages/amazonq/src/app/chat/activation.ts +++ b/packages/amazonq/src/app/chat/activation.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { ExtensionContext } from 'vscode' import { telemetry } from 'aws-core-vscode/telemetry' import { AuthUtil } from 'aws-core-vscode/codewhisperer' -import { Commands, placeholder } from 'aws-core-vscode/shared' +import { Commands, getLogger, placeholder } from 'aws-core-vscode/shared' import * as amazonq from 'aws-core-vscode/amazonq' export async function activate(context: ExtensionContext) { @@ -67,7 +67,9 @@ async function setupAuthNotification() { const selection = await vscode.window.showWarningMessage('Start using Amazon Q', buttonAction) if (selection === buttonAction) { - void amazonq.focusAmazonQPanel.execute(placeholder, source) + amazonq.focusAmazonQPanel.execute(placeholder, source).catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }) } } } diff --git a/packages/amazonq/src/extension.ts b/packages/amazonq/src/extension.ts index 45641b37440..e5e0700614d 100644 --- a/packages/amazonq/src/extension.ts +++ b/packages/amazonq/src/extension.ts @@ -166,7 +166,9 @@ export async function activateAmazonQCommon(context: vscode.ExtensionContext, is // Give time for the extension to finish initializing. globals.clock.setTimeout(async () => { CommonAuthWebview.authSource = ExtStartUpSources.firstStartUp - void focusAmazonQPanel.execute(placeholder, ExtStartUpSources.firstStartUp) + focusAmazonQPanel.execute(placeholder, ExtStartUpSources.firstStartUp).catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }) }, 1000) } diff --git a/packages/core/src/amazonq/auth/controller.ts b/packages/core/src/amazonq/auth/controller.ts index 9cc09ef17cb..5b9772d686a 100644 --- a/packages/core/src/amazonq/auth/controller.ts +++ b/packages/core/src/amazonq/auth/controller.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { getLogger } from '../../shared/logger/logger' import { reconnect } from '../../codewhisperer/commands/basicCommands' import { amazonQChatSource } from '../../codewhisperer/commands/types' import { focusAmazonQPanel } from '../../codewhispererChat/commands/registerCommands' @@ -27,7 +28,9 @@ export class AuthController { } private handleFullAuth() { - void focusAmazonQPanel.execute(placeholder, 'amazonQChat') + focusAmazonQPanel.execute(placeholder, 'amazonQChat').catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }) } private handleReAuth() { diff --git a/packages/core/src/codewhisperer/commands/basicCommands.ts b/packages/core/src/codewhisperer/commands/basicCommands.ts index 7fe6078a1d7..a24c6ade704 100644 --- a/packages/core/src/codewhisperer/commands/basicCommands.ts +++ b/packages/core/src/codewhisperer/commands/basicCommands.ts @@ -405,7 +405,9 @@ export const notifyNewCustomizationsCmd = Commands.declare( function focusQAfterDelay() { // this command won't work without a small delay after install globals.clock.setTimeout(() => { - void focusAmazonQPanel.execute(placeholder, 'startDelay') + focusAmazonQPanel.execute(placeholder, 'startDelay').catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }) }, 1000) } @@ -597,7 +599,10 @@ export const signoutCodeWhisperer = Commands.declare( (auth: AuthUtil) => async (_: VsCodeCommandArg, source: CodeWhispererSource) => { await auth.secondaryAuth.deleteConnection() SecurityIssueTreeViewProvider.instance.refresh() - return focusAmazonQPanel.execute(placeholder, source) + return focusAmazonQPanel.execute(placeholder, source).catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + return undefined + }) } ) diff --git a/packages/core/src/codewhisperer/ui/codeWhispererNodes.ts b/packages/core/src/codewhisperer/ui/codeWhispererNodes.ts index c3e46bdc78e..f317a20a573 100644 --- a/packages/core/src/codewhisperer/ui/codeWhispererNodes.ts +++ b/packages/core/src/codewhisperer/ui/codeWhispererNodes.ts @@ -28,6 +28,7 @@ import { AuthUtil } from '../util/authUtil' import { submitFeedback } from '../../feedback/vue/submitFeedback' import { focusAmazonQPanel } from '../../codewhispererChat/commands/registerCommands' import { isWeb } from '../../shared/extensionGlobals' +import { getLogger } from '../../shared/logger/logger' export function createAutoSuggestions(running: boolean): DataQuickPickItem<'autoSuggestions'> { const labelResume = localize('AWS.codewhisperer.resumeCodeWhispererNode.label', 'Resume Auto-Suggestions') @@ -238,7 +239,10 @@ export function switchToAmazonQNode(): DataQuickPickItem<'openChatPanel'> { data: 'openChatPanel', label: 'Open Chat Panel', iconPath: getIcon('vscode-comment'), - onClick: () => focusAmazonQPanel.execute(placeholder, 'codewhispererQuickPick'), + onClick: () => + focusAmazonQPanel.execute(placeholder, 'codewhispererQuickPick').catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }), } } @@ -247,7 +251,9 @@ export function createSignIn(): DataQuickPickItem<'signIn'> { const icon = getIcon('vscode-account') let onClick = () => { - void focusAmazonQPanel.execute(placeholder, 'codewhispererQuickPick') + focusAmazonQPanel.execute(placeholder, 'codewhispererQuickPick').catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }) } if (isWeb()) { // TODO: nkomonen, call a Command instead diff --git a/packages/core/src/codewhisperer/util/authUtil.ts b/packages/core/src/codewhisperer/util/authUtil.ts index 10acbe16424..e5177e7b578 100644 --- a/packages/core/src/codewhisperer/util/authUtil.ts +++ b/packages/core/src/codewhisperer/util/authUtil.ts @@ -267,7 +267,9 @@ export class AuthUtil { } catch (err) { if (err instanceof ProfileNotFoundError) { // Expected that connection would be deleted by conn.getToken() - void focusAmazonQPanel.execute(placeholder, 'profileNotFoundSignout') + focusAmazonQPanel.execute(placeholder, 'profileNotFoundSignout').catch((e) => { + getLogger().error('focusAmazonQPanel failed: %s', e) + }) } throw err } From d41e7493a07f6999ce490cb488713c9b381274ce Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Fri, 30 May 2025 14:29:14 -0400 Subject: [PATCH 07/20] ci: only publish amazonq as "latest" release #7408 Problem: The `browser_download_url` in https://api.github.com/repos/aws/aws-toolkit-vscode/releases/latest points to a random artifact depending on whether toolkit or amazonq was the last release to publish. Solution: Modify the deploy logic to only set "latest" for "amazonq", never "toolkit". --- buildspec/release/50githubrelease.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/buildspec/release/50githubrelease.yml b/buildspec/release/50githubrelease.yml index c994b4111a6..df542cbee14 100644 --- a/buildspec/release/50githubrelease.yml +++ b/buildspec/release/50githubrelease.yml @@ -36,10 +36,13 @@ phases: - echo "posting $VERSION with sha384 hash $HASH to GitHub" - PKG_DISPLAY_NAME=$(grep -m 1 displayName packages/${TARGET_EXTENSION}/package.json | grep -o '[a-zA-z][^\"]\+' | tail -n1) - RELEASE_MESSAGE="${PKG_DISPLAY_NAME} for VS Code $VERSION" + # Only set amazonq as "latest" release. This ensures https://api.github.com/repos/aws/aws-toolkit-vscode/releases/latest + # consistently points to the amazonq artifact, instead of being "random". + - LATEST="$([ "$TARGET_EXTENSION" = amazonq ] && echo '--latest' || echo '--latest=false' )" - | if [ "$STAGE" = "prod" ]; then # note: the tag arg passed here should match what is in 10changeversion.yml - gh release create --repo $REPO --title "$PKG_DISPLAY_NAME $VERSION" --notes "$RELEASE_MESSAGE" -- "${TARGET_EXTENSION}/v${VERSION}" "$UPLOAD_TARGET" "$HASH_UPLOAD_TARGET" + gh release create "$LATEST" --repo $REPO --title "$PKG_DISPLAY_NAME $VERSION" --notes "$RELEASE_MESSAGE" -- "${TARGET_EXTENSION}/v${VERSION}" "$UPLOAD_TARGET" "$HASH_UPLOAD_TARGET" else echo "SKIPPED (stage=${STAGE}): 'gh release create --repo $REPO'" fi From 12eece1aac2765fb0d03c36cf888a2998c62cde8 Mon Sep 17 00:00:00 2001 From: Tai Lai Date: Fri, 30 May 2025 14:51:36 -0700 Subject: [PATCH 08/20] feat(lsp): forward chatOptionsUpdate to ui (#7397) ## Problem `chatOptionsUpdate` notifications are not forwarded to UI. This is needed to persist previously selected model in new tabs. ## Solution Forward `chatOptionsUpdate` notifications to UI Related PR: https://github.com/aws/language-server-runtimes/pull/530 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/amazonq/src/lsp/chat/messages.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 89d221e9442..80ef45426cd 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -53,6 +53,8 @@ import { CancellationTokenSource, chatUpdateNotificationType, ChatUpdateParams, + chatOptionsUpdateType, + ChatOptionsUpdateParams, } from '@aws/language-server-runtimes/protocol' import { v4 as uuidv4 } from 'uuid' import * as vscode from 'vscode' @@ -486,6 +488,13 @@ export function registerMessageListeners( params: params, }) }) + + languageClient.onNotification(chatOptionsUpdateType.method, (params: ChatOptionsUpdateParams) => { + void provider.webview?.postMessage({ + command: chatOptionsUpdateType.method, + params: params, + }) + }) } function isServerEvent(command: string) { From 6e69d4071f31a23f6624c7244378b4c6a6f8131a Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 13 May 2025 20:22:57 -0400 Subject: [PATCH 09/20] telemetry: avoid PII in openUrl metric --- packages/core/src/shared/utilities/vsCodeUtils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/shared/utilities/vsCodeUtils.ts b/packages/core/src/shared/utilities/vsCodeUtils.ts index 03229cf104a..57f9e380974 100644 --- a/packages/core/src/shared/utilities/vsCodeUtils.ts +++ b/packages/core/src/shared/utilities/vsCodeUtils.ts @@ -215,8 +215,11 @@ export function reloadWindowPrompt(message: string): void { * if user dismisses the vscode confirmation prompt. */ export async function openUrl(url: vscode.Uri, source?: string): Promise { + // Avoid PII in URL. + const truncatedUrl = `${url.scheme}${url.authority}${url.path}${url.fragment.substring(20)}` + return telemetry.aws_openUrl.run(async (span) => { - span.record({ url: url.toString(), source }) + span.record({ url: truncatedUrl, source }) const didOpen = await vscode.env.openExternal(url) if (!didOpen) { throw new CancellationError('user') From f9fce594aa0bfd3318dd0d508458d38c2ec5cc15 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 13 May 2025 17:11:48 -0400 Subject: [PATCH 10/20] fix(lsp): handle ShowDocumentParams.external Problem: LSP server can't open URLs, because the LSP client does not correctly handle `ShowDocumentParams.external` requests. LSP spec: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#showDocumentParams Solution: When `ShowDocumentParams.external` is true, open the URL in a web browser instead of as a editor document. --- packages/amazonq/src/lsp/chat/messages.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 80ef45426cd..f0dcbd9e608 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -435,6 +435,21 @@ export function registerMessageListeners( async (params: ShowDocumentParams): Promise> => { try { const uri = vscode.Uri.parse(params.uri) + + if (params.external) { + // Note: Not using openUrl() because we probably don't want telemetry for these URLs. + // Also it doesn't yet support the required HACK below. + + // HACK: workaround vscode bug: https://github.com/microsoft/vscode/issues/85930 + vscode.env.openExternal(params.uri as any).then(undefined, (e) => { + // TODO: getLogger('?').error('failed vscode.env.openExternal: %O', e) + vscode.env.openExternal(uri).then(undefined, (e) => { + // TODO: getLogger('?').error('failed vscode.env.openExternal: %O', e) + }) + }) + return params + } + const doc = await vscode.workspace.openTextDocument(uri) await vscode.window.showTextDocument(doc, { preview: false }) return params From 14df48dbad640c23a5f2f87a1cfc60ebda8aa4ed Mon Sep 17 00:00:00 2001 From: Na Yue Date: Mon, 2 Jun 2025 15:28:04 -0700 Subject: [PATCH 11/20] fix(amazonq): Revert "feat(amazonq): add the mcp field to client capabilities" This reverts commit 6cbe787cbd1132bdea0de1b0d5edc5d329953087. --- packages/amazonq/src/lsp/client.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index 01dac742902..549b0ac7dad 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -123,7 +123,6 @@ export async function startLanguageServer( awsClientCapabilities: { q: { developerProfiles: true, - mcp: true, }, window: { notifications: true, From 02a89c59d598cfff75271a588431195e82ca22ec Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Wed, 4 Jun 2025 09:52:37 -0700 Subject: [PATCH 12/20] telemetry(amazonq): bumping up telemetry version to 1.0.323 (#7424) ## Problem - Current telemetry version is ` 1.0.322` ## Solution - Bumping up telemetry version to ` 1.0.323` - https://github.com/aws/aws-toolkit-common/pull/1034 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50f914ba482..3c7551dc11c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "vscode-nls-dev": "^4.0.4" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.322", + "@aws-toolkits/telemetry": "^1.0.323", "@playwright/browser-chromium": "^1.43.1", "@stylistic/eslint-plugin": "^2.11.0", "@types/he": "^1.2.3", @@ -10879,9 +10879,9 @@ } }, "node_modules/@aws-toolkits/telemetry": { - "version": "1.0.322", - "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.322.tgz", - "integrity": "sha512-KtLabV3ycRH31EAZ0xoWrdpIBG3ym8CQAqgkHd9DSefndbepPRa07atfXw73Ok9J5aA81VHCFpx1dwrLg39EcQ==", + "version": "1.0.323", + "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.323.tgz", + "integrity": "sha512-Wc6HE+l5iJm/3TYx8Y8pU99ffmq78FgDDVMKjYG9Mfr4cXO4PEkB6XOkiVwGYnrNOGWqyYNlnkBFJ32WJRfkKg==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 525655b8c35..751144b9f47 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "skippedTestReport": "ts-node ./scripts/skippedTestReport.ts ./packages/amazonq/test/e2e/" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.322", + "@aws-toolkits/telemetry": "^1.0.323", "@playwright/browser-chromium": "^1.43.1", "@stylistic/eslint-plugin": "^2.11.0", "@types/he": "^1.2.3", From 3a9aca95aeb40dbf3115b8cdbd61db2da4612327 Mon Sep 17 00:00:00 2001 From: David <60020664+dhasani23@users.noreply.github.com> Date: Wed, 4 Jun 2025 10:40:52 -0700 Subject: [PATCH 13/20] fix(amazonq): minor text update (#7420) ## Problem Minor text update ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: David Hasani --- packages/core/src/amazonq/webview/ui/tabs/constants.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/src/amazonq/webview/ui/tabs/constants.ts b/packages/core/src/amazonq/webview/ui/tabs/constants.ts index ed7d6a1d1fe..8578c72377a 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/constants.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/constants.ts @@ -63,7 +63,8 @@ To learn more, visit the [User Guide](${userGuideURL}).`, gumby: { title: 'Q - Code Transformation', placeholder: 'Open a new tab to chat with Q', - welcome: 'Welcome to Code Transformation!', + welcome: + 'Welcome to Code Transformation! You can also run transformations from the command line. To install the tool, see the [documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/run-CLI-transformations.html).', }, review: { title: 'Q - Review', From a7d939e623b7fe4b32161e4a1f95c521651a794f Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Wed, 4 Jun 2025 17:45:18 +0000 Subject: [PATCH 14/20] Release 1.71.0 --- package-lock.json | 4 ++-- packages/amazonq/.changes/1.71.0.json | 5 +++++ packages/amazonq/CHANGELOG.md | 4 ++++ packages/amazonq/package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 packages/amazonq/.changes/1.71.0.json diff --git a/package-lock.json b/package-lock.json index 3c7551dc11c..24ff6b3c326 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -25291,7 +25291,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.71.0-SNAPSHOT", + "version": "1.71.0", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.71.0.json b/packages/amazonq/.changes/1.71.0.json new file mode 100644 index 00000000000..be5cc5a2013 --- /dev/null +++ b/packages/amazonq/.changes/1.71.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-06-04", + "version": "1.71.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 10c6904fe2a..eebb0bdc496 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.71.0 2025-06-04 + +- Miscellaneous non-user-facing changes + ## 1.70.0 2025-05-28 - **Removal** Disable local workspace LSP diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 5a463d56add..fd466ae492c 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI-powered assistant for building, operating, and transforming software, with advanced capabilities for managing data and AI", - "version": "1.71.0-SNAPSHOT", + "version": "1.71.0", "extensionKind": [ "workspace" ], From d712ffdaf0dbc9428e66b1dff20b24aa522c7a17 Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Wed, 4 Jun 2025 17:56:14 +0000 Subject: [PATCH 15/20] Release 3.64.0 --- package-lock.json | 4 ++-- packages/toolkit/.changes/3.64.0.json | 5 +++++ packages/toolkit/CHANGELOG.md | 4 ++++ packages/toolkit/package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 packages/toolkit/.changes/3.64.0.json diff --git a/package-lock.json b/package-lock.json index 3c7551dc11c..7944a2d1fec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -27005,7 +27005,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.64.0-SNAPSHOT", + "version": "3.64.0", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/toolkit/.changes/3.64.0.json b/packages/toolkit/.changes/3.64.0.json new file mode 100644 index 00000000000..c9fd077f42d --- /dev/null +++ b/packages/toolkit/.changes/3.64.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-06-04", + "version": "3.64.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index d2d3f1e9479..2f19a136349 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.64.0 2025-06-04 + +- Miscellaneous non-user-facing changes + ## 3.63.0 2025-05-22 - Miscellaneous non-user-facing changes diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 309f1e92da2..31ed38635f7 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -2,7 +2,7 @@ "name": "aws-toolkit-vscode", "displayName": "AWS Toolkit", "description": "Including CodeCatalyst, Infrastructure Composer, and support for Lambda, S3, CloudWatch Logs, CloudFormation, and many other services.", - "version": "3.64.0-SNAPSHOT", + "version": "3.64.0", "extensionKind": [ "workspace" ], From 6c88e44bba063961a30f1de0bd6c217579ab75d8 Mon Sep 17 00:00:00 2001 From: Tyrone Smith Date: Wed, 4 Jun 2025 03:08:26 -0700 Subject: [PATCH 16/20] fix(amazonq): Add proxy configuration support with SSL Cert Validation --- packages/amazonq/package.json | 6 ++ packages/amazonq/src/extension.ts | 5 ++ packages/core/package.nls.json | 2 +- packages/core/src/shared/index.ts | 1 + packages/core/src/shared/logger/logger.ts | 1 + .../core/src/shared/settings-amazonq.gen.ts | 3 +- .../core/src/shared/utilities/proxyUtil.ts | 78 +++++++++++++++++++ 7 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/shared/utilities/proxyUtil.ts diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 5a463d56add..c43dba05034 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -213,6 +213,12 @@ "items": { "type": "string" } + }, + "amazonQ.proxy.certificateAuthority": { + "type": "string", + "markdownDescription": "%AWS.configuration.description.amazonq.proxy.certificateAuthority%", + "default": null, + "scope": "application" } } }, diff --git a/packages/amazonq/src/extension.ts b/packages/amazonq/src/extension.ts index e5e0700614d..1a9d3c5facc 100644 --- a/packages/amazonq/src/extension.ts +++ b/packages/amazonq/src/extension.ts @@ -34,6 +34,7 @@ import { Experiments, isSageMaker, isAmazonLinux2, + ProxyUtil, } from 'aws-core-vscode/shared' import { ExtStartUpSources } from 'aws-core-vscode/telemetry' import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' @@ -119,6 +120,10 @@ export async function activateAmazonQCommon(context: vscode.ExtensionContext, is const extContext = { extensionContext: context, } + + // Configure proxy settings early + ProxyUtil.configureProxyForLanguageServer() + // This contains every lsp agnostic things (auth, security scan, code scan) await activateCodeWhisperer(extContext as ExtContext) if ( diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index 9922ec6fcd8..609eeb5cd08 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -98,7 +98,7 @@ "AWS.configuration.description.amazonq.workspaceIndexIgnoreFilePatterns": "File patterns to ignore when indexing your workspace files", "AWS.configuration.description.amazonq.workspaceIndexCacheDirPath": "The path to the directory that contains the cache of the index of your workspace files", "AWS.configuration.description.amazonq.ignoredSecurityIssues": "Specifies a list of code issue identifiers that Amazon Q should ignore when reviewing your workspace. Each item in the array should be a unique string identifier for a specific code issue. This allows you to suppress notifications for known issues that you've assessed and determined to be false positives or not applicable to your project. Use this setting with caution, as it may cause you to miss important security alerts.", - "AWS.command.apig.copyUrl": "Copy URL", + "AWS.configuration.description.amazonq.proxy.certificateAuthority": "Path to a Certificate Authority (PEM file) for SSL/TLS verification when using a proxy.", "AWS.command.apig.invokeRemoteRestApi": "Invoke in the cloud", "AWS.command.apig.invokeRemoteRestApi.cn": "Invoke on Amazon", "AWS.appBuilder.explorerTitle": "Application Builder", diff --git a/packages/core/src/shared/index.ts b/packages/core/src/shared/index.ts index f4c78e2093c..799ffb1b35c 100644 --- a/packages/core/src/shared/index.ts +++ b/packages/core/src/shared/index.ts @@ -39,6 +39,7 @@ export { CodewhispererUserDecision, CodewhispererSecurityScan, } from './telemetry/telemetry.gen' +export { ProxyUtil } from './utilities/proxyUtil' export { randomUUID } from './crypto' export * from './environmentVariables' export * from './vscode/setContext' diff --git a/packages/core/src/shared/logger/logger.ts b/packages/core/src/shared/logger/logger.ts index b398ff93162..eb2602c30b9 100644 --- a/packages/core/src/shared/logger/logger.ts +++ b/packages/core/src/shared/logger/logger.ts @@ -21,6 +21,7 @@ export type LogTopic = | 'nextEditPrediction' | 'resourceCache' | 'telemetry' + | 'proxyUtil' class ErrorLog { constructor( diff --git a/packages/core/src/shared/settings-amazonq.gen.ts b/packages/core/src/shared/settings-amazonq.gen.ts index 637c5b1b12e..836b68444f2 100644 --- a/packages/core/src/shared/settings-amazonq.gen.ts +++ b/packages/core/src/shared/settings-amazonq.gen.ts @@ -36,7 +36,8 @@ export const amazonqSettings = { "amazonQ.workspaceIndexMaxFileSize": {}, "amazonQ.workspaceIndexCacheDirPath": {}, "amazonQ.workspaceIndexIgnoreFilePatterns": {}, - "amazonQ.ignoredSecurityIssues": {} + "amazonQ.ignoredSecurityIssues": {}, + "amazonQ.proxy.certificateAuthority": {} } export default amazonqSettings diff --git a/packages/core/src/shared/utilities/proxyUtil.ts b/packages/core/src/shared/utilities/proxyUtil.ts new file mode 100644 index 00000000000..9c27606ad48 --- /dev/null +++ b/packages/core/src/shared/utilities/proxyUtil.ts @@ -0,0 +1,78 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import vscode from 'vscode' +import { getLogger } from '../logger/logger' + +interface ProxyConfig { + proxyUrl: string | undefined + certificateAuthority: string | undefined +} + +/** + * Utility class for handling proxy configuration + */ +export class ProxyUtil { + private static readonly logger = getLogger('proxyUtil') + + /** + * Sets proxy environment variables based on VS Code settings for use with the Flare Language Server + * + * See documentation here for setting the environement variables which are inherited by Flare LS process: + * https://github.com/aws/language-server-runtimes/blob/main/runtimes/docs/proxy.md + */ + public static configureProxyForLanguageServer(): void { + try { + const proxyConfig = this.getProxyConfiguration() + + this.setProxyEnvironmentVariables(proxyConfig) + } catch (err) { + this.logger.error(`Failed to configure proxy: ${err}`) + } + } + + /** + * Gets proxy configuration from VS Code settings + */ + private static getProxyConfiguration(): ProxyConfig { + const httpConfig = vscode.workspace.getConfiguration('http') + const proxyUrl = httpConfig.get('proxy') + this.logger.debug(`Proxy URL: ${proxyUrl}`) + + const amazonQConfig = vscode.workspace.getConfiguration('amazonQ') + const proxySettings = amazonQConfig.get<{ + certificateAuthority?: string + }>('proxy', {}) + + return { + proxyUrl, + certificateAuthority: proxySettings.certificateAuthority, + } + } + + /** + * Sets environment variables based on proxy configuration + */ + private static setProxyEnvironmentVariables(config: ProxyConfig): void { + const proxyUrl = config.proxyUrl + + // Always enable experimental proxy support for better handling of both explicit and transparent proxies + process.env.EXPERIMENTAL_HTTP_PROXY_SUPPORT = 'true' + + // Set proxy environment variables + if (proxyUrl) { + process.env.HTTPS_PROXY = proxyUrl + process.env.HTTP_PROXY = proxyUrl + this.logger.debug(`Set proxy environment variables: ${proxyUrl}`) + } + + // Set certificate bundle environment variables if configured + if (config.certificateAuthority) { + process.env.NODE_EXTRA_CA_CERTS = config.certificateAuthority + process.env.AWS_CA_BUNDLE = config.certificateAuthority + this.logger.debug(`Set certificate bundle path: ${config.certificateAuthority}`) + } + } +} From a78564ad8acc433e533682599ca88c41f3413a1d Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Fri, 6 Jun 2025 18:35:18 +0000 Subject: [PATCH 17/20] Update version to snapshot version: 1.72.0-SNAPSHOT --- package-lock.json | 4 ++-- packages/amazonq/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24ff6b3c326..c1f32b27ad4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.2", + "ts-node": "^10.9.1", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -25291,7 +25291,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.71.0", + "version": "1.72.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index fd466ae492c..0636f6a033b 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI-powered assistant for building, operating, and transforming software, with advanced capabilities for managing data and AI", - "version": "1.71.0", + "version": "1.72.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 1126c702dc8b969d76741c685aecb8581067cc39 Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Fri, 6 Jun 2025 18:35:46 +0000 Subject: [PATCH 18/20] Update version to snapshot version: 3.65.0-SNAPSHOT --- package-lock.json | 4 ++-- packages/toolkit/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7944a2d1fec..381b8cc5c50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.2", + "ts-node": "^10.9.1", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -27005,7 +27005,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.64.0", + "version": "3.65.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 31ed38635f7..a433c2693ff 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -2,7 +2,7 @@ "name": "aws-toolkit-vscode", "displayName": "AWS Toolkit", "description": "Including CodeCatalyst, Infrastructure Composer, and support for Lambda, S3, CloudWatch Logs, CloudFormation, and many other services.", - "version": "3.64.0", + "version": "3.65.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 62d50d98576f9ab6f153ca185a58ee95bc912b80 Mon Sep 17 00:00:00 2001 From: Lei Gao <97199248+leigaol@users.noreply.github.com> Date: Fri, 6 Jun 2025 13:47:43 -0700 Subject: [PATCH 19/20] feat(amazonq): Bundle LSP with the extension as fallback. (#7421) ## Problem The LSP start failure because 1. node binary is blocked because of firewall 2. chat UI js file is blocked because of firewall or anti virus 3. lsp js file is broken post download because of security mechanism ## Solution 1. Bundle the JS LSP with the amazonq package. 2. Re-start LSP wth the bundled JS files if and only if downloaded LSP does not work! 3. Use the VS Code vended node to start the bundled LSP. This was tested by 1. Generated the vsix, which is now 20MB. 2. Disconnect from internet, remove local LSP caches 3. Install the new vsix 4. Webview of chat should load. also tested by manually corrupting the aws-lsp-codewhisperer.js Limitations: 1. The indexing library function will not work because it is missing. 2. rg is not in the bundle Ref: https://github.com/aws/aws-toolkit-jetbrains/pull/5772 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Justin M. Keyes --- ...-d6714581-799f-49dc-bb63-f08d461e9bde.json | 4 + packages/amazonq/src/lsp/activation.ts | 15 +- .../amazonq/src/lsp/chat/webviewProvider.ts | 10 +- packages/amazonq/src/lsp/lspInstaller.ts | 11 ++ scripts/lspArtifact.ts | 181 ++++++++++++++++++ scripts/package.ts | 9 +- 6 files changed, 223 insertions(+), 7 deletions(-) create mode 100644 packages/amazonq/.changes/next-release/Feature-d6714581-799f-49dc-bb63-f08d461e9bde.json create mode 100644 scripts/lspArtifact.ts diff --git a/packages/amazonq/.changes/next-release/Feature-d6714581-799f-49dc-bb63-f08d461e9bde.json b/packages/amazonq/.changes/next-release/Feature-d6714581-799f-49dc-bb63-f08d461e9bde.json new file mode 100644 index 00000000000..c1ff05f38ff --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-d6714581-799f-49dc-bb63-f08d461e9bde.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Launch LSP with bundled artifacts as fallback" +} diff --git a/packages/amazonq/src/lsp/activation.ts b/packages/amazonq/src/lsp/activation.ts index 84bae8a01a6..e2c1b6899d9 100644 --- a/packages/amazonq/src/lsp/activation.ts +++ b/packages/amazonq/src/lsp/activation.ts @@ -5,8 +5,8 @@ import vscode from 'vscode' import { startLanguageServer } from './client' -import { AmazonQLspInstaller } from './lspInstaller' -import { lspSetupStage, ToolkitError, messages } from 'aws-core-vscode/shared' +import { AmazonQLspInstaller, getBundledResourcePaths } from './lspInstaller' +import { lspSetupStage, ToolkitError, messages, getLogger } from 'aws-core-vscode/shared' export async function activate(ctx: vscode.ExtensionContext): Promise { try { @@ -16,6 +16,15 @@ export async function activate(ctx: vscode.ExtensionContext): Promise { }) } catch (err) { const e = err as ToolkitError - void messages.showViewLogsMessage(`Failed to launch Amazon Q language server: ${e.message}`) + 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))) + }) + } catch (error) { + void messages.showViewLogsMessage( + `Failed to launch Amazon Q language server: ${(error as ToolkitError).message}` + ) + } } } diff --git a/packages/amazonq/src/lsp/chat/webviewProvider.ts b/packages/amazonq/src/lsp/chat/webviewProvider.ts index 1a513f1df3f..bb190b5eb67 100644 --- a/packages/amazonq/src/lsp/chat/webviewProvider.ts +++ b/packages/amazonq/src/lsp/chat/webviewProvider.ts @@ -19,6 +19,7 @@ import { AmazonQPromptSettings, LanguageServerResolver, amazonqMark, + getLogger, } from 'aws-core-vscode/shared' import { AuthUtil, RegionProfile } from 'aws-core-vscode/codewhisperer' import { featureConfig } from 'aws-core-vscode/amazonq' @@ -44,9 +45,12 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { ) { const lspDir = Uri.file(LanguageServerResolver.defaultDir()) const dist = Uri.joinPath(globals.context.extensionUri, 'dist') - - const resourcesRoots = [lspDir, dist] - + const bundledResources = Uri.joinPath(globals.context.extensionUri, 'resources/language-server') + let resourcesRoots = [lspDir, dist] + if (this.mynahUIPath?.startsWith(globals.context.extensionUri.fsPath)) { + getLogger('amazonqLsp').info(`Using bundled webview resources ${bundledResources.fsPath}`) + resourcesRoots = [bundledResources, dist] + } /** * if the mynah chat client is defined, then make sure to add it to the resource roots, otherwise * it will 401 when trying to load diff --git a/packages/amazonq/src/lsp/lspInstaller.ts b/packages/amazonq/src/lsp/lspInstaller.ts index 84d5ee8961b..9ac19601fe7 100644 --- a/packages/amazonq/src/lsp/lspInstaller.ts +++ b/packages/amazonq/src/lsp/lspInstaller.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +import vscode from 'vscode' import { fs, getNodeExecutableName, getRgExecutableName, BaseLspInstaller, ResourcePaths } from 'aws-core-vscode/shared' import path from 'path' import { ExtendedAmazonQLSPConfig, getAmazonQLspConfig } from './config' @@ -54,3 +55,13 @@ export class AmazonQLspInstaller extends BaseLspInstaller.BaseLspInstaller< protected override downloadMessageOverride: string | undefined = 'Updating Amazon Q plugin' } + +export function getBundledResourcePaths(ctx: vscode.ExtensionContext): AmazonQResourcePaths { + const assetDirectory = vscode.Uri.joinPath(ctx.extensionUri, 'resources', 'language-server').fsPath + return { + lsp: path.join(assetDirectory, 'servers', 'aws-lsp-codewhisperer.js'), + node: process.execPath, + ripGrep: '', + ui: path.join(assetDirectory, 'clients', 'amazonq-ui.js'), + } +} diff --git a/scripts/lspArtifact.ts b/scripts/lspArtifact.ts new file mode 100644 index 00000000000..fb055ad94b7 --- /dev/null +++ b/scripts/lspArtifact.ts @@ -0,0 +1,181 @@ +import * as https from 'https' +import * as fs from 'fs' +import * as crypto from 'crypto' +import * as path from 'path' +import * as os from 'os' +import AdmZip from 'adm-zip' + +interface ManifestContent { + filename: string + url: string + hashes: string[] + bytes: number +} + +interface ManifestTarget { + platform: string + arch: string + contents: ManifestContent[] +} + +interface ManifestVersion { + serverVersion: string + isDelisted: boolean + targets: ManifestTarget[] +} + +interface Manifest { + versions: ManifestVersion[] +} +async function verifyFileHash(filePath: string, expectedHash: string): Promise { + return new Promise((resolve, reject) => { + const hash = crypto.createHash('sha384') + const stream = fs.createReadStream(filePath) + + stream.on('data', (data) => { + hash.update(data) + }) + + stream.on('end', () => { + const fileHash = hash.digest('hex') + // Remove 'sha384:' prefix from expected hash if present + const expectedHashValue = expectedHash.replace('sha384:', '') + resolve(fileHash === expectedHashValue) + }) + + stream.on('error', reject) + }) +} + +async function ensureDirectoryExists(dirPath: string): Promise { + if (!fs.existsSync(dirPath)) { + await fs.promises.mkdir(dirPath, { recursive: true }) + } +} + +export async function downloadLanguageServer(): Promise { + const tempDir = path.join(os.tmpdir(), 'amazonq-download-temp') + const resourcesDir = path.join(__dirname, '../packages/amazonq/resources/language-server') + + // clear previous cached language server + try { + if (fs.existsSync(resourcesDir)) { + fs.rmdirSync(resourcesDir, { recursive: true }) + } + } catch (e) { + throw Error(`Failed to clean up language server ${resourcesDir}`) + } + + await ensureDirectoryExists(tempDir) + await ensureDirectoryExists(resourcesDir) + + return new Promise((resolve, reject) => { + const manifestUrl = 'https://aws-toolkit-language-servers.amazonaws.com/qAgenticChatServer/0/manifest.json' + + https + .get(manifestUrl, (res) => { + let data = '' + + res.on('data', (chunk) => { + data += chunk + }) + + res.on('end', async () => { + try { + const manifest: Manifest = JSON.parse(data) + + const latestVersion = manifest.versions + .filter((v) => !v.isDelisted) + .sort((a, b) => b.serverVersion.localeCompare(a.serverVersion))[0] + + if (!latestVersion) { + throw new Error('No valid version found in manifest') + } + + const darwinArm64Target = latestVersion.targets.find( + (t) => t.platform === 'darwin' && t.arch === 'arm64' + ) + + if (!darwinArm64Target) { + throw new Error('No darwin arm64 target found') + } + + for (const content of darwinArm64Target.contents) { + const fileName = content.filename + const fileUrl = content.url + const expectedHash = content.hashes[0] + const tempFilePath = path.join(tempDir, fileName) + const fileFolderName = content.filename.replace('.zip', '') + + console.log(`Downloading ${fileName} from ${fileUrl} ...`) + + await new Promise((downloadResolve, downloadReject) => { + https + .get(fileUrl, (fileRes) => { + const fileStream = fs.createWriteStream(tempFilePath) + fileRes.pipe(fileStream) + + fileStream.on('finish', () => { + fileStream.close() + downloadResolve(void 0) + }) + + fileStream.on('error', (err) => { + fs.unlink(tempFilePath, () => {}) + downloadReject(err) + }) + }) + .on('error', (err) => { + fs.unlink(tempFilePath, () => {}) + downloadReject(err) + }) + }) + + console.log(`Verifying hash for ${fileName}...`) + const isHashValid = await verifyFileHash(tempFilePath, expectedHash) + + if (!isHashValid) { + fs.unlinkSync(tempFilePath) + throw new Error(`Hash verification failed for ${fileName}`) + } + + console.log(`Extracting ${fileName}...`) + const zip = new AdmZip(tempFilePath) + zip.extractAllTo(path.join(resourcesDir, fileFolderName), true) // true for overwrite + + // Clean up temp file + fs.unlinkSync(tempFilePath) + console.log(`Successfully processed ${fileName}`) + } + + // Clean up temp directory + fs.rmdirSync(tempDir) + fs.rmdirSync(path.join(resourcesDir, 'servers', 'indexing'), { recursive: true }) + fs.rmdirSync(path.join(resourcesDir, 'servers', 'ripgrep'), { recursive: true }) + fs.rmSync(path.join(resourcesDir, 'servers', 'node')) + if (!fs.existsSync(path.join(resourcesDir, 'servers', 'aws-lsp-codewhisperer.js'))) { + throw new Error(`Extracting aws-lsp-codewhisperer.js failure`) + } + if (!fs.existsSync(path.join(resourcesDir, 'clients', 'amazonq-ui.js'))) { + throw new Error(`Extracting amazonq-ui.js failure`) + } + console.log('Download and extraction completed successfully') + resolve() + } catch (err) { + // Clean up temp directory on error + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir, { recursive: true }) + } + reject(err) + } + }) + }) + .on('error', (err) => { + // Clean up temp directory on error + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir, { recursive: true }) + } + reject(err) + }) + }) +} diff --git a/scripts/package.ts b/scripts/package.ts index 84622ac12c0..203777e8131 100644 --- a/scripts/package.ts +++ b/scripts/package.ts @@ -20,6 +20,7 @@ import * as child_process from 'child_process' // eslint-disable-line no-restricted-imports import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports import * as path from 'path' +import { downloadLanguageServer } from './lspArtifact' function parseArgs() { // Invoking this script with argument "foo": @@ -105,7 +106,7 @@ function getVersionSuffix(feature: string, debug: boolean): string { return `${debugSuffix}${featureSuffix}${commitSuffix}` } -function main() { +async function main() { const args = parseArgs() // It is expected that this will package from a packages/{subproject} folder. // There is a base config in packages/ @@ -155,6 +156,12 @@ function main() { } nodefs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, undefined, ' ')) + + // add language server bundle + if (packageJson.name === 'amazon-q-vscode') { + await downloadLanguageServer() + } + child_process.execFileSync( 'vsce', [ From 523fc16551bbe624f4910218c8e9917ef6dacbc0 Mon Sep 17 00:00:00 2001 From: Tyrone Smith Date: Wed, 4 Jun 2025 03:08:26 -0700 Subject: [PATCH 20/20] fix(amazonq): Add proxy configuration support with SSL Cert Validation --- packages/core/src/shared/utilities/proxyUtil.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/shared/utilities/proxyUtil.ts b/packages/core/src/shared/utilities/proxyUtil.ts index 9c27606ad48..4e0e5c940b5 100644 --- a/packages/core/src/shared/utilities/proxyUtil.ts +++ b/packages/core/src/shared/utilities/proxyUtil.ts @@ -39,7 +39,7 @@ export class ProxyUtil { private static getProxyConfiguration(): ProxyConfig { const httpConfig = vscode.workspace.getConfiguration('http') const proxyUrl = httpConfig.get('proxy') - this.logger.debug(`Proxy URL: ${proxyUrl}`) + this.logger.debug(`Proxy URL Setting in VSCode Settings: ${proxyUrl}`) const amazonQConfig = vscode.workspace.getConfiguration('amazonQ') const proxySettings = amazonQConfig.get<{ @@ -60,6 +60,8 @@ export class ProxyUtil { // Always enable experimental proxy support for better handling of both explicit and transparent proxies process.env.EXPERIMENTAL_HTTP_PROXY_SUPPORT = 'true' + // Add OpenSSL certificate store support + process.env.NODE_OPTIONS = '--use-openssl-ca' // Set proxy environment variables if (proxyUrl) {