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 -  2. Click the gear icon on the bottom right and select `Debug` -  -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. -  4. Open the Command Palette again and select `Reload Window`. 5. Now you should see additional `[debug]` prefixed logs in the output. 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 diff --git a/package-lock.json b/package-lock.json index 7f7f35e42fd..1d5e71abc8f 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", @@ -68,22 +68,6 @@ "resolved": "src.gen/@amzn/codewhisperer-streaming", "link": true }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" - } - }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "license": "Apache-2.0", @@ -8113,6 +8097,7 @@ "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/credential-provider-env": "3.758.0", @@ -8135,6 +8120,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/client-sso": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -8182,6 +8168,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/core": "^3.1.5", @@ -8202,6 +8189,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-env": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -8216,6 +8204,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-http": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -8235,6 +8224,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-process": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -8250,6 +8240,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.758.0", "@aws-sdk/core": "3.758.0", @@ -8267,6 +8258,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-host-header": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", @@ -8280,6 +8272,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-logger": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", @@ -8292,6 +8285,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", @@ -8305,6 +8299,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -8321,6 +8316,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/region-config-resolver": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/node-config-provider": "^4.0.1", @@ -8336,6 +8332,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/token-providers": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/nested-clients": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -8351,6 +8348,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8362,6 +8360,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-endpoints": { "version": "3.743.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", @@ -8375,6 +8374,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", @@ -8385,6 +8385,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/middleware-user-agent": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -8407,6 +8408,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/abort-controller": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8418,6 +8420,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/config-resolver": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -8432,6 +8435,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/core": { "version": "3.1.5", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/middleware-serde": "^4.0.2", "@smithy/protocol-http": "^5.0.1", @@ -8449,6 +8453,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/credential-provider-imds": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", @@ -8463,6 +8468,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/fetch-http-handler": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/querystring-builder": "^4.0.1", @@ -8477,6 +8483,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/hash-node": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-buffer-from": "^4.0.0", @@ -8490,6 +8497,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/invalid-dependency": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8501,6 +8509,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/is-array-buffer": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8511,6 +8520,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-content-length": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", @@ -8523,6 +8533,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-endpoint": { "version": "4.0.6", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-serde": "^4.0.2", @@ -8540,6 +8551,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-retry": { "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", @@ -8558,6 +8570,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8569,6 +8582,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8580,6 +8594,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -8593,6 +8608,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/node-http-handler": { "version": "4.0.3", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/abort-controller": "^4.0.1", "@smithy/protocol-http": "^5.0.1", @@ -8607,6 +8623,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8618,6 +8635,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8629,6 +8647,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-builder": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-uri-escape": "^4.0.0", @@ -8641,6 +8660,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-parser": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8652,6 +8672,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/service-error-classification": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0" }, @@ -8662,6 +8683,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8673,6 +8695,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.0.1", @@ -8690,6 +8713,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-endpoint": "^4.0.6", @@ -8706,6 +8730,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8716,6 +8741,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/querystring-parser": "^4.0.1", "@smithy/types": "^4.1.0", @@ -8728,6 +8754,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-base64": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", @@ -8740,6 +8767,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8750,6 +8778,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-body-length-node": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8760,6 +8789,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-buffer-from": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" @@ -8771,6 +8801,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-config-provider": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8781,6 +8812,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-defaults-mode-browser": { "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/smithy-client": "^4.1.6", @@ -8795,6 +8827,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-defaults-mode-node": { "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", @@ -8811,6 +8844,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-endpoints": { "version": "3.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -8823,6 +8857,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-hex-encoding": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8833,6 +8868,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-middleware": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -8844,6 +8880,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-retry": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/service-error-classification": "^4.0.1", "@smithy/types": "^4.1.0", @@ -8856,6 +8893,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-stream": { "version": "4.1.2", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", "@smithy/node-http-handler": "^4.0.3", @@ -8873,6 +8911,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-uri-escape": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -8883,6 +8922,7 @@ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-utf8": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" @@ -9054,6 +9094,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/nested-clients": "3.758.0", @@ -9069,6 +9110,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/core": "^3.1.5", @@ -9089,6 +9131,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9100,6 +9143,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/abort-controller": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9111,6 +9155,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/core": { "version": "3.1.5", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/middleware-serde": "^4.0.2", "@smithy/protocol-http": "^5.0.1", @@ -9128,6 +9173,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/fetch-http-handler": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/querystring-builder": "^4.0.1", @@ -9142,6 +9188,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/is-array-buffer": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -9152,6 +9199,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-endpoint": { "version": "4.0.6", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-serde": "^4.0.2", @@ -9169,6 +9217,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9180,6 +9229,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9191,6 +9241,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -9204,6 +9255,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/node-http-handler": { "version": "4.0.3", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/abort-controller": "^4.0.1", "@smithy/protocol-http": "^5.0.1", @@ -9218,6 +9270,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9229,6 +9282,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9240,6 +9294,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/querystring-builder": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-uri-escape": "^4.0.0", @@ -9252,6 +9307,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/querystring-parser": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9263,6 +9319,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9274,6 +9331,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.0.1", @@ -9291,6 +9349,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-endpoint": "^4.0.6", @@ -9307,6 +9366,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -9317,6 +9377,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/querystring-parser": "^4.0.1", "@smithy/types": "^4.1.0", @@ -9329,6 +9390,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-base64": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", @@ -9341,6 +9403,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -9351,6 +9414,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-buffer-from": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" @@ -9362,6 +9426,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-hex-encoding": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -9372,6 +9437,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-middleware": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9383,6 +9449,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-stream": { "version": "4.1.2", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", "@smithy/node-http-handler": "^4.0.3", @@ -9400,6 +9467,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-uri-escape": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -9410,6 +9478,7 @@ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-utf8": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" @@ -9793,6 +9862,7 @@ "node_modules/@aws-sdk/nested-clients": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9840,6 +9910,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/core": "^3.1.5", @@ -9860,6 +9931,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", @@ -9873,6 +9945,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", @@ -9885,6 +9958,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", @@ -9898,6 +9972,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -9914,6 +9989,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/region-config-resolver": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/node-config-provider": "^4.0.1", @@ -9929,6 +10005,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9940,6 +10017,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { "version": "3.743.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", @@ -9953,6 +10031,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", @@ -9963,6 +10042,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/middleware-user-agent": "3.758.0", "@aws-sdk/types": "3.734.0", @@ -9985,6 +10065,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -9996,6 +10077,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/config-resolver": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -10010,6 +10092,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { "version": "3.1.5", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/middleware-serde": "^4.0.2", "@smithy/protocol-http": "^5.0.1", @@ -10027,6 +10110,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/credential-provider-imds": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", @@ -10041,6 +10125,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/querystring-builder": "^4.0.1", @@ -10055,6 +10140,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/hash-node": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-buffer-from": "^4.0.0", @@ -10068,6 +10154,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/invalid-dependency": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10079,6 +10166,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10089,6 +10177,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-content-length": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", @@ -10101,6 +10190,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { "version": "4.0.6", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-serde": "^4.0.2", @@ -10118,6 +10208,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-retry": { "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", @@ -10136,6 +10227,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10147,6 +10239,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10158,6 +10251,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -10171,6 +10265,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { "version": "4.0.3", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/abort-controller": "^4.0.1", "@smithy/protocol-http": "^5.0.1", @@ -10185,6 +10280,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10196,6 +10292,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10207,6 +10304,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-uri-escape": "^4.0.0", @@ -10219,6 +10317,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10230,6 +10329,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/service-error-classification": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0" }, @@ -10240,6 +10340,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10251,6 +10352,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.0.1", @@ -10268,6 +10370,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-endpoint": "^4.0.6", @@ -10284,6 +10387,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10294,6 +10398,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/querystring-parser": "^4.0.1", "@smithy/types": "^4.1.0", @@ -10306,6 +10411,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", @@ -10318,6 +10424,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10328,6 +10435,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-node": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10338,6 +10446,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-buffer-from": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" @@ -10349,6 +10458,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-config-provider": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10359,6 +10469,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-browser": { "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/smithy-client": "^4.1.6", @@ -10373,6 +10484,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-node": { "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", @@ -10389,6 +10501,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-endpoints": { "version": "3.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -10401,6 +10514,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-hex-encoding": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10411,6 +10525,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -10422,6 +10537,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-retry": { "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/service-error-classification": "^4.0.1", "@smithy/types": "^4.1.0", @@ -10434,6 +10550,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { "version": "4.1.2", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", "@smithy/node-http-handler": "^4.0.3", @@ -10451,6 +10568,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-uri-escape": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -10461,6 +10579,7 @@ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" @@ -10760,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": { @@ -10796,32 +10915,31 @@ } }, "node_modules/@aws/language-server-runtimes": { - "version": "0.2.70", + "version": "0.2.97", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.97.tgz", + "integrity": "sha512-Wzt09iC5YTVRJmmW6DwunBFSR0mV+cHjDwJ5iic1sEvXlI9CnrxlEjfn09crkVQ2XZj3dNJHoLQPptH+AEQfNg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.9.3", - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-sdk/client-cognito-identity": "^3.758.0", - "@aws/language-server-runtimes-types": "^0.1.21", + "@aws/language-server-runtimes-types": "^0.1.39", "@opentelemetry/api": "^1.9.0", - "@opentelemetry/resources": "^1.30.1", - "@opentelemetry/sdk-metrics": "^1.30.1", - "@opentelemetry/sdk-node": "^0.57.2", - "@opentelemetry/sdk-trace-base": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.30.0", - "@smithy/node-http-handler": "^4.0.2", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", + "@opentelemetry/api-logs": "^0.200.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.200.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", + "@opentelemetry/resources": "^2.0.1", + "@opentelemetry/sdk-logs": "^0.200.0", + "@opentelemetry/sdk-metrics": "^2.0.1", + "@smithy/node-http-handler": "^4.0.4", "ajv": "^8.17.1", "aws-sdk": "^2.1692.0", - "axios": "^1.8.4", "hpagent": "^1.2.0", "jose": "^5.9.6", "mac-ca": "^3.1.1", + "os-proxy-config": "^1.1.2", "rxjs": "^7.8.2", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", + "vscode-uri": "^3.1.0", "win-ca": "^3.5.1" }, "engines": { @@ -10829,880 +10947,126 @@ } }, "node_modules/@aws/language-server-runtimes-types": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes-types/-/language-server-runtimes-types-0.1.26.tgz", - "integrity": "sha512-c63rpUbcrtLqaC33t6elRApQqLbQvFgKzIQ2z/VCavE5F7HSLBfzhHkhgUFd775fBpsF4MHrIzwNitYLhDGobw==", + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes-types/-/language-server-runtimes-types-0.1.39.tgz", + "integrity": "sha512-HjZ9tYcs++vcSyNwCcGLC8k1nvdWTD7XRa6sI71OYwFzJvyMa4/BY7Womq/kmyuD/IB6MRVvuRdgYQxuU1mSGA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.768.0", + "node_modules/@aws/language-server-runtimes/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.758.0", - "@aws-sdk/credential-provider-node": "3.758.0", - "@aws-sdk/middleware-host-header": "3.734.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.758.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.758.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/client-sso": { - "version": "3.758.0", + "node_modules/@aws/language-server-runtimes/node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.758.0", - "@aws-sdk/middleware-host-header": "3.734.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.758.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.758.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws/language-server-runtimes/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/core": "^3.1.5", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/property-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.758.0", - "@aws-sdk/credential-provider-http": "3.758.0", - "@aws-sdk/credential-provider-ini": "3.758.0", - "@aws-sdk/credential-provider-process": "3.758.0", - "@aws-sdk/credential-provider-sso": "3.758.0", - "@aws-sdk/credential-provider-web-identity": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/credential-provider-imds": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.758.0", - "@aws-sdk/core": "3.758.0", - "@aws-sdk/token-providers": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.734.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/middleware-logger": { - "version": "3.734.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.734.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@smithy/core": "^3.1.5", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.734.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/token-providers": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/nested-clients": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/types": { - "version": "3.734.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/util-endpoints": { - "version": "3.743.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "@smithy/util-endpoints": "^3.0.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.734.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.758.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/abort-controller": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/config-resolver": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/core": { - "version": "3.1.5", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.0.2", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/hash-node": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/invalid-dependency": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/middleware-content-length": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.1.5", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-middleware": "^4.0.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/middleware-retry": { - "version": "4.0.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/service-error-classification": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/middleware-serde": { - "version": "4.0.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/middleware-stack": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/node-http-handler": { - "version": "4.0.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/property-provider": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/querystring-builder": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-uri-escape": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/querystring-parser": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/service-error-classification": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/signature-v4": { - "version": "5.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/smithy-client": { - "version": "4.1.6", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.1.5", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/types": { - "version": "4.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/url-parser": { - "version": "4.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-base64": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.0.1", - "@smithy/credential-provider-imds": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-endpoints": { - "version": "3.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" + "node": "^18.19.0 || >=20.6.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/abort-controller": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.2.tgz", + "integrity": "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/node-http-handler": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz", + "integrity": "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/abort-controller": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/querystring-builder": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-retry": { - "version": "4.0.1", + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/protocol-http": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.0.tgz", + "integrity": "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-stream": { - "version": "4.1.2", + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/querystring-builder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz", + "integrity": "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/types": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", + "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11712,12 +11076,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-utf8": { + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-uri-escape": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { @@ -11780,12 +11145,17 @@ "vscode-languageserver-types": "3.17.5" } }, + "node_modules/@aws/language-server-runtimes/node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true + }, "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.35.4", + "resolved": "https://registry.npmjs.org/@aws/mynah-ui/-/mynah-ui-4.35.4.tgz", + "integrity": "sha512-LuOexbuMSKYCl/Qa7zj9d4/ueTLK3ltoYHeA0I7gOpPC/vYACxqjVqX6HPhNCE+L5zBKNMN2Z+FUaox+fYhvAQ==", "hasInstallScript": true, - "license": "Apache License 2.0", "dependencies": { "escape-html": "^1.0.3", "highlight.js": "^11.11.0", @@ -12109,35 +11479,6 @@ "node": ">=10" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.13.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "dev": true, @@ -12259,643 +11600,323 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@koa/router": { - "version": "13.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "path-to-regexp": "^6.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@koa/router/node_modules/path-to-regexp": { - "version": "6.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.57.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.30.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.30.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { - "version": "0.57.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/sdk-logs": "0.57.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=8" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.57.2", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/sdk-logs": "0.57.2" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=6.0.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto": { - "version": "0.57.2", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-logs": "0.57.2", - "@opentelemetry/sdk-trace-base": "1.30.1" - }, + "license": "MIT", "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=6.0.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { - "version": "0.57.2", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-metrics": "1.30.1" - }, + "license": "MIT", "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=6.0.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.57.2", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-metrics": "1.30.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { - "version": "0.57.2", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-metrics": "1.30.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.57.2", + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/@koa/cors": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-metrics": "1.30.1" + "vary": "^1.1.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">= 14.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.57.2", + "node_modules/@koa/router": { + "version": "13.1.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1" + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "path-to-regexp": "^6.3.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">= 18" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.57.2", + "node_modules/@koa/router/node_modules/path-to-regexp": { + "version": "6.3.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">= 8" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.57.2", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1" - }, + "license": "MIT", "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">= 8" } }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.30.1", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "node": ">= 8" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=14" + "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.57.2", + "node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/api": "^1.3.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.57.2", + "node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-transformer": "0.57.2" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.57.2", + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", + "integrity": "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2" + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/sdk-logs": "0.200.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.57.2", + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", + "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-logs": "0.57.2", - "@opentelemetry/sdk-metrics": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1", - "protobufjs": "^7.3.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.30.1", + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", + "integrity": "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.30.1" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-transformer": "0.200.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.30.1", + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", + "integrity": "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.30.1" + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-logs": "0.200.0", + "@opentelemetry/sdk-metrics": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0", + "protobufjs": "^7.3.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/resources": { - "version": "1.30.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "node_modules/@opentelemetry/sdk-logs": { - "version": "0.57.2", + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.200.0.tgz", + "integrity": "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1" + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.30.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.57.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/exporter-logs-otlp-grpc": "0.57.2", - "@opentelemetry/exporter-logs-otlp-http": "0.57.2", - "@opentelemetry/exporter-logs-otlp-proto": "0.57.2", - "@opentelemetry/exporter-metrics-otlp-grpc": "0.57.2", - "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", - "@opentelemetry/exporter-metrics-otlp-proto": "0.57.2", - "@opentelemetry/exporter-prometheus": "0.57.2", - "@opentelemetry/exporter-trace-otlp-grpc": "0.57.2", - "@opentelemetry/exporter-trace-otlp-http": "0.57.2", - "@opentelemetry/exporter-trace-otlp-proto": "0.57.2", - "@opentelemetry/exporter-zipkin": "1.30.1", - "@opentelemetry/instrumentation": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-logs": "0.57.2", - "@opentelemetry/sdk-metrics": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1", - "@opentelemetry/sdk-trace-node": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.30.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.30.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", + "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "1.30.1", - "@opentelemetry/core": "1.30.1", - "@opentelemetry/propagator-b3": "1.30.1", - "@opentelemetry/propagator-jaeger": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1", - "semver": "^7.5.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.30.0", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.33.0.tgz", + "integrity": "sha512-TIpZvE8fiEILFfTlfPnltpBaD3d9/+uQHVCyC3vfdh6WfCXKhNFzoP5RyDDIndfvZC5GrA4pyEDNyjPloJud+w==", "dev": true, "license": "Apache-2.0", "engines": { @@ -12935,26 +11956,36 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12964,26 +11995,36 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true, "license": "BSD-3-Clause" }, @@ -14444,11 +13485,6 @@ "@types/node": "*" } }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/@types/sinon": { "version": "10.0.5", "dev": true, @@ -15636,13 +14672,60 @@ "node_modules/anymatch": { "version": "3.1.2", "dev": true, - "license": "ISC", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "safe-buffer": "~5.1.0" } }, "node_modules/arg": { @@ -15880,16 +14963,6 @@ "resolved": "packages/toolkit", "link": true }, - "node_modules/axios": { - "version": "1.8.4", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/azure-devops-node-api": { "version": "11.2.0", "dev": true, @@ -16008,7 +15081,6 @@ "version": "4.1.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -16033,7 +15105,6 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -16557,8 +15628,7 @@ "node_modules/chownr": { "version": "1.1.4", "dev": true, - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/chrome-trace-event": { "version": "1.0.3", @@ -16601,11 +15671,6 @@ "webpack": ">=4.0.1" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "dev": true, - "license": "MIT" - }, "node_modules/clean-regexp": { "version": "1.0.0", "dev": true, @@ -16754,6 +15819,15 @@ "dev": true, "license": "MIT" }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color": { "version": "3.2.1", "license": "MIT", @@ -16900,6 +15974,12 @@ "node": ">=0.8" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "dev": true, @@ -17330,7 +16410,6 @@ "version": "0.6.0", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=4.0.0" } @@ -18400,7 +17479,6 @@ "version": "2.0.3", "dev": true, "license": "(MIT OR WTFPL)", - "optional": true, "engines": { "node": ">=6" } @@ -18855,8 +17933,7 @@ "node_modules/fs-constants": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/fs-extra": { "version": "11.3.0", @@ -18922,6 +17999,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/geometry-interfaces": { "version": "1.1.4", "dev": true, @@ -18992,8 +18133,7 @@ "node_modules/github-from-package": { "version": "0.0.0", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/glob": { "version": "10.3.10", @@ -19235,6 +18375,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "node_modules/hash-base": { "version": "3.1.0", "license": "MIT", @@ -19635,17 +18781,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-in-the-middle": { - "version": "1.13.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, "node_modules/import-local": { "version": "3.0.3", "dev": true, @@ -19692,8 +18827,7 @@ "node_modules/ini": { "version": "1.3.8", "dev": true, - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.3", @@ -20827,11 +19961,6 @@ "version": "4.17.21", "license": "MIT" }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.get": { "version": "4.4.2", "dev": true, @@ -20873,7 +20002,9 @@ "license": "MIT" }, "node_modules/long": { - "version": "5.3.1", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "dev": true, "license": "Apache-2.0" }, @@ -20912,6 +20043,12 @@ "undici": "^6.16.1" } }, + "node_modules/mac-system-proxy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mac-system-proxy/-/mac-system-proxy-1.0.4.tgz", + "integrity": "sha512-IAkNLxXZrYuM99A2OhPrvUoAxohsxQciJh2D2xnD+R6vypn/AVyOYLsbZsMVCS/fEbLIe67nQ8krEAfqP12BVg==", + "dev": true + }, "node_modules/magic-string": { "version": "0.30.0", "license": "MIT", @@ -21278,8 +20415,7 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/mocha": { "version": "10.1.0", @@ -21485,11 +20621,6 @@ "node": ">=10" } }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/morgan": { "version": "1.10.0", "dev": true, @@ -21595,8 +20726,7 @@ "node_modules/napi-build-utils": { "version": "1.0.2", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -21706,6 +20836,12 @@ "dev": true, "license": "MIT" }, + "node_modules/noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", + "dev": true + }, "node_modules/normalize-package-data": { "version": "3.0.3", "dev": true, @@ -21749,6 +20885,19 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "dev": true, @@ -21760,6 +20909,15 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nunjucks": { "version": "3.2.4", "dev": true, @@ -21945,6 +21103,16 @@ "version": "0.3.0", "license": "MIT" }, + "node_modules/os-proxy-config": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/os-proxy-config/-/os-proxy-config-1.1.2.tgz", + "integrity": "sha512-sV7htE8y6NQORU0oKOUGTwQYe1gSFK3a3Z1i4h6YaqdrA9C0JIsUPQAqEkO8ejjYbRrQ+jsnks5qjtisr7042Q==", + "dev": true, + "dependencies": { + "mac-system-proxy": "^1.0.0", + "windows-system-proxy": "^1.0.0" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "license": "MIT", @@ -22608,7 +21776,9 @@ "license": "MIT" }, "node_modules/protobufjs": { - "version": "7.4.0", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.1.tgz", + "integrity": "sha512-3qx3IRjR9WPQKagdwrKjO3Gu8RgQR2qqw+1KnigWhoVjFqegIj1K3bP11sGqhxrO46/XL7lekuG4jmjL+4cLsw==", "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", @@ -22650,11 +21820,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/psl": { "version": "1.9.0", "dev": true, @@ -22810,7 +21975,6 @@ "version": "1.2.8", "dev": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -22825,7 +21989,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=0.10.0" } @@ -23070,6 +22233,117 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/registry-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/registry-js/-/registry-js-1.16.1.tgz", + "integrity": "sha512-pQ2kD36lh+YNtpaXm6HCCb0QZtV/zQEeKnkfEIj5FDSpF/oFts7pwizEUkWSvP8IbGb4A4a5iBhhS9eUearMmQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "prebuild-install": "^5.3.5" + } + }, + "node_modules/registry-js/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/registry-js/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/registry-js/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/registry-js/node_modules/node-abi": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "dev": true, + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/registry-js/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/registry-js/node_modules/prebuild-install": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", + "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/registry-js/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/registry-js/node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dev": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/regjsparser": { "version": "0.10.0", "dev": true, @@ -23170,40 +22444,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-in-the-middle": { - "version": "7.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/require-in-the-middle/node_modules/debug": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/require-in-the-middle/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/requires-port": { "version": "1.0.0", "dev": true, @@ -23697,6 +22937,12 @@ "node": ">= 0.8" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/set-function-length": { "version": "1.2.2", "license": "MIT", @@ -23783,11 +23029,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/side-channel": { "version": "1.0.6", "license": "MIT", @@ -23826,8 +23067,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -24367,7 +23607,6 @@ "version": "2.1.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -24379,7 +23618,6 @@ "version": "2.2.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -24808,7 +24046,6 @@ "version": "0.6.0", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -25885,6 +25122,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/which-typed-array": { "version": "1.1.8", "license": "MIT", @@ -25903,6 +25149,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/wildcard": { "version": "2.0.0", "dev": true, @@ -25931,6 +25186,15 @@ "node": ">=4" } }, + "node_modules/windows-system-proxy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/windows-system-proxy/-/windows-system-proxy-1.0.0.tgz", + "integrity": "sha512-qd1WfyX9gjAqI36RHt95di2+FBr74DhvELd1EASgklCGScjwReHnWnXfUyabp/CJWl/IdnkUzG0Ub6Cv2R4KJQ==", + "dev": true, + "dependencies": { + "registry-js": "^1.15.1" + } + }, "node_modules/winston": { "version": "3.11.0", "license": "MIT", @@ -26384,7 +25648,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.68.0-SNAPSHOT", + "version": "1.76.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -26427,7 +25691,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.35.4", "@gerhobbelt/gitignore-parser": "^0.2.0-9", "@iarna/toml": "^2.2.5", "@smithy/fetch-http-handler": "^5.0.1", @@ -26484,8 +25748,8 @@ "@aws-sdk/types": "^3.13.1", "@aws/chat-client": "^0.1.4", "@aws/chat-client-ui-types": "^0.1.24", - "@aws/language-server-runtimes": "^0.2.70", - "@aws/language-server-runtimes-types": "^0.1.26", + "@aws/language-server-runtimes": "^0.2.97", + "@aws/language-server-runtimes-types": "^0.1.39", "@cspotcode/source-map-support": "^0.8.1", "@sinonjs/fake-timers": "^10.0.2", "@types/adm-zip": "^0.4.34", @@ -28098,7 +27362,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.62.0-SNAPSHOT", + "version": "3.66.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" 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", diff --git a/packages/amazonq/.changes/1.68.0.json b/packages/amazonq/.changes/1.68.0.json new file mode 100644 index 00000000000..2c21170aa0b --- /dev/null +++ b/packages/amazonq/.changes/1.68.0.json @@ -0,0 +1,18 @@ +{ + "date": "2025-05-15", + "version": "1.68.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Fix Error: 'Amazon Q service is not signed in'" + }, + { + "type": "Bug Fix", + "description": "Fix Error: 'Amazon Q Profile is not selected for IDC connection type'" + }, + { + "type": "Feature", + "description": "Add inline completion support for abap language" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.69.0.json b/packages/amazonq/.changes/1.69.0.json new file mode 100644 index 00000000000..caa8ed28676 --- /dev/null +++ b/packages/amazonq/.changes/1.69.0.json @@ -0,0 +1,14 @@ +{ + "date": "2025-05-22", + "version": "1.69.0", + "entries": [ + { + "type": "Bug Fix", + "description": "/transform: avoid prompting user for target JDK path unnecessarily" + }, + { + "type": "Removal", + "description": "/transform: remove option to select multiple diffs" + } + ] +} \ No newline at end of file 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/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/.changes/1.72.0.json b/packages/amazonq/.changes/1.72.0.json new file mode 100644 index 00000000000..10b0b374c3a --- /dev/null +++ b/packages/amazonq/.changes/1.72.0.json @@ -0,0 +1,10 @@ +{ + "date": "2025-06-11", + "version": "1.72.0", + "entries": [ + { + "type": "Feature", + "description": "Launch LSP with bundled artifacts as fallback" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.73.0.json b/packages/amazonq/.changes/1.73.0.json new file mode 100644 index 00000000000..25cda6dcf03 --- /dev/null +++ b/packages/amazonq/.changes/1.73.0.json @@ -0,0 +1,10 @@ +{ + "date": "2025-06-11", + "version": "1.73.0", + "entries": [ + { + "type": "Feature", + "description": "Add MCP Server Support" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.74.0.json b/packages/amazonq/.changes/1.74.0.json new file mode 100644 index 00000000000..e584f7a9d01 --- /dev/null +++ b/packages/amazonq/.changes/1.74.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-06-12", + "version": "1.74.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.75.0.json b/packages/amazonq/.changes/1.75.0.json new file mode 100644 index 00000000000..384d07654a4 --- /dev/null +++ b/packages/amazonq/.changes/1.75.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-06-13", + "version": "1.75.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Bug Fix-665b0f02-d6fe-4cfc-ac52-564f35d12aa5.json b/packages/amazonq/.changes/next-release/Bug Fix-665b0f02-d6fe-4cfc-ac52-564f35d12aa5.json new file mode 100644 index 00000000000..7e59d131c8d --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-665b0f02-d6fe-4cfc-ac52-564f35d12aa5.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "/transform: only show lines of code statistic in plan" +} diff --git a/packages/amazonq/.changes/next-release/Feature-31d91f84-30cb-4acd-9e39-9dc153edf0a6.json b/packages/amazonq/.changes/next-release/Feature-31d91f84-30cb-4acd-9e39-9dc153edf0a6.json deleted file mode 100644 index da0d200410d..00000000000 --- a/packages/amazonq/.changes/next-release/Feature-31d91f84-30cb-4acd-9e39-9dc153edf0a6.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "Add inline completion support for abap language" -} diff --git a/packages/amazonq/.changes/next-release/Feature-35bcb9ac-0cc5-456f-8159-765a6deb3b47.json b/packages/amazonq/.changes/next-release/Feature-35bcb9ac-0cc5-456f-8159-765a6deb3b47.json new file mode 100644 index 00000000000..2ca333a9f64 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-35bcb9ac-0cc5-456f-8159-765a6deb3b47.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Add model selection feature" +} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index ceb42f25c55..82ac8b6440c 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,38 @@ +## 1.75.0 2025-06-13 + +- Miscellaneous non-user-facing changes + +## 1.74.0 2025-06-12 + +- Miscellaneous non-user-facing changes + +## 1.73.0 2025-06-11 + +- **Feature** Add MCP Server Support + +## 1.72.0 2025-06-11 + +- **Feature** Launch LSP with bundled artifacts as fallback + +## 1.71.0 2025-06-04 + +- Miscellaneous non-user-facing changes + +## 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 +- **Removal** /transform: remove option to select multiple diffs + +## 1.68.0 2025-05-15 + +- **Bug Fix** Fix Error: 'Amazon Q service is not signed in' +- **Bug Fix** Fix Error: 'Amazon Q Profile is not selected for IDC connection type' +- **Feature** Add inline completion support for abap language + ## 1.67.0 2025-05-14 - **Bug Fix** Previous and subsequent cells are used as context for completion in a Jupyter notebook diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 06c6ce3d30c..c3e525cf42b 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.68.0-SNAPSHOT", + "version": "1.76.0-SNAPSHOT", "extensionKind": [ "workspace" ], @@ -213,6 +213,12 @@ "items": { "type": "string" } + }, + "amazonQ.proxy.certificateAuthority": { + "type": "string", + "markdownDescription": "%AWS.configuration.description.amazonq.proxy.certificateAuthority%", + "default": null, + "scope": "application" } } }, @@ -382,16 +388,21 @@ "when": "view == aws.amazonq.AmazonQChatView", "group": "0_topAmazonQ@1" }, - { - "command": "aws.amazonq.learnMore", - "when": "view =~ /^aws\\.amazonq/", - "group": "1_amazonQ@1" - }, { "command": "aws.amazonq.selectRegionProfile", "when": "view == aws.amazonq.AmazonQChatView && aws.amazonq.connectedSsoIdc == true", "group": "1_amazonQ@1" }, + { + "command": "aws.amazonq.manageSubscription", + "when": "(view == aws.amazonq.AmazonQChatView) && aws.codewhisperer.connected", + "group": "1_amazonQ@2" + }, + { + "command": "aws.amazonq.learnMore", + "when": "view =~ /^aws\\.amazonq/", + "group": "1_amazonQ@3" + }, { "command": "aws.amazonq.signout", "when": "(view == aws.amazonq.AmazonQChatView) && aws.codewhisperer.connected && !aws.isSageMakerUnifiedStudio", @@ -673,6 +684,13 @@ "category": "%AWS.amazonq.title%", "icon": "$(question)" }, + { + "command": "aws.amazonq.manageSubscription", + "title": "%AWS.command.manageSubscription%", + "category": "%AWS.amazonq.title%", + "icon": "$(gear)", + "enablement": "aws.codewhisperer.connected && !aws.amazonq.connectedSsoIdc" + }, { "command": "aws.amazonq.signout", "title": "%AWS.command.codewhisperer.signout%", @@ -805,6 +823,11 @@ { "command": "aws.amazonq.walkthrough.show", "title": "%AWS.amazonq.welcomeWalkthrough%" + }, + { + "command": "aws.amazonq.clearCache", + "title": "%AWS.amazonq.clearCache%", + "category": "%AWS.amazonq.title%" } ], "keybindings": [ diff --git a/packages/amazonq/src/app/chat/activation.ts b/packages/amazonq/src/app/chat/activation.ts index bf6b7cdc3df..659115d4256 100644 --- a/packages/amazonq/src/app/chat/activation.ts +++ b/packages/amazonq/src/app/chat/activation.ts @@ -6,22 +6,14 @@ import * as vscode from 'vscode' import { ExtensionContext } from 'vscode' import { telemetry } from 'aws-core-vscode/telemetry' -import { AuthUtil, CodeWhispererSettings } from 'aws-core-vscode/codewhisperer' -import { Commands, placeholder, funcUtil } from 'aws-core-vscode/shared' +import { AuthUtil } from 'aws-core-vscode/codewhisperer' +import { Commands, getLogger, placeholder } from 'aws-core-vscode/shared' import * as amazonq from 'aws-core-vscode/amazonq' export async function activate(context: ExtensionContext) { const appInitContext = amazonq.DefaultAmazonQAppInitContext.instance await amazonq.TryChatCodeLensProvider.register(appInitContext.onDidChangeAmazonQVisibility.event) - const setupLsp = funcUtil.debounce(async () => { - void amazonq.LspController.instance.trySetupLsp(context, { - startUrl: AuthUtil.instance.startUrl, - maxIndexSize: CodeWhispererSettings.instance.getMaxIndexSize(), - isVectorIndexEnabled: false, - }) - }, 5000) - context.subscriptions.push( amazonq.focusAmazonQChatWalkthrough.register(), amazonq.walkthroughInlineSuggestionsExample.register(), @@ -37,7 +29,6 @@ export async function activate(context: ExtensionContext) { void vscode.env.openExternal(vscode.Uri.parse(amazonq.amazonQHelpUrl)) }) - void setupLsp() void setupAuthNotification() } @@ -76,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/commands.ts b/packages/amazonq/src/commands.ts index 66979146651..494a3f6a3b7 100644 --- a/packages/amazonq/src/commands.ts +++ b/packages/amazonq/src/commands.ts @@ -9,7 +9,11 @@ import * as vscode from 'vscode' import { Auth } from 'aws-core-vscode/auth' import { Commands } from 'aws-core-vscode/shared' +import { clearCacheDeclaration } from './util/clearCache' export function registerCommands(context: vscode.ExtensionContext) { - context.subscriptions.push(Commands.register('_aws.amazonq.auth.autoConnect', Auth.instance.tryAutoConnect)) + context.subscriptions.push( + Commands.register('_aws.amazonq.auth.autoConnect', Auth.instance.tryAutoConnect), + clearCacheDeclaration.register() + ) } diff --git a/packages/amazonq/src/extension.ts b/packages/amazonq/src/extension.ts index 45641b37440..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 ( @@ -166,7 +171,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/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<void> { try { @@ -16,6 +16,15 @@ export async function activate(ctx: vscode.ExtensionContext): Promise<void> { }) } 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/auth.ts b/packages/amazonq/src/lsp/auth.ts index 816c4b09ab0..0bfee98f2e2 100644 --- a/packages/amazonq/src/lsp/auth.ts +++ b/packages/amazonq/src/lsp/auth.ts @@ -18,6 +18,7 @@ import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { Writable } from 'stream' import { onceChanged } from 'aws-core-vscode/utils' import { getLogger, oneMinute } from 'aws-core-vscode/shared' +import { isSsoConnection } from 'aws-core-vscode/auth' export const encryptionKey = crypto.randomBytes(32) @@ -76,8 +77,8 @@ export class AmazonQLspAuth { * @param force bypass memoization, and forcefully update the bearer token */ async refreshConnection(force: boolean = false) { - const activeConnection = this.authUtil.auth.activeConnection - if (activeConnection?.state === 'valid' && activeConnection?.type === 'sso') { + const activeConnection = this.authUtil.conn + if (this.authUtil.isConnectionValid() && isSsoConnection(activeConnection)) { // send the token to the language server const token = await this.authUtil.getBearerToken() await (force ? this._updateBearerToken(token) : this.updateBearerToken(token)) @@ -95,6 +96,8 @@ export class AmazonQLspAuth { token, }) + // "aws/credentials/token/update" + // https://github.com/aws/language-servers/blob/44d81f0b5754747d77bda60b40cc70950413a737/core/aws-lsp-core/src/credentials/credentialsProvider.ts#L27 await this.client.sendRequest(bearerCredentialsUpdateRequestType.method, request) this.client.info(`UpdateBearerToken: ${JSON.stringify(request)}`) @@ -118,7 +121,7 @@ export class AmazonQLspAuth { data: jwt, metadata: { sso: { - startUrl: AuthUtil.instance.auth.startUrl, + startUrl: AuthUtil.instance.startUrl, }, }, encrypted: true, diff --git a/packages/amazonq/src/lsp/chat/activation.ts b/packages/amazonq/src/lsp/chat/activation.ts index 3a36377b9b5..90a0adbc61f 100644 --- a/packages/amazonq/src/lsp/chat/activation.ts +++ b/packages/amazonq/src/lsp/chat/activation.ts @@ -6,32 +6,22 @@ import { window } from 'vscode' import { LanguageClient } from 'vscode-languageclient' import { AmazonQChatViewProvider } from './webviewProvider' -import { registerCommands } from './commands' -import { registerLanguageServerEventListener, registerMessageListeners } from './messages' +import { focusAmazonQPanel, registerCommands } from './commands' +import { + registerActiveEditorChangeListener, + registerLanguageServerEventListener, + registerMessageListeners, +} from './messages' import { Commands, getLogger, globals, undefinedIfEmpty } from 'aws-core-vscode/shared' import { activate as registerLegacyChatListeners } from '../../app/chat/activation' import { DefaultAmazonQAppInitContext } from 'aws-core-vscode/amazonq' import { AuthUtil, getSelectedCustomization } from 'aws-core-vscode/codewhisperer' -import { - DidChangeConfigurationNotification, - updateConfigurationRequestType, -} from '@aws/language-server-runtimes/protocol' +import { pushConfigUpdate } from '../config' export async function activate(languageClient: LanguageClient, encryptionKey: Buffer, mynahUIPath: string) { const disposables = globals.context.subscriptions - // Make sure we've sent an auth profile to the language server before even initializing the UI - await pushConfigUpdate(languageClient, { - type: 'profile', - profileArn: AuthUtil.instance.regionProfileManager.activeRegionProfile?.arn, - }) - // We need to push the cached customization on startup explicitly - await pushConfigUpdate(languageClient, { - type: 'customization', - customization: getSelectedCustomization(), - }) - - const provider = new AmazonQChatViewProvider(mynahUIPath) + const provider = new AmazonQChatViewProvider(mynahUIPath, languageClient) disposables.push( window.registerWebviewViewProvider(AmazonQChatViewProvider.viewType, provider, { @@ -47,6 +37,7 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu **/ registerCommands(provider) registerLanguageServerEventListener(languageClient, provider) + registerActiveEditorChangeListener(languageClient) provider.onDidResolveWebview(() => { const disposable = DefaultAmazonQAppInitContext.instance.getAppsToWebViewMessageListener().onMessage((msg) => { @@ -79,10 +70,6 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu disposables.push( AuthUtil.instance.regionProfileManager.onDidChangeRegionProfile(async () => { - void pushConfigUpdate(languageClient, { - type: 'profile', - profileArn: AuthUtil.instance.regionProfileManager.activeRegionProfile?.arn, - }) await provider.refreshWebview() }), Commands.register('aws.amazonq.updateCustomizations', () => { @@ -91,6 +78,18 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu customization: undefinedIfEmpty(getSelectedCustomization().arn), }) }), + Commands.register('aws.amazonq.manageSubscription', () => { + focusAmazonQPanel().catch((e) => languageClient.error(`[VSCode Client] focusAmazonQPanel() failed`)) + + languageClient + .sendRequest('workspace/executeCommand', { + command: 'aws/chat/manageSubscription', + // arguments: [], + }) + .catch((e) => { + getLogger('amazonqLsp').error('failed request: aws/chat/manageSubscription: %O', e) + }) + }), globals.logOutputChannel.onDidChangeLogLevel((logLevel) => { getLogger('amazonqLsp').info(`Local log level changed to ${logLevel}, notifying LSP`) void pushConfigUpdate(languageClient, { @@ -99,45 +98,3 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu }) ) } - -/** - * Push a config value to the language server, effectively updating it with the - * latest configuration from the client. - * - * The issue is we need to push certain configs to different places, since there are - * different handlers for specific configs. So this determines the correct place to - * push the given config. - */ -async function pushConfigUpdate(client: LanguageClient, config: QConfigs) { - switch (config.type) { - case 'profile': - await client.sendRequest(updateConfigurationRequestType.method, { - section: 'aws.q', - settings: { profileArn: config.profileArn }, - }) - break - case 'customization': - client.sendNotification(DidChangeConfigurationNotification.type.method, { - section: 'aws.q', - settings: { customization: config.customization }, - }) - break - case 'logLevel': - client.sendNotification(DidChangeConfigurationNotification.type.method, { - section: 'aws.logLevel', - }) - break - } -} -type ProfileConfig = { - type: 'profile' - profileArn: string | undefined -} -type CustomizationConfig = { - type: 'customization' - customization: string | undefined -} -type LogLevelConfig = { - type: 'logLevel' -} -type QConfigs = ProfileConfig | CustomizationConfig | LogLevelConfig diff --git a/packages/amazonq/src/lsp/chat/commands.ts b/packages/amazonq/src/lsp/chat/commands.ts index 74c63592a4f..115118a4ad2 100644 --- a/packages/amazonq/src/lsp/chat/commands.ts +++ b/packages/amazonq/src/lsp/chat/commands.ts @@ -125,7 +125,7 @@ function registerGenericCommand(commandName: string, genericCommand: string, pro * * Instead, we just create our own as a temporary solution */ -async function focusAmazonQPanel() { +export async function focusAmazonQPanel() { await Commands.tryExecute('aws.amazonq.AmazonQChatView.focus') await Commands.tryExecute('aws.amazonq.AmazonCommonAuth.focus') } diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 38a52f72f9c..0178050b4a4 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -32,6 +32,8 @@ import { getSerializedChatRequestType, listConversationsRequestType, conversationClickRequestType, + listMcpServersRequestType, + mcpServerClickRequestType, ShowSaveFileDialogRequestType, ShowSaveFileDialogParams, LSPErrorCodes, @@ -51,6 +53,12 @@ import { CancellationTokenSource, chatUpdateNotificationType, ChatUpdateParams, + chatOptionsUpdateType, + ChatOptionsUpdateParams, + listRulesRequestType, + ruleClickRequestType, + pinnedContextNotificationType, + activeEditorChangedNotificationType, } from '@aws/language-server-runtimes/protocol' import { v4 as uuidv4 } from 'uuid' import * as vscode from 'vscode' @@ -58,7 +66,7 @@ import { Disposable, LanguageClient, Position, TextDocumentIdentifier } from 'vs import * as jose from 'jose' import { AmazonQChatViewProvider } from './webviewProvider' import { AuthUtil, ReferenceLogViewProvider } from 'aws-core-vscode/codewhisperer' -import { amazonQDiffScheme, AmazonQPromptSettings, messages, openUrl } from 'aws-core-vscode/shared' +import { amazonQDiffScheme, AmazonQPromptSettings, messages, openUrl, isTextEditor } from 'aws-core-vscode/shared' import { DefaultAmazonQAppInitContext, messageDispatcher, @@ -68,6 +76,30 @@ import { } from 'aws-core-vscode/amazonq' import { telemetry, TelemetryBase } from 'aws-core-vscode/telemetry' import { isValidResponseError } from './error' +import { focusAmazonQPanel } from './commands' + +export function registerActiveEditorChangeListener(languageClient: LanguageClient) { + let debounceTimer: NodeJS.Timeout | undefined + vscode.window.onDidChangeActiveTextEditor((editor) => { + if (debounceTimer) { + clearTimeout(debounceTimer) + } + debounceTimer = setTimeout(() => { + let textDocument = undefined + let cursorState = undefined + if (editor) { + textDocument = { + uri: editor.document.uri.toString(), + } + cursorState = getCursorState(editor.selections) + } + languageClient.sendNotification(activeEditorChangedNotificationType.method, { + textDocument, + cursorState, + }) + }, 100) + }) +} export function registerLanguageServerEventListener(languageClient: LanguageClient, provider: AmazonQChatViewProvider) { languageClient.info( @@ -311,8 +343,12 @@ export function registerMessageListeners( ) break } + case listRulesRequestType.method: + case ruleClickRequestType.method: case listConversationsRequestType.method: case conversationClickRequestType.method: + case listMcpServersRequestType.method: + case mcpServerClickRequestType.method: case tabBarActionRequestType.method: await resolveChatResponse(message.command, message.params, languageClient, webview) break @@ -328,7 +364,7 @@ export function registerMessageListeners( ) if (!buttonResult.success) { languageClient.error( - `[VSCode Client] Failed to execute action associated with button with reason: ${buttonResult.failureReason}` + `[VSCode Client] Failed to execute button action: ${buttonResult.failureReason}` ) } break @@ -427,8 +463,25 @@ export function registerMessageListeners( languageClient.onRequest<ShowDocumentParams, ShowDocumentResult>( ShowDocumentRequest.method, async (params: ShowDocumentParams): Promise<ShowDocumentParams | ResponseError<ShowDocumentResult>> => { + focusAmazonQPanel().catch((e) => languageClient.error(`[VSCode Client] focusAmazonQPanel() failed`)) + 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 @@ -447,6 +500,20 @@ export function registerMessageListeners( params: params, }) }) + languageClient.onNotification( + pinnedContextNotificationType.method, + (params: ContextCommandParams & { tabId: string; textDocument?: TextDocumentIdentifier }) => { + const editor = vscode.window.activeTextEditor + let textDocument = undefined + if (editor && isTextEditor(editor)) { + textDocument = { uri: vscode.workspace.asRelativePath(editor.document.uri) } + } + void provider.webview?.postMessage({ + command: pinnedContextNotificationType.method, + params: { ...params, textDocument }, + }) + } + ) languageClient.onNotification(openFileDiffNotificationType.method, async (params: OpenFileDiffParams) => { const ecc = new EditorContentController() @@ -482,6 +549,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) { diff --git a/packages/amazonq/src/lsp/chat/webviewProvider.ts b/packages/amazonq/src/lsp/chat/webviewProvider.ts index 1a513f1df3f..7d51648398d 100644 --- a/packages/amazonq/src/lsp/chat/webviewProvider.ts +++ b/packages/amazonq/src/lsp/chat/webviewProvider.ts @@ -19,10 +19,12 @@ 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' import { getAmazonQLspConfig } from '../config' +import { LanguageClient } from 'vscode-languageclient' export class AmazonQChatViewProvider implements WebviewViewProvider { public static readonly viewType = 'aws.amazonq.AmazonQChatView' @@ -35,7 +37,10 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { connectorAdapterPath?: string uiPath?: string - constructor(private readonly mynahUIPath: string) {} + constructor( + private readonly mynahUIPath: string, + private readonly languageClient: LanguageClient + ) {} public async resolveWebviewView( webviewView: WebviewView, @@ -44,9 +49,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 @@ -91,6 +99,8 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { const pairProgrammingAcknowledged = !AmazonQPromptSettings.instance.isPromptEnabled('amazonQChatPairProgramming') const welcomeCount = globals.globalState.tryGet('aws.amazonq.welcomeChatShowCount', Number, 0) + const modelSelectionEnabled = + this.languageClient.initializeResult?.awsServerCapabilities?.chatOptions?.modelSelection ?? false // only show profile card when the two conditions // 1. profile count >= 2 @@ -139,14 +149,14 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { const vscodeApi = acquireVsCodeApi() const hybridChatConnector = new HybridChatAdapter(${(await AuthUtil.instance.getChatAuthState()).amazonQ === 'connected'},${featureConfigData},${welcomeCount},${disclaimerAcknowledged},${regionProfileString},${disabledCommands},${isSMUS},${isSM},vscodeApi.postMessage) const commands = [hybridChatConnector.initialQuickActions[0]] - qChat = amazonQChat.createChat(vscodeApi, {disclaimerAcknowledged: ${disclaimerAcknowledged}, pairProgrammingAcknowledged: ${pairProgrammingAcknowledged}, agenticMode: true, quickActionCommands: commands}, hybridChatConnector, ${JSON.stringify(featureConfigData)}); + qChat = amazonQChat.createChat(vscodeApi, {disclaimerAcknowledged: ${disclaimerAcknowledged}, pairProgrammingAcknowledged: ${pairProgrammingAcknowledged}, agenticMode: true, quickActionCommands: commands, modelSelectionEnabled: ${modelSelectionEnabled}}, hybridChatConnector, ${JSON.stringify(featureConfigData)}); } window.addEventListener('message', (event) => { /** * special handler that "simulates" reloading the webview when a profile changes. * required because chat-client relies on initializedResult from the lsp that * are only sent once - * + * * References: * closing tabs: https://github.com/aws/mynah-ui/blob/de736b52f369ba885cd19f33ac86c6f57b4a3134/docs/USAGE.md#removing-a-tab-programmatically- * opening tabs: https://github.com/aws/aws-toolkit-vscode/blob/c22efa03e73b241564c8051c35761eb8620edb83/packages/amazonq/test/e2e/amazonq/framework/framework.ts#L98 diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index 5559afb9f1d..55198852d96 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -16,7 +16,6 @@ import { GetConfigurationFromServerParams, RenameFilesParams, ResponseMessage, - updateConfigurationRequestType, WorkspaceFolder, } from '@aws/language-server-runtimes/protocol' import { AuthUtil, CodeWhispererSettings, getSelectedCustomization } from 'aws-core-vscode/codewhisperer' @@ -38,7 +37,7 @@ import { import { processUtils } from 'aws-core-vscode/shared' import { activate } from './chat/activation' import { AmazonQResourcePaths } from './lspInstaller' -import { ConfigSection, isValidConfigSection, toAmazonQLSPLogLevel } from './config' +import { ConfigSection, isValidConfigSection, pushConfigUpdate, toAmazonQLSPLogLevel } from './config' import { telemetry } from 'aws-core-vscode/telemetry' const localize = nls.loadMessageBundle() @@ -124,6 +123,8 @@ export async function startLanguageServer( awsClientCapabilities: { q: { developerProfiles: true, + pinnedContextEnabled: true, + mcp: true, }, window: { notifications: true, @@ -160,120 +161,133 @@ export async function startLanguageServer( const disposable = client.start() toDispose.push(disposable) + await client.onReady() - const auth = new AmazonQLspAuth(client) + const auth = await initializeAuth(client) - return client.onReady().then(async () => { - await auth.refreshConnection() + await onLanguageServerReady(auth, client, resourcePaths, toDispose) - if (Experiments.instance.get('amazonqLSPInline', false)) { - const inlineManager = new InlineCompletionManager(client) - inlineManager.registerInlineCompletion() - toDispose.push( - inlineManager, - Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => { - await vscode.commands.executeCommand('editor.action.inlineSuggest.trigger') - }), - vscode.workspace.onDidCloseTextDocument(async () => { - await vscode.commands.executeCommand('aws.amazonq.rejectCodeSuggestion') - }) - ) - } + return client +} - if (Experiments.instance.get('amazonqChatLSP', true)) { - await activate(client, encryptionKey, resourcePaths.ui) - } +async function initializeAuth(client: LanguageClient): Promise<AmazonQLspAuth> { + const auth = new AmazonQLspAuth(client) + await auth.refreshConnection(true) + return auth +} - const refreshInterval = auth.startTokenRefreshInterval(10 * oneSecond) +async function onLanguageServerReady( + auth: AmazonQLspAuth, + client: LanguageClient, + resourcePaths: AmazonQResourcePaths, + toDispose: vscode.Disposable[] +) { + if (Experiments.instance.get('amazonqLSPInline', false)) { + const inlineManager = new InlineCompletionManager(client) + inlineManager.registerInlineCompletion() + toDispose.push( + inlineManager, + Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => { + await vscode.commands.executeCommand('editor.action.inlineSuggest.trigger') + }), + vscode.workspace.onDidCloseTextDocument(async () => { + await vscode.commands.executeCommand('aws.amazonq.rejectCodeSuggestion') + }) + ) + } - const sendProfileToLsp = async () => { - try { - const result = await client.sendRequest(updateConfigurationRequestType.method, { - section: 'aws.q', - settings: { - profileArn: AuthUtil.instance.regionProfileManager.activeRegionProfile?.arn, - }, - }) - client.info( - `Client: Updated Amazon Q Profile ${AuthUtil.instance.regionProfileManager.activeRegionProfile?.arn} to Amazon Q LSP`, - result - ) - } catch (err) { - client.error('Error when setting Q Developer Profile to Amazon Q LSP', err) - } - } + if (Experiments.instance.get('amazonqChatLSP', true)) { + await activate(client, encryptionKey, resourcePaths.ui) + } - // send profile to lsp once. - void sendProfileToLsp() + const refreshInterval = auth.startTokenRefreshInterval(10 * oneSecond) - toDispose.push( - AuthUtil.instance.auth.onDidChangeActiveConnection(async () => { - await auth.refreshConnection() - }), - AuthUtil.instance.auth.onDidDeleteConnection(async () => { - client.sendNotification(notificationTypes.deleteBearerToken.method) - }), - AuthUtil.instance.regionProfileManager.onDidChangeRegionProfile(sendProfileToLsp), - vscode.commands.registerCommand('aws.amazonq.getWorkspaceId', async () => { - const requestType = new RequestType<GetConfigurationFromServerParams, ResponseMessage, Error>( - 'aws/getConfigurationFromServer' - ) - const workspaceIdResp = await client.sendRequest(requestType.method, { - section: 'aws.q.workspaceContext', - }) - return workspaceIdResp - }), - vscode.workspace.onDidCreateFiles((e) => { - client.sendNotification('workspace/didCreateFiles', { - files: e.files.map((it) => { - return { uri: it.fsPath } - }), - } as CreateFilesParams) - }), - vscode.workspace.onDidDeleteFiles((e) => { - client.sendNotification('workspace/didDeleteFiles', { - files: e.files.map((it) => { - return { uri: it.fsPath } + // We manually push the cached values the first time since event handlers, which should push, may not have been setup yet. + // Execution order is weird and should be fixed in the flare implementation. + // TODO: Revisit if we need this if we setup the event handlers properly + if (AuthUtil.instance.isConnectionValid()) { + await sendProfileToLsp(client) + + await pushConfigUpdate(client, { + type: 'customization', + customization: getSelectedCustomization(), + }) + } + + toDispose.push( + AuthUtil.instance.auth.onDidChangeActiveConnection(async () => { + await auth.refreshConnection() + }), + AuthUtil.instance.auth.onDidDeleteConnection(async () => { + client.sendNotification(notificationTypes.deleteBearerToken.method) + }), + AuthUtil.instance.regionProfileManager.onDidChangeRegionProfile(() => sendProfileToLsp(client)), + vscode.commands.registerCommand('aws.amazonq.getWorkspaceId', async () => { + const requestType = new RequestType<GetConfigurationFromServerParams, ResponseMessage, Error>( + 'aws/getConfigurationFromServer' + ) + const workspaceIdResp = await client.sendRequest(requestType.method, { + section: 'aws.q.workspaceContext', + }) + return workspaceIdResp + }), + vscode.workspace.onDidCreateFiles((e) => { + client.sendNotification('workspace/didCreateFiles', { + files: e.files.map((it) => { + return { uri: it.fsPath } + }), + } as CreateFilesParams) + }), + vscode.workspace.onDidDeleteFiles((e) => { + client.sendNotification('workspace/didDeleteFiles', { + files: e.files.map((it) => { + return { uri: it.fsPath } + }), + } as DeleteFilesParams) + }), + vscode.workspace.onDidRenameFiles((e) => { + client.sendNotification('workspace/didRenameFiles', { + files: e.files.map((it) => { + return { oldUri: it.oldUri.fsPath, newUri: it.newUri.fsPath } + }), + } as RenameFilesParams) + }), + vscode.workspace.onDidSaveTextDocument((e) => { + client.sendNotification('workspace/didSaveTextDocument', { + textDocument: { + uri: e.uri.fsPath, + }, + } as DidSaveTextDocumentParams) + }), + vscode.workspace.onDidChangeWorkspaceFolders((e) => { + client.sendNotification('workspace/didChangeWorkspaceFolder', { + event: { + added: e.added.map((it) => { + return { + name: it.name, + uri: it.uri.fsPath, + } as WorkspaceFolder }), - } as DeleteFilesParams) - }), - vscode.workspace.onDidRenameFiles((e) => { - client.sendNotification('workspace/didRenameFiles', { - files: e.files.map((it) => { - return { oldUri: it.oldUri.fsPath, newUri: it.newUri.fsPath } + removed: e.removed.map((it) => { + return { + name: it.name, + uri: it.uri.fsPath, + } as WorkspaceFolder }), - } as RenameFilesParams) - }), - vscode.workspace.onDidSaveTextDocument((e) => { - client.sendNotification('workspace/didSaveTextDocument', { - textDocument: { - uri: e.uri.fsPath, - }, - } as DidSaveTextDocumentParams) - }), - vscode.workspace.onDidChangeWorkspaceFolders((e) => { - client.sendNotification('workspace/didChangeWorkspaceFolder', { - event: { - added: e.added.map((it) => { - return { - name: it.name, - uri: it.uri.fsPath, - } as WorkspaceFolder - }), - removed: e.removed.map((it) => { - return { - name: it.name, - uri: it.uri.fsPath, - } as WorkspaceFolder - }), - }, - } as DidChangeWorkspaceFoldersParams) - }), - { dispose: () => clearInterval(refreshInterval) }, - // Set this inside onReady so that it only triggers on subsequent language server starts (not the first) - onServerRestartHandler(client, auth) - ) - }) + }, + } as DidChangeWorkspaceFoldersParams) + }), + { dispose: () => clearInterval(refreshInterval) }, + // Set this inside onReady so that it only triggers on subsequent language server starts (not the first) + onServerRestartHandler(client, auth) + ) + + async function sendProfileToLsp(client: LanguageClient) { + await pushConfigUpdate(client, { + type: 'profile', + profileArn: AuthUtil.instance.regionProfileManager.activeRegionProfile?.arn, + }) + } } /** diff --git a/packages/amazonq/src/lsp/config.ts b/packages/amazonq/src/lsp/config.ts index bb6870cb561..1760fb51401 100644 --- a/packages/amazonq/src/lsp/config.ts +++ b/packages/amazonq/src/lsp/config.ts @@ -5,6 +5,11 @@ import * as vscode from 'vscode' import { DevSettings, getServiceEnvVarConfig } from 'aws-core-vscode/shared' import { LspConfig } from 'aws-core-vscode/amazonq' +import { LanguageClient } from 'vscode-languageclient' +import { + DidChangeConfigurationNotification, + updateConfigurationRequestType, +} from '@aws/language-server-runtimes/protocol' export interface ExtendedAmazonQLSPConfig extends LspConfig { ui?: string @@ -54,3 +59,45 @@ export function getAmazonQLspConfig(): ExtendedAmazonQLSPConfig { export function toAmazonQLSPLogLevel(logLevel: vscode.LogLevel): LspLogLevel { return lspLogLevelMapping.get(logLevel) ?? 'info' } + +/** + * Request/Notify a config value to the language server, effectively updating it with the + * latest configuration from the client. + * + * The issue is we need to push certain configs to different places, since there are + * different handlers for specific configs. So this determines the correct place to + * push the given config. + */ +export async function pushConfigUpdate(client: LanguageClient, config: QConfigs) { + switch (config.type) { + case 'profile': + await client.sendRequest(updateConfigurationRequestType.method, { + section: 'aws.q', + settings: { profileArn: config.profileArn }, + }) + break + case 'customization': + client.sendNotification(DidChangeConfigurationNotification.type.method, { + section: 'aws.q', + settings: { customization: config.customization }, + }) + break + case 'logLevel': + client.sendNotification(DidChangeConfigurationNotification.type.method, { + section: 'aws.logLevel', + }) + break + } +} +type ProfileConfig = { + type: 'profile' + profileArn: string | undefined +} +type CustomizationConfig = { + type: 'customization' + customization: string | undefined +} +type LogLevelConfig = { + type: 'logLevel' +} +type QConfigs = ProfileConfig | CustomizationConfig | LogLevelConfig diff --git a/packages/amazonq/src/lsp/lspInstaller.ts b/packages/amazonq/src/lsp/lspInstaller.ts index 72fa091f027..9ac19601fe7 100644 --- a/packages/amazonq/src/lsp/lspInstaller.ts +++ b/packages/amazonq/src/lsp/lspInstaller.ts @@ -3,12 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { fs, getNodeExecutableName, BaseLspInstaller, ResourcePaths } from 'aws-core-vscode/shared' +import vscode from 'vscode' +import { fs, getNodeExecutableName, getRgExecutableName, BaseLspInstaller, ResourcePaths } from 'aws-core-vscode/shared' import path from 'path' import { ExtendedAmazonQLSPConfig, getAmazonQLspConfig } from './config' export interface AmazonQResourcePaths extends ResourcePaths { ui: string + /** + * Path to `rg` (or `rg.exe`) executable/binary. + * Example: `"<cachedir>/aws/toolkits/language-servers/AmazonQ/3.3.0/servers/rg"` + */ + ripGrep: string } export class AmazonQLspInstaller extends BaseLspInstaller.BaseLspInstaller< @@ -22,6 +28,9 @@ export class AmazonQLspInstaller extends BaseLspInstaller.BaseLspInstaller< protected override async postInstall(assetDirectory: string): Promise<void> { const resourcePaths = this.resourcePaths(assetDirectory) await fs.chmod(resourcePaths.node, 0o755) + if (await fs.exists(resourcePaths.ripGrep)) { + await fs.chmod(resourcePaths.ripGrep, 0o755) + } } protected override resourcePaths(assetDirectory?: string): AmazonQResourcePaths { @@ -29,17 +38,30 @@ export class AmazonQLspInstaller extends BaseLspInstaller.BaseLspInstaller< return { lsp: this.config.path ?? '', node: getNodeExecutableName(), + ripGrep: `ripgrep/${getRgExecutableName()}`, ui: this.config.ui ?? '', } } const nodePath = path.join(assetDirectory, `servers/${getNodeExecutableName()}`) + const rgPath = path.join(assetDirectory, `servers/ripgrep/${getRgExecutableName()}`) return { lsp: path.join(assetDirectory, 'servers/aws-lsp-codewhisperer.js'), node: nodePath, + ripGrep: rgPath, ui: path.join(assetDirectory, 'clients/amazonq-ui.js'), } } 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/packages/amazonq/src/util/clearCache.ts b/packages/amazonq/src/util/clearCache.ts new file mode 100644 index 00000000000..8c93b35ac12 --- /dev/null +++ b/packages/amazonq/src/util/clearCache.ts @@ -0,0 +1,49 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { AuthUtil } from 'aws-core-vscode/codewhisperer' +import { Commands, fs, globals, LanguageServerResolver } from 'aws-core-vscode/shared' +import vscode from 'vscode' + +/** + * The purpose of this module is to provide a util to clear all extension cache so that it has a clean state + */ + +/** + * Clears "all" cache of the extension, effectively putting the user in a "net new" state. + * + * NOTE: This is a best attempt. There may be state like a file in the filesystem which is not deleted. + * We should aim to add all state clearing in to this method. + */ +async function clearCache() { + // Check a final time if they want to clear their cache + const doContinue = await vscode.window + .showInformationMessage( + 'This will wipe your Amazon Q extension state, then reload your VS Code window. This operation is not dangerous. ', + { modal: true }, + 'Continue' + ) + .then((value) => { + return value === 'Continue' + }) + if (!doContinue) { + return + } + + // SSO cache persists on disk, this should indirectly delete it + const conn = AuthUtil.instance.conn + if (conn) { + await AuthUtil.instance.auth.deleteConnection(conn) + } + + await globals.globalState.clear() + + // Clear the Language Server Cache + await fs.delete(LanguageServerResolver.defaultDir(), { recursive: true, force: true }) + + // Make the IDE reload so all new changes take effect + void vscode.commands.executeCommand('workbench.action.reloadWindow') +} +export const clearCacheDeclaration = Commands.declare({ id: 'aws.amazonq.clearCache' }, () => clearCache) diff --git a/packages/amazonq/test/e2e/amazonq/transformByQ.test.ts b/packages/amazonq/test/e2e/amazonq/transformByQ.test.ts index 74f788732dd..4493a7c2387 100644 --- a/packages/amazonq/test/e2e/amazonq/transformByQ.test.ts +++ b/packages/amazonq/test/e2e/amazonq/transformByQ.test.ts @@ -123,29 +123,8 @@ describe('Amazon Q Code Transformation', function () { formItemValues: skipTestsFormValues, }) - // 3 additional chat messages (including message with 3rd form) get sent after 2nd form submitted; wait for all of them - await tab.waitForEvent(() => tab.getChatItems().length > 9, { - waitTimeoutInMs: 5000, - waitIntervalInMs: 1000, - }) - const multipleDiffsForm = tab.getChatItems().pop() - assert.strictEqual( - multipleDiffsForm?.formItems?.[0]?.id ?? undefined, - 'GumbyTransformOneOrMultipleDiffsForm' - ) - - const oneOrMultipleDiffsFormItemValues = { - GumbyTransformOneOrMultipleDiffsForm: 'One diff', - } - const oneOrMultipleDiffsFormValues: Record<string, string> = { ...oneOrMultipleDiffsFormItemValues } - tab.clickCustomFormButton({ - id: 'gumbyTransformOneOrMultipleDiffsFormConfirm', - text: 'Confirm', - formItemValues: oneOrMultipleDiffsFormValues, - }) - // 2 additional chat messages get sent after 3rd form submitted; wait for both of them - await tab.waitForEvent(() => tab.getChatItems().length > 11, { + await tab.waitForEvent(() => tab.getChatItems().length > 8, { waitTimeoutInMs: 5000, waitIntervalInMs: 1000, }) @@ -172,7 +151,7 @@ describe('Amazon Q Code Transformation', function () { tab.addChatMessage({ prompt: '/dummy/path/to/jdk8' }) // 2 additional chat messages get sent after JDK path submitted; wait for both of them - await tab.waitForEvent(() => tab.getChatItems().length > 13, { + await tab.waitForEvent(() => tab.getChatItems().length > 10, { waitTimeoutInMs: 5000, waitIntervalInMs: 1000, }) @@ -194,7 +173,7 @@ describe('Amazon Q Code Transformation', function () { text: 'View summary', }) - await tab.waitForEvent(() => tab.getChatItems().length > 14, { + await tab.waitForEvent(() => tab.getChatItems().length > 11, { waitTimeoutInMs: 5000, waitIntervalInMs: 1000, }) diff --git a/packages/amazonq/test/unit/amazonqGumby/resources/files/diff.json b/packages/amazonq/test/unit/amazonqGumby/resources/files/diff.json deleted file mode 100644 index 5b73cdd201b..00000000000 --- a/packages/amazonq/test/unit/amazonqGumby/resources/files/diff.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "content": [ - { - "name": "Added file", - "fileName": "resources/files/addedFile.diff", - "isSuccessful": true - } - ] -} diff --git a/packages/amazonq/test/unit/amazonqGumby/transformationResultsHandler.test.ts b/packages/amazonq/test/unit/amazonqGumby/transformationResultsHandler.test.ts index 4e1ce627bd3..143346674d9 100644 --- a/packages/amazonq/test/unit/amazonqGumby/transformationResultsHandler.test.ts +++ b/packages/amazonq/test/unit/amazonqGumby/transformationResultsHandler.test.ts @@ -5,18 +5,12 @@ import assert from 'assert' import sinon from 'sinon' import { DiffModel, AddedChangeNode, ModifiedChangeNode } from 'aws-core-vscode/codewhisperer/node' -import { DescriptionContent } from 'aws-core-vscode/codewhisperer' import path from 'path' import { getTestResourceFilePath } from './amazonQGumbyUtil' import { fs } from 'aws-core-vscode/shared' import { createTestWorkspace } from 'aws-core-vscode/test' describe('DiffModel', function () { - let parsedTestDescriptions: DescriptionContent - beforeEach(async () => { - parsedTestDescriptions = JSON.parse(await fs.readFileText(getTestResourceFilePath('resources/files/diff.json'))) - }) - afterEach(() => { sinon.restore() }) @@ -34,18 +28,12 @@ describe('DiffModel', function () { return true }) - testDiffModel.parseDiff( - getTestResourceFilePath('resources/files/addedFile.diff'), - workspacePath, - parsedTestDescriptions.content[0], - 1 - ) + testDiffModel.parseDiff(getTestResourceFilePath('resources/files/addedFile.diff'), workspacePath) assert.strictEqual( testDiffModel.patchFileNodes[0].patchFilePath, getTestResourceFilePath('resources/files/addedFile.diff') ) - assert(testDiffModel.patchFileNodes[0].label.includes(parsedTestDescriptions.content[0].name)) const change = testDiffModel.patchFileNodes[0].children[0] assert.strictEqual(change instanceof AddedChangeNode, true) @@ -64,44 +52,13 @@ describe('DiffModel', function () { testDiffModel.parseDiff( getTestResourceFilePath('resources/files/modifiedFile.diff'), - workspaceFolder.uri.fsPath, - parsedTestDescriptions.content[0], - 1 - ) - - assert.strictEqual( - testDiffModel.patchFileNodes[0].patchFilePath, - getTestResourceFilePath('resources/files/modifiedFile.diff') - ) - assert(testDiffModel.patchFileNodes[0].label.includes(parsedTestDescriptions.content[0].name)) - const change = testDiffModel.patchFileNodes[0].children[0] - - assert.strictEqual(change instanceof ModifiedChangeNode, true) - }) - - it('WHEN parsing a diff patch where diff.json is not present and a file was modified THEN returns an array representing the modified file', async function () { - const testDiffModel = new DiffModel() - - const fileAmount = 1 - const workspaceFolder = await createTestWorkspace(fileAmount, { fileContent: '' }) - - await fs.writeFile( - path.join(workspaceFolder.uri.fsPath, 'README.md'), - 'This guide walks you through using Gradle to build a simple Java project.' - ) - - testDiffModel.parseDiff( - getTestResourceFilePath('resources/files/modifiedFile.diff'), - workspaceFolder.uri.fsPath, - undefined, - 1 + workspaceFolder.uri.fsPath ) assert.strictEqual( testDiffModel.patchFileNodes[0].patchFilePath, getTestResourceFilePath('resources/files/modifiedFile.diff') ) - assert(testDiffModel.patchFileNodes[0].label.endsWith('modifiedFile.diff')) const change = testDiffModel.patchFileNodes[0].children[0] assert.strictEqual(change instanceof ModifiedChangeNode, true) diff --git a/packages/amazonq/test/unit/codewhisperer/util/editorContext.test.ts b/packages/amazonq/test/unit/codewhisperer/util/editorContext.test.ts index f8265a4fa86..3875dbbd0f2 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/editorContext.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/editorContext.test.ts @@ -56,6 +56,7 @@ describe('editorContext', function () { const editor = createMockTextEditor('import math\ndef two_sum(nums, target):\n', 'test.py', 'python', 1, 17) const actual = EditorContext.extractContextForCodeWhisperer(editor) const expected: codewhispererClient.FileContext = { + fileUri: 'file:///test.py', filename: 'test.py', programmingLanguage: { languageName: 'python', @@ -76,6 +77,7 @@ describe('editorContext', function () { ) const actual = EditorContext.extractContextForCodeWhisperer(editor) const expected: codewhispererClient.FileContext = { + fileUri: 'file:///test.py', filename: 'test.py', programmingLanguage: { languageName: 'python', @@ -112,6 +114,7 @@ describe('editorContext', function () { const actual = EditorContext.extractContextForCodeWhisperer(editor) const expected: codewhispererClient.FileContext = { + fileUri: editor.document.uri.toString(), filename: 'Untitled-1.py', programmingLanguage: { languageName: 'python', diff --git a/packages/core/package.json b/packages/core/package.json index 0ed5e368121..d1287b5db07 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -443,8 +443,8 @@ "@aws-sdk/types": "^3.13.1", "@aws/chat-client": "^0.1.4", "@aws/chat-client-ui-types": "^0.1.24", - "@aws/language-server-runtimes": "^0.2.70", - "@aws/language-server-runtimes-types": "^0.1.26", + "@aws/language-server-runtimes": "^0.2.97", + "@aws/language-server-runtimes-types": "^0.1.39", "@cspotcode/source-map-support": "^0.8.1", "@sinonjs/fake-timers": "^10.0.2", "@types/adm-zip": "^0.4.34", @@ -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.35.4", "@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.nls.json b/packages/core/package.nls.json index 81f56a32c57..aa1ac167917 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", @@ -137,6 +137,7 @@ "AWS.command.codecatalyst.login": "Connect to CodeCatalyst", "AWS.command.codecatalyst.logout": "Sign out of CodeCatalyst", "AWS.command.codecatalyst.signout": "Sign Out", + "AWS.command.manageSubscription": "Manage Q Developer Pro Subscription", "AWS.command.amazonq.explainCode": "Explain", "AWS.command.amazonq.refactorCode": "Refactor", "AWS.command.amazonq.fixCode": "Fix", @@ -328,6 +329,7 @@ "AWS.amazonq.title": "Amazon Q", "AWS.amazonq.chat": "Chat", "AWS.amazonq.openChat": "Open Chat", + "AWS.amazonq.clearCache": "Clear extension cache", "AWS.amazonq.context.folders.title": "Folders", "AWS.amazonq.context.folders.description": "Add all files in a folder to context", "AWS.amazonq.context.files.title": "Files", 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/amazonq/webview/ui/quickActions/handler.ts b/packages/core/src/amazonq/webview/ui/quickActions/handler.ts index f0d707247e9..2b8b9acabd3 100644 --- a/packages/core/src/amazonq/webview/ui/quickActions/handler.ts +++ b/packages/core/src/amazonq/webview/ui/quickActions/handler.ts @@ -308,6 +308,12 @@ export class QuickActionHandler { if (gumbyTabId !== undefined) { this.mynahUI.selectTab(gumbyTabId, eventId || '') this.connector.onTabChange(gumbyTabId) + this.mynahUI.notify({ + duration: 5000, + title: 'Q CodeTransformation', + content: + "Switched to the existing /transform tab; click 'Start a new transformation' below to run another transformation", + }) return } @@ -356,7 +362,7 @@ export class QuickActionHandler { cancelButtonWhenLoading: false, }) } else { - this.mynahUI.updateStore(affectedTabId, { promptInputOptions: [] }) + this.mynahUI.updateStore(affectedTabId, { promptInputOptions: [], promptTopBarTitle: '' }) } if (affectedTabId && this.isHybridChatEnabled) { 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', diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index af3f462bf95..57367143cd4 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -367,16 +367,12 @@ export class GumbyController { this.transformationFinished({ message: CodeWhispererConstants.jobCancelledChatMessage, tabID: message.tabID, - includeStartNewTransformationButton: true, }) }) break case ButtonActions.CONFIRM_SKIP_TESTS_FORM: await this.handleSkipTestsSelection(message) break - case ButtonActions.CONFIRM_SELECTIVE_TRANSFORMATION_FORM: - await this.handleOneOrMultipleDiffs(message) - break case ButtonActions.CONFIRM_SQL_CONVERSION_TRANSFORMATION_FORM: await this.handleUserSQLConversionProjectSelection(message) break @@ -441,25 +437,6 @@ export class GumbyController { userChoice: skipTestsSelection, }) this.messenger.sendSkipTestsSelectionMessage(skipTestsSelection, message.tabID) - await this.messenger.sendOneOrMultipleDiffsPrompt(message.tabID) - }) - } - - private async handleOneOrMultipleDiffs(message: any) { - await telemetry.codeTransform_submitSelection.run(async () => { - const oneOrMultipleDiffsSelection = message.formSelectedValues['GumbyTransformOneOrMultipleDiffsForm'] - if (oneOrMultipleDiffsSelection === CodeWhispererConstants.multipleDiffsMessage) { - transformByQState.setMultipleDiffs(true) - } else { - transformByQState.setMultipleDiffs(false) - } - - telemetry.record({ - codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), - userChoice: oneOrMultipleDiffsSelection, - }) - - this.messenger.sendOneOrMultipleDiffsMessage(oneOrMultipleDiffsSelection, message.tabID) this.promptJavaHome('source', message.tabID) // TO-DO: delete line above and uncomment line below when releasing CSB // await this.messenger.sendCustomDependencyVersionMessage(message.tabID) @@ -618,7 +595,6 @@ export class GumbyController { this.transformationFinished({ message: CodeWhispererConstants.jobCancelledChatMessage, tabID: message.tabID, - includeStartNewTransformationButton: true, }) return } @@ -647,15 +623,11 @@ export class GumbyController { ) } - private transformationFinished(data: { - message: string | undefined - tabID: string - includeStartNewTransformationButton: boolean - }) { + private transformationFinished(data: { message: string | undefined; tabID: string }) { this.resetTransformationChatFlow() // at this point job is either completed, partially_completed, cancelled, or failed if (data.message) { - this.messenger.sendJobFinishedMessage(data.tabID, data.message, data.includeStartNewTransformationButton) + this.messenger.sendJobFinishedMessage(data.tabID, data.message) } } @@ -688,13 +660,17 @@ export class GumbyController { const pathToJavaHome = extractPath(data.message) if (pathToJavaHome) { transformByQState.setSourceJavaHome(pathToJavaHome) + // TO-DO: delete line below and uncomment the block below when releasing CSB + await this.prepareLanguageUpgradeProject(data.tabID) // if source and target JDK versions are the same, just re-use the source JAVA_HOME and start the build + /* if (transformByQState.getTargetJDKVersion() === transformByQState.getSourceJDKVersion()) { transformByQState.setTargetJavaHome(pathToJavaHome) await this.prepareLanguageUpgradeProject(data.tabID) } else { this.promptJavaHome('target', data.tabID) } + */ } else { this.messenger.sendUnrecoverableErrorResponse('invalid-java-home', data.tabID) } @@ -779,7 +755,6 @@ export class GumbyController { this.transformationFinished({ tabID: message.tabID, message: (err as Error).message, - includeStartNewTransformationButton: true, }) } diff --git a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts index 30324bab06f..5265cb5b888 100644 --- a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts +++ b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts @@ -157,47 +157,6 @@ export class Messenger { ) } - public async sendOneOrMultipleDiffsPrompt(tabID: string) { - const formItems: ChatItemFormItem[] = [] - formItems.push({ - id: 'GumbyTransformOneOrMultipleDiffsForm', - type: 'select', - title: CodeWhispererConstants.selectiveTransformationFormTitle, - mandatory: true, - options: [ - { - value: CodeWhispererConstants.oneDiffMessage, - label: CodeWhispererConstants.oneDiffMessage, - }, - { - value: CodeWhispererConstants.multipleDiffsMessage, - label: CodeWhispererConstants.multipleDiffsMessage, - }, - ], - }) - - this.dispatcher.sendAsyncEventProgress( - new AsyncEventProgressMessage(tabID, { - inProgress: true, - message: CodeWhispererConstants.userPatchDescriptionChatMessage( - transformByQState.getTargetJDKVersion() ?? '' - ), - }) - ) - - this.dispatcher.sendChatPrompt( - new ChatPrompt( - { - message: 'Q Code Transformation', - formItems: formItems, - }, - 'TransformOneOrMultipleDiffsForm', - tabID, - false - ) - ) - } - public async sendLanguageUpgradeProjectPrompt(projects: TransformationCandidateProject[], tabID: string) { const projectFormOptions: { value: any; label: string }[] = [] const detectedJavaVersions = new Array<JDKVersion | undefined>() @@ -501,16 +460,14 @@ export class Messenger { this.dispatcher.sendCommandMessage(new SendCommandMessage(message.command, message.tabID, message.eventId)) } - public sendJobFinishedMessage(tabID: string, message: string, includeStartNewTransformationButton: boolean = true) { + public sendJobFinishedMessage(tabID: string, message: string) { const buttons: ChatItemButton[] = [] - if (includeStartNewTransformationButton) { - buttons.push({ - keepCardAfterClick: false, - text: CodeWhispererConstants.startTransformationButtonText, - id: ButtonActions.CONFIRM_START_TRANSFORMATION_FLOW, - disabled: false, - }) - } + buttons.push({ + keepCardAfterClick: false, + text: CodeWhispererConstants.startTransformationButtonText, + id: ButtonActions.CONFIRM_START_TRANSFORMATION_FLOW, + disabled: false, + }) if (transformByQState.isPartiallySucceeded() || transformByQState.isSucceeded()) { buttons.push({ @@ -598,11 +555,6 @@ export class Messenger { this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'ai-prompt' }, tabID)) } - public sendOneOrMultipleDiffsMessage(selectiveTransformationSelection: string, tabID: string) { - const message = `Okay, I will create ${selectiveTransformationSelection.toLowerCase()} with my proposed changes.` - this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'ai-prompt' }, tabID)) - } - public sendHumanInTheLoopInitialMessage(tabID: string, codeSnippet: string) { let message = `I was not able to upgrade all dependencies. To resolve it, I will try to find an updated depedency in your local Maven repository. I will need additional information from you to continue.` @@ -787,7 +739,7 @@ dependencyManagement: - identifier: "com.example:library1" targetVersion: "2.1.0" versionProperty: "library1.version" # Optional - originType: "FIRST_PARTY" # or "THIRD_PARTY" # Optional + originType: "FIRST_PARTY" # or "THIRD_PARTY" - identifier: "com.example:library2" targetVersion: "3.0.0" originType: "THIRD_PARTY" diff --git a/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts b/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts index ad1aade7c7e..af9f9f47a7b 100644 --- a/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts +++ b/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts @@ -18,7 +18,6 @@ export enum ButtonActions { CONFIRM_SQL_CONVERSION_TRANSFORMATION_FORM = 'gumbySQLConversionTransformFormConfirm', CANCEL_TRANSFORMATION_FORM = 'gumbyTransformFormCancel', // shared between Language Upgrade & SQL Conversion CONFIRM_SKIP_TESTS_FORM = 'gumbyTransformSkipTestsFormConfirm', - CONFIRM_SELECTIVE_TRANSFORMATION_FORM = 'gumbyTransformOneOrMultipleDiffsFormConfirm', SELECT_SQL_CONVERSION_METADATA_FILE = 'gumbySQLConversionMetadataTransformFormConfirm', SELECT_CUSTOM_DEPENDENCY_VERSION_FILE = 'gumbyCustomDependencyVersionTransformFormConfirm', CONTINUE_TRANSFORMATION_FORM = 'gumbyTransformFormContinue', diff --git a/packages/core/src/auth/index.ts b/packages/core/src/auth/index.ts index 54dd17d702b..c180d603c67 100644 --- a/packages/core/src/auth/index.ts +++ b/packages/core/src/auth/index.ts @@ -18,8 +18,10 @@ export { isBuilderIdConnection, getTelemetryMetadataForConn, isIamConnection, + isSsoConnection, } from './connection' export { Auth } from './auth' export { CredentialsStore } from './credentials/store' export { LoginManager } from './deprecated/loginManager' export * as AuthUtils from './utils' +export * as credentialsValidation from './credentials/validation' diff --git a/packages/core/src/auth/sso/clients.ts b/packages/core/src/auth/sso/clients.ts index e050bdc793e..e921cb7856e 100644 --- a/packages/core/src/auth/sso/clients.ts +++ b/packages/core/src/auth/sso/clients.ts @@ -36,6 +36,7 @@ import { StandardRetryStrategy, defaultRetryDecider } from '@smithy/middleware-r import { AuthenticationFlow } from './model' import { toSnakeCase } from '../../shared/utilities/textUtilities' import { getUserAgent, withTelemetryContext } from '../../shared/telemetry/util' +import { oneSecond } from '../../shared/datetime' export class OidcClient { public constructor( @@ -124,7 +125,9 @@ export class OidcClient { requestHandler: { // This field may have a bug: https://github.com/aws/aws-sdk-js-v3/issues/6271 // If the bug is real but is fixed, then we can probably remove this field and just have no timeout by default - requestTimeout: 5000, + // + // Also, we bump this higher due to ticket V1761315147, so that SSO does not timeout + requestTimeout: oneSecond * 12, }, }) diff --git a/packages/core/src/codewhisperer/client/service-2.json b/packages/core/src/codewhisperer/client/service-2.json index ca57c0f29c6..3e063c38a10 100644 --- a/packages/core/src/codewhisperer/client/service-2.json +++ b/packages/core/src/codewhisperer/client/service-2.json @@ -612,11 +612,20 @@ "filename": { "shape": "FileContextFilenameString" }, + "fileUri": { + "shape": "FileContextFileUriString" + }, "programmingLanguage": { "shape": "ProgrammingLanguage" } } }, + "FileContextFileUriString": { + "type": "string", + "max": 1024, + "min": 1, + "sensitive": true + }, "FileContextFilenameString": { "type": "string", "max": 1024, diff --git a/packages/core/src/codewhisperer/client/user-service-2.json b/packages/core/src/codewhisperer/client/user-service-2.json index 969abf41f1a..714937ed402 100644 --- a/packages/core/src/codewhisperer/client/user-service-2.json +++ b/packages/core/src/codewhisperer/client/user-service-2.json @@ -1852,9 +1852,16 @@ "leftFileContent": { "shape": "FileContextLeftFileContentString" }, "rightFileContent": { "shape": "FileContextRightFileContentString" }, "filename": { "shape": "FileContextFilenameString" }, + "fileUri": { "shape": "FileContextFileUriString" }, "programmingLanguage": { "shape": "ProgrammingLanguage" } } }, + "FileContextFileUriString": { + "type": "string", + "max": 1024, + "min": 1, + "sensitive": true + }, "FileContextFilenameString": { "type": "string", "max": 1024, 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/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index eb31839686d..91e9ad00ab9 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -27,7 +27,6 @@ import { downloadHilResultArchive, findDownloadArtifactStep, getArtifactsFromProgressUpdate, - getTransformationPlan, getTransformationSteps, pollTransformationJob, resumeTransformationJob, @@ -554,28 +553,6 @@ export async function pollTransformationStatusUntilPlanReady(jobId: string, prof // for now, no plan shown with SQL conversions. later, we may add one return } - let plan = undefined - try { - plan = await getTransformationPlan(jobId, profile) - } catch (error) { - // means API call failed - getLogger().error(`CodeTransformation: ${CodeWhispererConstants.failedToCompleteJobNotification}`, error) - transformByQState.setJobFailureErrorNotification( - `${CodeWhispererConstants.failedToGetPlanNotification} ${(error as Error).message}` - ) - transformByQState.setJobFailureErrorChatMessage( - `${CodeWhispererConstants.failedToGetPlanChatMessage} ${(error as Error).message}` - ) - throw new Error('Get plan failed') - } - - if (plan !== undefined) { - const planFilePath = path.join(transformByQState.getProjectPath(), 'transformation-plan.md') - fs.writeFileSync(planFilePath, plan) - await vscode.commands.executeCommand('markdown.showPreview', vscode.Uri.file(planFilePath)) - transformByQState.setPlanFilePath(planFilePath) - await setContext('gumby.isPlanAvailable', true) - } jobPlanProgress['generatePlan'] = StepProgress.Succeeded throwIfCancelled() } @@ -699,11 +676,10 @@ export async function postTransformationJob() { } let chatMessage = transformByQState.getJobFailureErrorChatMessage() - const diffMessage = CodeWhispererConstants.diffMessage(transformByQState.getMultipleDiffs()) if (transformByQState.isSucceeded()) { - chatMessage = CodeWhispererConstants.jobCompletedChatMessage(diffMessage) + chatMessage = CodeWhispererConstants.jobCompletedChatMessage(transformByQState.getTargetJDKVersion() ?? '') } else if (transformByQState.isPartiallySucceeded()) { - chatMessage = CodeWhispererConstants.jobPartiallyCompletedChatMessage(diffMessage) + chatMessage = CodeWhispererConstants.jobPartiallyCompletedChatMessage } transformByQState.getChatControllers()?.transformationFinished.fire({ @@ -732,13 +708,16 @@ export async function postTransformationJob() { } if (transformByQState.isSucceeded()) { - void vscode.window.showInformationMessage(CodeWhispererConstants.jobCompletedNotification(diffMessage), { - title: localizedText.ok, - }) + void vscode.window.showInformationMessage( + CodeWhispererConstants.jobCompletedNotification(transformByQState.getTargetJDKVersion() ?? ''), + { + title: localizedText.ok, + } + ) } else if (transformByQState.isPartiallySucceeded()) { void vscode.window .showInformationMessage( - CodeWhispererConstants.jobPartiallyCompletedNotification(diffMessage), + CodeWhispererConstants.jobPartiallyCompletedNotification, CodeWhispererConstants.amazonQFeedbackText ) .then((choice) => { diff --git a/packages/core/src/codewhisperer/models/constants.ts b/packages/core/src/codewhisperer/models/constants.ts index 73b0b475a2b..e5cd9525ddb 100644 --- a/packages/core/src/codewhisperer/models/constants.ts +++ b/packages/core/src/codewhisperer/models/constants.ts @@ -22,23 +22,6 @@ export const AWSTemplateKeyWords = ['AWSTemplateFormatVersion', 'Resources', 'AW export const AWSTemplateCaseInsensitiveKeyWords = ['cloudformation', 'cfn', 'template', 'description'] -const patchDescriptions: { [key: string]: string } = { - 'Prepare minimal upgrade to Java 17': - 'This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks in Java 17.', - 'Prepare minimal upgrade to Java 21': - 'This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks in Java 21.', - 'Popular Enterprise Specifications and Application Frameworks upgrade': - 'This diff patch covers the set of upgrades for Jakarta EE 10, Hibernate 6.2, and Micronaut 3.', - 'HTTP Client Utilities, Apache Commons Utilities, and Web Frameworks': - 'This diff patch covers the set of upgrades for Apache HTTP Client 5, Apache Commons utilities (Collections, IO, Lang, Math), and Struts 6.0.', - 'Testing Tools and Frameworks upgrade': - 'This diff patch covers the set of upgrades for ArchUnit, Mockito, TestContainers, and Cucumber, in addition to the Jenkins plugins and the Maven Wrapper.', - 'Miscellaneous Processing Documentation upgrade': - 'This diff patch covers a diverse set of upgrades spanning ORMs, XML processing, API documentation, and more.', - 'Deprecated API replacement, dependency upgrades, and formatting': - 'This diff patch replaces deprecated APIs, makes additional dependency version upgrades, and formats code changes.', -} - export const JsonConfigFileNamingConvention = new Set([ 'app.json', 'appsettings.json', @@ -672,27 +655,15 @@ export const enterJavaHomePlaceholder = 'Enter the path to your Java installatio export const openNewTabPlaceholder = 'Open a new tab to chat with Q' -export const diffMessage = (multipleDiffs: boolean) => { - return multipleDiffs - ? 'You can review the diffs to see my proposed changes and accept or reject them. You will be able to accept changes from one diff at a time. If you reject changes in one diff, you will not be able to view or accept changes in the other diffs.' - : 'You can review the diff to see my proposed changes and accept or reject them.' -} - -export const jobCompletedChatMessage = (multipleDiffsString: string) => { - return `I completed your transformation. ${multipleDiffsString} The transformation summary has details about the changes I'm proposing.` -} +export const jobCompletedChatMessage = (version: string) => + `I completed your transformation. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the changes I'm proposing. If you want to upgrade additional libraries and other dependencies, run /transform with the transformed code and specify ${version} as the source and target version.` -export const jobCompletedNotification = (multipleDiffsString: string) => { - return `Amazon Q transformed your code. ${multipleDiffsString} The transformation summary has details about the changes.` -} +export const jobCompletedNotification = (version: string) => + `Amazon Q transformed your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the changes. If you want to upgrade additional libraries and other dependencies, run /transform with the transformed code and specify ${version} as the source and target version.` -export const jobPartiallyCompletedChatMessage = (multipleDiffsString: string) => { - return `I transformed part of your code. ${multipleDiffsString} The transformation summary has details about the files I updated and the errors that prevented a complete transformation.` -} +export const jobPartiallyCompletedChatMessage = `I transformed part of your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.` -export const jobPartiallyCompletedNotification = (multipleDiffsString: string) => { - return `Amazon Q transformed part of your code. ${multipleDiffsString} The transformation summary has details about the files I updated and the errors that prevented a complete transformation.` -} +export const jobPartiallyCompletedNotification = `Amazon Q transformed part of your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.` export const noPomXmlFoundChatMessage = `I couldn\'t find a project that I can upgrade. I couldn\'t find a pom.xml file in any of your open projects, nor could I find any embedded SQL statements. Currently, I can upgrade Java 8, 11, or 17 projects built on Maven, or Oracle SQL to PostgreSQL statements in Java projects. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).` @@ -730,25 +701,8 @@ export const viewProposedChangesNotification = export const changesAppliedChatMessageOneDiff = 'I applied the changes to your project.' -export const changesAppliedChatMessageMultipleDiffs = ( - currentPatchIndex: number, - totalPatchFiles: number, - description: string | undefined -) => - description - ? `I applied the changes in diff patch ${currentPatchIndex + 1} of ${totalPatchFiles} to your project. ${patchDescriptions[description]}` - : 'I applied the changes to your project.' - export const changesAppliedNotificationOneDiff = 'Amazon Q applied the changes to your project' -export const changesAppliedNotificationMultipleDiffs = (currentPatchIndex: number, totalPatchFiles: number) => { - if (totalPatchFiles === 1) { - return 'Amazon Q applied the changes to your project.' - } else { - return `Amazon Q applied the changes in diff patch ${currentPatchIndex + 1} of ${totalPatchFiles} to your project.` - } -} - export const noOpenProjectsFoundChatMessage = `I couldn\'t find a project that I can upgrade. Currently, I support Java 8, Java 11, Java 17, and Java 21 projects built on Maven. Make sure your project is open in the IDE. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).` export const noOpenFileFoundChatMessage = `Sorry, there isn't a source file open right now that I can generate a test for. Make sure you open a source file so I can generate tests.` @@ -807,21 +761,15 @@ export const chooseProjectSchemaFormMessage = 'To continue, choose the project a export const skipUnitTestsFormTitle = 'Choose to skip unit tests' -export const selectiveTransformationFormTitle = 'Choose how to receive proposed changes' - export const skipUnitTestsFormMessage = 'I will build your project using `mvn clean test` by default. If you would like me to build your project without running unit tests, I will use `mvn clean test-compile`.' export const runUnitTestsMessage = 'Run unit tests' -export const oneDiffMessage = 'One diff' - export const doNotSkipUnitTestsBuildCommand = 'clean test' export const skipUnitTestsMessage = 'Skip unit tests' -export const multipleDiffsMessage = 'Multiple diffs' - export const skipUnitTestsBuildCommand = 'clean test-compile' export const planTitle = 'Code Transformation plan by Amazon Q' diff --git a/packages/core/src/codewhisperer/models/model.ts b/packages/core/src/codewhisperer/models/model.ts index 28072249371..d77c52254bc 100644 --- a/packages/core/src/codewhisperer/models/model.ts +++ b/packages/core/src/codewhisperer/models/model.ts @@ -66,16 +66,6 @@ export type CrossFileStrategy = 'opentabs' | 'codemap' | 'bm25' | 'default' export type SupplementalContextStrategy = CrossFileStrategy | UtgStrategy | 'empty' -export type PatchInfo = { - name: string - filename: string - isSuccessful: boolean -} - -export type DescriptionContent = { - content: PatchInfo[] -} - export interface CodeWhispererSupplementalContext { isUtg: boolean isProcessTimeout: boolean @@ -686,7 +676,8 @@ export class ZipManifest { version: string = '1.0' hilCapabilities: string[] = ['HIL_1pDependency_VersionUpgrade'] // TO-DO: add 'CLIENT_SIDE_BUILD' here when releasing - transformCapabilities: string[] = ['EXPLAINABILITY_V1'] + transformCapabilities: string[] = ['EXPLAINABILITY_V1', 'SELECTIVE_TRANSFORMATION_V2'] + noInteractiveMode: boolean = true customBuildCommand: string = 'clean test' requestedConversions?: { sqlConversion?: { @@ -757,8 +748,6 @@ export class TransformByQState { private targetJDKVersion: JDKVersion | undefined = undefined - private produceMultipleDiffs: boolean = false - private customBuildCommand: string = '' private sourceDB: DB | undefined = undefined @@ -855,10 +844,6 @@ export class TransformByQState { return this.linesOfCodeSubmitted } - public getMultipleDiffs() { - return this.produceMultipleDiffs - } - public getPreBuildLogFilePath() { return this.preBuildLogFilePath } @@ -1035,10 +1020,6 @@ export class TransformByQState { this.linesOfCodeSubmitted = lines } - public setMultipleDiffs(produceMultipleDiffs: boolean) { - this.produceMultipleDiffs = produceMultipleDiffs - } - public setStartTime(time: string) { this.startTime = time } @@ -1181,7 +1162,6 @@ export class TransformByQState { this.buildLog = '' this.customBuildCommand = '' this.intervalId = undefined - this.produceMultipleDiffs = false } } diff --git a/packages/core/src/codewhisperer/region/regionProfileManager.ts b/packages/core/src/codewhisperer/region/regionProfileManager.ts index 149a78391f8..a85a2133d89 100644 --- a/packages/core/src/codewhisperer/region/regionProfileManager.ts +++ b/packages/core/src/codewhisperer/region/regionProfileManager.ts @@ -177,9 +177,17 @@ export class RegionProfileManager { } } - // Only throw error if all regions fail - if (failedRegions.length === endpoints.size) { - throw new Error(`Failed to list profiles for all regions: ${failedRegions.join(', ')}`) + // Throw error if any regional API calls failed and no profiles are available + if (failedRegions.length > 0 && availableProfiles.length === 0) { + throw new ToolkitError(`Failed to list Q Developer profiles for regions: ${failedRegions.join(', ')}`, { + code: 'ListQDeveloperProfilesFailed', + }) + } + + // Throw an error if all listAvailableProfile calls succeeded, but user has no Q developer profiles + // This is not an expected state + if (failedRegions.length === 0 && availableProfiles.length === 0) { + throw new ToolkitError('This user has no Q Developer profiles', { code: 'QDeveloperProfileNotFound' }) } this._profiles = availableProfiles diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts index 476123f2d6d..e284207540d 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts @@ -51,6 +51,7 @@ import { encodeHTML } from '../../../shared/utilities/textUtilities' import { convertToTimeString } from '../../../shared/datetime' import { getAuthType } from '../../../auth/utils' import { UserWrittenCodeTracker } from '../../tracker/userWrittenCodeTracker' +import { setContext } from '../../../shared/vscode/setContext' import { AuthUtil } from '../../util/authUtil' import { DiffModel } from './transformationResultsViewProvider' import { spawnSync } from 'child_process' // eslint-disable-line no-restricted-imports @@ -347,10 +348,6 @@ export async function zipCode( getLogger().info(`CodeTransformation: source code files size = ${sourceFilesSize}`) } - if (transformByQState.getMultipleDiffs() && zipManifest instanceof ZipManifest) { - zipManifest.transformCapabilities.push('SELECTIVE_TRANSFORMATION_V1') - } - if ( transformByQState.getTransformationType() === TransformationType.SQL_CONVERSION && zipManifest instanceof ZipManifest @@ -521,20 +518,33 @@ export function getFormattedString(s: string) { return CodeWhispererConstants.formattedStringMap.get(s) ?? s } -export function addTableMarkdown(plan: string, stepId: string, tableMapping: { [key: string]: string }) { - const tableObj = tableMapping[stepId] - if (!tableObj) { - // no table present for this step +export function addTableMarkdown(plan: string, stepId: string, tableMapping: { [key: string]: string[] }) { + const tableObjects = tableMapping[stepId] + if (!tableObjects || tableObjects.length === 0 || tableObjects.every((table: string) => table === '')) { + // no tables for this stepId return plan } - const table = JSON.parse(tableObj) - if (table.rows.length === 0) { - // empty table - plan += `\n\nThere are no ${table.name.toLowerCase()} to display.\n\n` + const tables: any[] = [] + // eslint-disable-next-line unicorn/no-array-for-each + tableObjects.forEach((tableObj: string) => { + try { + const table = JSON.parse(tableObj) + if (table) { + tables.push(table) + } + } catch (e) { + getLogger().error(`CodeTransformation: Failed to parse table JSON, skipping: ${e}`) + } + }) + + if (tables.every((table: any) => table.rows.length === 0)) { + // empty tables for this stepId + plan += `\n\nThere are no ${tables[0].name.toLowerCase()} to display.\n\n` return plan } - plan += `\n\n\n${table.name}\n|` - const columns = table.columnNames + // table name and columns are shared, so only add to plan once + plan += `\n\n\n${tables[0].name}\n|` + const columns = tables[0].columnNames // eslint-disable-next-line unicorn/no-array-for-each columns.forEach((columnName: string) => { plan += ` ${getFormattedString(columnName)} |` @@ -544,16 +554,21 @@ export function addTableMarkdown(plan: string, stepId: string, tableMapping: { [ columns.forEach((_: any) => { plan += '-----|' }) + // add all rows of all tables // eslint-disable-next-line unicorn/no-array-for-each - table.rows.forEach((row: any) => { - plan += '\n|' + tables.forEach((table: any) => { // eslint-disable-next-line unicorn/no-array-for-each - columns.forEach((columnName: string) => { - if (columnName === 'relativePath') { - plan += ` [${row[columnName]}](${row[columnName]}) |` // add MD link only for files - } else { - plan += ` ${row[columnName]} |` - } + table.rows.forEach((row: any) => { + plan += '\n|' + // eslint-disable-next-line unicorn/no-array-for-each + columns.forEach((columnName: string) => { + if (columnName === 'relativePath') { + // add markdown link only for file paths + plan += ` [${row[columnName]}](${row[columnName]}) |` + } else { + plan += ` ${row[columnName]} |` + } + }) }) }) plan += '\n\n' @@ -561,11 +576,13 @@ export function addTableMarkdown(plan: string, stepId: string, tableMapping: { [ } export function getTableMapping(stepZeroProgressUpdates: ProgressUpdates) { - const map: { [key: string]: string } = {} + const map: { [key: string]: string[] } = {} for (const update of stepZeroProgressUpdates) { - // description should never be undefined since even if no data we show an empty table - // but just in case, empty string allows us to skip this table without errors when rendering - map[update.name] = update.description ?? '' + if (!map[update.name]) { + map[update.name] = [] + } + // empty string allows us to skip this table when rendering + map[update.name].push(update.description ?? '') } return map } @@ -578,9 +595,11 @@ export function getJobStatisticsHtml(jobStatistics: any) { htmlString += `<div style="flex: 1; margin-left: 20px; border: 1px solid #424750; border-radius: 8px; padding: 10px;">` // eslint-disable-next-line unicorn/no-array-for-each jobStatistics.forEach((stat: { name: string; value: string }) => { - htmlString += `<p style="margin-bottom: 4px"><img src="${getTransformationIcon( - stat.name - )}" style="vertical-align: middle;"> ${getFormattedString(stat.name)}: ${stat.value}</p>` + if (stat.name === 'linesOfCode') { + htmlString += `<p style="margin-bottom: 4px"><img src="${getTransformationIcon( + stat.name + )}" style="vertical-align: middle;"> ${getFormattedString(stat.name)}: ${stat.value}</p>` + } }) htmlString += `</div>` return htmlString @@ -604,7 +623,7 @@ export async function getTransformationPlan(jobId: string, profile: RegionProfil // gets a mapping between the ID ('name' field) of each progressUpdate (substep) and the associated table const tableMapping = getTableMapping(stepZeroProgressUpdates) - const jobStatistics = JSON.parse(tableMapping['0']).rows // ID of '0' reserved for job statistics table + const jobStatistics = JSON.parse(tableMapping['0'][0]).rows // ID of '0' reserved for job statistics table; only 1 table there // get logo directly since we only use one logo regardless of color theme const logoIcon = getTransformationIcon('transformLogo') @@ -630,8 +649,6 @@ export async function getTransformationPlan(jobId: string, profile: RegionProfil plan += `</div><br>` } plan += `</div><br>` - plan += `<p style="font-size: 18px; margin-bottom: 4px;"><b>Appendix</b><br><a href="#top" style="float: right; font-size: 14px;">Scroll to top <img src="${arrowIcon}" style="vertical-align: middle;"></a></p><br>` - plan = addTableMarkdown(plan, '-1', tableMapping) // ID of '-1' reserved for appendix table return plan } catch (e: any) { const errorMessage = (e as Error).message @@ -663,6 +680,7 @@ export async function getTransformationSteps(jobId: string, profile: RegionProfi export async function pollTransformationJob(jobId: string, validStates: string[], profile: RegionProfile | undefined) { let status: string = '' + let isPlanComplete = false while (true) { throwIfCancelled() try { @@ -699,6 +717,19 @@ export async function pollTransformationJob(jobId: string, validStates: string[] `${CodeWhispererConstants.failedToCompleteJobGenericNotification} ${errorMessage}` ) } + + if ( + CodeWhispererConstants.validStatesForPlanGenerated.includes(status) && + transformByQState.getTransformationType() === TransformationType.LANGUAGE_UPGRADE && + !isPlanComplete + ) { + const plan = await openTransformationPlan(jobId, profile) + if (plan?.toLowerCase().includes('dependency changes')) { + // final plan is complete; show to user + isPlanComplete = true + } + } + if (validStates.includes(status)) { break } @@ -738,6 +769,32 @@ export async function pollTransformationJob(jobId: string, validStates: string[] return status } +async function openTransformationPlan(jobId: string, profile?: RegionProfile) { + let plan = undefined + try { + plan = await getTransformationPlan(jobId, profile) + } catch (error) { + // means API call failed + getLogger().error(`CodeTransformation: ${CodeWhispererConstants.failedToCompleteJobNotification}`, error) + transformByQState.setJobFailureErrorNotification( + `${CodeWhispererConstants.failedToGetPlanNotification} ${(error as Error).message}` + ) + transformByQState.setJobFailureErrorChatMessage( + `${CodeWhispererConstants.failedToGetPlanChatMessage} ${(error as Error).message}` + ) + throw new Error('Get plan failed') + } + + if (plan) { + const planFilePath = path.join(transformByQState.getProjectPath(), 'transformation-plan.md') + nodefs.writeFileSync(planFilePath, plan) + await vscode.commands.executeCommand('markdown.showPreview', vscode.Uri.file(planFilePath)) + transformByQState.setPlanFilePath(planFilePath) + await setContext('gumby.isPlanAvailable', true) + } + return plan +} + async function attemptLocalBuild() { const jobId = transformByQState.getJobId() let artifactId @@ -788,7 +845,7 @@ async function processClientInstructions(jobId: string, clientInstructionsPath: await extractOriginalProjectSources(destinationPath) getLogger().info(`CodeTransformation: copied project to ${destinationPath}`) const diffModel = new DiffModel() - diffModel.parseDiff(clientInstructionsPath, path.join(destinationPath, 'sources'), undefined, 1, true) + diffModel.parseDiff(clientInstructionsPath, path.join(destinationPath, 'sources'), true) // show user the diff.patch const doc = await vscode.workspace.openTextDocument(clientInstructionsPath) await vscode.window.showTextDocument(doc, { viewColumn: vscode.ViewColumn.One }) diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts b/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts index 411571f0693..e5de2099753 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts @@ -10,13 +10,7 @@ import { parsePatch, applyPatches, ParsedDiff } from 'diff' import path from 'path' import vscode from 'vscode' import { ExportIntent } from '@amzn/codewhisperer-streaming' -import { - TransformByQReviewStatus, - transformByQState, - PatchInfo, - DescriptionContent, - TransformationType, -} from '../../models/model' +import { TransformByQReviewStatus, transformByQState, TransformationType } from '../../models/model' import { ExportResultArchiveStructure, downloadExportResultArchive } from '../../../shared/utilities/download' import { getLogger } from '../../../shared/logger/logger' import { telemetry } from '../../../shared/telemetry/telemetry' @@ -119,11 +113,9 @@ export class PatchFileNode { readonly patchFilePath: string children: ProposedChangeNode[] = [] - constructor(description: PatchInfo | undefined = undefined, patchFilePath: string) { + constructor(patchFilePath: string) { this.patchFilePath = patchFilePath - this.label = description - ? `${description.name} (${description.isSuccessful ? 'Success' : 'Failure'})` - : path.basename(patchFilePath) + this.label = path.basename(patchFilePath) } } @@ -164,13 +156,7 @@ export class DiffModel { * @param pathToWorkspace Path to the project that was transformed * @returns List of nodes containing the paths of files that were modified, added, or removed */ - public parseDiff( - pathToDiff: string, - pathToWorkspace: string, - diffDescription: PatchInfo | undefined, - totalDiffPatches: number, - isIntermediateBuild: boolean = false - ): PatchFileNode { + public parseDiff(pathToDiff: string, pathToWorkspace: string, isIntermediateBuild: boolean = false): PatchFileNode { this.patchFileNodes = [] const diffContents = fs.readFileSync(pathToDiff, 'utf8') @@ -214,8 +200,7 @@ export class DiffModel { } }, }) - const patchFileNode = new PatchFileNode(diffDescription, pathToDiff) - patchFileNode.label = `Patch ${this.currentPatchIndex + 1} of ${totalDiffPatches}: ${patchFileNode.label}` + const patchFileNode = new PatchFileNode(pathToDiff) patchFileNode.children = changedFiles.flatMap((file) => { /* ex. file.oldFileName = 'a/src/java/com/project/component/MyFile.java' * ex. file.newFileName = 'b/src/java/com/project/component/MyFile.java' @@ -331,7 +316,6 @@ export class ProposedTransformationExplorer { let patchFiles: string[] = [] let singlePatchFile: string = '' - let patchFilesDescriptions: DescriptionContent | undefined = undefined const reset = async () => { await setContext('gumby.transformationProposalReviewInProgress', false) @@ -446,45 +430,9 @@ export class ProposedTransformationExplorer { const zip = new AdmZip(pathToArchive) zip.extractAllTo(pathContainingArchive) const files = fs.readdirSync(path.join(pathContainingArchive, ExportResultArchiveStructure.PathToPatch)) - if (files.length === 1) { - singlePatchFile = path.join( - pathContainingArchive, - ExportResultArchiveStructure.PathToPatch, - files[0] - ) - } else { - const jsonFile = files.find((file) => file.endsWith('.json')) - if (!jsonFile) { - throw new Error('Expected JSON file not found') - } - const filePath = path.join( - pathContainingArchive, - ExportResultArchiveStructure.PathToPatch, - jsonFile - ) - const jsonData = fs.readFileSync(filePath, 'utf-8') - patchFilesDescriptions = JSON.parse(jsonData) - } - if (patchFilesDescriptions !== undefined) { - for (const patchInfo of patchFilesDescriptions.content) { - patchFiles.push( - path.join( - pathContainingArchive, - ExportResultArchiveStructure.PathToPatch, - patchInfo.filename - ) - ) - } - } else { - patchFiles.push(singlePatchFile) - } - // Because multiple patches are returned once the ZIP is downloaded, we want to show the first one to start - diffModel.parseDiff( - patchFiles[0], - transformByQState.getProjectPath(), - patchFilesDescriptions ? patchFilesDescriptions.content[0] : undefined, - patchFiles.length - ) + singlePatchFile = path.join(pathContainingArchive, ExportResultArchiveStructure.PathToPatch, files[0]) + patchFiles.push(singlePatchFile) + diffModel.parseDiff(patchFiles[0], transformByQState.getProjectPath()) await setContext('gumby.reviewState', TransformByQReviewStatus.InReview) transformDataProvider.refresh() @@ -548,51 +496,16 @@ export class ProposedTransformationExplorer { telemetry.record({ codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), codeTransformJobId: transformByQState.getJobId(), - userChoice: `acceptChanges-${patchFilesDescriptions?.content[diffModel.currentPatchIndex].name}`, + userChoice: 'acceptChanges', }) }) - if (transformByQState.getMultipleDiffs()) { - void vscode.window.showInformationMessage( - CodeWhispererConstants.changesAppliedNotificationMultipleDiffs( - diffModel.currentPatchIndex, - patchFiles.length - ) - ) - } else { - void vscode.window.showInformationMessage(CodeWhispererConstants.changesAppliedNotificationOneDiff) - } - - // We do this to ensure that the changesAppliedChatMessage is only sent to user when they accept the first diff.patch + void vscode.window.showInformationMessage(CodeWhispererConstants.changesAppliedNotificationOneDiff) transformByQState.getChatControllers()?.transformationFinished.fire({ - message: CodeWhispererConstants.changesAppliedChatMessageMultipleDiffs( - diffModel.currentPatchIndex, - patchFiles.length, - patchFilesDescriptions - ? patchFilesDescriptions.content[diffModel.currentPatchIndex].name - : undefined - ), + message: CodeWhispererConstants.changesAppliedChatMessageOneDiff, tabID: ChatSessionManager.Instance.getSession().tabID, - includeStartNewTransformationButton: diffModel.currentPatchIndex === patchFiles.length - 1, }) - - // Load the next patch file - diffModel.currentPatchIndex++ - if (diffModel.currentPatchIndex < patchFiles.length) { - const nextPatchFile = patchFiles[diffModel.currentPatchIndex] - const nextPatchFileDescription = patchFilesDescriptions - ? patchFilesDescriptions.content[diffModel.currentPatchIndex] - : undefined - diffModel.parseDiff( - nextPatchFile, - transformByQState.getProjectPath(), - nextPatchFileDescription, - patchFiles.length - ) - transformDataProvider.refresh() - } else { - // All patches have been applied, reset the state - await reset() - } + // reset after applying the patch + await reset() }) vscode.commands.registerCommand('aws.amazonq.transformationHub.reviewChanges.rejectChanges', async () => { diff --git a/packages/core/src/codewhisperer/ui/codeWhispererNodes.ts b/packages/core/src/codewhisperer/ui/codeWhispererNodes.ts index c3e46bdc78e..28ed3952494 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') @@ -175,6 +176,18 @@ export function createGettingStarted(): DataQuickPickItem<'gettingStarted'> { } as DataQuickPickItem<'gettingStarted'> } +export function createManageSubscription(): DataQuickPickItem<'manageSubscription'> { + const label = localize('AWS.command.manageSubscription', 'Manage Q Developer Pro Subscription') + // const kind = AuthUtil.instance.isBuilderIdInUse() ? 'AWS Builder ID' : 'IAM Identity Center' + + return { + data: 'manageSubscription', + label: label, + iconPath: getIcon('vscode-link-external'), + onClick: () => Commands.tryExecute('aws.amazonq.manageSubscription'), + } as DataQuickPickItem<'manageSubscription'> +} + export function createSignout(): DataQuickPickItem<'signout'> { const label = localize('AWS.codewhisperer.signoutNode.label', 'Sign Out') const icon = getIcon('vscode-export') @@ -238,7 +251,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 +263,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/ui/statusBarMenu.ts b/packages/core/src/codewhisperer/ui/statusBarMenu.ts index 2ad14a81df0..46f47e35a2c 100644 --- a/packages/core/src/codewhisperer/ui/statusBarMenu.ts +++ b/packages/core/src/codewhisperer/ui/statusBarMenu.ts @@ -11,6 +11,7 @@ import { createSelectCustomization, createReconnect, createGettingStarted, + createManageSubscription, createSignout, createSeparator, createSettingsNode, @@ -106,7 +107,7 @@ export function getQuickPickItems(): DataQuickPickItem<string>[] { createSettingsNode(), ...(isUsingEnterpriseSso && regionProfile ? [createSelectRegionProfileNode(regionProfile)] : []), ...(AuthUtil.instance.isConnected() && !hasVendedIamCredentials() && !hasVendedCredentialsFromMetadata() - ? [createSignout()] + ? [...(AuthUtil.instance.isBuilderIdInUse() ? [createManageSubscription()] : []), createSignout()] : []), ] 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 } diff --git a/packages/core/src/codewhisperer/util/editorContext.ts b/packages/core/src/codewhisperer/util/editorContext.ts index 756d9fb2a00..95df5eb509a 100644 --- a/packages/core/src/codewhisperer/util/editorContext.ts +++ b/packages/core/src/codewhisperer/util/editorContext.ts @@ -167,6 +167,7 @@ export function extractContextForCodeWhisperer(editor: vscode.TextEditor): codew } return { + fileUri: editor.document.uri.toString().substring(0, CodeWhispererConstants.filenameCharsLimit), filename: getFileRelativePath(editor), programmingLanguage: { languageName: languageName, diff --git a/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts b/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts index e1d4802b6f1..b87db0a65e8 100644 --- a/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts +++ b/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts @@ -153,7 +153,6 @@ export class RuntimeLanguageContext { psm1: 'powershell', r: 'r', abap: 'abap', - acds: 'abap', }) this.languageSingleLineCommentPrefixMap = createConstantMap<CodewhispererLanguage, string>({ c: '// ', diff --git a/packages/core/src/login/webview/vue/login.vue b/packages/core/src/login/webview/vue/login.vue index ddcd1d91c28..312aa18029b 100644 --- a/packages/core/src/login/webview/vue/login.vue +++ b/packages/core/src/login/webview/vue/login.vue @@ -108,8 +108,8 @@ @toggle="toggleItemSelection" :isSelected="selectedLoginOption === LoginOption.BUILDER_ID" :itemId="LoginOption.BUILDER_ID" - :itemText="'with Builder ID, a personal profile from AWS'" - :itemTitle="'Use for Free'" + :itemText="'Free to start with a Builder ID.'" + :itemTitle="'Personal account'" :itemType="LoginOption.BUILDER_ID" class="selectable-item bottomMargin" ></SelectableItem> @@ -118,8 +118,8 @@ @toggle="toggleItemSelection" :isSelected="selectedLoginOption === LoginOption.ENTERPRISE_SSO" :itemId="LoginOption.ENTERPRISE_SSO" - :itemText="''" - :itemTitle="'Use with Pro license'" + :itemText="'Best for individual teams or organizations.'" + :itemTitle="'Company account'" :itemType="LoginOption.ENTERPRISE_SSO" class="selectable-item bottomMargin" ></SelectableItem> diff --git a/packages/core/src/shared/index.ts b/packages/core/src/shared/index.ts index f4c78e2093c..9a08a7afaf3 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' @@ -50,6 +51,7 @@ export * from './vscode/commands2' export * from './utilities/pathUtils' export * from './utilities/zipStream' export * from './errors' +export { isTextEditor } from './utilities/editorUtilities' export * as messages from './utilities/messages' export * as errors from './errors' export * as funcUtil from './utilities/functionUtils' 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/lsp/utils/platform.ts b/packages/core/src/shared/lsp/utils/platform.ts index 2555793ceb5..39284e8a0ac 100644 --- a/packages/core/src/shared/lsp/utils/platform.ts +++ b/packages/core/src/shared/lsp/utils/platform.ts @@ -13,6 +13,10 @@ export function getNodeExecutableName(): string { return process.platform === 'win32' ? 'node.exe' : 'node' } +export function getRgExecutableName(): string { + return process.platform === 'win32' ? 'rg.exe' : 'rg' +} + /** * Get a json payload that will be sent to the language server, who is waiting to know what the encryption key is. * Code reference: https://github.com/aws/language-servers/blob/7da212185a5da75a72ce49a1a7982983f438651a/client/vscode/src/credentialsActivation.ts#L77 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..5c37c5e3e46 --- /dev/null +++ b/packages/core/src/shared/utilities/proxyUtil.ts @@ -0,0 +1,74 @@ +/*! + * 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<string>('proxy') + this.logger.debug(`Proxy URL Setting in VSCode Settings: ${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 + // 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}`) + } + } +} 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<boolean> { + // 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') diff --git a/packages/core/src/test/codewhisperer/commands/basicCommands.test.ts b/packages/core/src/test/codewhisperer/commands/basicCommands.test.ts index 01c7c43c947..936e7d84cd6 100644 --- a/packages/core/src/test/codewhisperer/commands/basicCommands.test.ts +++ b/packages/core/src/test/codewhisperer/commands/basicCommands.test.ts @@ -42,6 +42,7 @@ import { createGettingStarted, createGitHubNode, createLearnMore, + createManageSubscription, createOpenReferenceLog, createReconnect, createSecurityScan, @@ -515,6 +516,7 @@ describe('CodeWhisperer-basicCommands', function () { ...genericItems(), createSeparator(), createSettingsNode(), + createManageSubscription(), createSignout(), ]) e.dispose() // skip needing to select an item to continue @@ -537,6 +539,7 @@ describe('CodeWhisperer-basicCommands', function () { switchToAmazonQNode(), ...genericItems(), createSettingsNode(), + createManageSubscription(), createSignout() ) e.dispose() diff --git a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts index 4b478e1876e..edb2524ee68 100644 --- a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts +++ b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts @@ -28,6 +28,7 @@ import { zipCode, getTableMapping, getFilesRecursively, + getJobStatisticsHtml, } from '../../../codewhisperer/service/transformByQ/transformApiHandler' import { validateOpenProjects, @@ -247,7 +248,25 @@ dependencyManagement: }, transformationJob: { status: 'COMPLETED' }, } + const mockPlanResponse = { + $response: { + data: { + transformationPlan: { transformationSteps: [] }, + }, + requestId: 'requestId', + hasNextPage: () => false, + error: undefined, + nextPage: () => null, // eslint-disable-line unicorn/no-null + redirectCount: 0, + retryCount: 0, + httpResponse: new HttpResponse(), + }, + transformationPlan: { transformationSteps: [] }, + } sinon.stub(codeWhisperer.codeWhispererClient, 'codeModernizerGetCodeTransformation').resolves(mockJobResponse) + sinon + .stub(codeWhisperer.codeWhispererClient, 'codeModernizerGetCodeTransformationPlan') + .resolves(mockPlanResponse) transformByQState.setToSucceeded() const status = await pollTransformationJob( 'dummyId', @@ -294,6 +313,31 @@ dependencyManagement: assert.deepStrictEqual(actual, expected) }) + it('WHEN showing plan statistics THEN correct labels appear', () => { + const mockJobStatistics = [ + { + name: 'linesOfCode', + value: '1234', + }, + { + name: 'plannedDependencyChanges', + value: '0', + }, + { + name: 'plannedDeprecatedApiChanges', + value: '0', + }, + { + name: 'plannedFileChanges', + value: '0', + }, + ] + const result = getJobStatisticsHtml(mockJobStatistics) + assert.strictEqual(result.includes('Lines of code in your application'), true) + assert.strictEqual(result.includes('to be replaced'), false) + assert.strictEqual(result.includes('to be changed'), false) + }) + it(`WHEN transforming a project with a Windows Maven executable THEN mavenName set correctly`, async function () { sinon.stub(env, 'isWin').returns(true) const tempFileName = 'mvnw.cmd' @@ -374,6 +418,8 @@ dependencyManagement: const manifestText = manifestBuffer.toString('utf8') const manifest = JSON.parse(manifestText) assert.strictEqual(manifest.customBuildCommand, CodeWhispererConstants.skipUnitTestsBuildCommand) + assert.strictEqual(manifest.noInteractiveMode, true) + assert.strictEqual(manifest.transformCapabilities.includes('SELECTIVE_TRANSFORMATION_V2'), true) }) }) @@ -488,12 +534,18 @@ dependencyManagement: const actual = getTableMapping(stepZeroProgressUpdates) const expected = { - '0': '{"columnNames":["name","value"],"rows":[{"name":"Lines of code in your application","value":"3000"},{"name":"Dependencies to be replaced","value":"5"},{"name":"Deprecated code instances to be replaced","value":"10"},{"name":"Files to be updated","value":"7"}]}', - '1-dependency-change-abc': + '0': [ + '{"columnNames":["name","value"],"rows":[{"name":"Lines of code in your application","value":"3000"},{"name":"Dependencies to be replaced","value":"5"},{"name":"Deprecated code instances to be replaced","value":"10"},{"name":"Files to be updated","value":"7"}]}', + ], + '1-dependency-change-abc': [ '{"columnNames":["dependencyName","action","currentVersion","targetVersion"],"rows":[{"dependencyName":"org.springboot.com","action":"Update","currentVersion":"2.1","targetVersion":"2.4"}, {"dependencyName":"com.lombok.java","action":"Remove","currentVersion":"1.7","targetVersion":"-"}]}', - '2-deprecated-code-xyz': + ], + '2-deprecated-code-xyz': [ '{"columnNames":["apiFullyQualifiedName","numChangedFiles"],“rows”:[{"apiFullyQualifiedName":"java.lang.Thread.stop()","numChangedFiles":"6"}, {"apiFullyQualifiedName":"java.math.bad()","numChangedFiles":"3"}]}', - '-1': '{"columnNames":["relativePath","action"],"rows":[{"relativePath":"pom.xml","action":"Update"}, {"relativePath":"src/main/java/com/bhoruka/bloodbank/BloodbankApplication.java","action":"Update"}]}', + ], + '-1': [ + '{"columnNames":["relativePath","action"],"rows":[{"relativePath":"pom.xml","action":"Update"}, {"relativePath":"src/main/java/com/bhoruka/bloodbank/BloodbankApplication.java","action":"Update"}]}', + ], } assert.deepStrictEqual(actual, expected) }) diff --git a/packages/toolkit/.changes/3.62.0.json b/packages/toolkit/.changes/3.62.0.json new file mode 100644 index 00000000000..7c2d15933be --- /dev/null +++ b/packages/toolkit/.changes/3.62.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-05-15", + "version": "3.62.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/3.63.0.json b/packages/toolkit/.changes/3.63.0.json new file mode 100644 index 00000000000..238e3d2d3b6 --- /dev/null +++ b/packages/toolkit/.changes/3.63.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-05-22", + "version": "3.63.0", + "entries": [] +} \ No newline at end of file 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/.changes/3.65.0.json b/packages/toolkit/.changes/3.65.0.json new file mode 100644 index 00000000000..1cc912907bc --- /dev/null +++ b/packages/toolkit/.changes/3.65.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-06-13", + "version": "3.65.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index e830b391487..89b1793c1fc 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,19 @@ +## 3.65.0 2025-06-13 + +- Miscellaneous non-user-facing changes + +## 3.64.0 2025-06-04 + +- Miscellaneous non-user-facing changes + +## 3.63.0 2025-05-22 + +- Miscellaneous non-user-facing changes + +## 3.62.0 2025-05-15 + +- Miscellaneous non-user-facing changes + ## 3.61.0 2025-05-14 - Miscellaneous non-user-facing changes diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 491031f47af..4920a5e0141 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.62.0-SNAPSHOT", + "version": "3.66.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/scripts/lspArtifact.ts b/scripts/lspArtifact.ts new file mode 100644 index 00000000000..42b5c59907d --- /dev/null +++ b/scripts/lspArtifact.ts @@ -0,0 +1,183 @@ +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 * as semver from 'semver' +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<boolean> { + 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<void> { + if (!fs.existsSync(dirPath)) { + await fs.promises.mkdir(dirPath, { recursive: true }) + } +} + +export async function downloadLanguageServer(): Promise<void> { + 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) => semver.compare(b.serverVersion, 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', [